summaryrefslogtreecommitdiffstats
path: root/python_modules/demarshal.py
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2010-06-29 18:14:49 +0200
committerGerd Hoffmann <kraxel@redhat.com>2010-06-30 22:35:16 +0200
commitbb851317657e68239bedf2d3d4c23bea26156278 (patch)
treeec190bdc60989209d5be1ffe527eaee97a933283 /python_modules/demarshal.py
parenta93351f3674feddfc9a9716e94acd4c4b131a5f2 (diff)
downloadspice-bb851317657e68239bedf2d3d4c23bea26156278.tar.gz
spice-bb851317657e68239bedf2d3d4c23bea26156278.tar.xz
spice-bb851317657e68239bedf2d3d4c23bea26156278.zip
demarshaller: Support @c_ptr attributes for pointers
A @c_ptr pointer is stored in memory as a real pointer rather than a SPICE_ADDRESS. This is a temporary thing that will be removed again when all SPICE_ADDRESSes have been converted to real pointer.
Diffstat (limited to 'python_modules/demarshal.py')
-rw-r--r--python_modules/demarshal.py23
1 files changed, 16 insertions, 7 deletions
diff --git a/python_modules/demarshal.py b/python_modules/demarshal.py
index d8b8ea90..faaf8620 100644
--- a/python_modules/demarshal.py
+++ b/python_modules/demarshal.py
@@ -50,8 +50,9 @@ def write_parser_helpers(writer):
writer.begin_block("struct PointerInfo")
writer.variable_def("uint64_t", "offset")
writer.variable_def("parse_func_t", "parse")
- writer.variable_def("SPICE_ADDRESS *", "dest")
+ writer.variable_def("void *", "dest")
writer.variable_def("uint32_t", "nelements")
+ writer.variable_def("int", "is_ptr")
writer.end_block(semicolon=True)
def write_read_primitive(writer, start, container, name, scope):
@@ -636,7 +637,7 @@ def write_switch_parser(writer, container, switch, dest, scope):
if t.is_struct():
write_container_parser(writer, t, dest2)
elif t.is_pointer():
- write_parse_pointer(writer, t, False, dest2, m.name, block)
+ write_parse_pointer(writer, t, False, m.has_attr("c_ptr"), dest2, m.name, block)
elif t.is_primitive():
if not m.has_attr("zero"):
writer.assign(dest2.get_ref(m.name), "consume_%s(&in)" % (t.primitive_type()))
@@ -725,15 +726,16 @@ def write_array_parser(writer, nelements, array, dest, scope):
dest2.reuse_scope = array_scope
write_container_parser(writer, element_type, dest2)
-def write_parse_pointer(writer, t, at_end, dest, member_name, scope):
+def write_parse_pointer(writer, t, at_end, as_c_ptr, dest, member_name, scope):
target_type = t.target_type
writer.assign("ptr_info[n_ptr].offset", "consume_%s(&in)" % t.primitive_type())
writer.assign("ptr_info[n_ptr].parse", write_parse_ptr_function(writer, target_type))
if at_end:
writer.assign("ptr_info[n_ptr].dest", "end")
- writer.increment("end", "sizeof(SPICE_ADDRESS)");
+ writer.increment("end", "sizeof(void *)" if as_c_ptr else "sizeof(SPICE_ADDRESS)");
else:
writer.assign("ptr_info[n_ptr].dest", "&%s" % dest.get_ref(member_name))
+ writer.assign("ptr_info[n_ptr].is_ptr", "1" if as_c_ptr else "0")
if target_type.is_array():
nelements = read_array_len(writer, member_name, target_type, dest, scope)
writer.assign("ptr_info[n_ptr].nelements", nelements)
@@ -756,7 +758,7 @@ def write_member_parser(writer, container, member, dest, scope):
writer.comment("Reuse data from network message").newline()
writer.assign(dest.get_ref(member.name), "(size_t)(message_start + consume_%s(&in))" % t.primitive_type())
else:
- write_parse_pointer(writer, t, member.has_end_attr(), dest, member.name, scope)
+ write_parse_pointer(writer, t, member.has_end_attr(), member.has_attr("c_ptr"), dest, member.name, scope)
elif t.is_primitive():
if member.has_attr("zero"):
pass
@@ -817,13 +819,20 @@ def write_ptr_info_check(writer):
with writer.for_loop(index, "n_ptr") as scope:
offset = "ptr_info[%s].offset" % index
function = "ptr_info[%s].parse" % index
+ is_ptr = "ptr_info[%s].is_ptr" % index
dest = "ptr_info[%s].dest" % index
with writer.if_block("%s == 0" % offset, newline=False):
- writer.assign("*%s" % dest, "0")
+ with writer.if_block("%s == 0" % is_ptr, newline=False):
+ writer.assign("*(void **)(%s)" % dest, "NULL")
+ with writer.block(" else"):
+ writer.assign("*(SPICE_ADDRESS *)(%s)" % dest, "0")
with writer.block(" else"):
writer.comment("Align to 32 bit").newline()
writer.assign("end", "(uint8_t *)SPICE_ALIGN((size_t)end, 4)")
- writer.assign("*%s" % dest, "(size_t)end")
+ with writer.if_block("%s == 0" % is_ptr, newline=False):
+ writer.assign("*(void **)(%s)" % dest, "(void *)end")
+ with writer.block(" else"):
+ writer.assign("*(SPICE_ADDRESS *)(%s)" % dest, "(SPICE_ADDRESS)end")
writer.assign("end", "%s(message_start, message_end, end, &ptr_info[%s], minor)" % (function, index))
writer.error_check("end == NULL")
writer.newline()