Use transfer-ownership everywhere, to mark ownership/calle/caller etc.
authorJohan Dahlin <johan@gnome.org>
Wed, 30 Apr 2008 01:48:36 +0000 (01:48 +0000)
committerJohan Dahlin <johan@src.gnome.org>
Wed, 30 Apr 2008 01:48:36 +0000 (01:48 +0000)
2008-04-29  Johan Dahlin  <johan@gnome.org>

        * giscanner/ast.py:
        * giscanner/girwriter.py:
        * giscanner/transformer.py:
        * tests/parser/Foo-expected.gir:
        * TODO:
        Use transfer-ownership everywhere, to mark ownership/calle/caller etc.

svn path=/trunk/; revision=260

ChangeLog
TODO
giscanner/ast.py
giscanner/girwriter.py
giscanner/transformer.py
tests/parser/Foo-expected.gir

index ea3bd0b..ff93dea 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-04-29  Johan Dahlin  <johan@gnome.org>
+
+       * giscanner/ast.py:
+       * giscanner/girwriter.py:
+       * giscanner/transformer.py:
+       * tests/parser/Foo-expected.gir:
+       * TODO:
+       Use transfer-ownership everywhere, to mark ownership/calle/caller etc.
+
 2008-04-29  Johan Dahlin  <jdahlin@async.com.br>
 
        * Makefile.am:
diff --git a/TODO b/TODO
index 5bb6054..d258667 100644 (file)
--- a/TODO
+++ b/TODO
@@ -8,7 +8,6 @@ XML format
 - For argument/return values etc, store only c:identifier in the
   <class/> definition. Requires a link to the references type in the 
   Type node.
-- c:owner -> ownership-transfer=yes/no
 - replace gidl/gdk-pixbuf.gidl with something generated from headers,
   verify all information is available, possible to write
 
index fbe4757..86f9aaf 100644 (file)
@@ -55,7 +55,7 @@ class Parameter(Node):
         Node.__init__(self, name)
         self.type = Type(type_name)
         self.direction = 'in'
-        self.transfer = 'none'
+        self.transfer = False
 
     def __repr__(self):
         return 'Parameter(%r, %r)' % (self.name, self.type)
@@ -94,7 +94,7 @@ class Return(Node):
     def __init__(self, type_name):
         Node.__init__(self)
         self.type = Type(type_name)
-        self.transfer = 'none'
+        self.transfer = False
 
     def __repr__(self):
         return 'Return(%r)' % (self.type,)
@@ -167,3 +167,4 @@ class Sequence(Type):
     def __init__(self, name, element_type):
         Type.__init__(self, name)
         self.element_type = element_type
+        self.transfer = False
index 5127fa1..c93dd62 100644 (file)
@@ -79,7 +79,12 @@ class GIRWriter(XMLWriter):
     def _write_return_type(self, return_):
         if not return_:
             return
-        with self.tagcontext('return-value'):
+
+        attrs = []
+        if return_.transfer:
+            attrs.append(('transfer-ownership',
+                          str(int(return_.transfer))))
+        with self.tagcontext('return-value', attrs):
             if isinstance(return_.type, Sequence):
                 self._write_sequence(return_.type)
             else:
@@ -96,8 +101,9 @@ class GIRWriter(XMLWriter):
         attrs = [('name', parameter.name)]
         if parameter.direction != 'in':
             attrs.append(('direction', parameter.direction))
-        if parameter.transfer != 'none':
-            attrs.append(('transfer', parameter.transfer))
+        if parameter.transfer:
+            attrs.append(('transfer-ownership',
+                          str(int(parameter.transfer))))
         with self.tagcontext('parameter', attrs):
             self._write_type(parameter.type)
 
@@ -111,7 +117,10 @@ class GIRWriter(XMLWriter):
         self.write_tag('type', attrs)
 
     def _write_sequence(self, sequence):
-        attrs = [('c:owner', sequence.cowner)]
+        attrs = []
+        if sequence.transfer:
+            attrs.append(('transfer-ownership',
+                          str(int(sequence.transfer))))
         with self.tagcontext('sequence', attrs):
             attrs = [('c:identifier', sequence.element_type)]
             self.write_tag('element-type', attrs)
index 5382b6a..d3e7647 100644 (file)
@@ -137,7 +137,7 @@ class Transformer(object):
             elif option == 'out':
                 param.direction = 'out'
             elif option == 'callee-owns':
-                param.transfer = 'full'
+                param.transfer = True
             else:
                 print 'Unhandled parameter annotation option: %s' % (
                     option,)
@@ -150,12 +150,12 @@ class Transformer(object):
         return_ = Return(return_type)
         for option in options:
             if option == 'caller-owns':
-                return_.transfer = 'full'
+                return_.transfer = True
             elif option.startswith('seq '):
                 value, element_options = option[3:].split(None, 2)
                 element_type = self._parse_type_annotation(value)
                 seq = Sequence(return_type, element_type)
-                seq.cowner = 'caller'
+                seq.transfer = True
                 return_.type = seq
             else:
                 print 'Unhandled parameter annotation option: %s' % (
index 85599d8..6284a08 100644 (file)
@@ -57,7 +57,7 @@
         </parameters>
       </method>
       <method name="create_object" c:identifier="foo_object_create_object">
-        <return-value>
+        <return-value transfer-ownership="1">
           <type name="GLib.Object" c:type="GObject*"/>
         </return-value>
         <parameters>
           <parameter name="object">
             <type name="Object" c:type="FooObject*"/>
           </parameter>
-          <parameter name="toown" transfer="full">
+          <parameter name="toown" transfer-ownership="1">
             <type name="GLib.Object" c:type="GObject*"/>
           </parameter>
         </parameters>
           <parameter name="object">
             <type name="Object" c:type="FooObject*"/>
           </parameter>
-          <parameter name="toown1" transfer="full">
+          <parameter name="toown1" transfer-ownership="1">
             <type name="GLib.Object" c:type="GObject*"/>
           </parameter>
-          <parameter name="toown2" transfer="full">
+          <parameter name="toown2" transfer-ownership="1">
             <type name="GLib.Object" c:type="GObject*"/>
           </parameter>
         </parameters>
       </method>
       <method name="get_strings" c:identifier="foo_object_get_strings">
         <return-value>
-          <sequence c:owner="caller">
+          <sequence transfer-ownership="1">
             <element-type c:identifier="char*"/>
           </sequence>
         </return-value>
       </method>
       <method name="get_objects" c:identifier="foo_object_get_objects">
         <return-value>
-          <sequence c:owner="caller">
+          <sequence transfer-ownership="1">
             <element-type c:identifier="FooObject*"/>
           </sequence>
         </return-value>