]> gitweb.factorcode.org Git - factor.git/commitdiff
gobject-introspection: don't generate C-TYPEs for boxed types that already exist...
authorPhilipp Brüschweiler <blei42@gmail.com>
Mon, 29 Aug 2011 13:11:24 +0000 (15:11 +0200)
committerPhilipp Brüschweiler <blei42@gmail.com>
Mon, 29 Aug 2011 13:11:24 +0000 (15:11 +0200)
basis/glib/ffi/ffi.factor
basis/gobject-introspection/ffi/ffi.factor
basis/gobject/ffi/ffi.factor

index 4ed80c0a7a12c43e66f9e7ef4ae892da7757bb28..30f681203ef38fff279ab5d3ba4493ce3bc28f10 100644 (file)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2010 Anton Gorenko.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors alien alien.destructors alien.libraries
-alien.strings alien.syntax combinators io.encodings.utf8 kernel
-gobject.ffi gobject-introspection gobject-introspection.standard-types
+alien.strings alien.syntax combinators gobject-introspection
+gobject-introspection.standard-types io.encodings.utf8 kernel
 system ;
 IN: glib.ffi
 
@@ -16,7 +16,7 @@ LIBRARY: glib
 } cond
 >>
 
-IMPLEMENT-STRUCTS: GPollFD GSource GSourceFuncs ;
+IMPLEMENT-STRUCTS: GError GPollFD GSource GSourceFuncs ;
 
 CONSTANT: G_MININT8   HEX: -80
 CONSTANT: G_MAXINT8   HEX:  7f
index 82a1d638ddc77a485476191f3000fa15bdc586a3..40561da87f706cff00c4126a7fcd7d0cb21c993e 100644 (file)
@@ -237,6 +237,12 @@ M: array-type field-type>c-type type>c-type ;
         [ [ methods>> ] keep def-methods ]
     } cleave ;
 
+: find-existing-boxed-type ( boxed -- type/f )
+    c-type>> search [
+        dup [ c-type? ] [ "c-type" word-prop ] bi or
+        [ drop f ] unless
+    ] [ f ] if* ;
+
 : def-boxed-type ( boxed -- )
     c-type>> void def-c-type ;
 
@@ -290,11 +296,20 @@ M: array-type field-type>c-type type>c-type ;
 : defer-enums ( enums -- ) enum-info defer-types ;
 : defer-bitfields ( bitfields -- ) bitfield-info defer-types ;
 : defer-unions ( unions -- ) union-info defer-types ;
-: defer-boxeds ( boxeds -- ) boxed-info defer-types ;
 : defer-callbacks ( callbacks -- ) callback-info defer-types ;
 : defer-interfaces ( interfaces -- ) interface-info defer-types ;
 : defer-classes ( class -- ) class-info defer-types ;
 
+: defer-boxeds ( boxeds -- )
+    [
+        [
+            dup find-existing-boxed-type
+            [ nip ] [ c-type>> defer-c-type ] if*
+        ]
+        [ name>> qualified-name ] bi
+        boxed-info new swap register-type
+    ] each ;
+
 : defer-records ( records -- )
     [ private-record? ] partition
     [ begin-private record-info defer-types end-private ]
@@ -303,11 +318,14 @@ M: array-type field-type>c-type type>c-type ;
 : def-enums ( enums -- ) [ def-enum-type ] each ;
 : def-bitfields ( bitfields -- ) [ def-bitfield-type ] each ;
 : def-unions ( unions -- ) [ def-union ] each ;
-: def-boxeds ( boxeds -- ) [ def-boxed-type ] each ;
 : def-callbacks ( callbacks -- ) [ def-callback-type ] each ;
 : def-interfaces ( interfaces -- ) [ def-interface ] each ;
 : def-classes ( classes -- ) [ def-class ] each ;
 
+: def-boxeds ( boxeds -- )
+    [ find-existing-boxed-type not ] filter
+    [ def-boxed-type ] each ;
+
 : def-records ( records -- )
     [ private-record? ] partition
     [ begin-private [ def-record ] each end-private ]
index eac9f34fca0a784bd356ab20416f55f8fb488fb6..c9d9c21af80a0174759e54b36169ca2bdd34bae8 100644 (file)
@@ -4,9 +4,12 @@ USING: alien alien.destructors alien.libraries alien.syntax kernel
 combinators gobject-introspection literals math system vocabs.loader ;
 IN: gobject.ffi
 
+! these two are needed for the definition of GError and others.
+! otherwise we generate GError and some others in this vocab as well.
 <<
 "glib.ffi" require
 >>
+USE: glib.ffi
 
 LIBRARY: gobject
 
@@ -17,7 +20,7 @@ LIBRARY: gobject
 } cond
 >>
 
-IMPLEMENT-STRUCTS: GError GValue GParamSpecVariant ;
+IMPLEMENT-STRUCTS: GValue GParamSpecVariant ;
 
 GIR: vocab:gobject/GObject-2.0.gir