]> gitweb.factorcode.org Git - factor.git/commitdiff
C struct cleanups, alien-call word
authorSlava Pestov <slava@factorcode.org>
Sat, 25 Sep 2004 20:18:11 +0000 (20:18 +0000)
committerSlava Pestov <slava@factorcode.org>
Sat, 25 Sep 2004 20:18:11 +0000 (20:18 +0000)
library/compiler/alien-macros.factor
library/compiler/alien-types.factor
library/compiler/alien.factor [new file with mode: 0644]
library/platform/native/boot-stage2.factor

index 8e0da8fd9db592fc6c827a5fc7be7ebc5afbbcf8..329f1e9ea13156cd09f68c570debcf66953c4953 100644 (file)
@@ -64,9 +64,3 @@ USE: stack
     ] [
         c-type [ "boxer" get ] bind BOX
     ] ifte ;
-
-: ALIEN-CALL ( return func dll params -- )
-    reverse PARAMETERS >r
-    dlsym CALL drop
-    r> CLEANUP
-    RETURNS ;
index bc411301bb71c1552082cf98c1c27b7dcb588daf..77f39ecacaec93b13108aafe39e5d11c135842e7 100644 (file)
@@ -32,6 +32,7 @@ USE: errors
 USE: lists
 USE: math
 USE: namespaces
+USE: parser
 USE: stack
 USE: strings
 USE: words
@@ -74,8 +75,8 @@ USE: words
     "set-" swap cat2 "in" get create >r
     [ "setter" get ] bind cons r> swap define-compound ;
 
-: define-field ( offset spec -- offset )
-    unswons >r c-type dup >r [ "width" get ] bind align r> r>
+: define-field ( offset type name -- offset )
+    >r c-type dup >r [ "width" get ] bind align r> r>
     "struct-name" get swap "-" swap cat3
     ( offset type name -- )
     3dup define-getter 3dup define-setter
@@ -108,12 +109,23 @@ USE: words
     #! alien.
     [
         "struct-name" set
-        0 swap [ define-field ] each
+        0 swap [ unswons define-field ] each
         dup define-constructor
         dup define-local-constructor
         define-struct-type
     ] with-scope ;
 
+: BEGIN-STRUCT: ( -- offset )
+    scan "struct-name" set  0 ; parsing
+
+: FIELD: ( offset -- offset )
+    scan scan define-field ; parsing
+
+: END-STRUCT ( offset -- )
+    dup define-constructor
+    dup define-local-constructor
+    define-struct-type ; parsing
+
 global [ <namespace> "c-types" set ] bind
 
 [
diff --git a/library/compiler/alien.factor b/library/compiler/alien.factor
new file mode 100644 (file)
index 0000000..21d015d
--- /dev/null
@@ -0,0 +1,79 @@
+! :folding=indent:collapseFolds=1:
+
+! $Id$
+!
+! Copyright (C) 2004 Slava Pestov.
+! 
+! Redistribution and use in source and binary forms, with or without
+! modification, are permitted provided that the following conditions are met:
+! 
+! 1. Redistributions of source code must retain the above copyright notice,
+!    this list of conditions and the following disclaimer.
+! 
+! 2. Redistributions in binary form must reproduce the above copyright notice,
+!    this list of conditions and the following disclaimer in the documentation
+!    and/or other materials provided with the distribution.
+! 
+! THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+! INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+! FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+! DEVELOPERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+! OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+! WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+! ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+IN: alien
+USE: compiler
+USE: errors
+USE: lists
+USE: math
+USE: namespaces
+USE: parser
+USE: stack
+USE: words
+
+: BEGIN-ENUM:
+    #! C-style enumartions. Their use is not encouraged unless
+    #! it is for C library interfaces. Used like this:
+    #!
+    #! BEGIN-ENUM 0
+    #!     ENUM: x
+    #!     ENUM: y
+    #!     ENUM: z
+    #! END-ENUM
+    #!
+    #! This is the same as : x 0 ; : y 1 ; : z 2 ;.
+    scan str>number ; parsing
+
+: ENUM:
+    dup CREATE swap unit define-compound succ ; parsing
+
+: END-ENUM
+    drop ; parsing
+
+: alien-call ( ... returns library function parameters -- ... )
+    #! Call a C library function.
+    #! 'returns' is a type spec, and 'parameters' is a list of
+    #! type specs. 'library' is an entry in the "libraries"
+    #! namespace.
+    "alien-call cannot be interpreted." throw ;
+
+: library ( name -- handle )
+    "libraries" get get* ;
+
+: alien-function ( function library -- )
+    library dlsym ;
+
+: compile-alien-call
+    pop-literal reverse PARAMETERS >r
+    pop-literal pop-literal alien-function CALL drop
+    r> CLEANUP
+    pop-literal RETURNS ;
+
+global [ <namespace> "libraries" set ] bind
+
+[ alien-call compile-alien-call ]
+unswons "compiling" swap set-word-property
index 8bcb05785d9de4a6fd0be310e107815975c500e5..6f716402a1fe77c8c35a464dd9c6d3d1208d64ef 100644 (file)
@@ -140,6 +140,7 @@ USE: stdio
     "/library/compiler/words.factor"
     "/library/compiler/alien-types.factor"
     "/library/compiler/alien-macros.factor"
+    "/library/compiler/alien.factor"
 
     "/library/platform/native/primitives.factor"