diff --git a/blueprintcompiler/gir.py b/blueprintcompiler/gir.py index e85190b..b289b5e 100644 --- a/blueprintcompiler/gir.py +++ b/blueprintcompiler/gir.py @@ -638,29 +638,35 @@ class Namespace(GirNode): def __init__(self, repo: "Repository", tl: typelib.Typelib) -> None: super().__init__(repo, tl) - self.entries: T.Dict[str, GirType] = {} + @cached_property + def entries(self) -> T.Mapping[str, GirType]: + entries: dict[str, GirType] = {} + + n_local_entries: int = self.tl.HEADER_N_ENTRIES + directory: typelib.Typelib = self.tl.HEADER_DIRECTORY + blob_size: int = self.tl.header.HEADER_ENTRY_BLOB_SIZE - n_local_entries: int = tl.HEADER_N_ENTRIES - directory: typelib.Typelib = tl.HEADER_DIRECTORY for i in range(n_local_entries): - entry = directory[i * tl.HEADER_ENTRY_BLOB_SIZE] + entry = directory[i * blob_size] entry_name: str = entry.DIR_ENTRY_NAME entry_type: int = entry.DIR_ENTRY_BLOB_TYPE entry_blob: typelib.Typelib = entry.DIR_ENTRY_OFFSET if entry_type == typelib.BLOB_TYPE_ENUM: - self.entries[entry_name] = Enumeration(self, entry_blob) + entries[entry_name] = Enumeration(self, entry_blob) elif entry_type == typelib.BLOB_TYPE_FLAGS: - self.entries[entry_name] = Bitfield(self, entry_blob) + entries[entry_name] = Bitfield(self, entry_blob) elif entry_type == typelib.BLOB_TYPE_OBJECT: - self.entries[entry_name] = Class(self, entry_blob) + entries[entry_name] = Class(self, entry_blob) elif entry_type == typelib.BLOB_TYPE_INTERFACE: - self.entries[entry_name] = Interface(self, entry_blob) + entries[entry_name] = Interface(self, entry_blob) elif ( entry_type == typelib.BLOB_TYPE_BOXED or entry_type == typelib.BLOB_TYPE_STRUCT ): - self.entries[entry_name] = Boxed(self, entry_blob) + entries[entry_name] = Boxed(self, entry_blob) + + return entries @cached_property def xml(self): diff --git a/blueprintcompiler/language/ui.py b/blueprintcompiler/language/ui.py index 033e2ca..533d21b 100644 --- a/blueprintcompiler/language/ui.py +++ b/blueprintcompiler/language/ui.py @@ -17,6 +17,8 @@ # # SPDX-License-Identifier: LGPL-3.0-or-later +from functools import cached_property + from .. import gir from .imports import GtkDirective, Import from .gtkbuilder_template import Template @@ -42,7 +44,7 @@ class UI(AstNode): ), ] - @property + @cached_property def gir(self) -> gir.GirContext: gir_ctx = gir.GirContext() self._gir_errors = [] diff --git a/blueprintcompiler/typelib.py b/blueprintcompiler/typelib.py index 6babc10..54ee341 100644 --- a/blueprintcompiler/typelib.py +++ b/blueprintcompiler/typelib.py @@ -237,9 +237,7 @@ class Typelib: if loc == 0: return None - end = loc - while self._typelib_file[end] != 0: - end += 1 + end = self._typelib_file.find(b"\0", loc) return self._typelib_file[loc:end].decode("utf-8") def _int(self, size, signed) -> int: