mirror of
https://github.com/isledecomp/isle-portable.git
synced 2024-11-22 07:28:00 -05:00
Parse anonymous LF_UNION type (#1013)
This commit is contained in:
parent
be4c351d7d
commit
0dca127649
2 changed files with 26 additions and 2 deletions
|
@ -221,7 +221,7 @@ class CvdumpTypesParser:
|
||||||
)
|
)
|
||||||
LF_ENUM_UDT = re.compile(r"^\s*UDT\((?P<udt>0x\w+)\)$")
|
LF_ENUM_UDT = re.compile(r"^\s*UDT\((?P<udt>0x\w+)\)$")
|
||||||
LF_UNION_LINE = re.compile(
|
LF_UNION_LINE = re.compile(
|
||||||
r"^.*field list type (?P<field_type>0x\w+),.*Size = (?P<size>\d+)\s*,class name = (?P<name>(?:[^,]|,\S)+),\s.*UDT\((?P<udt>0x\w+)\)$"
|
r"^.*field list type (?P<field_type>0x\w+),.*Size = (?P<size>\d+)\s*,class name = (?P<name>(?:[^,]|,\S)+)(?:,\s.*UDT\((?P<udt>0x\w+)\))?$"
|
||||||
)
|
)
|
||||||
|
|
||||||
MODES_OF_INTEREST = {
|
MODES_OF_INTEREST = {
|
||||||
|
@ -659,4 +659,5 @@ def read_union_line(self, line: str):
|
||||||
self._set("is_forward_ref", True)
|
self._set("is_forward_ref", True)
|
||||||
|
|
||||||
self._set("size", int(match.group("size")))
|
self._set("size", int(match.group("size")))
|
||||||
self._set("udt", normalize_type_id(match.group("udt")))
|
if match.group("udt") is not None:
|
||||||
|
self._set("udt", normalize_type_id(match.group("udt")))
|
||||||
|
|
|
@ -551,3 +551,26 @@ def test_fieldlist_enumerate(parser: CvdumpTypesParser):
|
||||||
{"name": "c_text", "value": 4},
|
{"name": "c_text", "value": 4},
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
UNNAMED_UNION_DATA = """
|
||||||
|
0x369d : Length = 34, Leaf = 0x1203 LF_FIELDLIST
|
||||||
|
list[0] = LF_MEMBER, public, type = T_32PRCHAR(0470), offset = 0
|
||||||
|
member name = 'sz'
|
||||||
|
list[1] = LF_MEMBER, public, type = T_32PUSHORT(0421), offset = 0
|
||||||
|
member name = 'wz'
|
||||||
|
|
||||||
|
0x369e : Length = 22, Leaf = 0x1506 LF_UNION
|
||||||
|
# members = 2, field list type 0x369d, NESTED, Size = 4 ,class name = __unnamed
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def test_unnamed_union():
|
||||||
|
"""Make sure we can parse anonymous union types without a UDT"""
|
||||||
|
parser = CvdumpTypesParser()
|
||||||
|
for line in UNNAMED_UNION_DATA.split("\n"):
|
||||||
|
parser.read_line(line)
|
||||||
|
|
||||||
|
# Make sure we can parse the members line
|
||||||
|
union = parser.keys["0x369e"]
|
||||||
|
assert union["size"] == 4
|
||||||
|
|
Loading…
Reference in a new issue