factor/core/compiler/alien/alien-indirect.factor

51 lines
1.6 KiB
Factor
Raw Normal View History

! Copyright (C) 2006, 2007 Slava Pestov.
2006-09-09 00:12:46 -04:00
! See http://factorcode.org/license.txt for BSD license.
IN: alien
USING: generator errors generic hashtables inference
kernel namespaces sequences strings words parser prettyprint
kernel-internals math ;
2006-09-09 00:12:46 -04:00
TUPLE: alien-indirect return parameters abi ;
C: alien-indirect make-node ;
M: alien-indirect alien-node-parameters alien-indirect-parameters ;
M: alien-indirect alien-node-return alien-indirect-return ;
M: alien-indirect alien-node-abi alien-indirect-abi ;
2006-11-13 01:34:01 -05:00
2006-09-09 00:12:46 -04:00
TUPLE: alien-indirect-error ;
: alien-indirect ( ... funcptr return parameters abi -- )
2006-09-09 00:12:46 -04:00
<alien-indirect-error> throw ;
M: alien-indirect-error summary
drop "Words calling ``alien-indirect'' cannot run in the interpreter. Compile the caller word and try again." ;
\ alien-indirect [
! Three literals and function pointer
4 ensure-values
empty-node <alien-indirect>
! Compile-time parameters
2006-09-09 00:12:46 -04:00
pop-literal nip over set-alien-indirect-abi
pop-literal nip over set-alien-indirect-parameters
pop-literal nip over set-alien-indirect-return
! Quotation which coerces parameters to required types
dup make-prep-quot 1 make-dip infer-quot
! Add node to IR
2006-11-13 01:34:01 -05:00
dup node,
! Magic #: consume the function pointer, too
1 alien-invoke-stack
2006-09-09 00:12:46 -04:00
] "infer" set-word-prop
M: alien-indirect generate-node
2006-11-03 00:48:43 -05:00
end-basic-block
! Save alien at top of stack to temporary storage
%prepare-alien-indirect
dup objects>registers
! Call alien in temporary storage
2006-09-09 00:12:46 -04:00
%alien-indirect
dup %cleanup
box-return*
2006-09-09 00:12:46 -04:00
iterate-next ;
M: alien-indirect stack-frame-size* alien-invoke-frame ;