summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorRyan Snyder <ryan@vector35.com>2018-03-20 09:53:59 -0400
committerPeter LaFosse <peter@vector35.com>2018-03-23 17:10:07 -0400
commitcacaec3766abddd15233aa1be7df2efc804fe996 (patch)
tree2fba0c2a192ba8211fa40c48f95e2ba1c113ecee /python
parent19b66619718e8b114db2fefc498018af44010ac6 (diff)
Cache all created CoreArchitecture objects
Diffstat (limited to 'python')
-rw-r--r--python/architecture.py18
-rw-r--r--python/basicblock.py2
-rw-r--r--python/binaryview.py6
-rw-r--r--python/callingconvention.py2
-rw-r--r--python/function.py8
-rw-r--r--python/platform.py2
6 files changed, 23 insertions, 15 deletions
diff --git a/python/architecture.py b/python/architecture.py
index 781edcfd..c5f87ec6 100644
--- a/python/architecture.py
+++ b/python/architecture.py
@@ -44,7 +44,7 @@ class _ArchitectureMetaClass(type):
archs = core.BNGetArchitectureList(count)
result = []
for i in xrange(0, count.value):
- result.append(CoreArchitecture(archs[i]))
+ result.append(CoreArchitecture._from_cache(archs[i]))
core.BNFreeArchitectureList(archs)
return result
@@ -54,7 +54,7 @@ class _ArchitectureMetaClass(type):
archs = core.BNGetArchitectureList(count)
try:
for i in xrange(0, count.value):
- yield CoreArchitecture(archs[i])
+ yield CoreArchitecture._from_cache(archs[i])
finally:
core.BNFreeArchitectureList(archs)
@@ -63,7 +63,7 @@ class _ArchitectureMetaClass(type):
arch = core.BNGetArchitectureByName(name)
if arch is None:
raise KeyError("'%s' is not a valid architecture" % str(name))
- return CoreArchitecture(arch)
+ return CoreArchitecture._from_cache(arch)
def register(cls):
startup._init_plugins()
@@ -2037,6 +2037,7 @@ class Architecture(object):
core.BNRegisterCallingConvention(self.handle, cc.handle)
+_architecture_cache = {}
class CoreArchitecture(Architecture):
def __init__(self, handle):
super(CoreArchitecture, self).__init__()
@@ -2256,12 +2257,19 @@ class CoreArchitecture(Architecture):
self._intrinsics[name] = intrinsics[i]
self._intrinsics_by_index[intrinsics[i]] = (name, self.intrinsics[name])
core.BNFreeRegisterList(intrinsics)
+ global _architecture_cache
+ _architecture_cache[ctypes.addressof(handle.contents)] = self
+
+ @classmethod
+ def _from_cache(cls, handle):
+ global _architecture_cache
+ return _architecture_cache.get(ctypes.addressof(handle.contents)) or cls(handle)
def get_associated_arch_by_address(self, addr):
new_addr = ctypes.c_ulonglong()
new_addr.value = addr
result = core.BNGetAssociatedArchitectureByAddress(self.handle, new_addr)
- return CoreArchitecture(handle = result), new_addr.value
+ return CoreArchitecture._from_cache(handle = result), new_addr.value
def get_instruction_info(self, data, addr):
"""
@@ -2289,7 +2297,7 @@ class CoreArchitecture(Architecture):
for i in xrange(0, info.branchCount):
target = info.branchTarget[i]
if info.branchArch[i]:
- arch = CoreArchitecture(info.branchArch[i])
+ arch = CoreArchitecture._from_cache(info.branchArch[i])
else:
arch = None
result.add_branch(BranchType(info.branchType[i]), target, arch)
diff --git a/python/basicblock.py b/python/basicblock.py
index c93d0b2c..1d932c5e 100644
--- a/python/basicblock.py
+++ b/python/basicblock.py
@@ -100,7 +100,7 @@ class BasicBlock(object):
arch = core.BNGetBasicBlockArchitecture(self.handle)
if arch is None:
return None
- self._arch = architecture.CoreArchitecture(arch)
+ self._arch = architecture.CoreArchitecture._from_cache(arch)
return self._arch
@property
diff --git a/python/binaryview.py b/python/binaryview.py
index 3af0ee50..0cf25e70 100644
--- a/python/binaryview.py
+++ b/python/binaryview.py
@@ -411,7 +411,7 @@ class BinaryViewType(object):
arch = core.BNGetArchitectureForViewType(self.handle, ident, endian)
if arch is None:
return None
- return architecture.CoreArchitecture(arch)
+ return architecture.CoreArchitecture._from_cache(arch)
def register_platform(self, ident, arch, plat):
core.BNRegisterPlatformForViewType(self.handle, ident, arch.handle, plat.handle)
@@ -823,7 +823,7 @@ class BinaryView(object):
arch = core.BNGetDefaultArchitecture(self.handle)
if arch is None:
return None
- return architecture.CoreArchitecture(handle=arch)
+ return architecture.CoreArchitecture._from_cache(handle=arch)
@arch.setter
def arch(self, value):
@@ -2211,7 +2211,7 @@ class BinaryView(object):
else:
func = None
if refs[i].arch:
- arch = architecture.CoreArchitecture(refs[i].arch)
+ arch = architecture.CoreArchitecture._from_cache(refs[i].arch)
else:
arch = None
addr = refs[i].addr
diff --git a/python/callingconvention.py b/python/callingconvention.py
index 49ef7666..e3ec7261 100644
--- a/python/callingconvention.py
+++ b/python/callingconvention.py
@@ -75,7 +75,7 @@ class CallingConvention(object):
self.__class__._registered_calling_conventions.append(self)
else:
self.handle = handle
- self.arch = architecture.CoreArchitecture(core.BNGetCallingConventionArchitecture(self.handle))
+ self.arch = architecture.CoreArchitecture._from_cache(core.BNGetCallingConventionArchitecture(self.handle))
self.__dict__["name"] = core.BNGetCallingConventionName(self.handle)
self.__dict__["arg_regs_share_index"] = core.BNAreArgumentRegistersSharedIndex(self.handle)
self.__dict__["stack_reserved_for_arg_regs"] = core.BNIsStackReservedForArgumentRegisters(self.handle)
diff --git a/python/function.py b/python/function.py
index 0d796d98..8c4b7765 100644
--- a/python/function.py
+++ b/python/function.py
@@ -420,7 +420,7 @@ class Function(object):
arch = core.BNGetFunctionArchitecture(self.handle)
if arch is None:
return None
- self._arch = architecture.CoreArchitecture(arch)
+ self._arch = architecture.CoreArchitecture._from_cache(arch)
return self._arch
@property
@@ -558,7 +558,7 @@ class Function(object):
branches = core.BNGetIndirectBranches(self.handle, count)
result = []
for i in xrange(0, count.value):
- result.append(IndirectBranchInfo(architecture.CoreArchitecture(branches[i].sourceArch), branches[i].sourceAddr, architecture.Architecture(branches[i].destArch), branches[i].destAddr, branches[i].autoDefined))
+ result.append(IndirectBranchInfo(architecture.CoreArchitecture._from_cache(branches[i].sourceArch), branches[i].sourceAddr, architecture.Architecture(branches[i].destArch), branches[i].destAddr, branches[i].autoDefined))
core.BNFreeIndirectBranchList(branches)
return result
@@ -1142,7 +1142,7 @@ class Function(object):
branches = core.BNGetIndirectBranchesAt(self.handle, arch.handle, addr, count)
result = []
for i in xrange(0, count.value):
- result.append(IndirectBranchInfo(architecture.CoreArchitecture(branches[i].sourceArch), branches[i].sourceAddr, architecture.Architecture(branches[i].destArch), branches[i].destAddr, branches[i].autoDefined))
+ result.append(IndirectBranchInfo(architecture.CoreArchitecture._from_cache(branches[i].sourceArch), branches[i].sourceAddr, architecture.Architecture(branches[i].destArch), branches[i].destAddr, branches[i].autoDefined))
core.BNFreeIndirectBranchList(branches)
return result
@@ -1660,7 +1660,7 @@ class FunctionGraphBlock(object):
arch = core.BNGetFunctionGraphBlockArchitecture(self.handle)
if arch is None:
return None
- return architecture.CoreArchitecture(arch)
+ return architecture.CoreArchitecture._from_cache(arch)
@property
def start(self):
diff --git a/python/platform.py b/python/platform.py
index 09670bac..a79e3b9a 100644
--- a/python/platform.py
+++ b/python/platform.py
@@ -105,7 +105,7 @@ class Platform(object):
else:
self.handle = handle
self.__dict__["name"] = core.BNGetPlatformName(self.handle)
- self.arch = architecture.CoreArchitecture(core.BNGetPlatformArchitecture(self.handle))
+ self.arch = architecture.CoreArchitecture._from_cache(core.BNGetPlatformArchitecture(self.handle))
def __del__(self):
core.BNFreePlatform(self.handle)