[Spice-devel] [PATCH v2 07/43] codegen: Do some check on attributes
Frediano Ziglio
fziglio at redhat.com
Wed Jul 8 06:53:40 PDT 2015
Verify that the attribute is known. This could help for instance to
avoid some future typo mistake.
Also we have a list of attributes we can comment.
Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
python_modules/ptypes.py | 69 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 69 insertions(+)
diff --git a/python_modules/ptypes.py b/python_modules/ptypes.py
index 845fa73..3a307ed 100644
--- a/python_modules/ptypes.py
+++ b/python_modules/ptypes.py
@@ -62,11 +62,76 @@ class FixedSize:
# other members
propagated_attributes=["ptr_array", "nonnull", "chunk"]
+valid_attributes={
+ # write to an array at end of structure
+ 'end',
+ # the C structure contain a pointer to data
+ # for instance we want to write an array to an allocated array
+ 'to_ptr',
+ # write output to this C structure
+ 'ctype',
+ # prefix for flags/values enumerations
+ 'prefix',
+ # use in demarshaller to use directly data from message without copy
+ 'nocopy',
+ # store member array in a pointer
+ # similar to to_ptr but has an additional argument as C field to
+ # store length
+ 'as_ptr',
+ # do not generate marshal code
+ # used for last members to be able to marshall them manually
+ 'nomarshal',
+ # ??? not used by python code
+ 'zero_terminated',
+ 'marshall',
+ # this pointer member cannot be null
+ 'nonnull',
+ # this flags member contains only a single flag
+ 'unique_flag',
+ 'ptr_array',
+ 'outvar',
+ # C structure has anonymous member (used in switch)
+ 'anon',
+ 'chunk',
+ # this channel if conditional to an #ifdef
+ 'ifdef',
+ # write this member as zero on network
+ 'zero',
+ # specify minor version required for these members
+ 'minor',
+ 'bytes_count',
+ # this attribute does not exists on the network, fill just structure with the value
+ 'virtual',
+ # for a switch this indicate that on network
+ # will occupy always same size (maximum size required for all members)
+ 'fixedsize',
+ # use 32 bit pointer
+ 'ptr32',
+}
+
+attributes_with_arguments={
+ 'ctype',
+ 'prefix',
+ 'as_ptr',
+ 'outvar',
+ 'ifdef',
+ 'minor',
+ 'bytes_count',
+ 'virtual',
+}
+
def fix_attributes(attribute_list):
attrs = {}
for attr in attribute_list:
name = attr[0][1:]
lst = attr[1:]
+ if not name in valid_attributes:
+ raise Exception("Attribute %s not recognized" % name)
+ if not name in attributes_with_arguments:
+ if len(lst) > 0:
+ raise Exception("Attribute %s specified with options" % name)
+ elif len(lst) > 1:
+ raise Exception("Attribute %s has more than 1 argument" % name)
attrs[name] = lst
return attrs
@@ -139,6 +204,8 @@ class Type:
_types_by_name[self.name] = self
def has_attr(self, name):
+ if not name in valid_attributes:
+ raise Exception('attribute %s not expected' % name)
return name in self.attributes
class TypeRef(Type):
@@ -522,6 +589,8 @@ class Containee:
return not self.is_switch() and self.member_type.is_primitive()
def has_attr(self, name):
+ if not name in valid_attributes:
+ raise Exception('attribute %s not expected' % name)
return name in self.attributes
def has_minor_attr(self):
--
2.1.0
More information about the Spice-devel
mailing list