feat: small speed up to the unmarshaller (#238)
This commit is contained in:
@@ -177,14 +177,14 @@ cdef class Unmarshaller:
|
|||||||
)
|
)
|
||||||
cdef Variant _read_variant(self)
|
cdef Variant _read_variant(self)
|
||||||
|
|
||||||
cpdef read_array(self, SignatureType type_)
|
|
||||||
|
|
||||||
@cython.locals(
|
@cython.locals(
|
||||||
beginning_pos=cython.ulong,
|
beginning_pos=cython.ulong,
|
||||||
array_length=cython.uint,
|
array_length=cython.uint,
|
||||||
child_type=SignatureType,
|
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_)
|
cpdef read_signature(self, SignatureType type_)
|
||||||
|
|
||||||
|
|||||||
@@ -440,12 +440,12 @@ class Unmarshaller:
|
|||||||
return Variant(SIGNATURE_TREE_N, self._read_int16_unpack(), False)
|
return Variant(SIGNATURE_TREE_N, self._read_int16_unpack(), False)
|
||||||
elif signature == "ay":
|
elif signature == "ay":
|
||||||
return Variant(
|
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}":
|
elif signature == "a{qv}":
|
||||||
return Variant(
|
return Variant(
|
||||||
SIGNATURE_TREE_A_QV,
|
SIGNATURE_TREE_A_QV,
|
||||||
self._read_array(SIGNATURE_TREE_A_QV_TYPES_0),
|
self.read_array(SIGNATURE_TREE_A_QV_TYPES_0),
|
||||||
False,
|
False,
|
||||||
)
|
)
|
||||||
elif signature == "s":
|
elif signature == "s":
|
||||||
@@ -456,17 +456,17 @@ class Unmarshaller:
|
|||||||
return Variant(SIGNATURE_TREE_O, self._read_string_unpack(), False)
|
return Variant(SIGNATURE_TREE_O, self._read_string_unpack(), False)
|
||||||
elif signature == "as":
|
elif signature == "as":
|
||||||
return Variant(
|
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}":
|
elif signature == "a{sv}":
|
||||||
return Variant(
|
return Variant(
|
||||||
SIGNATURE_TREE_A_SV,
|
SIGNATURE_TREE_A_SV,
|
||||||
self._read_array(SIGNATURE_TREE_A_SV_TYPES_0),
|
self.read_array(SIGNATURE_TREE_A_SV_TYPES_0),
|
||||||
False,
|
False,
|
||||||
)
|
)
|
||||||
elif signature == "ao":
|
elif signature == "ao":
|
||||||
return Variant(
|
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":
|
elif signature == "u":
|
||||||
return Variant(SIGNATURE_TREE_U, self._read_uint32_unpack(), False)
|
return Variant(SIGNATURE_TREE_U, self._read_uint32_unpack(), False)
|
||||||
@@ -495,9 +495,6 @@ class Unmarshaller:
|
|||||||
), self._readers[type_.children[1].token](self, type_.children[1])
|
), self._readers[type_.children[1].token](self, type_.children[1])
|
||||||
|
|
||||||
def read_array(self, type_: _SignatureType) -> Iterable[Any]:
|
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 & 3 # align 4 for the array
|
||||||
self._pos += (
|
self._pos += (
|
||||||
-self._pos & (UINT32_SIZE - 1)
|
-self._pos & (UINT32_SIZE - 1)
|
||||||
@@ -547,7 +544,7 @@ class Unmarshaller:
|
|||||||
while self._pos - beginning_pos < array_length:
|
while self._pos - beginning_pos < array_length:
|
||||||
self._pos += -self._pos & 7 # align 8
|
self._pos += -self._pos & 7 # align 8
|
||||||
key = self._read_string_unpack()
|
key = self._read_string_unpack()
|
||||||
result_dict[key] = self._read_array(child_1)
|
result_dict[key] = self.read_array(child_1)
|
||||||
else:
|
else:
|
||||||
reader_1 = self._readers[child_1_token]
|
reader_1 = self._readers[child_1_token]
|
||||||
reader_0 = self._readers[child_0_token]
|
reader_0 = self._readers[child_0_token]
|
||||||
@@ -680,24 +677,24 @@ class Unmarshaller:
|
|||||||
tree = SIGNATURE_TREE_SA_SV_AS
|
tree = SIGNATURE_TREE_SA_SV_AS
|
||||||
body = [
|
body = [
|
||||||
self._read_string_unpack(),
|
self._read_string_unpack(),
|
||||||
self._read_array(SIGNATURE_TREE_SA_SV_AS_TYPES_1),
|
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_2),
|
||||||
]
|
]
|
||||||
elif signature == "oa{sa{sv}}":
|
elif signature == "oa{sa{sv}}":
|
||||||
tree = SIGNATURE_TREE_OA_SA_SV
|
tree = SIGNATURE_TREE_OA_SA_SV
|
||||||
body = [
|
body = [
|
||||||
self._read_string_unpack(),
|
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":
|
elif signature == "oas":
|
||||||
tree = SIGNATURE_TREE_OAS
|
tree = SIGNATURE_TREE_OAS
|
||||||
body = [
|
body = [
|
||||||
self._read_string_unpack(),
|
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}}}":
|
elif signature == "a{oa{sa{sv}}}":
|
||||||
tree = SIGNATURE_TREE_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":
|
elif signature == "o":
|
||||||
tree = SIGNATURE_TREE_O
|
tree = SIGNATURE_TREE_O
|
||||||
body = [self._read_string_unpack()]
|
body = [self._read_string_unpack()]
|
||||||
|
|||||||
Reference in New Issue
Block a user