1 ! Copyright (C) 2005, 2006 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: alien arrays assembler inference kernel
5 kernel-internals math memory namespaces words ;
7 : %unbox ( n reg-class func -- )
8 f %alien-invoke push-return-reg drop ;
10 : struct-ptr/size ( size func -- )
13 ! Load destination address
15 ! Copy the struct to the stack
21 : %unbox-struct ( n size -- )
25 ! Save destination address in EAX
27 "unbox_value_struct" struct-ptr/size ;
29 : %box-struct ( n size -- )
31 ! Compute source address in EAX
34 "box_value_struct" struct-ptr/size ;
36 : %box ( n reg-class func -- )
37 rot [ 8 + pick load-return-reg ] when*
42 : %alien-callback ( quot -- )
43 0 <int-vreg> load-literal
45 "run_callback" f %alien-invoke
48 : %callback-value ( reg-class func -- )
51 ! Save return register
53 ! Restore data/callstacks
54 "unnest_stacks" f %alien-invoke
55 ! Restore return register
58 : %cleanup ( n -- ) dup zero? [ drop ] [ ESP swap ADD ] if ;