summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter LaFosse <peter@vector35.com>2022-04-11 11:53:01 -0400
committerPeter LaFosse <peter@vector35.com>2022-04-14 09:22:49 -0400
commit4425004475844466f2faa28bc1b136bf6da74977 (patch)
tree0131826d2f1857f2de65b4f47a2486a4c69005d3
parentdc0626a11c30387993380a31db3b4bce23d81983 (diff)
Add some python api side caching to improve performance for some frequently accessed fields
-rw-r--r--python/binaryview.py10
-rw-r--r--python/highlevelil.py12
-rw-r--r--python/types.py20
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: