2019-10-18 09:05:06 -04:00
|
|
|
! Copyright (C) 2004, 2007 Slava Pestov.
|
2006-01-30 02:03:34 -05:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2004-09-25 16:18:11 -04:00
|
|
|
IN: alien
|
2019-10-18 09:05:06 -04:00
|
|
|
USING: arrays generator errors generic hashtables
|
2006-09-06 18:06:11 -04:00
|
|
|
inference io kernel kernel-internals math namespaces parser
|
2019-10-18 09:05:08 -04:00
|
|
|
prettyprint sequences strings words quotations
|
|
|
|
|
inspector ;
|
2005-03-26 20:12:14 -05:00
|
|
|
|
2006-02-11 02:30:18 -05:00
|
|
|
TUPLE: alien-invoke library function return parameters ;
|
2006-11-13 01:34:01 -05:00
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
M: alien-invoke alien-node-parameters alien-invoke-parameters ;
|
|
|
|
|
M: alien-invoke alien-node-return alien-invoke-return ;
|
2019-10-18 09:05:08 -04:00
|
|
|
|
|
|
|
|
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 ;
|
|
|
|
|
|
2019-10-18 09:05:08 -04:00
|
|
|
: 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 )
|
2019-10-18 09:05:08 -04:00
|
|
|
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 [
|
2019-10-18 09:05:06 -04:00
|
|
|
! Four literals
|
|
|
|
|
4 ensure-values
|
2006-11-03 16:39:37 -05:00
|
|
|
empty-node <alien-invoke>
|
2019-10-18 09:05:06 -04:00
|
|
|
! 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
|
2019-10-18 09:05:06 -04:00
|
|
|
! Quotation which coerces parameters to required types
|
|
|
|
|
dup make-prep-quot infer-quot
|
|
|
|
|
! If symbol doesn't resolve, no stack effect, no compile
|
2019-10-18 09:05:08 -04:00
|
|
|
dup alien-invoke-dlsym 2drop
|
2019-10-18 09:05:06 -04:00
|
|
|
! Add node to IR
|
2006-11-03 16:39:37 -05:00
|
|
|
dup node,
|
2019-10-18 09:05:06 -04:00
|
|
|
! 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
|
|
|
|
2006-08-15 03:01:24 -04:00
|
|
|
M: alien-invoke generate-node
|
2019-10-18 09:05:08 -04:00
|
|
|
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 )
|
2019-10-18 09:05:06 -04:00
|
|
|
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
|
|
|
|
2019-10-18 09:05:08 -04:00
|
|
|
: function-quot ( type lib func types -- quot )
|
|
|
|
|
[ alien-invoke ] curry curry curry curry ;
|
2005-08-24 10:19:09 -04:00
|
|
|
|
2019-10-18 09:05:08 -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 ;
|