summaryrefslogtreecommitdiffstats
path: root/python_modules
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2010-07-19 15:47:40 +0200
committerAlexander Larsson <alexl@redhat.com>2010-07-19 16:28:22 +0200
commit7690a24acdfba226566773b309bf249627dec784 (patch)
treea74251c5f2573189c7f12f844adab2d0d6de110c /python_modules
parent12b08f2c3e07cea617255bedfd97b2eedf0f180f (diff)
downloadspice-7690a24acdfba226566773b309bf249627dec784.tar.gz
spice-7690a24acdfba226566773b309bf249627dec784.tar.xz
spice-7690a24acdfba226566773b309bf249627dec784.zip
codegen: Allow @to_ptr to make inline structs demarshal as pointers
Diffstat (limited to 'python_modules')
-rw-r--r--python_modules/demarshal.py32
-rw-r--r--python_modules/marshal.py10
-rw-r--r--python_modules/ptypes.py4
3 files changed, 37 insertions, 9 deletions
diff --git a/python_modules/demarshal.py b/python_modules/demarshal.py
index 63f952b7..4aba7b0b 100644
--- a/python_modules/demarshal.py
+++ b/python_modules/demarshal.py
@@ -161,6 +161,7 @@ def write_validate_switch_member(writer, container, switch_member, scope, parent
with writer.if_block(check, not first, False) as if_scope:
item.type = c.member.member_type
item.subprefix = item.prefix + "_" + m.name
+ item.member = c.member
all_as_extra_size = m.is_extra_size() and want_extra_size
if not want_mem_size and all_as_extra_size and not scope.variable_defined(item.mem_size()):
@@ -459,6 +460,8 @@ def write_validate_primitive_item(writer, container, item, scope, parent_scope,
def write_validate_item(writer, container, item, scope, parent_scope, start,
want_nw_size, want_mem_size, want_extra_size):
+ if item.member and item.member.has_attr("to_ptr"):
+ want_nw_size = True
if item.type.is_pointer():
write_validate_pointer_item(writer, container, item, scope, parent_scope, start,
want_nw_size, want_mem_size, want_extra_size)
@@ -474,6 +477,11 @@ def write_validate_item(writer, container, item, scope, parent_scope, start,
else:
writer.todo("Implement validation of %s" % item.type)
+ if item.member and item.member.has_attr("to_ptr"):
+ saved_size = "%s__saved_size" % item.member.name
+ writer.add_function_variable("uint32_t", saved_size)
+ writer.assign(saved_size, item.nw_size())
+
def write_validate_member(writer, container, member, parent_scope, start,
want_nw_size, want_mem_size, want_extra_size):
if member.has_attr("virtual"):
@@ -708,10 +716,12 @@ def write_switch_parser(writer, container, switch, dest, scope):
dest2 = dest.child_sub(switch.name)
dest2.reuse_scope = block
- if t.is_struct():
- write_container_parser(writer, t, dest2)
+ if m.has_attr("to_ptr"):
+ write_parse_to_pointer(writer, t, False, dest2, m.name, block)
elif t.is_pointer():
write_parse_pointer(writer, t, False, dest2, m.name, block)
+ elif t.is_struct():
+ write_container_parser(writer, t, dest2)
elif t.is_primitive():
if m.has_attr("zero"):
writer.statement("consume_%s(&in)" % (t.primitive_type()))
@@ -813,9 +823,8 @@ def write_array_parser(writer, member, nelements, array, dest, scope):
writer.comment("Align ptr_array element to 4 bytes").newline()
writer.assign("end", "(uint8_t *)SPICE_ALIGN((size_t)end, 4)")
-def write_parse_pointer(writer, t, at_end, dest, member_name, scope):
- target_type = t.target_type
- writer.assign("ptr_info[n_ptr].offset", "consume_%s(&in)" % t.primitive_type())
+def write_parse_pointer_core(writer, target_type, offset, at_end, dest, member_name, scope):
+ writer.assign("ptr_info[n_ptr].offset", offset)
writer.assign("ptr_info[n_ptr].parse", write_parse_ptr_function(writer, target_type))
if at_end:
writer.assign("ptr_info[n_ptr].dest", "(void **)end")
@@ -828,6 +837,15 @@ def write_parse_pointer(writer, t, at_end, dest, member_name, scope):
writer.statement("n_ptr++")
+def write_parse_pointer(writer, t, at_end, dest, member_name, scope):
+ write_parse_pointer_core(writer, t.target_type, "consume_%s(&in)" % t.primitive_type(),
+ at_end, dest, member_name, scope)
+
+def write_parse_to_pointer(writer, t, at_end, dest, member_name, scope):
+ write_parse_pointer_core(writer, t, "in - start",
+ at_end, dest, member_name, scope)
+ writer.increment("in", "%s__saved_size" % member_name)
+
def write_member_parser(writer, container, member, dest, scope):
if member.has_attr("virtual"):
writer.assign(dest.get_ref(member.name), member.attributes["virtual"][0])
@@ -839,7 +857,9 @@ def write_member_parser(writer, container, member, dest, scope):
t = member.member_type
- if t.is_pointer():
+ if member.has_attr("to_ptr"):
+ write_parse_to_pointer(writer, t, member.has_end_attr(), dest, member.name, scope)
+ elif t.is_pointer():
if member.has_attr("chunk"):
assert(t.target_type.is_array())
nelements = read_array_len(writer, member.name, t.target_type, dest, scope, True)
diff --git a/python_modules/marshal.py b/python_modules/marshal.py
index cf6ad08b..6b894c16 100644
--- a/python_modules/marshal.py
+++ b/python_modules/marshal.py
@@ -87,10 +87,16 @@ class SubMarshallingSource(MarshallingSource):
self.is_helper = False
def get_self_ref(self):
- return "&%s" % self.parent_src.get_ref(self.name)
+ if self.containee.has_attr("to_ptr"):
+ return "%s" % self.parent_src.get_ref(self.name)
+ else:
+ return "&%s" % self.parent_src.get_ref(self.name)
def get_ref(self, member):
- return self.parent_src.get_ref(self.name) + "." + member
+ if self.containee.has_attr("to_ptr"):
+ return self.parent_src.get_ref(self.name) + "->" + member
+ else:
+ return self.parent_src.get_ref(self.name) + "." + member
def write_marshal_ptr_function(writer, target_type):
if target_type.is_array():
diff --git a/python_modules/ptypes.py b/python_modules/ptypes.py
index e354454b..59ed8974 100644
--- a/python_modules/ptypes.py
+++ b/python_modules/ptypes.py
@@ -536,7 +536,7 @@ class Member(Containee):
return self.member_type.is_fixed_sizeof()
def is_extra_size(self):
- return self.has_end_attr() or self.member_type.is_extra_size()
+ return self.has_end_attr() or self.has_attr("to_ptr") or self.member_type.is_extra_size()
def is_fixed_nw_size(self):
if self.has_attr("virtual"):
@@ -562,6 +562,8 @@ class Member(Containee):
return "%s (%s)" % (str(self.name), str(self.member_type))
def get_num_pointers(self):
+ if self.has_attr("to_ptr"):
+ return 1
return self.member_type.get_num_pointers()
def get_pointer_names(self, marshalled):