]> gitweb.factorcode.org Git - factor.git/commitdiff
Eliminate compiler.alien
authorSlava Pestov <slava@factorcode.org>
Wed, 12 May 2010 03:23:41 +0000 (23:23 -0400)
committerSlava Pestov <slava@factorcode.org>
Wed, 12 May 2010 03:24:47 +0000 (23:24 -0400)
basis/alien/c-types/c-types.factor
basis/alien/syntax/syntax-docs.factor
basis/classes/struct/struct.factor
basis/cocoa/messages/messages.factor
basis/compiler/alien/alien.factor [deleted file]
basis/compiler/alien/summary.txt [deleted file]
basis/compiler/cfg/builder/alien/alien.factor
basis/compiler/cfg/builder/builder.factor

index af9ef4dc166dd1ede97d9d31e1349beec389f095..03c35d62516c726d168c34a22eacfe77a7fb2ee3 100644 (file)
@@ -66,15 +66,6 @@ M: word c-type
     dup "c-type" word-prop resolve-typedef
     [ ] [ no-c-type ] ?if ;
 
-GENERIC: c-struct? ( c-type -- ? )
-
-M: object c-struct? drop f ;
-
-M: c-type-name c-struct? dup void? [ drop f ] [ c-type c-struct? ] if ;
-
-! These words being foldable means that words need to be
-! recompiled if a C type is redefined. Even so, folding the
-! size facilitates some optimizations.
 GENERIC: c-type-class ( name -- class )
 
 M: abstract-c-type c-type-class class>> ;
index c960984d533da25c40f104db243c9ecead3d2e76..c7ff228ab27679fd5ac5e3fb1571f60692b44c1e 100644 (file)
@@ -119,10 +119,6 @@ HELP: typedef
 
 { POSTPONE: TYPEDEF: typedef } related-words
 
-HELP: c-struct?
-{ $values { "c-type" "a C type" } { "?" "a boolean" } }
-{ $description "Tests if a C type is a structure defined by " { $link POSTPONE: STRUCT: } "." } ;
-
 HELP: C-GLOBAL:
 { $syntax "C-GLOBAL: type name" }
 { $values { "type" "a C type" } { "name" "a C global variable name" } }
index d8835c1dca9184b6974b134a36836c24a00b0ef3..37cea6b9f2e2b15c17ed46df319ad7f6b6b3dba6 100644 (file)
@@ -176,7 +176,12 @@ HOOK: flatten-struct-type cpu ( type -- pairs )
 M: object flatten-struct-type
     stack-size cell /i { int-rep f } <repetition> ;
 
-M: struct-c-type c-struct? drop t ;
+: large-struct? ( type -- ? )
+    {
+        { [ dup void? ] [ drop f ] }
+        { [ dup base-type struct-c-type? not ] [ drop f ] }
+        [ return-struct-in-registers? not ]
+    } cond ;
 
 <PRIVATE
 : struct-slot-values-quot ( class -- quot )
index c422d85423eb39c3dafb5f2cd9a1435649ddddcd..5cce0401ce675bc38a576ef14fb21a29e674939c 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2006, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors alien alien.c-types alien.strings arrays assocs
-classes.struct continuations combinators compiler compiler.alien
+classes.struct continuations combinators compiler
 core-graphics.types stack-checker kernel math namespaces make
 quotations sequences strings words cocoa.runtime cocoa.types io
 macros memoize io.encodings.utf8 effects layouts libc
diff --git a/basis/compiler/alien/alien.factor b/basis/compiler/alien/alien.factor
deleted file mode 100644 (file)
index 335b8bf..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-! Copyright (C) 2008, 2010 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: accessors kernel namespaces make math sequences layouts
-alien.c-types cpu.architecture ;
-IN: compiler.alien
-
-: large-struct? ( type -- ? )
-    dup c-struct? [ return-struct-in-registers? not ] [ drop f ] if ;
-
-: alien-parameters ( params -- seq )
-    dup parameters>>
-    swap return>> large-struct?
-    [ struct-return-on-stack? (stack-value) void* ? prefix ] when ;
diff --git a/basis/compiler/alien/summary.txt b/basis/compiler/alien/summary.txt
deleted file mode 100644 (file)
index 5fc715b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Common code used for analysis and code generation of alien bindings
index 6f12a390d4fb437ace3a371c80db29364a3e1c12..7f42bdf3229459704c211af813db7dfad3c06e8b 100644 (file)
@@ -1,10 +1,10 @@
 ! Copyright (C) 2008, 2010 Slava Pestov.\r
 ! See http://factorcode.org/license.txt for BSD license.\r
 USING: accessors arrays layouts math math.order math.parser\r
-combinators fry make sequences locals alien alien.private\r
-alien.strings alien.c-types alien.libraries classes.struct\r
-namespaces kernel strings libc quotations cpu.architecture\r
-compiler.alien compiler.utilities compiler.tree compiler.cfg\r
+combinators combinators.short-circuit fry make sequences locals\r
+alien alien.private alien.strings alien.c-types alien.libraries\r
+classes.struct namespaces kernel strings libc quotations\r
+cpu.architecture compiler.utilities compiler.tree compiler.cfg\r
 compiler.cfg.builder compiler.cfg.builder.alien.params\r
 compiler.cfg.builder.blocks compiler.cfg.instructions\r
 compiler.cfg.stack-frame compiler.cfg.stacks\r
@@ -65,9 +65,9 @@ M:: struct-c-type unbox-parameter ( src c-type -- )
 \r
 : (objects>registers) ( vregs -- )\r
     ! Place instructions in reverse order, so that the\r
-    ! ##store-stack-param instructions come first. This is\r
-    ! because they are not clobber-insns and so we avoid some\r
-    ! spills that way.\r
+    ! ##store-stack-param instructions come first. This ensures\r
+    ! that no registers are used after the ##store-reg-param\r
+    ! instructions.\r
     [\r
         first3 [ dup reg-class-of reg-class-full? ] dip or\r
         [ [ alloc-stack-param ] keep \ ##store-stack-param new-insn ]\r
@@ -75,15 +75,13 @@ M:: struct-c-type unbox-parameter ( src c-type -- )
         if\r
     ] map reverse % ;\r
 \r
-: objects>registers ( params -- )\r
-    #! Generate code for unboxing a list of C types, then\r
-    #! generate code for moving these parameters to registers on\r
-    #! architectures where parameters are passed in registers.\r
+: objects>registers ( params -- stack-size )\r
     [ abi>> ] [ parameters>> ] [ return>> ] tri\r
     '[ \r
         _ unbox-parameters\r
         _ prepare-struct-area\r
         (objects>registers)\r
+        stack-params get\r
     ] with-param-regs ;\r
 \r
 GENERIC: box-return ( c-type -- dst )\r
@@ -94,11 +92,9 @@ M: c-type box-return
 M: long-long-type box-return\r
     [ f ] dip boxer>> ^^box-long-long ;\r
 \r
-: if-small-struct ( c-type true false -- ? )\r
-    [ dup return-struct-in-registers? ] 2dip '[ f swap @ ] if ; inline\r
-\r
 M: struct-c-type box-return\r
-    [ ^^box-small-struct ] [ ^^box-large-struct ] if-small-struct ;\r
+    dup return-struct-in-registers?\r
+    [ ^^box-small-struct ] [ [ f ] dip ^^box-large-struct ] if ;\r
 \r
 : box-return* ( node -- )\r
     return>> [ ] [ base-type box-return 1 ##inc-d D 0 ##replace ] if-void ;\r
@@ -130,62 +126,66 @@ M: array dlsym-valid? '[ _ dlsym ] any? ;
     [ library>> load-library ]\r
     bi 2dup check-dlsym ;\r
 \r
-: return-size ( ctype -- n )\r
+: return-size ( c-type -- n )\r
     #! Amount of space we reserve for a return value.\r
     {\r
-        { [ dup c-struct? not ] [ drop 0 ] }\r
+        { [ dup void? ] [ drop 0 ] }\r
+        { [ dup base-type struct-c-type? not ] [ drop 0 ] }\r
         { [ dup large-struct? not ] [ drop 2 cells ] }\r
         [ heap-size ]\r
     } cond ;\r
 \r
-: <alien-stack-frame> ( params -- stack-frame )\r
-    stack-frame new\r
-        swap\r
-        [ return>> return-size >>return ]\r
-        [ alien-parameters [ stack-size ] map-sum >>params ] bi\r
-        t >>calls-vm? ;\r
-\r
 : alien-node-height ( params -- )\r
     [ out-d>> length ] [ in-d>> length ] bi - adjust-d ;\r
 \r
-: emit-alien-node ( node quot -- )\r
+: emit-alien-block ( node quot: ( params -- ) -- )\r
     '[\r
         make-kill-block\r
         params>>\r
-        [ <alien-stack-frame> ##stack-frame ]\r
-        _\r
-        [ alien-node-height ]\r
-        tri\r
+        _ [ alien-node-height ] bi\r
     ] emit-trivial-block ; inline\r
 \r
+: <alien-stack-frame> ( stack-size return -- stack-frame )\r
+    stack-frame new\r
+        swap return-size >>return\r
+        swap >>params\r
+        t >>calls-vm? ;\r
+\r
+: emit-stack-frame ( stack-size params -- )\r
+    return>>\r
+    [ stack-cleanup ##cleanup ]\r
+    [ <alien-stack-frame> ##stack-frame ] bi ;\r
+\r
 M: #alien-invoke emit-node\r
     [\r
         {\r
             [ objects>registers ]\r
             [ alien-invoke-dlsym ##alien-invoke ]\r
-            [ stack-cleanup ##cleanup ]\r
+            [ emit-stack-frame ]\r
             [ box-return* ]\r
         } cleave\r
-    ] emit-alien-node ;\r
+    ] emit-alien-block ;\r
 \r
-M: #alien-indirect emit-node\r
-    [\r
-        D 0 ^^peek -1 ##inc-d ^^unbox-any-c-ptr\r
+M:: #alien-indirect emit-node ( node -- )\r
+    node [\r
+        D 0 ^^peek -1 ##inc-d ^^unbox-any-c-ptr :> src\r
         {\r
-            [ drop objects>registers ]\r
-            [ nip ##alien-indirect ]\r
-            [ drop stack-cleanup ##cleanup ]\r
-            [ drop box-return* ]\r
-        } 2cleave\r
-    ] emit-alien-node ;\r
+            [ objects>registers ]\r
+            [ drop src ##alien-indirect ]\r
+            [ emit-stack-frame ]\r
+            [ box-return* ]\r
+        } cleave\r
+    ] emit-alien-block ;\r
 \r
 M: #alien-assembly emit-node\r
     [\r
-        [ objects>registers ]\r
-        [ quot>> ##alien-assembly ]\r
-        [ box-return* ]\r
-        tri\r
-    ] emit-alien-node ;\r
+        {\r
+            [ objects>registers ]\r
+            [ quot>> ##alien-assembly ]\r
+            [ emit-stack-frame ]\r
+            [ box-return* ]\r
+        } cleave\r
+    ] emit-alien-block ;\r
 \r
 GENERIC: box-parameter ( n c-type -- dst )\r
 \r
@@ -207,6 +207,10 @@ M: struct-c-type box-parameter
 : prepare-parameters ( parameters -- offsets types indices )\r
     [ length iota <reversed> ] [ parameter-offsets ] [ ] tri ;\r
 \r
+: alien-parameters ( params -- seq )\r
+    [ parameters>> ] [ return>> large-struct? ] bi\r
+    [ struct-return-on-stack? (stack-value) void* ? prefix ] when ;\r
+\r
 : box-parameters ( params -- )\r
     alien-parameters\r
     [ length ##inc-d ]\r
@@ -276,25 +280,32 @@ M: long-long-type unbox-return
 M: struct-c-type unbox-return\r
     [ ^^unbox-any-c-ptr ] dip ##store-struct-return ;\r
 \r
+: emit-callback-stack-frame ( params -- )\r
+    [ alien-parameters [ stack-size ] map-sum ] [ return>> ] bi\r
+    <alien-stack-frame> ##stack-frame ;\r
+\r
 M: #alien-callback emit-node\r
     dup params>> xt>> dup\r
     [\r
         ##prologue\r
         [\r
-            [ registers>objects ]\r
-            [ wrap-callback-quot ##alien-callback ]\r
-            [\r
-                return>> {\r
-                    { [ dup void eq? ] [ drop ##end-callback ] }\r
-                    { [ dup large-struct? ] [ drop ##end-callback ] }\r
-                    [\r
-                        [ D 0 ^^peek ] dip\r
-                        ##end-callback\r
-                        base-type unbox-return\r
-                    ]\r
-                } cond\r
-            ] tri\r
-        ] emit-alien-node\r
+            {\r
+                [ registers>objects ]\r
+                [ emit-callback-stack-frame ]\r
+                [ wrap-callback-quot ##alien-callback ]\r
+                [\r
+                    return>> {\r
+                        { [ dup void? ] [ drop ##end-callback ] }\r
+                        { [ dup large-struct? ] [ drop ##end-callback ] }\r
+                        [\r
+                            [ D 0 ^^peek ] dip\r
+                            ##end-callback\r
+                            base-type unbox-return\r
+                        ]\r
+                    } cond\r
+                ]\r
+            } cleave\r
+        ] emit-alien-block\r
         ##epilogue\r
         ##return\r
     ] with-cfg-builder ;\r
index 059a7f2215c2adaaae13f5cc7e50c8c5c81fd1b9..c6d541460ab0ca1003e8e10d6510685c3f584504 100644 (file)
@@ -19,8 +19,7 @@ compiler.cfg.instructions
 compiler.cfg.predecessors
 compiler.cfg.builder.blocks
 compiler.cfg.stacks
-compiler.cfg.stacks.local
-compiler.alien ;
+compiler.cfg.stacks.local ;
 IN: compiler.cfg.builder
 
 ! Convert tree SSA IR to CFG IR. The result is not in SSA form; this is