diff options
| author | Alexander Larsson <alexl@redhat.com> | 2010-06-18 17:09:58 +0200 |
|---|---|---|
| committer | Marc-André Lureau <marcandre.lureau@gmail.com> | 2012-03-20 15:25:44 +0100 |
| commit | 53f8a1a7baf35d67b29ab9a9acbaf72a5a92bfa3 (patch) | |
| tree | 8dd10f5092a035287d779ee35966363ace075136 /python_modules | |
| parent | cc71d4989b327f33dec397611d5ed19a7518416f (diff) | |
| download | spice-common-53f8a1a7baf35d67b29ab9a9acbaf72a5a92bfa3.tar.gz spice-common-53f8a1a7baf35d67b29ab9a9acbaf72a5a92bfa3.tar.xz spice-common-53f8a1a7baf35d67b29ab9a9acbaf72a5a92bfa3.zip | |
Support @as_ptr in demarshaller to avoid copying data unnecessary
Diffstat (limited to 'python_modules')
| -rw-r--r-- | python_modules/demarshal.py | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/python_modules/demarshal.py b/python_modules/demarshal.py index fcd6850..8b90458 100644 --- a/python_modules/demarshal.py +++ b/python_modules/demarshal.py @@ -760,7 +760,19 @@ def write_member_parser(writer, container, member, dest, scope): #TODO validate e.g. flags and enums elif t.is_array(): nelements = read_array_len(writer, member.name, t, dest, scope, handles_bytes = True) - write_array_parser(writer, nelements, t, dest, scope) + if member.has_attr("as_ptr") and t.element_type.is_fixed_nw_size(): + writer.comment("use array as pointer").newline() + writer.assign(dest.get_ref(member.name), "(%s *)in" % t.element_type.c_type()) + len_var = member.attributes["as_ptr"] + if len(len_var) > 0: + writer.assign(dest.get_ref(len_var[0]), nelements) + el_size = t.element_type.get_fixed_nw_size() + if el_size != 1: + writer.increment("in", "%s * %s" % (nelements, el_size)) + else: + writer.increment("in", "%s" % (nelements)) + else: + write_array_parser(writer, nelements, t, dest, scope) elif t.is_struct(): if member.has_end_attr(): dest2 = dest.child_at_end(writer, t) |
