factor/library/alien/alien-callback.factor

65 lines
1.9 KiB
Factor
Raw Normal View History

2006-02-11 02:30:18 -05:00
! Copyright (C) 2006 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
IN: alien
USING: compiler-backend compiler-frontend errors generic
hashtables inference inspector kernel lists namespaces sequences
strings words ;
2006-02-13 17:16:34 -05:00
TUPLE: alien-callback return parameters quot xt ;
2006-02-11 02:30:18 -05:00
C: alien-callback make-node ;
TUPLE: alien-callback-error ;
M: alien-callback-error summary ( error -- )
drop "Words calling ``alien-callback'' cannot run in the interpreter. Compile the caller word and try again." ;
2006-02-13 17:16:34 -05:00
: alien-callback ( ... return parameters quot -- ... )
2006-02-11 02:30:18 -05:00
<alien-callback-error> throw ;
: callback-bottom ( node -- )
alien-callback-xt [ word-xt <alien> ] curry infer-quot ;
2006-02-13 17:16:34 -05:00
\ alien-callback [ [ string object general-list ] [ alien ] ]
2006-02-11 02:30:18 -05:00
"infer-effect" set-word-prop
\ alien-callback [
empty-node <alien-callback>
2006-02-13 17:16:34 -05:00
pop-literal nip over set-alien-callback-quot
2006-02-11 02:30:18 -05:00
pop-literal nip over set-alien-callback-parameters
pop-literal nip over set-alien-callback-return
gensym over set-alien-callback-xt
dup node,
callback-bottom
] "infer" set-word-prop
2006-02-13 22:20:39 -05:00
: box-parameters ( parameters -- )
2006-02-20 17:49:44 -05:00
[ box-parameter ] map-parameters % ;
2006-02-13 22:20:39 -05:00
: registers>objects ( parameters -- )
dup stack-space %parameters ,
2006-02-20 17:49:44 -05:00
dup \ %freg>stack move-parameters %
2006-02-13 22:20:39 -05:00
"nest_stacks" f %alien-invoke ,
box-parameters ;
: unbox-return ( node -- )
alien-callback-return [
"unnest_stacks" f %alien-invoke ,
] [
c-type [
"reg-class" get
"unboxer-function" get
%callback-value ,
] bind
] if-void ;
2006-02-11 02:34:33 -05:00
: linearize-callback ( node -- )
dup alien-callback-xt [
2006-02-13 22:20:39 -05:00
dup alien-callback-parameters registers>objects
dup alien-callback-quot %alien-callback ,
unbox-return
2006-02-13 17:16:34 -05:00
%return ,
2006-02-11 02:34:33 -05:00
] make-linear ;
2006-02-11 02:30:18 -05:00
M: alien-callback linearize* ( node -- )
compile-gc dup linearize-callback linearize-next ;