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-11 02:34:33 -05:00
|
|
|
: linearize-callback ( node -- )
|
|
|
|
|
dup alien-callback-xt [
|
2006-02-13 17:16:34 -05:00
|
|
|
"nest_stacks" f %alien-invoke ,
|
|
|
|
|
alien-callback-quot %nullary-callback ,
|
|
|
|
|
%return ,
|
2006-02-11 02:34:33 -05:00
|
|
|
] make-linear ;
|
2006-02-11 02:30:18 -05:00
|
|
|
|
|
|
|
|
M: alien-callback linearize* ( node -- )
|
2006-02-11 02:34:33 -05:00
|
|
|
dup linearize-callback linearize-next ;
|