Skip to content

Commit 3674042

Browse files
committed
Merge: Cache children for debugging and (probably) perf
1 parent 2184361 commit 3674042

1 file changed

Lines changed: 24 additions & 0 deletions

File tree

python/database.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,8 @@ def analysis_cache(self) -> KeyValueStore:
375375
class DatabaseObject:
376376
def __init__(self, handle):
377377
self.handle = core.handle_of_type(handle, core.BNDatabaseObject)
378+
self._children = None
379+
self._dependencies = None
378380

379381
def __del__(self):
380382
core.BNFreeDatabaseObject(self.handle)
@@ -411,6 +413,11 @@ def parent(self) -> Optional['DatabaseObject']:
411413
@property
412414
def children(self) -> Dict[str, 'DatabaseObject']:
413415
"""Get dictionary of child objects (read-only)"""
416+
if self._children is None:
417+
self._children = self._generate_children()
418+
return self._children
419+
420+
def _generate_children(self) -> Dict[str, 'DatabaseObject']:
414421
names = ctypes.POINTER(ctypes.c_char_p)()
415422
objects = ctypes.POINTER(core.BNDatabaseObjectHandle)()
416423
count = core.BNGetDatabaseObjectChildren(
@@ -431,6 +438,11 @@ def children(self) -> Dict[str, 'DatabaseObject']:
431438
@property
432439
def dependencies(self) -> List[str]:
433440
"""Get list of dependencies for this database object (read-only)"""
441+
if self._dependencies is None:
442+
self._dependencies = self._generate_dependencies()
443+
return self._dependencies
444+
445+
def _generate_dependencies(self) -> List[str]:
434446
count = ctypes.c_size_t()
435447
deps = core.BNGetDatabaseObjectDependencies(self.handle, ctypes.byref(count))
436448
try:
@@ -503,10 +515,17 @@ def is_applied(self, object: 'DiffObject') -> bool:
503515
class DiffObject:
504516
def __init__(self, handle):
505517
self.handle = core.handle_of_type(handle, core.BNDiffObject)
518+
self._children = None
506519

507520
def __del__(self):
508521
core.BNFreeDiffObject(self.handle)
509522

523+
def __str__(self):
524+
return f"<diff {self.base}/{self.left}/{self.right}>"
525+
526+
def __repr__(self):
527+
return f"<diff {self.base}/{self.left}/{self.right}>"
528+
510529
@property
511530
def base(self) -> Optional[str]:
512531
"""Get the base path for the diff object (read-only)"""
@@ -534,6 +553,11 @@ def right(self) -> Optional[str]:
534553
@property
535554
def children(self) -> Dict[str, 'DiffObject']:
536555
"""Get dictionary of child diff objects (read-only)"""
556+
if self._children is None:
557+
self._children = self._generate_children()
558+
return self._children
559+
560+
def _generate_children(self) -> Dict[str, 'DiffObject']:
537561
names = ctypes.POINTER(ctypes.c_char_p)()
538562
objects = ctypes.POINTER(ctypes.POINTER(core.BNDiffObject))()
539563
count = core.BNGetDiffObjectChildren(

0 commit comments

Comments
 (0)