codegen: Allow @to_ptr to make inline structs demarshal as pointers

This commit is contained in:
Alexander Larsson 2010-07-19 15:47:40 +02:00
parent 12b08f2c3e
commit 7690a24acd
3 changed files with 37 additions and 9 deletions

View File

@ -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)

View File

@ -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():

View File

@ -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):