From 4e02c34a5bc68f4260d71adfa23501d75211a129 Mon Sep 17 00:00:00 2001 From: James Westman Date: Tue, 13 Jun 2023 17:39:59 -0500 Subject: [PATCH 1/2] Minor performance optimizations --- blueprintcompiler/gir.py | 24 +++++++++++++++--------- blueprintcompiler/language/ui.py | 4 +++- blueprintcompiler/typelib.py | 4 +--- 3 files changed, 19 insertions(+), 13 deletions(-) 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: From f526cfa4d92a02be1eeb539076e22b06bc9ab887 Mon Sep 17 00:00:00 2001 From: AkshayWarrier Date: Mon, 12 Jun 2023 22:23:30 +0530 Subject: [PATCH 2/2] lsp: Decompile empty XML docs to empty strings --- blueprintcompiler/lsp.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/blueprintcompiler/lsp.py b/blueprintcompiler/lsp.py index 5f6b5a2..58d6fac 100644 --- a/blueprintcompiler/lsp.py +++ b/blueprintcompiler/lsp.py @@ -292,16 +292,19 @@ class LanguageServer: def decompile(self, id, params): text = params.get("text") blp = None - - try: - blp = decompiler.decompile_string(text) - except decompiler.UnsupportedError as e: - self._send_error(id, ErrorCode.RequestFailed, e.message) - return - except: - printerr(traceback.format_exc()) - self._send_error(id, ErrorCode.RequestFailed, "Invalid input") - return + if text.strip() == "": + blp = "" + printerr("Decompiled to empty blueprint because input was empty") + else: + try: + blp = decompiler.decompile_string(text) + except decompiler.UnsupportedError as e: + self._send_error(id, ErrorCode.RequestFailed, e.message) + return + except: + printerr(traceback.format_exc()) + self._send_error(id, ErrorCode.RequestFailed, "Invalid input") + return self._send_response(id, {"blp": blp})