accessing global variables with FFI

cvs
Slava Pestov 2005-03-30 00:11:10 +00:00
parent 41cd52316a
commit 9e678e52c7
7 changed files with 57 additions and 29 deletions

View File

@ -24,10 +24,7 @@
+ compiler/ffi: + compiler/ffi:
- ffi global variables, and get rid of factor_str_error hack
- box/unbox_signed/unsigned_8 - box/unbox_signed/unsigned_8
- unsigned versions of all alien accessors and setters
- [ [ dup call ] dup call ] infer hangs - [ [ dup call ] dup call ] infer hangs
- ffi unicode strings: null char security hole - ffi unicode strings: null char security hole
- utf16 string boxing - utf16 string boxing

View File

@ -75,8 +75,6 @@ M: alien unparse ( obj -- str )
SYMBOL: #cleanup ( unwind stack by parameter ) SYMBOL: #cleanup ( unwind stack by parameter )
SYMBOL: #c-call ( jump to raw address )
SYMBOL: #unbox ( move top of datastack to C stack ) SYMBOL: #unbox ( move top of datastack to C stack )
SYMBOL: #box ( move EAX to datastack ) SYMBOL: #box ( move EAX to datastack )
@ -84,6 +82,7 @@ SYMBOL: #box ( move EAX to datastack )
library [ [ "abi" get ] bind ] [ "cdecl" ] ifte* ; library [ [ "abi" get ] bind ] [ "cdecl" ] ifte* ;
SYMBOL: #alien-invoke SYMBOL: #alien-invoke
SYMBOL: #alien-global
! These are set in the #alien-invoke dataflow IR node. ! These are set in the #alien-invoke dataflow IR node.
SYMBOL: alien-returns SYMBOL: alien-returns
@ -100,22 +99,36 @@ SYMBOL: alien-parameters
[ drop object ] map dup dup ensure-d [ drop object ] map dup dup ensure-d
length 0 node-inputs consume-d ; length 0 node-inputs consume-d ;
: alien-node ( returns params function library -- ) : ensure-dlsym ( symbol library -- ) load-dll dlsym drop ;
: alien-invoke-node ( returns params function library -- )
#! We should fail if the library does not exist, so that #! We should fail if the library does not exist, so that
#! compilation does not keep trying to compile FFI words #! compilation does not keep trying to compile FFI words
#! over and over again if the library is not loaded. #! over and over again if the library is not loaded.
2dup load-dll dlsym drop 2dup ensure-dlsym
cons #alien-invoke dataflow, cons #alien-invoke dataflow,
[ set-alien-parameters ] keep [ set-alien-parameters ] keep
set-alien-returns ; set-alien-returns ;
: infer-alien ( -- ) : infer-alien-invoke ( -- )
[ string string string general-list ] ensure-d \ alien-invoke "infer-effect" word-prop car ensure-d
dataflow-drop, pop-d literal-value pop-literal
dataflow-drop, pop-d literal-value >r pop-literal >r
dataflow-drop, pop-d literal-value pop-literal
dataflow-drop, pop-d literal-value -rot pop-literal -rot
r> swap alien-node ; r> swap alien-invoke-node ;
: alien-global-node ( type name library -- )
2dup ensure-dlsym
cons #alien-global dataflow,
set-alien-returns ;
: infer-alien-global ( -- )
\ alien-global "infer-effect" word-prop car ensure-d
pop-literal
pop-literal
pop-literal -rot
alien-global-node ;
: box-parameter : box-parameter
c-type [ c-type [
@ -137,14 +150,20 @@ SYMBOL: alien-parameters
c-type [ "boxer" get ] bind #box swons , c-type [ "boxer" get ] bind #box swons ,
] ifte ; ] ifte ;
: linearize-alien ( node -- ) : linearize-alien-invoke ( node -- )
dup linearize-parameters >r dup linearize-parameters >r
dup [ node-param get ] bind #c-call swons , dup [ node-param get ] bind #alien-invoke swons ,
dup [ node-param get cdr library-abi "stdcall" = ] bind dup [ node-param get cdr library-abi "stdcall" = ] bind
r> swap [ drop ] [ #cleanup swons , ] ifte r> swap [ drop ] [ #cleanup swons , ] ifte
linearize-returns ; linearize-returns ;
#alien-invoke [ linearize-alien ] "linearizer" set-word-prop #alien-invoke [ linearize-alien-invoke ] "linearizer" set-word-prop
: linearize-alien-global ( node -- )
dup [ node-param get ] bind #alien-global swons ,
linearize-returns ;
#alien-global [ linearize-alien-global ] "linearizer" set-word-prop
TUPLE: alien-error lib ; TUPLE: alien-error lib ;
@ -152,7 +171,7 @@ C: alien-error ( lib -- ) [ set-alien-error-lib ] keep ;
M: alien-error error. ( error -- ) M: alien-error error. ( error -- )
[ [
"alien-invoke cannot be interpreted. " , "C library interface words cannot be interpreted. " ,
"Either the compiler is disabled, " , "Either the compiler is disabled, " ,
"or the ``" , alien-error-lib , "or the ``" , alien-error-lib ,
"'' library is missing." , "'' library is missing." ,
@ -165,10 +184,21 @@ M: alien-error error. ( error -- )
#! namespace. #! namespace.
rot <alien-error> throw ; rot <alien-error> throw ;
\ alien-invoke [ [ object object object object ] [ ] ] \ alien-invoke [ [ string string string general-list ] [ ] ]
"infer-effect" set-word-prop "infer-effect" set-word-prop
\ alien-invoke [ infer-alien ] "infer" set-word-prop \ alien-invoke [ infer-alien-invoke ] "infer" set-word-prop
: alien-global ( type library name -- value )
#! Fetch the value of C global variable.
#! 'type' is a type spec. 'library' is an entry in the
#! "libraries" namespace.
swap <alien-error> throw ;
\ alien-global [ [ string string string ] [ object ] ]
"infer-effect" set-word-prop
\ alien-global [ infer-alien-global ] "infer" set-word-prop
global [ global [
"libraries" get [ <namespace> "libraries" set ] unless "libraries" get [ <namespace> "libraries" set ] unless

View File

@ -55,10 +55,14 @@ math memory namespaces words ;
compiled-offset swap set-compiled-cell ( fixup -- ) compiled-offset swap set-compiled-cell ( fixup -- )
] "generator" set-word-prop ] "generator" set-word-prop
#c-call [ #alien-invoke [
uncons load-dll 2dup dlsym CALL t rel-dlsym uncons load-dll 2dup dlsym CALL t rel-dlsym
] "generator" set-word-prop ] "generator" set-word-prop
#alien-global [
uncons load-dll 2dup dlsym EAX swap unit MOV f rel-dlsym
] "generator" set-word-prop
#unbox [ #unbox [
dup f dlsym CALL f t rel-dlsym dup f dlsym CALL f t rel-dlsym
EAX PUSH EAX PUSH

View File

@ -227,7 +227,7 @@ SYMBOL: cloned
USE: kernel-internals USE: kernel-internals
: static-dispatch ( vtable -- ) : static-dispatch ( vtable -- )
>r dataflow-drop, pop-d literal-value r> >r pop-literal r>
dup literal-value swap value-recursion dup literal-value swap value-recursion
>r vector-nth r> <literal> infer-quot-value ; >r vector-nth r> <literal> infer-quot-value ;

View File

@ -79,6 +79,9 @@ M: computed literal-value ( value -- )
"A literal value was expected where a computed value was" "A literal value was expected where a computed value was"
" found: " rot unparse cat3 inference-error ; " found: " rot unparse cat3 inference-error ;
: pop-literal ( -- obj )
dataflow-drop, pop-d literal-value ;
: (ensure-types) ( typelist n stack -- ) : (ensure-types) ( typelist n stack -- )
pick [ pick [
3dup >r >r car r> r> vector-nth value-class-and 3dup >r >r car r> r> vector-nth value-class-and

View File

@ -12,7 +12,7 @@ lists math namespaces strings vectors words stdio prettyprint ;
peek-next-d value-class builtin-supertypes length 1 = and ; peek-next-d value-class builtin-supertypes length 1 = and ;
: fast-slot ( -- ) : fast-slot ( -- )
dataflow-drop, pop-d literal-value pop-literal
peek-d value-class builtin-supertypes cons peek-d value-class builtin-supertypes cons
\ slot [ [ object ] [ object ] ] (consume/produce) ; \ slot [ [ object ] [ object ] ] (consume/produce) ;

View File

@ -303,9 +303,3 @@ void collect_io_tasks(void)
COPY_OBJECT(write_io_tasks[i].callbacks); COPY_OBJECT(write_io_tasks[i].callbacks);
} }
} }
/* FFI calls this */
char* factor_str_error(void)
{
return strerror(errno);
}