summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2010-07-20 11:34:23 +0200
committerAlexander Larsson <alexl@redhat.com>2010-07-20 11:34:23 +0200
commit2e9604d00d655f276f22b9ad1cce4fb631ac06a8 (patch)
tree51ddc427773a95f852744eb3fd8089c33d6ad893
parent5f664e0ffb62c4a1d13b7647aea3c1115150eb88 (diff)
downloadspice-2e9604d00d655f276f22b9ad1cce4fb631ac06a8.tar.gz
spice-2e9604d00d655f276f22b9ad1cce4fb631ac06a8.tar.xz
spice-2e9604d00d655f276f22b9ad1cce4fb631ac06a8.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.
-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 a4345d4d..c588f980 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"):