summaryrefslogtreecommitdiffstats
path: root/python_modules/demarshal.py
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2010-07-20 11:34:23 +0200
committerMarc-André Lureau <marcandre.lureau@gmail.com>2012-03-20 15:25:49 +0100
commitaae971c6abff7deacc9ffcde8aab87ded08b24c3 (patch)
treee163c7c6c98b7396c4bdfd471cd718e1c151f2dd /python_modules/demarshal.py
parent7861ba0921cae2a8616fa625693e3a887da43f94 (diff)
downloadspice-protocol-aae971c6abff7deacc9ffcde8aab87ded08b24c3.tar.gz
spice-protocol-aae971c6abff7deacc9ffcde8aab87ded08b24c3.tar.xz
spice-protocol-aae971c6abff7deacc9ffcde8aab87ded08b24c3.zip
demarshaller: Fix palette marshalling
It turns out that using base + sizeof(struct) is not a good way to access an array at the end of a struct. For SpicePalette sizeof is 16, but offset of ents is 12. Using this calculation in the demarshaller breaks things badly, so now we use the actual array member.
Diffstat (limited to 'python_modules/demarshal.py')
-rw-r--r--python_modules/demarshal.py46
1 files changed, 32 insertions, 14 deletions
diff --git a/python_modules/demarshal.py b/python_modules/demarshal.py
index a4345d4..c588f98 100644
--- a/python_modules/demarshal.py
+++ b/python_modules/demarshal.py
@@ -797,29 +797,47 @@ def write_array_parser(writer, member, nelements, array, dest, scope):
is_byte_size = array.is_bytes_length()
element_type = array.element_type
+ if member:
+ array_start = dest.get_ref(member.name)
+ at_end = member.has_attr("end")
+ else:
+ array_start = "end"
+ at_end = True
+
if element_type == ptypes.uint8 or element_type == ptypes.int8:
- if not member or member.has_attr("end"):
- writer.statement("memcpy(end, in, %s)" % (nelements))
- writer.increment("end", nelements)
- else:
- writer.statement("memcpy(%s, in, %s)" % (dest.get_ref(member.name), nelements))
+ writer.statement("memcpy(%s, in, %s)" % (array_start, nelements))
writer.increment("in", nelements)
+ if at_end:
+ writer.increment("end", nelements)
else:
- if array.has_attr("ptr_array"):
- scope.variable_def("void **", "ptr_array")
- scope.variable_def("int", "ptr_array_index")
- writer.assign("ptr_array_index", 0)
- writer.assign("ptr_array", "(void **)end")
- writer.increment("end", "sizeof(void *) * %s" % nelements)
with writer.index() as index:
+ if member:
+ array_pos = "%s[%s]" % (array_start, index)
+ else:
+ array_pos = "*(%s *)end" % (element_type.c_type())
+
+ if array.has_attr("ptr_array"):
+ scope.variable_def("void **", "ptr_array")
+ scope.variable_def("int", "ptr_array_index")
+ writer.assign("ptr_array_index", 0)
+ writer.assign("ptr_array", "(void **)%s" % array_start)
+ writer.increment("end", "sizeof(void *) * %s" % nelements)
+ array_start = "end"
+ array_pos = "*(%s *)end" % (element_type.c_type())
+ at_end = True
+
with writer.for_loop(index, nelements) as array_scope:
if array.has_attr("ptr_array"):
writer.statement("ptr_array[ptr_array_index++] = end")
if element_type.is_primitive():
- writer.statement("*(%s *)end = consume_%s(&in)" % (element_type.c_type(), element_type.primitive_type()))
- writer.increment("end", element_type.sizeof())
+ writer.statement("%s = consume_%s(&in)" % (array_pos, element_type.primitive_type()))
+ if at_end:
+ writer.increment("end", element_type.sizeof())
else:
- dest2 = dest.child_at_end(writer, element_type)
+ if at_end:
+ dest2 = dest.child_at_end(writer, element_type)
+ else:
+ dest2 = RootDemarshallingDestination(dest, element_type.c_type(), element_type.c_type(), array_pos)
dest2.reuse_scope = array_scope
write_container_parser(writer, element_type, dest2)
if array.has_attr("ptr_array"):