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 5c3ad50..f5c56ef 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 @@ -469,17 +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 'if type(%s) in [list, tuple]:' % var - yield INDENT+pack2("'