feat: speed up unmarshaller with common signature trees (#120)
Co-authored-by: David Lechner <david@lechnology.com>
This commit is contained in:
@@ -30,6 +30,14 @@ cdef object MESSAGE_TYPE_MAP
|
|||||||
cdef object MESSAGE_FLAG_MAP
|
cdef object MESSAGE_FLAG_MAP
|
||||||
cdef object HEADER_MESSAGE_ARG_NAME
|
cdef object HEADER_MESSAGE_ARG_NAME
|
||||||
|
|
||||||
|
cdef object SIGNATURE_TREE_EMPTY
|
||||||
|
cdef object SIGNATURE_TREE_SA_SV_AS
|
||||||
|
cdef object SIGNATURE_TREE_N
|
||||||
|
cdef object SIGNATURE_TREE_S
|
||||||
|
cdef object SIGNATURE_TREE_SA_SV_AS_TYPES_1
|
||||||
|
cdef object SIGNATURE_TREE_SA_SV_AS_TYPES_2
|
||||||
|
|
||||||
|
|
||||||
cpdef get_signature_tree
|
cpdef get_signature_tree
|
||||||
|
|
||||||
cdef inline unsigned long _cast_uint32_native(const char * payload, unsigned int offset):
|
cdef inline unsigned long _cast_uint32_native(const char * payload, unsigned int offset):
|
||||||
|
|||||||
@@ -50,6 +50,13 @@ HEADER_SIGNATURE_SIZE = 16
|
|||||||
HEADER_ARRAY_OF_STRUCT_SIGNATURE_POSITION = 12
|
HEADER_ARRAY_OF_STRUCT_SIGNATURE_POSITION = 12
|
||||||
|
|
||||||
|
|
||||||
|
SIGNATURE_TREE_EMPTY = get_signature_tree("")
|
||||||
|
SIGNATURE_TREE_N = get_signature_tree("n")
|
||||||
|
SIGNATURE_TREE_S = get_signature_tree("s")
|
||||||
|
SIGNATURE_TREE_SA_SV_AS = get_signature_tree("sa{sv}as")
|
||||||
|
SIGNATURE_TREE_SA_SV_AS_TYPES_1 = SIGNATURE_TREE_SA_SV_AS.types[1]
|
||||||
|
SIGNATURE_TREE_SA_SV_AS_TYPES_2 = SIGNATURE_TREE_SA_SV_AS.types[2]
|
||||||
|
|
||||||
HEADER_MESSAGE_ARG_NAME = {
|
HEADER_MESSAGE_ARG_NAME = {
|
||||||
1: "path",
|
1: "path",
|
||||||
2: "interface",
|
2: "interface",
|
||||||
@@ -293,9 +300,7 @@ class Unmarshaller:
|
|||||||
signature = self._read_signature()
|
signature = self._read_signature()
|
||||||
# verify in Variant is only useful on construction not unmarshalling
|
# verify in Variant is only useful on construction not unmarshalling
|
||||||
if signature == "n":
|
if signature == "n":
|
||||||
return Variant(
|
return Variant(SIGNATURE_TREE_N, self._read_int16_unpack(), False)
|
||||||
get_signature_tree(signature), self._read_int16_unpack(), False
|
|
||||||
)
|
|
||||||
tree = get_signature_tree(signature)
|
tree = get_signature_tree(signature)
|
||||||
signature_type = tree.types[0]
|
signature_type = tree.types[0]
|
||||||
return Variant(
|
return Variant(
|
||||||
@@ -465,19 +470,22 @@ class Unmarshaller:
|
|||||||
header_fields = self.header_fields(self._header_len)
|
header_fields = self.header_fields(self._header_len)
|
||||||
self._pos += -self._pos & 7 # align 8
|
self._pos += -self._pos & 7 # align 8
|
||||||
header_fields.pop("unix_fds", None) # defined by self._unix_fds
|
header_fields.pop("unix_fds", None) # defined by self._unix_fds
|
||||||
tree = get_signature_tree(header_fields.pop("signature", ""))
|
signature = header_fields.pop("signature", "")
|
||||||
if not self._body_len:
|
if not self._body_len:
|
||||||
|
tree = SIGNATURE_TREE_EMPTY
|
||||||
body = []
|
body = []
|
||||||
elif tree.signature == "s":
|
elif signature == "s":
|
||||||
|
tree = SIGNATURE_TREE_S
|
||||||
body = [self._read_string_unpack()]
|
body = [self._read_string_unpack()]
|
||||||
elif tree.signature == "sa{sv}as":
|
elif signature == "sa{sv}as":
|
||||||
types = tree.types
|
tree = SIGNATURE_TREE_SA_SV_AS
|
||||||
body = [
|
body = [
|
||||||
self._read_string_unpack(),
|
self._read_string_unpack(),
|
||||||
self._read_array(types[1]),
|
self._read_array(SIGNATURE_TREE_SA_SV_AS_TYPES_1),
|
||||||
self._read_array(types[2]),
|
self._read_array(SIGNATURE_TREE_SA_SV_AS_TYPES_2),
|
||||||
]
|
]
|
||||||
else:
|
else:
|
||||||
|
tree = get_signature_tree(signature)
|
||||||
body = [self._readers[t.token](self, t) for t in tree.types]
|
body = [self._readers[t.token](self, t) for t in tree.types]
|
||||||
|
|
||||||
self._message = Message(
|
self._message = Message(
|
||||||
|
|||||||
Reference in New Issue
Block a user