[Spice-devel] [PATCH spice-common 3/3] codegen: Remove minor attribute
Jonathon Jongsma
jjongsma at redhat.com
Tue Oct 9 19:42:34 UTC 2018
On Tue, 2018-10-09 at 17:24 +0100, Frediano Ziglio wrote:
> The idea in version 1 of the protocol was to extend it using the
> minor version.
> However this was replaced by the usage of capabilities and the minor
> attribute (which was not much used in version 1) was abandoned in
> version 2.
> This patch create a big difference in the code generated but only
> because the minor version was passed between all possible functions.
> Note that external function, for compatibility retains the minor
> argument.
What do you mean by "external function" here? Can you be more explicit?
One more comment below.
>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> docs/spice_protocol.txt | 5 ----
> python_modules/demarshal.py | 59 +++++++--------------------------
> ----
> python_modules/ptypes.py | 52 --------------------------------
> 3 files changed, 10 insertions(+), 106 deletions(-)
>
> diff --git a/docs/spice_protocol.txt b/docs/spice_protocol.txt
> index 421393d..b205743 100644
> --- a/docs/spice_protocol.txt
> +++ b/docs/spice_protocol.txt
> @@ -445,11 +445,6 @@ zero
>
> TODO
>
> -minor
> -~~~~~
> -
> -TODO
> -
> virtual
> ~~~~~~~
>
> diff --git a/python_modules/demarshal.py
> b/python_modules/demarshal.py
> index 5209272..6fe3c66 100644
> --- a/python_modules/demarshal.py
> +++ b/python_modules/demarshal.py
> @@ -92,8 +92,8 @@ def write_parser_helpers(writer):
> writer.newline()
> writer.statement("typedef struct PointerInfo PointerInfo")
> writer.statement("typedef void (*message_destructor_t)(uint8_t
> *message)")
> - writer.statement("typedef uint8_t * (*parse_func_t)(uint8_t
> *message_start, uint8_t *message_end, uint8_t *struct_data,
> PointerInfo *ptr_info, int minor)")
> - writer.statement("typedef uint8_t * (*parse_msg_func_t)(uint8_t
> *message_start, uint8_t *message_end, int minor, size_t *size_out,
> message_destructor_t *free_message)")
> + writer.statement("typedef uint8_t * (*parse_func_t)(uint8_t
> *message_start, uint8_t *message_end, uint8_t *struct_data,
> PointerInfo *ptr_info)")
> + writer.statement("typedef uint8_t * (*parse_msg_func_t)(uint8_t
> *message_start, uint8_t *message_end, size_t *size_out,
> message_destructor_t *free_message)")
> writer.statement("typedef uint8_t *
> (*spice_parse_channel_func_t)(uint8_t *message_start, uint8_t
> *message_end, uint16_t message_type, int minor, size_t *size_out,
> message_destructor_t *free_message)")
>
> writer.newline()
> @@ -216,7 +216,7 @@ def write_validate_struct_function(writer,
> struct):
>
> writer.set_is_generated("validator", validate_function)
> writer = writer.function_helper()
> - scope = writer.function(validate_function, "static intptr_t",
> "uint8_t *message_start, uint8_t *message_end, uint64_t offset,
> SPICE_GNUC_UNUSED int minor")
> + scope = writer.function(validate_function, "static intptr_t",
> "uint8_t *message_start, uint8_t *message_end, uint64_t offset")
> scope.variable_def("uint8_t *", "start = message_start +
> offset")
> scope.variable_def("SPICE_GNUC_UNUSED uint8_t *", "pos")
> scope.variable_def("uint64_t", "mem_size", "nw_size")
> @@ -301,7 +301,7 @@ def write_validate_pointer_item(writer,
> container, item, scope, parent_scope, st
>
> elif target_type.is_struct():
> validate_function =
> write_validate_struct_function(writer, target_type)
> - writer.assign("ptr_size", "%s(message_start,
> message_end, %s, minor)" % (validate_function, v))
> + writer.assign("ptr_size", "%s(message_start,
> message_end, %s)" % (validate_function, v))
> writer.error_check("ptr_size < 0")
>
> if want_extra_size:
> @@ -512,12 +512,8 @@ def write_validate_member(writer, mprefix,
> container, member, parent_scope, star
> if member.has_attr("virtual"):
> return
>
> - if member.has_minor_attr():
> - prefix = "if (minor >= %s)" % (member.get_minor_attr())
> - newline = False
> - else:
> - prefix = ""
> - newline = True
> + prefix = ""
> + newline = True
> item = MemberItemInfo(member, mprefix, container, start)
> with writer.block(prefix, newline=newline, comment=member.name)
> as scope:
> if member.is_switch():
> @@ -527,24 +523,6 @@ def write_validate_member(writer, mprefix,
> container, member, parent_scope, star
> write_validate_item(writer, container, item, scope,
> parent_scope, start,
> want_nw_size, want_mem_size,
> want_extra_size)
>
> - if member.has_minor_attr():
> - with writer.block(" else", comment = "minor < %s" %
> (member.get_minor_attr())):
> - if member.is_array():
> - nelements = "%s__nelements" %(item.prefix)
> - writer.assign(nelements, 0)
> - if want_nw_size:
> - writer.assign(item.nw_size(), 0)
> -
> - if want_mem_size:
> - if member.is_fixed_sizeof():
> - writer.assign(item.mem_size(), member.sizeof())
> - elif member.is_array():
> - writer.assign(item.mem_size(), 0)
> - else:
> - raise NotImplementedError("TODO minor check for
> non-constant items")
> -
> - assert not want_extra_size
> -
> def write_validate_container(writer, prefix, container, start,
> parent_scope, want_nw_size, want_mem_size, want_extra_size):
> def prefix_m(prefix, m):
> name = m.name
> @@ -782,7 +760,7 @@ def write_parse_ptr_function(writer,
> target_type):
> writer.set_is_generated("parser", parse_function)
>
> writer = writer.function_helper()
> - scope = writer.function(parse_function, "static uint8_t *",
> "uint8_t *message_start, SPICE_GNUC_UNUSED uint8_t *message_end,
> uint8_t *struct_data, PointerInfo *this_ptr_info, SPICE_GNUC_UNUSED
> int minor")
> + scope = writer.function(parse_function, "static uint8_t *",
> "uint8_t *message_start, SPICE_GNUC_UNUSED uint8_t *message_end,
> uint8_t *struct_data, PointerInfo *this_ptr_info")
> scope.variable_def("uint8_t *", "in = message_start +
> this_ptr_info->offset")
> scope.variable_def("uint8_t *", "end")
>
> @@ -977,24 +955,7 @@ def write_member_parser(writer, container,
> member, dest, scope):
> def write_container_parser(writer, container, dest):
> with dest.declare(writer) as scope:
> for m in container.members:
> - if m.has_minor_attr():
> - writer.begin_block("if (minor >= %s)" %
> m.get_minor_attr())
> write_member_parser(writer, container, m, dest, scope)
> - if m.has_minor_attr():
> - # We need to zero out the fixed part of all optional
> fields
> - if not m.member_type.is_array():
> - writer.end_block(newline=False)
> - writer.begin_block(" else")
> - # TODO: This is not right for fields that don't
> exist in the struct
> - if m.has_attr("zero"):
> - pass
> - elif m.member_type.is_primitive():
> - writer.assign(dest.get_ref(m.name), "0")
> - elif m.is_fixed_sizeof():
> - writer.statement("memset ((char *)&%s, 0,
> %s)" % (dest.get_ref(m.name), m.sizeof()))
> - else:
> - raise NotImplementedError("TODO Clear
> optional dynamic fields")
> - writer.end_block()
>
> def write_ptr_info_check(writer):
> writer.newline()
> @@ -1009,7 +970,7 @@ def write_ptr_info_check(writer):
> writer.comment("Align to 32 bit").newline()
> writer.assign("end", "(uint8_t
> *)SPICE_ALIGN((size_t)end, 4)")
> writer.assign("*%s" % dest, "(void *)end")
> - writer.assign("end", "%s(message_start, message_end,
> end, &ptr_info[%s], minor)" % (function, index))
> + writer.assign("end", "%s(message_start, message_end,
> end, &ptr_info[%s])" % (function, index))
> writer.error_check("end == NULL")
> writer.newline()
>
> @@ -1037,7 +998,7 @@ def write_msg_parser(writer, message):
> writer.ifdef(message.attributes["ifdef"][0])
> parent_scope = writer.function(function_name,
> "uint8_t *",
> - "uint8_t *message_start, uint8_t
> *message_end, SPICE_GNUC_UNUSED int minor, size_t *size,
> message_destructor_t *free_message", True)
> + "uint8_t *message_start, uint8_t
> *message_end, size_t *size, message_destructor_t *free_message",
> True)
> parent_scope.variable_def("SPICE_GNUC_UNUSED uint8_t *", "pos")
> parent_scope.variable_def("uint8_t *", "start = message_start")
> parent_scope.variable_def("uint8_t *", "data = NULL")
> @@ -1160,7 +1121,7 @@ def write_channel_parser(writer, channel,
> server):
> for r in ranges:
> d = d + 1
> with writer.if_block("message_type >= %d && message_type <
> %d" % (r[0], r[1]), d > 1, False):
> - writer.statement("return funcs%d[message_type-
> %d](message_start, message_end, minor, size_out, free_message)" % (d,
> r[0]))
> + writer.statement("return funcs%d[message_type-
> %d](message_start, message_end, size_out, free_message)" % (d, r[0]))
> writer.newline()
>
> writer.statement("return NULL")
> diff --git a/python_modules/ptypes.py b/python_modules/ptypes.py
> index f39f044..c548a28 100644
> --- a/python_modules/ptypes.py
> +++ b/python_modules/ptypes.py
> @@ -15,46 +15,6 @@ def lookup_type(name):
> def get_named_types():
> return _types
>
This hunk seems to belong to the previous patch?
> -class FixedSize:
> - def __init__(self, val = 0, minor = 0):
> - if isinstance(val, FixedSize):
> - self.vals = val.vals
> - else:
> - self.vals = [0] * (minor + 1)
> - self.vals[minor] = val
> -
> - def __add__(self, other):
> - if isinstance(other, int):
> - other = FixedSize(other)
> -
> - new = FixedSize()
> - l = max(len(self.vals), len(other.vals))
> - shared = min(len(self.vals), len(other.vals))
> -
> - new.vals = [0] * l
> -
> - for i in range(shared):
> - new.vals[i] = self.vals[i] + other.vals[i]
> -
> - for i in range(shared,len(self.vals)):
> - new.vals[i] = self.vals[i]
> -
> - for i in range(shared,len(other.vals)):
> - new.vals[i] = new.vals[i] + other.vals[i]
> -
> - return new
> -
> - def __radd__(self, other):
> - return self.__add__(other)
> -
> - def __str__(self):
> - s = "%d" % (self.vals[0])
> -
> - for i in range(1,len(self.vals)):
> - if self.vals[i] > 0:
> - s = s + " + ((minor >= %d)?%d:0)" % (i,
> self.vals[i])
> - return s
> -
> # Some attribute are propagated from member to the type as they
> really
> # are part of the type definition, rather than the member. This
> applies
> # only to attributes that affect pointer or array attributes, as
> these
> @@ -107,8 +67,6 @@ valid_attributes=set([
> # when marshalling, a zero field is written to the network
> # when demarshalling, the field is read from the network and
> discarded
> 'zero',
> - # specify minor version required for these members
> - 'minor',
> # this attribute does not exist on the network, fill just
> structure with the value
> 'virtual',
> ])
> @@ -119,7 +77,6 @@ attributes_with_arguments=set([
> 'as_ptr',
> 'outvar',
> 'ifdef',
> - 'minor',
> 'virtual',
> ])
>
> @@ -587,15 +544,9 @@ class Containee:
> raise Exception('attribute %s not expected' % name)
> return name in self.attributes
>
> - def has_minor_attr(self):
> - return self.has_attr("minor")
> -
> def has_end_attr(self):
> return self.has_attr("end")
>
> - def get_minor_attr(self):
> - return self.attributes["minor"][0]
> -
> class Member(Containee):
> def __init__(self, name, member_type, attribute_list):
> Containee.__init__(self)
> @@ -635,9 +586,6 @@ class Member(Containee):
> if self.has_attr("virtual"):
> return 0
> size = self.member_type.get_fixed_nw_size()
> - if self.has_minor_attr():
> - minor = self.get_minor_attr()
> - size = FixedSize(size, minor)
> return size
>
> def contains_extra_size(self):
More information about the Spice-devel
mailing list