Skip to content

Commit

Permalink
added support for buffer / memoryview data
Browse files Browse the repository at this point in the history
  • Loading branch information
tzickel authored and peci1 committed Nov 25, 2022
1 parent d329672 commit 15fff13
Showing 1 changed file with 19 additions and 8 deletions.
27 changes: 19 additions & 8 deletions src/genpy/generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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("'<I%sB'%length", 'length, *%s' % var)
yield 'else:'
yield INDENT+pack2("'<I%ss'%length", 'length, %s' % var)
yield 'try:'
yield INDENT+'tmp = memoryview(%s) if python3 else buffer(%s)' % (var, var)
yield INDENT+pack2("'<I'", "tmp.nbytes if python3 else len(tmp)")
yield INDENT+serializeit('tmp')
yield 'except Exception:'
yield INDENT+'if type(%s) in [list, tuple]:' % var
yield INDENT+INDENT+pack2("'<I%sB'%length", 'length, *%s' % var)
yield INDENT+'else:'
yield INDENT+INDENT+pack2("'<I%ss'%length", 'length, %s' % var)
else:
yield 'if type(%s) in [list, tuple]:' % var
yield INDENT+pack('%sB' % array_len, '*%s' % var)
yield 'else:'
yield INDENT+pack('%ss' % array_len, var)
yield 'try:'
yield INDENT+'tmp = memoryview(%s)[:%s] if python3 else buffer(%s, 0, %s)' % (
var, array_len, var, array_len)
yield INDENT+serializeit('tmp')
yield 'except Exception:'
yield INDENT+'if type(%s) in [list, tuple]:' % var
yield INDENT+INDENT+pack('%sB' % array_len, '*%s' % var)
yield INDENT+'else:'
yield INDENT+INDENT+pack('%ss' % array_len, var)
else:
# FIXME: for py3k, this needs to be w/ encode(), but this interferes with actual byte data
yield 'if python3 or type(%s) == unicode:' % (var)
Expand Down

0 comments on commit 15fff13

Please sign in to comment.