summaryrefslogtreecommitdiffstats
path: root/python_modules/demarshal.py
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2010-06-18 17:09:58 +0200
committerAlexander Larsson <alexl@redhat.com>2010-06-18 20:27:32 +0200
commit7fa29ea67e5202d4a3f6678445cef9bcad54aa79 (patch)
tree94e85aafe9953bbfda1c9447d460d7aa7cfc3636 /python_modules/demarshal.py
parent0b82006733e2eba89c32ac4dfb35e6db49cfa992 (diff)
downloadspice-7fa29ea67e5202d4a3f6678445cef9bcad54aa79.tar.gz
spice-7fa29ea67e5202d4a3f6678445cef9bcad54aa79.tar.xz
spice-7fa29ea67e5202d4a3f6678445cef9bcad54aa79.zip
Support @as_ptr in demarshaller to avoid copying data unnecessary
Diffstat (limited to 'python_modules/demarshal.py')
-rw-r--r--python_modules/demarshal.py14
1 files changed, 13 insertions, 1 deletions
diff --git a/python_modules/demarshal.py b/python_modules/demarshal.py
index fcd68508..8b90458c 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)