From 15fff13e2baa7b5624910a4e0305c8030623fd96 Mon Sep 17 00:00:00 2001 From: tzickel Date: Wed, 28 Aug 2019 19:57:12 +0200 Subject: [PATCH 1/2] added support for buffer / memoryview data --- src/genpy/generator.py | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/genpy/generator.py b/src/genpy/generator.py index 5c3ad50..e972aa9 100644 --- a/src/genpy/generator.py +++ b/src/genpy/generator.py @@ -77,6 +77,7 @@ from . generate_struct import pack from . generate_struct import pack2 from . generate_struct import reduce_pattern +from . generate_struct import serialize as serializeit from . generate_struct import unpack from . generate_struct import unpack2 from . generate_struct import unpack3 @@ -471,15 +472,25 @@ def string_serializer_generator(package, type_, name, serialize): # noqa: D401 if base_type in ['uint8', 'char']: yield '# - if encoded as a list instead, serialize as bytes instead of string' if array_len is None: - yield 'if type(%s) in [list, tuple]:' % var - yield INDENT+pack2("' Date: Fri, 25 Nov 2022 19:04:36 +0100 Subject: [PATCH 2/2] 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("'