2006-02-11 02:30:18 -05:00
|
|
|
! Copyright (C) 2006 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
IN: alien
|
2006-04-03 02:18:56 -04:00
|
|
|
USING: compiler errors generic hashtables inference inspector
|
2006-05-15 01:01:47 -04:00
|
|
|
kernel namespaces sequences strings words ;
|
2006-02-11 02:30:18 -05:00
|
|
|
|
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-03-09 01:44:17 -05:00
|
|
|
: alien-callback ( return parameters quot -- address )
|
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-05-15 01:01:47 -04:00
|
|
|
\ alien-callback [ [ string object quotation ] [ 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-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
|
|
|
|
2006-02-14 23:23:08 -05:00
|
|
|
: unbox-return ( node -- )
|
|
|
|
alien-callback-return [
|
2006-04-28 18:38:48 -04:00
|
|
|
"unnest_stacks" f %alien-invoke
|
2006-02-14 23:23:08 -05:00
|
|
|
] [
|
|
|
|
c-type [
|
|
|
|
"reg-class" get
|
|
|
|
"unboxer-function" get
|
2006-04-28 18:38:48 -04:00
|
|
|
%callback-value
|
2006-02-14 23:23:08 -05:00
|
|
|
] 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
|
2006-05-10 20:32:04 -04:00
|
|
|
dup alien-callback-quot \ init-error-handler add*
|
2006-04-28 18:38:48 -04:00
|
|
|
%alien-callback
|
2006-02-14 23:23:08 -05:00
|
|
|
unbox-return
|
2006-04-28 18:38:48 -04:00
|
|
|
%return
|
|
|
|
] generate-block ;
|
2006-02-11 02:30:18 -05:00
|
|
|
|
2006-04-28 18:38:48 -04:00
|
|
|
M: alien-callback generate-node ( node -- )
|
|
|
|
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 ;
|