From 261921717cac03d5e84b7c723abaf4e6066a7256 Mon Sep 17 00:00:00 2001 From: Jonathan Dorn Date: Fri, 16 Feb 2024 19:21:32 -0500 Subject: [PATCH] Use index for ProxyBlock.references --- CHANGELOG.md | 1 + python/gtirb/block.py | 28 ++++++++++++---------------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bff67f458..75a04486e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ * Stop generating debian metapackages and packages with the version attached to the package name. Updates in the apt-repository now support multiple package versions and upgrading `gtirb` with `apt-get upgrade`. +* Fix performance issue when checking references of ProxyBlocks in Python API. # 2.0.0 diff --git a/python/gtirb/block.py b/python/gtirb/block.py index a85820208..f152388f1 100644 --- a/python/gtirb/block.py +++ b/python/gtirb/block.py @@ -21,11 +21,22 @@ class Block(Node): of Block. """ + @property + def module(self) -> typing.Optional["Module"]: + """Get the module this node ultimately belongs to.""" + + raise NotImplementedError # pragma: no cover + @property def references(self) -> typing.Iterator["Symbol"]: """Get all the symbols that refer to this block.""" - raise NotImplementedError # pragma: no cover + if not self.module: + return + + symbol_set = self.module._symbol_referent_index.get(self) + if symbol_set: + yield from symbol_set def _add_to_uuid_cache(self, cache: typing.Dict[UUID, Node]) -> None: """Update the UUID cache when this node is added.""" @@ -117,15 +128,6 @@ def address(self) -> typing.Optional[int]: return None return self.byte_interval.address + self.offset - @property - def references(self) -> typing.Iterator["Symbol"]: - if not self.module: - return - - symbol_set = self.module._symbol_referent_index.get(self) - if symbol_set: - yield from symbol_set - @property def section(self) -> typing.Optional["Section"]: """Get the section this node ultimately belongs to.""" @@ -403,12 +405,6 @@ def module(self, value: typing.Optional["Module"]) -> None: if value is not None: value.proxies.add(self) - @property - def references(self) -> typing.Iterator["Symbol"]: - if self.module is None: - return iter(()) - return (s for s in self.module.symbols if s.referent == self) - @property def incoming_edges(self) -> typing.Iterator["Edge"]: if self.ir is None: