diff options
| author | Ryan Snyder <ryan@vector35.com> | 2025-11-20 21:40:23 -0500 |
|---|---|---|
| committer | Ryan Snyder <ryan@vector35.com> | 2026-04-13 12:52:07 -0400 |
| commit | b1246d8bfc27368028c3f9f93d022e373118fcaa (patch) | |
| tree | c3b9ac2ce7472c95f7e62ebfd77700416cbc632f /python/types.py | |
| parent | 745c0b3b806b7e44aba36cf3a8564dfa0631dc8f (diff) | |
types: fragment type API support (C++, Python)
Diffstat (limited to 'python/types.py')
| -rw-r--r-- | python/types.py | 110 |
1 files changed, 109 insertions, 1 deletions
diff --git a/python/types.py b/python/types.py index c149c70a..b47d98ce 100644 --- a/python/types.py +++ b/python/types.py @@ -31,7 +31,8 @@ from .enums import ( ReferenceType, VariableSourceType, TypeReferenceType, MemberAccess, MemberScope, TypeDefinitionLineType, TokenEscapingType, - NameType, PointerSuffix, PointerBaseType + NameType, PointerSuffix, PointerBaseType, + Endianness ) from . import callingconvention from . import function as _function @@ -655,6 +656,7 @@ class TypeBuilder: TypeClass.StructureTypeClass: StructureType, TypeClass.EnumerationTypeClass: EnumerationType, TypeClass.NamedTypeReferenceClass: NamedTypeReferenceType, + TypeClass.FragmentTypeClass: FragmentType, } return Types[self.type_class](self._finalized, self.platform, self.confidence) @@ -1125,6 +1127,74 @@ class PointerBuilder(TypeBuilder): def pointer_base_offset(self, value: int): self.set_pointer_base(self.pointer_base_type, value) +class FragmentBuilder(TypeBuilder): + @classmethod + def create( + cls, type: SomeType, width: int, + offset: int, endianness: Endianness = Endianness.LittleEndian, + confidence: int = core.max_confidence + ) -> 'FragmentBuilder': + ic = type.immutable_copy() + handle = core.BNCreateFragmentTypeBuilder(width, ic._to_core_struct(), offset, endianness) + assert handle is not None, "BNCreateFragmentTypeBuilder returned None" + return cls(handle, None, confidence) + + @property + def offset(self) -> int: + return core.BNGetTypeBuilderFragmentOriginalOffsetBytes(self._handle) + + @offset.setter + def offset(self, value: int): + core.BNSetTypeBuilderFragmentOriginalOffsetBytes(self._handle, value) + + @property + def fragment_original_width(self) -> int: + return core.BNGetTypeBuilderFragmentOriginalWidthBytes(self._handle) + + @fragment_original_width.setter + def fragment_original_width(self, value: int): + core.BNSetTypeBuilderFragmentOriginalWidthBytes(self._handle, value) + + @property + def fragment_start_bit(self) -> int: + return core.BNGetTypeBuilderFragmentStartBit(self._handle) + + @fragment_start_bit.setter + def fragment_start_bit(self, value: int): + core.BNSetTypeBuilderFragmentStartBit(self._handle, value) + + @property + def fragment_width_bits(self) -> int: + return core.BNGetTypeBuilderFragmentWidthBits(self._handle) + + @fragment_width_bits.setter + def fragment_width_bits(self, value: int): + core.BNSetTypeBuilderFragmentWidthBits(self._handle, value) + + @property + def fragment_truncated_start_bits(self) -> int: + return core.BNGetTypeBuilderFragmentTruncatedStartBits(self._handle) + + @fragment_truncated_start_bits.setter + def fragment_truncated_start_bits(self, value: int): + core.BNSetTypeBuilderFragmentTruncatedStartBits(self._handle, value) + + @property + def fragment_wrap_bit(self) -> int: + return core.BNGetTypeBuilderFragmentWrapBit(self._handle) + + @fragment_wrap_bit.setter + def fragment_wrap_bit(self, value: int): + core.BNSetTypeBuilderFragmentWrapBit(self._handle, value) + + @property + def endianness(self) -> Endianness: + return Endianness(core.BNGetTypeBuilderFragmentEndianness(self._handle)) + + @endianness.setter + def endianness(self, value: Endianness): + core.BNSetTypeBuilderFragmentEndianness(self._handle, value) + class ArrayBuilder(TypeBuilder): @classmethod @@ -2289,6 +2359,7 @@ class Type: TypeClass.IntegerTypeClass: IntegerBuilder, TypeClass.FloatTypeClass: FloatBuilder, TypeClass.PointerTypeClass: PointerBuilder, TypeClass.ArrayTypeClass: ArrayBuilder, TypeClass.FunctionTypeClass: FunctionBuilder, TypeClass.WideCharTypeClass: WideCharBuilder, + TypeClass.FragmentTypeClass: FragmentBuilder, # TypeClass.StructureTypeClass:Structure, # TypeClass.EnumerationTypeClass:Enumeration, # TypeClass.NamedTypeReferenceClass:NamedTypeReference, @@ -3484,6 +3555,42 @@ class WideCharType(Type): assert core_type is not None, "core.BNCreateWideCharType returned None" return cls(core_type, platform, confidence) +class FragmentType(Type): + @property + def target(self) -> Type: + """Target (read-only)""" + result = core.BNGetChildType(self._handle) + assert result is not None, "core.BNGetChildType returned None" + return Type.create(result.type, self._platform, result.confidence) + + @property + def offset(self) -> int: + return core.BNGetTypeFragmentOriginalOffsetBytes(self._handle) + + @property + def fragment_original_width_bytes(self) -> int: + return core.BNGetTypeFragmentOriginalWidthBytes(self._handle) + + @property + def fragment_start_bit(self) -> int: + return core.BNGetTypeFragmentStartBit(self._handle) + + @property + def fragment_width_bits(self) -> int: + return core.BNGetTypeFragmentWidthBits(self._handle) + + @property + def fragment_truncated_start_bits(self) -> int: + return core.BNGetTypeFragmentTruncatedStartBits(self._handle) + + @property + def fragment_wrap_bit(self) -> int: + return core.BNGetTypeFragmentWrapBit(self._handle) + + @property + def fragment_endianness(self) -> Endianness: + return Endianness(core.BNGetTypeFragmentEndianness(self._handle)) + Types = { TypeClass.VoidTypeClass: VoidType, TypeClass.BoolTypeClass: BoolType, TypeClass.IntegerTypeClass: IntegerType, @@ -3491,6 +3598,7 @@ Types = { TypeClass.EnumerationTypeClass: EnumerationType, TypeClass.PointerTypeClass: PointerType, TypeClass.ArrayTypeClass: ArrayType, TypeClass.FunctionTypeClass: FunctionType, TypeClass.NamedTypeReferenceClass: NamedTypeReferenceType, TypeClass.WideCharTypeClass: WideCharType, + TypeClass.FragmentTypeClass: FragmentType, } |
