diff options
| author | Peter LaFosse <peter@vector35.com> | 2022-01-24 19:51:46 -0500 |
|---|---|---|
| committer | Peter LaFosse <peter@vector35.com> | 2022-01-25 10:20:26 -0500 |
| commit | 2c0f75b954dea781b7ac68eee0ec7e8fbeadee4e (patch) | |
| tree | 4a9496dc5817f31c6dbec461fd9b29a33fed7945 | |
| parent | e632b5c4cd533bbae8230678dc6a57ea4734b62d (diff) | |
Fix bug and add test for NamedTypeReferenceBuilder.__repr__
Make Type/TypeBuilder.__repr__s consistent
| -rw-r--r-- | python/types.py | 62 | ||||
| -rw-r--r-- | suite/api_test.py | 16 |
2 files changed, 51 insertions, 27 deletions
diff --git a/python/types.py b/python/types.py index b058cc2c..3f832fe4 100644 --- a/python/types.py +++ b/python/types.py @@ -344,8 +344,8 @@ class FunctionParameter: def __repr__(self): if (self.location is not None) and (self.location.name != self.name): - return "%s %s%s @ %s" % (self.type.immutable_copy().get_string_before_name(), self.name, self.type.immutable_copy().get_string_after_name(), self.location.name) - return "%s %s%s" % (self.type.immutable_copy().get_string_before_name(), self.name, self.type.immutable_copy().get_string_after_name()) + return f"{self.type.immutable_copy().get_string_before_name()} {self.name}{self.type.immutable_copy().get_string_after_name()} @ {self.location.name}" + return f"{self.type.immutable_copy().get_string_before_name()} {self.name}{self.type.immutable_copy().get_string_after_name()}" def immutable_copy(self) -> 'FunctionParameter': return FunctionParameter(self.type.immutable_copy(), self.name, self.location) @@ -537,6 +537,14 @@ class TypeBuilder: def __ne__(self, other:'TypeBuilder') -> bool: return not self.__eq__(other) + def __repr__(self): + if self._confidence < core.max_confidence: + return f"<type: mutable:{self.type_class.name} '{self}', {self._confidence * 100 // core.max_confidence}% confidence>" + return f"<type: mutable:{self.type_class.name} '{self}'>" + + def __str__(self): + return str(self.immutable_copy()) + @property def handle(self) -> core.BNTypeHandle: return self.immutable_copy().handle @@ -1126,9 +1134,6 @@ class StructureBuilder(TypeBuilder): def type(self, value:StructureVariant) -> None: core.BNSetStructureBuilderType(self.builder_handle, value) - def __repr__(self): - return f"<struct: size {self.width:#x}>" - def __getitem__(self, name:str) -> Optional[StructureMember]: member = core.BNGetStructureBuilderMemberByName(self.builder_handle, name) if member is None: @@ -1248,9 +1253,6 @@ class EnumerationBuilder(TypeBuilder): assert handle is not None, "core.BNCreateEnumerationType returned None" return EnumerationType(handle, self.platform, self.confidence) - def __repr__(self): - return "<enum: %s>" % repr(self.members) - @property def signed(self) -> BoolWithConfidence: """Whether type is signed (read/write)""" @@ -1434,14 +1436,17 @@ class NamedTypeReferenceBuilder(TypeBuilder): def __repr__(self): if self.named_type_class == NamedTypeReferenceClass.TypedefNamedTypeClass: - return f"<named_type_reference: typedef {self.name}>" - if self.named_type_class == NamedTypeReferenceClass.StructNamedTypeClass: - return f"<named_type_reference: struct {self.name}>" - if self.named_type_class == NamedTypeReferenceClass.UnionNamedTypeClass: - return f"<named_type_reference: union {self.name}>" - if self.named_type_class == NamedTypeReferenceClass.EnumNamedTypeClass: - return f"<named_type_reference: enum {self.name}>" - return "<named_type_reference: unknown >" + return f"<type: mutable:{self.type_class.name} 'typedef {self.name}'>" + elif self.named_type_class == NamedTypeReferenceClass.StructNamedTypeClass: + return f"<type: mutable:{self.type_class.name} 'struct {self.name}'>" + elif self.named_type_class == NamedTypeReferenceClass.UnionNamedTypeClass: + return f"<type: mutable:{self.type_class.name} 'union {self.name}'>" + elif self.named_type_class == NamedTypeReferenceClass.ClassNamedTypeClass: + return f"<type: mutable:{self.type_class.name} 'class {self.name}'>" + elif self.named_type_class == NamedTypeReferenceClass.EnumNamedTypeClass: + return f"<type: mutable:{self.type_class.name} 'enum {self.name}'>" + else: + return f"<type: mutable:{self.type_class.name} 'unknown'>" class Type: @@ -1475,8 +1480,8 @@ class Type: def __repr__(self): if self._confidence < core.max_confidence: - return f"<type: {self}, {self._confidence * 100 // core.max_confidence}% confidence>" - return f"<type: {self}>" + return f"<type: immutable:{self.type_class.name} '{self}', {self._confidence * 100 // core.max_confidence}% confidence>" + return f"<type: immutable:{self.type_class.name} '{self}'>" def __str__(self): platform = None @@ -1801,7 +1806,7 @@ class Type: raise NotImplementedError("Name not implemented for this type") @staticmethod - def generate_auto_type_id(source, name:str) -> str: + def generate_auto_type_id(source:str, name:str) -> str: _name = QualifiedName(name)._to_core_struct() return core.BNGenerateAutoTypeId(source, _name) @@ -2324,14 +2329,17 @@ class NamedTypeReferenceType(Type): def __repr__(self): if self.named_type_class == NamedTypeReferenceClass.TypedefNamedTypeClass: - return f"<named_type_reference: {self}>" - if self.named_type_class == NamedTypeReferenceClass.StructNamedTypeClass: - return f"<named_type_reference: {self}>" - if self.named_type_class == NamedTypeReferenceClass.UnionNamedTypeClass: - return f"<named_type_reference: {self}>" - if self.named_type_class == NamedTypeReferenceClass.EnumNamedTypeClass: - return f"<named_type_reference: {self}>" - return "<named_type_reference: unknown >" + return f"<type: immutable:NamedTypeReferenceClass 'typedef {self.name}'>" + elif self.named_type_class == NamedTypeReferenceClass.StructNamedTypeClass: + return f"<type: immutable:NamedTypeReferenceClass 'struct {self.name}'>" + elif self.named_type_class == NamedTypeReferenceClass.UnionNamedTypeClass: + return f"<type: immutable:NamedTypeReferenceClass 'union {self.name}'>" + elif self.named_type_class == NamedTypeReferenceClass.ClassNamedTypeClass: + return f"<type: immutable:NamedTypeReferenceClass 'class {self.name}'>" + elif self.named_type_class == NamedTypeReferenceClass.EnumNamedTypeClass: + return f"<type: immutable:NamedTypeReferenceClass 'enum {self.name}'>" + else: + return f"<type: immutable:NamedTypeReferenceClass 'unknown'>" def __str__(self): name = self.registered_name diff --git a/suite/api_test.py b/suite/api_test.py index b04711bf..0a5770a7 100644 --- a/suite/api_test.py +++ b/suite/api_test.py @@ -590,32 +590,48 @@ class TypeBuilderTest(unittest.TestCase): assert b.name == "name" assert b.id == "type_id" assert b.named_type_class == NamedTypeReferenceClass.TypedefNamedTypeClass + assert repr(b).startswith("<type: mutable:NamedTypeReferenceClass 'typedef") b = TypeBuilder.named_type_from_type_and_id("type_id", QualifiedName(b"name")) assert b.name == "name" assert b.id == "type_id" assert b.named_type_class == NamedTypeReferenceClass.UnknownNamedTypeClass + assert repr(b).startswith("<type: mutable:NamedTypeReferenceClass 'unknown") enm = TypeBuilder.enumeration(self.arch, [("Member1", 0)], 4, False) b = TypeBuilder.named_type_from_type_and_id("type_id", QualifiedName(b"name"), enm) assert b.name == "name" assert b.id == "type_id" assert b.named_type_class == NamedTypeReferenceClass.EnumNamedTypeClass + assert repr(b).startswith("<type: mutable:NamedTypeReferenceClass 'enum") str = TypeBuilder.structure([], True, StructureVariant.StructStructureType) b = TypeBuilder.named_type_from_type_and_id("type_id", QualifiedName(b"name"), str) assert b.name == "name" assert b.id == "type_id" assert b.named_type_class == NamedTypeReferenceClass.StructNamedTypeClass + assert repr(b).startswith("<type: mutable:NamedTypeReferenceClass 'struct") str = TypeBuilder.structure([], True, StructureVariant.ClassStructureType) b = TypeBuilder.named_type_from_type_and_id("type_id", QualifiedName(b"name"), str) assert b.name == "name" assert b.id == "type_id" assert b.named_type_class == NamedTypeReferenceClass.ClassNamedTypeClass + assert repr(b).startswith("<type: mutable:NamedTypeReferenceClass 'class") str = TypeBuilder.structure([], True, StructureVariant.UnionStructureType) b = TypeBuilder.named_type_from_type_and_id("type_id", QualifiedName([b"name", b"name"]), str) assert b.name == QualifiedName(["name", "name"]) assert b.id == "type_id" assert b.named_type_class == NamedTypeReferenceClass.UnionNamedTypeClass + assert repr(b).startswith("<type: mutable:NamedTypeReferenceClass 'union") + + b = NamedTypeReferenceBuilder.named_type(b, 4, 4) + assert b.width == 4 + assert b.alignment == 4 + + b = NamedTypeReferenceBuilder.named_type_from_type("name") + b.named_type_class == NamedTypeReferenceClass.UnknownNamedTypeClass + + # need binary view for this one + #b = NamedTypeReferenceBuilder.named_type_from_registered_type(bv, )
\ No newline at end of file |
