feat: speed up marshalling (#32)
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
from struct import Struct, error, pack
|
from struct import Struct, error, pack
|
||||||
from typing import Any, Callable, Dict, List, Optional, Tuple
|
from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple
|
||||||
|
|
||||||
from ..signature import SignatureTree, SignatureType, Variant
|
from ..signature import SignatureTree, SignatureType, Variant
|
||||||
|
|
||||||
@@ -48,7 +48,7 @@ class Marshaller:
|
|||||||
written += self.write_single(variant.type, variant.value)
|
written += self.write_single(variant.type, variant.value)
|
||||||
return written
|
return written
|
||||||
|
|
||||||
def write_array(self, array: Any, type_: SignatureType) -> int:
|
def write_array(self, array: Iterable[Any], type_: SignatureType) -> int:
|
||||||
# TODO max array size is 64MiB (67108864 bytes)
|
# TODO max array size is 64MiB (67108864 bytes)
|
||||||
written = self.align(4)
|
written = self.align(4)
|
||||||
# length placeholder
|
# length placeholder
|
||||||
@@ -68,9 +68,19 @@ class Marshaller:
|
|||||||
elif child_type.token == "y":
|
elif child_type.token == "y":
|
||||||
array_len = len(array)
|
array_len = len(array)
|
||||||
self.buffer.extend(array)
|
self.buffer.extend(array)
|
||||||
|
elif child_type.token in self._writers:
|
||||||
|
writer, packer, size = self._writers[child_type.token]
|
||||||
|
if not writer:
|
||||||
|
for value in array:
|
||||||
|
array_len += self.align(size) + size
|
||||||
|
self.buffer.extend(packer(value))
|
||||||
|
else:
|
||||||
|
for value in array:
|
||||||
|
array_len += writer(self, value, child_type)
|
||||||
else:
|
else:
|
||||||
for value in array:
|
raise NotImplementedError(
|
||||||
array_len += self.write_single(child_type, value)
|
f'type is not implemented yet: "{child_type.token}"'
|
||||||
|
)
|
||||||
|
|
||||||
array_len_packed = PACK_UINT32(array_len)
|
array_len_packed = PACK_UINT32(array_len)
|
||||||
for i in range(offset, offset + 4):
|
for i in range(offset, offset + 4):
|
||||||
@@ -97,7 +107,7 @@ class Marshaller:
|
|||||||
raise NotImplementedError(f'type is not implemented yet: "{t}"')
|
raise NotImplementedError(f'type is not implemented yet: "{t}"')
|
||||||
|
|
||||||
writer, packer, size = self._writers[t]
|
writer, packer, size = self._writers[t]
|
||||||
if packer and size:
|
if not writer:
|
||||||
written = self.align(size)
|
written = self.align(size)
|
||||||
self.buffer.extend(packer(body))
|
self.buffer.extend(packer(body))
|
||||||
return written + size
|
return written + size
|
||||||
@@ -119,7 +129,7 @@ class Marshaller:
|
|||||||
raise NotImplementedError(f'type is not implemented yet: "{t}"')
|
raise NotImplementedError(f'type is not implemented yet: "{t}"')
|
||||||
|
|
||||||
writer, packer, size = self._writers[t]
|
writer, packer, size = self._writers[t]
|
||||||
if packer and size:
|
if not writer:
|
||||||
|
|
||||||
# In-line align
|
# In-line align
|
||||||
offset = size - len(self.buffer) % size
|
offset = size - len(self.buffer) % size
|
||||||
|
|||||||
Reference in New Issue
Block a user