diff options
| author | Peter LaFosse <peter@vector35.com> | 2022-04-11 11:53:01 -0400 |
|---|---|---|
| committer | Peter LaFosse <peter@vector35.com> | 2022-04-14 09:22:49 -0400 |
| commit | 4425004475844466f2faa28bc1b136bf6da74977 (patch) | |
| tree | 0131826d2f1857f2de65b4f47a2486a4c69005d3 | |
| parent | dc0626a11c30387993380a31db3b4bce23d81983 (diff) | |
Add some python api side caching to improve performance for some frequently accessed fields
| -rw-r--r-- | python/binaryview.py | 10 | ||||
| -rw-r--r-- | python/highlevelil.py | 12 | ||||
| -rw-r--r-- | python/types.py | 20 |
3 files changed, 25 insertions, 17 deletions
diff --git a/python/binaryview.py b/python/binaryview.py index 5cc920d5..5b58fa1d 100644 --- a/python/binaryview.py +++ b/python/binaryview.py @@ -1804,6 +1804,7 @@ class BinaryView: self._parse_only = False self._preload_limit = 5 self._platform = None + self._endianness = None def __enter__(self): return self @@ -2198,11 +2199,12 @@ class BinaryView: @property def platform(self) -> Optional['_platform.Platform']: """The platform associated with the current BinaryView (read/write)""" + if self._platform is not None: + return self._platform plat = core.BNGetDefaultPlatform(self.handle) if plat is None: return None - if self._platform is None: - self._platform = _platform.Platform(self.arch, handle=plat) + self._platform = _platform.Platform(self.arch, handle=plat) return self._platform @platform.setter @@ -2216,7 +2218,9 @@ class BinaryView: @property def endianness(self) -> Endianness: """Endianness of the binary (read-only)""" - return Endianness(core.BNGetDefaultEndianness(self.handle)) + if self._endianness is None: + self._endianness = Endianness(core.BNGetDefaultEndianness(self.handle)) + return self._endianness @property def relocatable(self) -> bool: diff --git a/python/highlevelil.py b/python/highlevelil.py index c77a4e39..e2a53bb5 100644 --- a/python/highlevelil.py +++ b/python/highlevelil.py @@ -2302,21 +2302,13 @@ class HighLevelILFunction: """ ``is_var_live_at`` determines if ``var`` is live at a given point in the function """ - var_data = core.BNVariable() - var_data.type = var.source_type - var_data.index = var.index - var_data.storage = var.storage - return core.BNIsHighLevelILVarLiveAt(self.handle, var_data, instr) + return core.BNIsHighLevelILVarLiveAt(self.handle, var.to_BNVariable(), instr) def is_ssa_var_live_at(self, ssa_var: 'mediumlevelil.SSAVariable', instr: InstructionIndex) -> bool: """ ``is_ssa_var_live_at`` determines if ``ssa_var`` is live at a given point in the function; counts phi's as uses """ - var_data = core.BNVariable() - var_data.type = ssa_var.var.source_type - var_data.index = ssa_var.var.index - var_data.storage = ssa_var.var.storage - return core.BNIsHighLevelILSSAVarLiveAt(self.handle, var_data, ssa_var.version, instr) + return core.BNIsHighLevelILSSAVarLiveAt(self.handle, ssa_var.var.to_BNVariable(), ssa_var.version, instr) def get_var_definitions(self, var: 'variable.Variable') -> List[HighLevelILInstruction]: count = ctypes.c_ulonglong() diff --git a/python/types.py b/python/types.py index f87cc37f..b92cb79d 100644 --- a/python/types.py +++ b/python/types.py @@ -1512,6 +1512,10 @@ class Type: self._handle = handle self._confidence = confidence self._platform = platform + self._type_class = None + self._width = None + self._alignment = None + self._offset = None @classmethod def create( @@ -1557,22 +1561,30 @@ class Type: @property def type_class(self) -> TypeClass: """Type class (read-only)""" - return TypeClass(core.BNGetTypeClass(self._handle)) + if self._type_class is None: + self._type_class = TypeClass(core.BNGetTypeClass(self._handle)) + return self._type_class @property def width(self) -> int: """Type width (read-only)""" - return core.BNGetTypeWidth(self._handle) + if self._width is None: + self._width = core.BNGetTypeWidth(self._handle) + return self._width @property def alignment(self) -> int: """Type alignment (read-only)""" - return core.BNGetTypeAlignment(self._handle) + if self._alignment is None: + self._alignment = core.BNGetTypeAlignment(self._handle) + return self._alignment @property def offset(self) -> int: """Offset into structure (read-only)""" - return core.BNGetTypeOffset(self._handle) + if self._offset is None: + self._offset = core.BNGetTypeOffset(self._handle) + return self._offset @property def altname(self) -> str: |
