From b8d0e9be4c7eb7c16347e7bf57f8bf40d0c293d0 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 6 Sep 2023 11:26:08 -0500 Subject: [PATCH] feat: small speed up to the unmarshaller (#238) --- src/dbus_fast/_private/unmarshaller.pxd | 6 +++--- src/dbus_fast/_private/unmarshaller.py | 25 +++++++++++-------------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/dbus_fast/_private/unmarshaller.pxd b/src/dbus_fast/_private/unmarshaller.pxd index 76610f91..7539015b 100644 --- a/src/dbus_fast/_private/unmarshaller.pxd +++ b/src/dbus_fast/_private/unmarshaller.pxd @@ -177,14 +177,14 @@ cdef class Unmarshaller: ) cdef Variant _read_variant(self) - cpdef read_array(self, SignatureType type_) - @cython.locals( beginning_pos=cython.ulong, array_length=cython.uint, child_type=SignatureType, + child_0=SignatureType, + child_1=SignatureType, ) - cdef object _read_array(self, SignatureType type_) + cpdef object read_array(self, SignatureType type_) cpdef read_signature(self, SignatureType type_) diff --git a/src/dbus_fast/_private/unmarshaller.py b/src/dbus_fast/_private/unmarshaller.py index 1745c61c..a3626c7b 100644 --- a/src/dbus_fast/_private/unmarshaller.py +++ b/src/dbus_fast/_private/unmarshaller.py @@ -440,12 +440,12 @@ def _read_variant(self) -> Variant: return Variant(SIGNATURE_TREE_N, self._read_int16_unpack(), False) elif signature == "ay": return Variant( - SIGNATURE_TREE_AY, self._read_array(SIGNATURE_TREE_AY_TYPES_0), False + SIGNATURE_TREE_AY, self.read_array(SIGNATURE_TREE_AY_TYPES_0), False ) elif signature == "a{qv}": return Variant( SIGNATURE_TREE_A_QV, - self._read_array(SIGNATURE_TREE_A_QV_TYPES_0), + self.read_array(SIGNATURE_TREE_A_QV_TYPES_0), False, ) elif signature == "s": @@ -456,17 +456,17 @@ def _read_variant(self) -> Variant: return Variant(SIGNATURE_TREE_O, self._read_string_unpack(), False) elif signature == "as": return Variant( - SIGNATURE_TREE_AS, self._read_array(SIGNATURE_TREE_AS_TYPES_0), False + SIGNATURE_TREE_AS, self.read_array(SIGNATURE_TREE_AS_TYPES_0), False ) elif signature == "a{sv}": return Variant( SIGNATURE_TREE_A_SV, - self._read_array(SIGNATURE_TREE_A_SV_TYPES_0), + self.read_array(SIGNATURE_TREE_A_SV_TYPES_0), False, ) elif signature == "ao": return Variant( - SIGNATURE_TREE_AO, self._read_array(SIGNATURE_TREE_AO_TYPES_0), False + SIGNATURE_TREE_AO, self.read_array(SIGNATURE_TREE_AO_TYPES_0), False ) elif signature == "u": return Variant(SIGNATURE_TREE_U, self._read_uint32_unpack(), False) @@ -495,9 +495,6 @@ def read_dict_entry(self, type_: _SignatureType) -> Tuple[Any, Any]: ), self._readers[type_.children[1].token](self, type_.children[1]) def read_array(self, type_: _SignatureType) -> Iterable[Any]: - return self._read_array(type_) - - def _read_array(self, type_: _SignatureType) -> Iterable[Any]: self._pos += -self._pos & 3 # align 4 for the array self._pos += ( -self._pos & (UINT32_SIZE - 1) @@ -547,7 +544,7 @@ def _read_array(self, type_: _SignatureType) -> Iterable[Any]: while self._pos - beginning_pos < array_length: self._pos += -self._pos & 7 # align 8 key = self._read_string_unpack() - result_dict[key] = self._read_array(child_1) + result_dict[key] = self.read_array(child_1) else: reader_1 = self._readers[child_1_token] reader_0 = self._readers[child_0_token] @@ -680,24 +677,24 @@ def _read_body(self) -> None: tree = SIGNATURE_TREE_SA_SV_AS body = [ self._read_string_unpack(), - self._read_array(SIGNATURE_TREE_SA_SV_AS_TYPES_1), - self._read_array(SIGNATURE_TREE_SA_SV_AS_TYPES_2), + self.read_array(SIGNATURE_TREE_SA_SV_AS_TYPES_1), + self.read_array(SIGNATURE_TREE_SA_SV_AS_TYPES_2), ] elif signature == "oa{sa{sv}}": tree = SIGNATURE_TREE_OA_SA_SV body = [ self._read_string_unpack(), - self._read_array(SIGNATURE_TREE_OA_SA_SV_TYPES_1), + self.read_array(SIGNATURE_TREE_OA_SA_SV_TYPES_1), ] elif signature == "oas": tree = SIGNATURE_TREE_OAS body = [ self._read_string_unpack(), - self._read_array(SIGNATURE_TREE_OAS_TYPES_1), + self.read_array(SIGNATURE_TREE_OAS_TYPES_1), ] elif signature == "a{oa{sa{sv}}}": tree = SIGNATURE_TREE_A_OA_SA_SV - body = [self._read_array(SIGNATURE_TREE_A_OA_SA_SV_TYPES_0)] + body = [self.read_array(SIGNATURE_TREE_A_OA_SA_SV_TYPES_0)] elif signature == "o": tree = SIGNATURE_TREE_O body = [self._read_string_unpack()]