2006-01-30 02:03:34 -05:00
|
|
|
! Copyright (C) 2004, 2006 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2004-09-25 16:18:11 -04:00
|
|
|
IN: alien
|
2006-04-03 02:18:56 -04:00
|
|
|
USING: arrays assembler compiler compiler
|
|
|
|
errors generic hashtables inference inspector
|
2006-02-06 01:43:59 -05:00
|
|
|
io kernel kernel-internals lists math namespaces parser
|
|
|
|
prettyprint sequences strings words ;
|
2005-03-26 20:12:14 -05:00
|
|
|
|
2006-02-11 02:30:18 -05:00
|
|
|
TUPLE: alien-invoke library function return parameters ;
|
|
|
|
C: alien-invoke make-node ;
|
|
|
|
|
|
|
|
: alien-invoke-stack ( node -- )
|
|
|
|
dup alien-invoke-parameters length over consume-values
|
|
|
|
dup alien-invoke-return "void" = 0 1 ? swap produce-values ;
|
|
|
|
|
|
|
|
: alien-invoke-dlsym ( node -- symbol dll )
|
|
|
|
dup alien-invoke-function swap alien-invoke-library
|
|
|
|
load-library ;
|
|
|
|
|
|
|
|
TUPLE: alien-invoke-error library symbol ;
|
|
|
|
|
|
|
|
M: alien-invoke-error summary ( error -- )
|
2006-01-09 01:06:20 -05:00
|
|
|
drop "Words calling ``alien-invoke'' cannot run in the interpreter. Compile the caller word and try again." ;
|
2005-04-23 19:34:54 -04:00
|
|
|
|
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 [ [ string object string object ] [ ] ]
|
|
|
|
"infer-effect" set-word-prop
|
2005-03-29 19:11:10 -05:00
|
|
|
|
2006-02-11 02:30:18 -05:00
|
|
|
\ alien-invoke [
|
|
|
|
empty-node <alien-invoke>
|
|
|
|
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
|
|
|
|
dup alien-invoke-dlsym dlsym drop
|
|
|
|
dup alien-invoke-stack
|
|
|
|
node,
|
|
|
|
] "infer" set-word-prop
|
2004-12-25 15:52:08 -05:00
|
|
|
|
2006-04-28 18:38:48 -04:00
|
|
|
: unbox-parameter ( stack# type -- )
|
2006-02-14 23:23:08 -05:00
|
|
|
c-type [ "reg-class" get "unboxer" get call ] bind ;
|
2004-12-13 19:14:03 -05:00
|
|
|
|
2006-02-13 22:20:39 -05:00
|
|
|
: unbox-parameters ( parameters -- )
|
2006-04-28 18:38:48 -04:00
|
|
|
[ unbox-parameter ] reverse-each-parameter ;
|
2006-02-13 22:20:39 -05:00
|
|
|
|
|
|
|
: objects>registers ( parameters -- )
|
2005-04-23 19:34:06 -04:00
|
|
|
#! Generate code for boxing a list of C types, then generate
|
|
|
|
#! code for moving these parameters to register on
|
|
|
|
#! architectures where parameters are passed in registers
|
2006-02-13 22:20:39 -05:00
|
|
|
#! (PowerPC, AMD64).
|
2006-04-28 18:38:48 -04:00
|
|
|
dup unbox-parameters "save_stacks" f %alien-invoke
|
|
|
|
\ %stack>freg move-parameters ;
|
2004-12-13 19:14:03 -05:00
|
|
|
|
2006-02-13 22:20:39 -05:00
|
|
|
: box-return ( node -- )
|
2006-04-28 18:38:48 -04:00
|
|
|
alien-invoke-return [ ] [ f swap box-parameter ] if-void ;
|
2004-12-13 19:14:03 -05:00
|
|
|
|
2006-04-28 18:38:48 -04:00
|
|
|
: generate-cleanup ( node -- )
|
2006-02-11 02:30:18 -05:00
|
|
|
dup alien-invoke-library library-abi "stdcall" = [
|
|
|
|
drop
|
|
|
|
] [
|
2006-04-28 18:38:48 -04:00
|
|
|
alien-invoke-parameters stack-space %cleanup
|
2006-02-11 02:30:18 -05:00
|
|
|
] if ;
|
2006-01-30 02:03:34 -05:00
|
|
|
|
2006-04-28 18:38:48 -04:00
|
|
|
M: alien-invoke generate-node ( node -- )
|
2006-04-03 03:22:33 -04:00
|
|
|
end-basic-block compile-gc
|
2006-02-13 22:20:39 -05:00
|
|
|
dup alien-invoke-parameters objects>registers
|
2006-04-28 18:38:48 -04:00
|
|
|
dup alien-invoke-dlsym %alien-invoke
|
|
|
|
dup generate-cleanup box-return
|
2006-03-02 01:12:32 -05:00
|
|
|
iterate-next ;
|
2005-03-29 19:11:10 -05:00
|
|
|
|
2006-03-07 19:53:58 -05:00
|
|
|
M: alien-invoke stack-reserve*
|
|
|
|
alien-invoke-parameters stack-space ;
|
|
|
|
|
2006-02-19 20:53:18 -05:00
|
|
|
: parse-arglist ( return seq -- types stack-effect )
|
2006-04-03 01:33:52 -04:00
|
|
|
2 swap group unpair
|
|
|
|
rot dup "void" = [ drop { } ] [ 1array ] if 2array
|
2006-03-29 17:19:58 -05:00
|
|
|
effect>string ;
|
2005-08-24 10:19:09 -04:00
|
|
|
|
|
|
|
: (define-c-word) ( type lib func types stack-effect -- )
|
|
|
|
>r over create-in >r
|
2006-05-10 20:32:04 -04:00
|
|
|
[ alien-invoke ] curry curry curry curry
|
|
|
|
r> swap define-compound word r>
|
|
|
|
"stack-effect" set-word-prop ;
|
2005-08-24 10:19:09 -04:00
|
|
|
|
2006-03-26 16:36:05 -05:00
|
|
|
: define-c-word ( return library function parameters -- )
|
2006-02-19 20:53:18 -05:00
|
|
|
[ "()" subseq? not ] subset >r pick r> parse-arglist
|
|
|
|
(define-c-word) ;
|
2005-08-24 10:19:09 -04:00
|
|
|
|
2006-03-27 03:10:58 -05:00
|
|
|
M: compound unxref-word*
|
2005-09-11 20:46:55 -04:00
|
|
|
dup word-def \ alien-invoke swap member?
|
|
|
|
over "infer" word-prop or [
|
2005-08-04 17:39:39 -04:00
|
|
|
drop
|
|
|
|
] [
|
2006-02-11 02:30:18 -05:00
|
|
|
dup
|
|
|
|
{ "infer-effect" "base-case" "no-effect" "terminates" }
|
2005-08-31 21:06:13 -04:00
|
|
|
reset-props update-xt
|
2005-09-24 15:21:17 -04:00
|
|
|
] if ;
|