]> gitweb.factorcode.org Git - factor.git/blob - core/compiler/x86/alien.factor
more sql changes
[factor.git] / core / compiler / x86 / alien.factor
1 ! Copyright (C) 2005, 2006 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 IN: compiler
4 USING: alien arrays assembler inference kernel
5 kernel-internals math memory namespaces words ;
6
7 : %unbox ( n reg-class func -- )
8     f %alien-invoke push-return-reg drop ;
9
10 : struct-ptr/size ( size func -- )
11     ! Load struct size
12     swap PUSH
13     ! Load destination address
14     EAX PUSH
15     ! Copy the struct to the stack
16     f %alien-invoke
17     ! Clean up
18     EAX POP
19     ECX POP ;
20
21 : %unbox-struct ( n size -- )
22     nip
23     ! Increase stack size
24     ESP over SUB
25     ! Save destination address in EAX
26     EAX ESP MOV
27     "unbox_value_struct" struct-ptr/size ;
28
29 : %box-struct ( n size -- )
30     nip
31     ! Compute source address in EAX
32     EAX ESP MOV
33     EAX 8 ADD
34     "box_value_struct" struct-ptr/size ;
35
36 : %box ( n reg-class func -- )
37     rot [ 8 + pick load-return-reg ] when*
38     over push-return-reg
39     f %alien-invoke
40     drop-return-reg ;
41
42 : %alien-callback ( quot -- )
43     0 <int-vreg> load-literal
44     EAX PUSH
45     "run_callback" f %alien-invoke
46     EAX POP ;
47
48 : %callback-value ( reg-class func -- )
49     ! Call the unboxer
50     f %alien-invoke
51     ! Save return register
52     dup push-return-reg
53     ! Restore data/callstacks
54     "unnest_stacks" f %alien-invoke
55     ! Restore return register
56     pop-return-reg ;
57
58 : %cleanup ( n -- ) dup zero? [ drop ] [ ESP swap ADD ] if ;