[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