1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors kernel namespaces make math sequences layouts
4 alien.c-types alien.structs compiler.backend ;
9 : large-struct? ( ctype -- ? )
11 heap-size struct-small-enough? not
14 : alien-parameters ( params -- seq )
16 swap return>> large-struct? [ "void*" prefix ] when ;
18 : alien-return ( params -- ctype )
19 return>> dup large-struct? [ drop "void" ] when ;
21 : c-type-stack-align ( type -- align )
22 dup c-type-stack-align? [ c-type-align ] [ drop cell ] if ;
24 : parameter-align ( n type -- n delta )
25 over >r c-type-stack-align align dup r> - ;
27 : parameter-sizes ( types -- total offsets )
28 #! Compute stack frame locations.
31 [ parameter-align drop dup , ] keep stack-size +
35 : return-size ( ctype -- n )
36 #! Amount of space we reserve for a return value.
37 dup large-struct? [ heap-size ] [ drop 0 ] if ;
39 : alien-stack-frame ( params -- n )
40 alien-parameters parameter-sizes drop ;
42 : alien-invoke-frame ( params -- n )
43 #! One cell is temporary storage, temp@
44 dup return>> return-size
45 swap alien-stack-frame +