From ca6441caba6c6c0c8a0ae3e3f8eea01b67c31d76 Mon Sep 17 00:00:00 2001 From: Martin Pecka Date: Fri, 25 Nov 2022 19:04:36 +0100 Subject: [PATCH] Better support for serializing buffer protocol objects. Added tests. Signed-off-by: Martin Pecka --- src/genpy/generate_struct.py | 14 +++ src/genpy/generator.py | 26 +++-- src/genpy/message.py | 16 ++- test/files/array/uint8_fixed_ser.txt | 21 +++- test/files/array/uint8_fixed_ser_np.txt | 21 +++- test/files/array/uint8_varlen_ser.txt | 17 ++- test/files/array/uint8_varlen_ser_np.txt | 17 ++- test/msg/TestBinary.msg | 2 + test/test_genpy_generator.py | 17 ++- test/test_genpy_message.py | 135 +++++++++++++++++++++++ 10 files changed, 253 insertions(+), 33 deletions(-) create mode 100644 test/msg/TestBinary.msg diff --git a/src/genpy/generate_struct.py b/src/genpy/generate_struct.py index e6fa8f3..eac107a 100644 --- a/src/genpy/generate_struct.py +++ b/src/genpy/generate_struct.py @@ -186,3 +186,17 @@ def unpack3(var, struct_var, buff): :param buff: buffer that the unpack reads from, ``StringIO`` """ return '%s = %s.unpack(%s)' % (var, struct_var, buff) + + +def memoryview_len(view): + """ + Compute the size (in bytes) of a ``memoryview`` object. + + This is the same as memoryview.nbytes, but compatible with Python 2. + + :param view: The ``memoryview`` object. + """ + length = view.itemsize + for s in view.shape: + length *= s + return length diff --git a/src/genpy/generator.py b/src/genpy/generator.py index e972aa9..f5c56ef 100644 --- a/src/genpy/generator.py +++ b/src/genpy/generator.py @@ -470,27 +470,37 @@ def string_serializer_generator(package, type_, name, serialize): # noqa: D401 # check to see if its a uint8/byte type, in which case we need to convert to string before serializing base_type, is_array, array_len = genmsg.msgs.parse_type(type_) if base_type in ['uint8', 'char']: - yield '# - if encoded as a list instead, serialize as bytes instead of string' + yield '# check for buffer protocol support' if array_len is None: yield 'try:' - yield INDENT+'tmp = memoryview(%s) if python3 else buffer(%s)' % (var, var) - yield INDENT+pack2("'