diff options
author | Alexander Larsson <alexl@redhat.com> | 2010-07-19 15:47:40 +0200 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2010-07-19 16:28:22 +0200 |
commit | 7690a24acdfba226566773b309bf249627dec784 (patch) | |
tree | a74251c5f2573189c7f12f844adab2d0d6de110c /python_modules | |
parent | 12b08f2c3e07cea617255bedfd97b2eedf0f180f (diff) | |
download | spice-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.py | 32 | ||||
-rw-r--r-- | python_modules/marshal.py | 10 | ||||
-rw-r--r-- | python_modules/ptypes.py | 4 |
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): |