Skip to content

Commit

Permalink
move name handling to _get_data_type_name
Browse files Browse the repository at this point in the history
  • Loading branch information
blattm committed Oct 19, 2023
1 parent 09919b0 commit 9036c07
Showing 1 changed file with 19 additions and 14 deletions.
33 changes: 19 additions & 14 deletions decompiler/frontend/binaryninja/handlers/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,7 @@ def lift_named_type_reference_type(self, custom: NamedTypeReferenceType, **kwarg
def lift_enum(self, binja_enum: EnumerationType, name: str = None, **kwargs) -> Enum:
"""Lift enum type."""
type_id = hash(binja_enum)
enum_name = name if name else self._get_data_type_name(binja_enum, keyword="enum")
if enum_name.strip() == "":
enum_name = f"__anonymous_enum"
enum_name = self._lifter.unique_name_provider.get_unique_name(enum_name)
enum_name = self._get_data_type_name(binja_enum, keyword="enum", provided_name=name)
enum = Enum(binja_enum.width * self.BYTE_SIZE, enum_name, {})
for member in binja_enum.members:
enum.add_member(self._lifter.lift(member))
Expand All @@ -106,10 +103,7 @@ def lift_struct(self, struct: StructureType, name: str = None, **kwargs) -> Unio
else:
raise RuntimeError(f"Unknown struct type {struct.type.name}")

type_name = name if name else self._get_data_type_name(struct, keyword=keyword)
if type_name.strip() == "":
type_name = f"__anonymous_{keyword}"
type_name = self._lifter.unique_name_provider.get_unique_name(type_name)
type_name = self._get_data_type_name(struct, keyword=keyword, provided_name=name)
lifted_struct = type(struct.width * self.BYTE_SIZE, type_name, members)

self._lifter.complex_types.add(lifted_struct, type_id)
Expand All @@ -118,12 +112,23 @@ def lift_struct(self, struct: StructureType, name: str = None, **kwargs) -> Unio
return lifted_struct

@abstractmethod
def _get_data_type_name(self, complex_type: Union[StructureType, EnumerationType], keyword: str) -> str:
"""Parse out the name of complex type."""
string = complex_type.get_string()
if keyword in string:
return complex_type.get_string().split(keyword)[1]
return string
def _get_data_type_name(self, complex_type: Union[StructureType, EnumerationType], keyword: str, provided_name:str) -> str:
"""Parse out the name of complex type. Empty and duplicate names are changed.
Calling this function has the side effect of incrementing a counter in the UniqueNameProvider."""
if provided_name:
name = provided_name
else:
type_string = complex_type.get_string()
if keyword in type_string:
name = complex_type.get_string().split(keyword)[1]
else:
name = type_string

if name.strip() == "":
name = f"__anonymous_{keyword}"
name = self._lifter.unique_name_provider.get_unique_name(name)

return name

def lift_struct_member(self, member: StructureMember, parent_struct_name: str = None) -> ComplexTypeMember:
"""Lift struct or union member."""
Expand Down

0 comments on commit 9036c07

Please sign in to comment.