Parse length= annotation as a parameter name, not a raw int.
authorColin Walters <walters@src.gnome.org>
Mon, 6 Oct 2008 18:58:46 +0000 (18:58 +0000)
committerColin Walters <walters@src.gnome.org>
Mon, 6 Oct 2008 18:58:46 +0000 (18:58 +0000)
svn path=/trunk/; revision=659

ChangeLog
giscanner/ast.py
giscanner/transformer.py
tests/scanner/annotation.c

index 5b6feb2..9a14d0d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-10-06  Colin Walters  <walters@verbum.org>
+
+       * giscanner/transformer.py: Parse length= annotation as
+       a parameter name, not a raw int.
+       * tests/*: Update.
+
 2008-10-03  Colin Walters  <walters@verbum.org>
 
        Bug 551744: Non-GObject types aren't aggregating ctors and methods
index 6f2e9c2..368f02e 100644 (file)
@@ -182,6 +182,7 @@ class Array(Type):
         self.element_type = element_type
         self.zeroterminated = True
         self.length_param_index = -1
+        self.length_param_name = None
 
     def __repr__(self):
         return 'Array(%r of %r)' % (self.name, self.element_type, )
index 63c09b1..df62bf3 100644 (file)
@@ -235,10 +235,32 @@ class Transformer(object):
                 # No version, just include str
                 node.deprecated = deprecated_value.strip()
 
+    def _pair_array(self, params, array):
+        if not array.type.length_param_name:
+            return
+        target_name = array.type.length_param_name
+        for i, param in enumerate(params):
+            if param.name == array.type.length_param_name:
+                array.type.length_param_index = i
+                return
+        raise ValueError("Unmatched length parameter name %r"\
+                             % (target_name, ))
+
+    def _pair_annotations(self, params):
+        names = {}
+        for param in params:
+            if param.name in names:
+                raise ValueError("Duplicate parameter name %r"\
+                                     % (param.name, ))
+            names[param.name] = 1
+            if isinstance(param.type, Array):
+                self._pair_array(params, param)
+
     def _create_function(self, symbol):
         directives = symbol.directives()
         parameters = list(self._create_parameters(
             symbol.base_type, directives))
+        self._pair_annotations(parameters)
         return_ = self._create_return(symbol.base_type.base_type,
                                       directives.get('return', []))
         name = self._strip_namespace_func(symbol.ident)
@@ -370,8 +392,8 @@ class Transformer(object):
             elif option == 'notransfer':
                 param.transfer = False
             elif isinstance(ptype, Array) and option.startswith('length'):
-                (_, index) = option.split('=')
-                ptype.length_param_index = int(index)
+                (_, index_param) = option.split('=')
+                ptype.length_param_name = index_param
             elif option == 'allow-none':
                 param.allow_none = True
             else:
index 00df78c..01ee015 100644 (file)
@@ -229,8 +229,8 @@ annotation_object_compute_sum  (AnnotationObject *object,
 /**
  * annotation_object_compute_sum_n:
  * @object: a #GObject
- * @nums: <array,length=2>: Sequence of numbers
- * @nums: Length of number array
+ * @nums: <array,length=n_nums>: Sequence of numbers
+ * @n_nums: Length of number array
  *
  * Test taking an array with length parameter
  **/