Check for some common function parameter description errors in the
authorIan Romanick <idr@us.ibm.com>
Thu, 3 Mar 2005 21:21:59 +0000 (21:21 +0000)
committerIan Romanick <idr@us.ibm.com>
Thu, 3 Mar 2005 21:21:59 +0000 (21:21 +0000)
endElement handler for <function>.  This catches the errors as early as
possible and makes debugging other code easier.

src/mesa/glapi/gl_XML.py

index b2e3cd4325232d00e0d9a99a88b563e2731eebc4..03aa982ac283c91bef79af42ea8015c776913ecd 100644 (file)
@@ -367,6 +367,9 @@ class glFunction( glItem ):
                else:
                        self.real_name = fn_name
 
+               self.parameters_by_name = {}
+               self.variable_length_parameters = []
+
                glItem.__init__(self, name, fn_name, context)
                return
 
@@ -387,6 +390,32 @@ class glFunction( glItem ):
                        self.set_return_type(attrs.get('type', None))
 
 
+       def endElement(self, name):
+               """Handle the end of a <function> element.
+
+               At the end of a <function> element, there is some semantic
+               checking that can be done.  This prevents some possible
+               exceptions from being thrown elsewhere in the code.
+               """
+
+               if name == "function":
+                       for p in self.variable_length_parameters:
+                               if p.counter:
+                                       counter = self.parameters_by_name[ p.counter ]
+                                       if not self.parameters_by_name.has_key( p.counter ):
+                                               raise RuntimeError("Parameter '%s' of function '%s' has counter '%s', but function has no such parameter." % (p.name, self.name, p.counter))
+                                       elif not self.parameters_by_name[ p.counter ].is_counter:
+                                               raise RuntimeError("Parameter '%s' of function '%s' has counter '%s', but '%s' is not marked as a counter." % (p.name, self.name, p.counter, p.counter))
+
+                                       for n in p.count_parameter_list:
+                                               if not self.parameters_by_name.has_key( n ):
+                                                       raise RuntimeError("Parameter '%s' of function '%s' has size parameter '%s', but function has no such parameter." % (p.name, self.name, n))
+
+                       return 1
+               else:
+                       return 0
+
+
        def append(self, tag_name, p):
                if tag_name != "param":
                        raise RuntimeError("Trying to append '%s' to parameter list of function '%s'." % (tag_name, self.name))
@@ -398,6 +427,11 @@ class glFunction( glItem ):
                if p.count_parameter_list != []:
                        self.count_parameter_list.extend( p.count_parameter_list )
 
+               if p.is_variable_length_array():
+                       self.variable_length_parameters.append(p)
+
+               self.parameters_by_name[ p.name ] = p
+
 
        def set_return_type(self, t):
                self.fn_return_type = t