feat: improve performance of unmarshalling headers (#88)

This commit is contained in:
J. Nick Koston 2022-10-08 14:22:24 -10:00 committed by GitHub
parent 3eda23f1ad
commit b6d40691fd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 7 deletions

View File

@ -81,6 +81,7 @@ cdef class Unmarshaller:
@cython.locals(
beginning_pos=cython.ulong,
o=cython.ulong,
field_0=cython.uint,
signature_len=cython.uint,
)
cdef header_fields(self, unsigned int header_length)

View File

@ -269,7 +269,7 @@ class Unmarshaller:
return self._buf[str_start : self._pos - 1].decode()
def read_signature(self, type_: SignatureType) -> str:
signature_len = self._view[self._pos] # byte
signature_len = self._buf[self._pos] # byte
o = self._pos + 1
# read terminating '\0' byte as well (str_length + 1)
self._pos = o + signature_len + 1
@ -277,9 +277,12 @@ class Unmarshaller:
def read_variant(self, type_: SignatureType) -> Variant:
tree = get_signature_tree(self.read_signature(type_))
signature_type = tree.types[0]
# verify in Variant is only useful on construction not unmarshalling
return Variant(
tree, self._readers[tree.types[0].token](self, tree.types[0]), verify=False
tree,
self._readers[signature_type.token](self, signature_type),
verify=False,
)
def read_struct(self, type_: SignatureType) -> List[Any]:
@ -343,18 +346,19 @@ class Unmarshaller:
"""Header fields are always a(yv)."""
beginning_pos = self._pos
headers = {}
buf = self._buf
readers = self._readers
while self._pos - beginning_pos < header_length:
# Now read the y (byte) of struct (yv)
self._pos += (-self._pos & 7) + 1 # align 8 + 1 for 'y' byte
field_0 = self._view[self._pos - 1]
field_0 = buf[self._pos - 1]
# Now read the v (variant) of struct (yv)
signature_len = self._view[self._pos] # byte
signature_len = buf[self._pos] # byte
o = self._pos + 1
self._pos += signature_len + 2 # one for the byte, one for the '\0'
tree = get_signature_tree(self._buf[o : o + signature_len].decode())
type_ = tree.types[0]
headers[HEADER_MESSAGE_ARG_NAME[field_0]] = self._readers[type_.token](
type_ = get_signature_tree(buf[o : o + signature_len].decode()).types[0]
headers[HEADER_MESSAGE_ARG_NAME[field_0]] = readers[type_.token](
self, type_
)
return headers