factor/library/compiler/alien/alien-callback.factor

73 lines
2.1 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 errors generic hashtables inference
2006-09-06 18:06:11 -04:00
kernel namespaces sequences strings words parser prettyprint ;
2006-02-11 02:30:18 -05:00
2006-10-16 18:06:34 -04:00
! Callbacks are registered in a global hashtable. If you clear
! this hashtable, they will all be blown away by code GC, beware
SYMBOL: callbacks
H{ } clone callbacks set-global
: register-callback ( word -- ) dup callbacks get set-hash ;
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 ;
2006-08-16 21:55:53 -04:00
: alien-callback ( return parameters quot -- alien )
2006-02-11 02:30:18 -05:00
<alien-callback-error> throw ;
2006-09-06 18:06:11 -04:00
M: alien-callback-error summary
drop "Words calling ``alien-callback'' cannot run in the interpreter. Compile the caller word and try again." ;
2006-02-11 02:30:18 -05:00
: callback-bottom ( node -- )
alien-callback-xt [ word-xt <alien> ] curry infer-quot ;
\ alien-callback [ string object quotation ] [ alien ] <effect>
2006-02-11 02:30:18 -05:00
"infer-effect" set-word-prop
\ alien-callback [
empty-node <alien-callback> dup node,
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
2006-10-16 18:06:34 -04:00
gensym dup register-callback over set-alien-callback-xt
2006-02-11 02:30:18 -05:00
callback-bottom
] "infer" set-word-prop
2006-02-13 22:20:39 -05:00
: box-parameters ( parameters -- )
2006-04-28 18:38:48 -04:00
[ box-parameter ] each-parameter ;
2006-02-13 22:20:39 -05:00
: registers>objects ( parameters -- )
2006-04-28 18:38:48 -04:00
dup \ %freg>stack move-parameters
"nest_stacks" f %alien-invoke box-parameters ;
2006-02-13 22:20:39 -05:00
: unbox-return ( node -- )
alien-callback-return [
2006-04-28 18:38:48 -04:00
"unnest_stacks" f %alien-invoke
] [
c-type [
"reg-class" get
"unboxer-function" get
2006-04-28 18:38:48 -04:00
%callback-value
] bind
] if-void ;
2006-04-28 18:38:48 -04:00
: generate-callback ( node -- )
[ alien-callback-xt ] keep [
2006-02-13 22:20:39 -05:00
dup alien-callback-parameters registers>objects
dup alien-callback-quot \ init-error-handler add*
2006-04-28 18:38:48 -04:00
%alien-callback
unbox-return
2006-04-28 18:38:48 -04:00
%return
2006-08-10 01:05:12 -04:00
] generate-1 ;
2006-02-11 02:30:18 -05:00
M: alien-callback generate-node
2006-04-28 18:38:48 -04:00
end-basic-block compile-gc generate-callback iterate-next ;
2006-03-07 19:53:58 -05:00
M: alien-callback stack-reserve*
alien-callback-parameters stack-space ;