factor/core/compiler/alien/alien-invoke.factor

85 lines
2.6 KiB
Factor
Raw Normal View History

! Copyright (C) 2004, 2007 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
2004-09-25 16:18:11 -04:00
IN: alien
USING: arrays generator errors generic hashtables
2006-09-06 18:06:11 -04:00
inference io kernel kernel-internals math namespaces parser
prettyprint sequences strings words quotations
inspector ;
2006-02-11 02:30:18 -05:00
TUPLE: alien-invoke library function return parameters ;
2006-11-13 01:34:01 -05:00
M: alien-invoke alien-node-parameters alien-invoke-parameters ;
M: alien-invoke alien-node-return alien-invoke-return ;
M: alien-invoke alien-node-abi
alien-invoke-library library
[ library-abi ] [ "cdecl" ] if* ;
2006-11-13 01:34:01 -05:00
2006-02-11 02:30:18 -05:00
C: alien-invoke make-node ;
: stdcall-mangle ( symbol node -- symbol )
"@"
swap alien-node-parameters parameter-sizes drop
number>string 3append ;
: (alien-invoke-dlsym) ( node -- symbol dll )
dup alien-invoke-function
swap alien-invoke-library load-library ;
2006-02-11 02:30:18 -05:00
: alien-invoke-dlsym ( node -- symbol dll )
dup (alien-invoke-dlsym) 2dup dlsym [
>r over stdcall-mangle r> 2dup dlsym [
"No such symbol" inference-error
] unless
] unless rot drop ;
2006-02-11 02:30:18 -05:00
TUPLE: alien-invoke-error library symbol ;
2006-09-06 18:06:11 -04:00
M: alien-invoke-error summary
drop "Words calling ``alien-invoke'' cannot run in the interpreter. Compile the caller word and try again." ;
2005-05-17 16:13:08 -04:00
: alien-invoke ( ... return library function parameters -- ... )
2006-02-11 02:30:18 -05:00
pick pick <alien-invoke-error> throw ;
2004-12-25 15:52:08 -05:00
2006-02-11 02:30:18 -05:00
\ alien-invoke [
! Four literals
4 ensure-values
empty-node <alien-invoke>
! Compile-time parameters
2006-02-11 02:30:18 -05:00
pop-literal nip over set-alien-invoke-parameters
pop-literal nip over set-alien-invoke-function
pop-literal nip over set-alien-invoke-library
pop-literal nip over set-alien-invoke-return
! Quotation which coerces parameters to required types
dup make-prep-quot infer-quot
! If symbol doesn't resolve, no stack effect, no compile
dup alien-invoke-dlsym 2drop
! Add node to IR
dup node,
! Magic #: consume exactly the number of inputs
0 alien-invoke-stack
2006-02-11 02:30:18 -05:00
] "infer" set-word-prop
2004-12-25 15:52:08 -05:00
M: alien-invoke generate-node
dup alien-invoke-frame [
end-basic-block
dup objects>registers
dup alien-invoke-dlsym %alien-invoke
dup %cleanup
box-return*
iterate-next
] with-stack-frame ;
2006-03-07 19:53:58 -05:00
2006-08-15 16:29:35 -04:00
: parse-arglist ( return seq -- types effect )
2 <groups> unpair
2006-08-15 16:29:35 -04:00
rot dup "void" = [ drop { } ] [ 1array ] if <effect> ;
2005-08-24 10:19:09 -04:00
: function-quot ( type lib func types -- quot )
[ alien-invoke ] curry curry curry curry ;
2005-08-24 10:19:09 -04:00
: define-function ( return library function parameters -- )
>r pick r> parse-arglist
pick create-in dup reset-generic
>r >r function-quot r> r>
-rot define-declared ;