1 USING: accessors alien alien.c-types alien.libraries
2 alien.syntax arrays classes.struct combinators
3 compiler continuations effects generalizations io
4 io.backend io.pathnames io.streams.string kernel
5 math memory namespaces namespaces.private parser
6 quotations sequences specialized-arrays stack-checker
7 stack-checker.errors system threads tools.test words
8 alien.complex concurrency.promises alien.data
9 byte-arrays classes compiler.test libc layouts
11 FROM: alien.c-types => float short ;
12 SPECIALIZED-ARRAY: float
13 SPECIALIZED-ARRAY: char
14 IN: compiler.tests.alien
16 ! Make sure that invalid inputs don't pass the stack checker
17 [ [ void { } "cdecl" alien-indirect ] infer ] must-fail
18 [ [ "void" { } cdecl alien-indirect ] infer ] must-fail
19 [ [ void* 3 cdecl alien-indirect ] infer ] must-fail
20 [ [ void* { "int" } cdecl alien-indirect ] infer ] must-fail
21 [ [ void* { int } cdecl { } alien-callback ] infer ] must-fail
24 : libfactor-ffi-tests-path ( -- string )
25 "resource:" absolute-path
27 { [ os windows? ] [ "libfactor-ffi-test.dll" ] }
28 { [ os macosx? ] [ "libfactor-ffi-test.dylib" ] }
29 { [ os unix? ] [ "libfactor-ffi-test.so" ] }
32 : mingw? ( -- ? ) os windows? vm-compiler "GCC" head? and ;
34 "f-cdecl" libfactor-ffi-tests-path mingw? mingw cdecl ? add-library
36 "f-stdcall" libfactor-ffi-tests-path stdcall add-library
38 "f-fastcall" libfactor-ffi-tests-path fastcall add-library
43 FUNCTION: void ffi_test_0 ;
44 [ ] [ ffi_test_0 ] unit-test
46 FUNCTION: int ffi_test_1 ;
47 [ 3 ] [ ffi_test_1 ] unit-test
49 [ ] [ \ ffi_test_1 def>> [ drop ] append compile-call ] unit-test
51 FUNCTION: int ffi_test_2 int x int y ;
52 [ 5 ] [ 2 3 ffi_test_2 ] unit-test
53 [ "hi" 3 ffi_test_2 ] must-fail
55 FUNCTION: int ffi_test_3 int x int y int z int t ;
56 [ 25 ] [ 2 3 4 5 ffi_test_3 ] unit-test
58 FUNCTION: float ffi_test_4 ;
59 [ 1.5 ] [ ffi_test_4 ] unit-test
61 FUNCTION: double ffi_test_5 ;
62 [ 1.5 ] [ ffi_test_5 ] unit-test
64 FUNCTION: int ffi_test_9 int a int b int c int d int e int f int g ;
65 [ 28 ] [ 1 2 3 4 5 6 7 ffi_test_9 ] unit-test
66 [ "a" 2 3 4 5 6 7 ffi_test_9 ] must-fail
67 [ 1 2 3 4 5 6 "a" ffi_test_9 ] must-fail
69 STRUCT: FOO { x int } { y int } ;
71 : make-FOO ( x y -- FOO )
72 FOO <struct> swap >>y swap >>x ;
74 FUNCTION: int ffi_test_11 int a FOO b int c ;
76 [ 14 ] [ 1 2 3 make-FOO 4 ffi_test_11 ] unit-test
78 FUNCTION: int ffi_test_13 int a int b int c int d int e int f int g int h int i int j int k ;
80 [ 66 ] [ 1 2 3 4 5 6 7 8 9 10 11 ffi_test_13 ] unit-test
82 FUNCTION: FOO ffi_test_14 int x int y ;
84 [ 11 6 ] [ 11 6 ffi_test_14 [ x>> ] [ y>> ] bi ] unit-test
86 FUNCTION: c-string ffi_test_15 c-string x c-string y ;
88 [ "foo" ] [ "xy" "zt" ffi_test_15 ] unit-test
89 [ "bar" ] [ "xy" "xy" ffi_test_15 ] unit-test
90 [ 1 2 ffi_test_15 ] must-fail
92 STRUCT: BAR { x long } { y long } { z long } ;
94 FUNCTION: BAR ffi_test_16 long x long y long z ;
97 11 6 -7 ffi_test_16 [ x>> ] [ y>> ] [ z>> ] tri
100 STRUCT: TINY { x int } ;
102 FUNCTION: TINY ffi_test_17 int x ;
104 [ 11 ] [ 11 ffi_test_17 x>> ] unit-test
106 [ [ alien-indirect ] infer ] [ inference-error? ] must-fail-with
108 : indirect-test-1 ( ptr -- result )
109 int { } cdecl alien-indirect ;
111 { 1 1 } [ indirect-test-1 ] must-infer-as
113 [ 3 ] [ &: ffi_test_1 indirect-test-1 ] unit-test
115 : indirect-test-1' ( ptr -- )
116 int { } cdecl alien-indirect drop ;
118 { 1 0 } [ indirect-test-1' ] must-infer-as
120 [ ] [ &: ffi_test_1 indirect-test-1' ] unit-test
122 [ -1 indirect-test-1 ] must-fail
124 : indirect-test-2 ( x y ptr -- result )
125 int { int int } cdecl alien-indirect gc ;
127 { 3 1 } [ indirect-test-2 ] must-infer-as
130 [ 2 3 &: ffi_test_2 indirect-test-2 ]
133 : indirect-test-3 ( a b c d ptr -- result )
134 int { int int int int } stdcall alien-indirect
137 [ f ] [ "f-stdcall" load-library f = ] unit-test
138 [ stdcall ] [ "f-stdcall" lookup-library abi>> ] unit-test
140 : ffi_test_18 ( w x y z -- int )
141 int "f-stdcall" "ffi_test_18" { int int int int }
144 [ 25 ] [ 2 3 4 5 ffi_test_18 ] unit-test
146 : ffi_test_19 ( x y z -- BAR )
147 BAR "f-stdcall" "ffi_test_19" { long long long }
151 11 6 -7 ffi_test_19 [ x>> ] [ y>> ] [ z>> ] tri
154 : multi_ffi_test_18 ( w x y z w' x' y' z' -- int int )
155 [ int "f-stdcall" "ffi_test_18" { int int int int } alien-invoke ]
157 int "f-stdcall" "ffi_test_18" { int int int int } alien-invoke
160 [ 25 85 ] [ 2 3 4 5 6 7 8 9 multi_ffi_test_18 ] unit-test
162 FUNCTION: double ffi_test_6 float x float y ;
163 [ 6.0 ] [ 3.0 2.0 ffi_test_6 ] unit-test
164 [ "a" "b" ffi_test_6 ] must-fail
166 FUNCTION: double ffi_test_7 double x double y ;
167 [ 6.0 ] [ 3.0 2.0 ffi_test_7 ] unit-test
169 FUNCTION: double ffi_test_8 double x float y double z float t int w ;
170 [ 19.0 ] [ 3.0 2.0 1.0 6.0 7 ffi_test_8 ] unit-test
172 FUNCTION: int ffi_test_10 int a int b double c int d float e int f int g int h ;
173 [ -34 ] [ 1 2 3.0 4 5.0 6 7 8 ffi_test_10 ] unit-test
175 FUNCTION: void ffi_test_20 double x1, double x2, double x3,
176 double y1, double y2, double y3,
177 double z1, double z2, double z3 ;
179 [ ] [ 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 ffi_test_20 ] unit-test
181 ! Make sure XT doesn't get clobbered in stack frame
183 : ffi_test_31 ( a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a -- result y )
185 "f-cdecl" "ffi_test_31"
186 { int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int }
189 [ 861 3 ] [ 42 [ ] each-integer ffi_test_31 ] unit-test
191 : ffi_test_31_point_5 ( a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a -- result )
193 "f-cdecl" "ffi_test_31_point_5"
194 { float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float }
197 [ 861.0 ] [ 42 [ >float ] each-integer ffi_test_31_point_5 ] unit-test
199 FUNCTION: longlong ffi_test_21 long x long y ;
201 [ 121932631112635269 ]
202 [ 123456789 987654321 ffi_test_21 ] unit-test
204 FUNCTION: long ffi_test_22 long x longlong y longlong z ;
207 [ 1111 121932631112635269 123456789 ffi_test_22 ] unit-test
209 [ 1111 f 123456789 ffi_test_22 ] must-fail
212 { x float } { y float }
213 { w float } { h float } ;
215 : <RECT> ( x y w h -- rect )
222 FUNCTION: int ffi_test_12 int a int b RECT c int d int e int f ;
224 [ 45 ] [ 1 2 3.0 4.0 5.0 6.0 <RECT> 7 8 9 ffi_test_12 ] unit-test
226 [ 1 2 { 1 2 3 } 7 8 9 ffi_test_12 ] must-fail
228 FUNCTION: float ffi_test_23 ( float[3] x, float[3] y ) ;
231 { 1.0 2.0 3.0 } float >c-array
232 { 4.0 5.0 6.0 } float >c-array
236 ! Test odd-size structs
237 STRUCT: test-struct-1 { x char[1] } ;
239 FUNCTION: test-struct-1 ffi_test_24 ;
241 [ S{ test-struct-1 { x char-array{ 1 } } } ] [ ffi_test_24 ] unit-test
243 STRUCT: test-struct-2 { x char[2] } ;
245 FUNCTION: test-struct-2 ffi_test_25 ;
247 [ S{ test-struct-2 { x char-array{ 1 2 } } } ] [ ffi_test_25 ] unit-test
249 STRUCT: test-struct-3 { x char[3] } ;
251 FUNCTION: test-struct-3 ffi_test_26 ;
253 [ S{ test-struct-3 { x char-array{ 1 2 3 } } } ] [ ffi_test_26 ] unit-test
255 STRUCT: test-struct-4 { x char[4] } ;
257 FUNCTION: test-struct-4 ffi_test_27 ;
259 [ S{ test-struct-4 { x char-array{ 1 2 3 4 } } } ] [ ffi_test_27 ] unit-test
261 STRUCT: test-struct-5 { x char[5] } ;
263 FUNCTION: test-struct-5 ffi_test_28 ;
265 [ S{ test-struct-5 { x char-array{ 1 2 3 4 5 } } } ] [ ffi_test_28 ] unit-test
267 STRUCT: test-struct-6 { x char[6] } ;
269 FUNCTION: test-struct-6 ffi_test_29 ;
271 [ S{ test-struct-6 { x char-array{ 1 2 3 4 5 6 } } } ] [ ffi_test_29 ] unit-test
273 STRUCT: test-struct-7 { x char[7] } ;
275 FUNCTION: test-struct-7 ffi_test_30 ;
277 [ S{ test-struct-7 { x char-array{ 1 2 3 4 5 6 7 } } } ] [ ffi_test_30 ] unit-test
279 STRUCT: test-struct-8 { x double } { y double } ;
281 FUNCTION: double ffi_test_32 test-struct-8 x int y ;
284 test-struct-8 <struct>
290 STRUCT: test-struct-9 { x float } { y float } ;
292 FUNCTION: double ffi_test_33 test-struct-9 x int y ;
295 test-struct-9 <struct>
301 STRUCT: test-struct-10 { x float } { y int } ;
303 FUNCTION: double ffi_test_34 test-struct-10 x int y ;
306 test-struct-10 <struct>
312 STRUCT: test-struct-11 { x int } { y int } ;
314 FUNCTION: double ffi_test_35 test-struct-11 x int y ;
317 test-struct-11 <struct>
323 STRUCT: test-struct-12 { a int } { x double } ;
325 : make-struct-12 ( x -- alien )
326 test-struct-12 <struct>
329 FUNCTION: double ffi_test_36 ( test-struct-12 x ) ;
331 [ 1.23456 ] [ 1.23456 make-struct-12 ffi_test_36 ] unit-test
333 FUNCTION: ulonglong ffi_test_38 ( ulonglong x, ulonglong y ) ;
335 [ t ] [ 31 2^ 32 2^ ffi_test_38 63 2^ = ] unit-test
338 : callback-throws ( -- x )
339 int { } cdecl [ "Hi" throw ] alien-callback ;
341 [ t ] [ callback-throws alien? ] unit-test
343 : callback-1 ( -- callback ) void { } cdecl [ ] alien-callback ;
345 [ 0 1 ] [ [ callback-1 ] infer [ in>> length ] [ out>> length ] bi ] unit-test
347 [ t ] [ callback-1 alien? ] unit-test
349 : callback_test_1 ( ptr -- ) void { } cdecl alien-indirect ;
351 [ ] [ callback-1 callback_test_1 ] unit-test
353 : callback-2 ( -- callback ) void { } cdecl [ [ 5 throw ] ignore-errors ] alien-callback ;
355 [ ] [ callback-2 callback_test_1 ] unit-test
357 : callback-3 ( -- callback ) void { } cdecl [ 5 "x" set ] alien-callback ;
362 3 "x" set callback-3 callback_test_1
364 "x" get "x" get-global
368 : callback-5 ( -- callback )
369 void { } cdecl [ gc ] alien-callback ;
372 "testing" callback-5 callback_test_1
375 : callback-5b ( -- callback )
376 void { } cdecl [ compact-gc ] alien-callback ;
379 "testing" callback-5b callback_test_1
382 : callback-6 ( -- callback )
383 void { } cdecl [ [ continue ] callcc0 ] alien-callback ;
385 [ 1 2 3 ] [ callback-6 callback_test_1 1 2 3 ] unit-test
387 : callback-7 ( -- callback )
388 void { } cdecl [ 1000000 sleep ] alien-callback ;
390 [ 1 2 3 ] [ callback-7 callback_test_1 1 2 3 ] unit-test
392 [ f ] [ namespace global eq? ] unit-test
394 : callback-8 ( -- callback )
395 void { } cdecl [ [ ] in-thread yield ] alien-callback ;
397 [ ] [ callback-8 callback_test_1 ] unit-test
399 : callback-9 ( -- callback )
400 int { int int int } cdecl [
404 FUNCTION: void ffi_test_36_point_5 ( ) ;
406 [ ] [ ffi_test_36_point_5 ] unit-test
408 FUNCTION: int ffi_test_37 ( void* func ) ;
410 [ 1 ] [ callback-9 ffi_test_37 ] unit-test
412 [ 7 ] [ callback-9 ffi_test_37 ] unit-test
414 STRUCT: test_struct_13
422 : make-test-struct-13 ( -- alien )
423 test_struct_13 <struct>
431 FUNCTION: int ffi_test_39 ( long a, long b, test_struct_13 s ) ;
433 [ 21 ] [ 12347 12347 make-test-struct-13 ffi_test_39 ] unit-test
435 ! Joe Groff found this problem
442 : <double-rect> ( a b c d -- foo )
449 : >double-rect< ( foo -- a b c d )
457 : double-rect-callback ( -- alien )
458 void { void* void* double-rect } cdecl
459 [ "example" set-global 2drop ] alien-callback ;
461 : double-rect-test ( arg callback -- arg' )
463 void { void* void* double-rect } cdecl alien-indirect
464 "example" get-global ;
466 [ byte-array 1.0 2.0 3.0 4.0 ]
468 1.0 2.0 3.0 4.0 <double-rect>
469 double-rect-callback double-rect-test
470 [ >c-ptr class-of ] [ >double-rect< ] bi
473 STRUCT: test_struct_14
477 FUNCTION: test_struct_14 ffi_test_40 ( double x1, double x2 ) ;
480 1.0 2.0 ffi_test_40 [ x1>> ] [ x2>> ] bi
483 : callback-10 ( -- callback )
484 test_struct_14 { double double } cdecl
486 test_struct_14 <struct>
491 : callback-10-test ( x1 x2 callback -- result )
492 test_struct_14 { double double } cdecl alien-indirect ;
495 1.0 2.0 callback-10 callback-10-test
499 FUNCTION: test-struct-12 ffi_test_41 ( int a, double x ) ;
506 : callback-11 ( -- callback )
507 test-struct-12 { int double } cdecl
509 test-struct-12 <struct>
514 : callback-11-test ( x1 x2 callback -- result )
515 test-struct-12 { int double } cdecl alien-indirect ;
518 1 2.0 callback-11 callback-11-test
522 STRUCT: test_struct_15
526 FUNCTION: test_struct_15 ffi_test_42 ( float x, float y ) ;
528 [ 1.0 2.0 ] [ 1.0 2.0 ffi_test_42 [ x>> ] [ y>> ] bi ] unit-test
530 : callback-12 ( -- callback )
531 test_struct_15 { float float } cdecl
533 test_struct_15 <struct>
538 : callback-12-test ( x1 x2 callback -- result )
539 test_struct_15 { float float } cdecl alien-indirect ;
542 1.0 2.0 callback-12 callback-12-test [ x>> ] [ y>> ] bi
545 STRUCT: test_struct_16
549 FUNCTION: test_struct_16 ffi_test_43 ( float x, int a ) ;
551 [ 1.0 2 ] [ 1.0 2 ffi_test_43 [ x>> ] [ a>> ] bi ] unit-test
553 : callback-13 ( -- callback )
554 test_struct_16 { float int } cdecl
556 test_struct_16 <struct>
561 : callback-13-test ( x1 x2 callback -- result )
562 test_struct_16 { float int } cdecl alien-indirect ;
565 1.0 2 callback-13 callback-13-test
569 FUNCTION: test_struct_14 ffi_test_44 ( ) ; inline
571 [ 1.0 2.0 ] [ ffi_test_44 [ x1>> ] [ x2>> ] bi ] unit-test
573 : stack-frame-bustage ( -- a b ) ffi_test_44 gc 3 ;
575 [ ] [ stack-frame-bustage 2drop ] unit-test
580 FUNCTION: complex-float ffi_test_45 ( int x ) ;
582 [ C{ 3.0 0.0 } ] [ 3 ffi_test_45 ] unit-test
584 FUNCTION: complex-double ffi_test_46 ( int x ) ;
586 [ C{ 3.0 0.0 } ] [ 3 ffi_test_46 ] unit-test
588 FUNCTION: complex-float ffi_test_47 ( complex-float x, complex-double y ) ;
592 C{ 1.5 1.0 } ffi_test_47
596 STRUCT: bool-field-test
601 FUNCTION: short ffi_test_48 ( bool-field-test x ) ;
604 bool-field-test <struct>
611 ! Test interaction between threads and callbacks
612 : thread-callback-1 ( -- callback )
613 int { } cdecl [ yield 100 ] alien-callback ;
615 : thread-callback-2 ( -- callback )
616 int { } cdecl [ yield 200 ] alien-callback ;
618 : thread-callback-invoker ( callback -- n )
619 int { } cdecl alien-indirect ;
622 [ thread-callback-1 thread-callback-invoker "p" get fulfill ] in-thread
623 [ 200 ] [ thread-callback-2 thread-callback-invoker ] unit-test
624 [ 100 ] [ "p" get ?promise ] unit-test
626 ! More alien-assembly tests are in cpu.* vocabs
627 : assembly-test-1 ( -- ) void { } cdecl [ ] alien-assembly ;
629 [ ] [ assembly-test-1 ] unit-test
631 [ f ] [ "f-fastcall" load-library f = ] unit-test
632 [ fastcall ] [ "f-fastcall" lookup-library abi>> ] unit-test
634 : ffi_test_49 ( x -- int )
635 int "f-fastcall" "ffi_test_49" { int }
637 : ffi_test_50 ( x y -- int )
638 int "f-fastcall" "ffi_test_50" { int int }
640 : ffi_test_51 ( x y z -- int )
641 int "f-fastcall" "ffi_test_51" { int int int }
643 : multi_ffi_test_51 ( x y z x' y' z' -- int int )
644 [ int "f-fastcall" "ffi_test_51" { int int int } alien-invoke ]
646 int "f-fastcall" "ffi_test_51" { int int int } alien-invoke gc ;
648 [ 4 ] [ 3 ffi_test_49 ] unit-test
649 [ 8 ] [ 3 4 ffi_test_50 ] unit-test
650 [ 13 ] [ 3 4 5 ffi_test_51 ] unit-test
651 [ 13 22 ] [ 3 4 5 6 7 8 multi_ffi_test_51 ] unit-test
653 : ffi_test_52 ( x y z -- int )
654 int "f-fastcall" "ffi_test_52" { int float int }
656 : ffi_test_53 ( x y z w -- int )
657 int "f-fastcall" "ffi_test_53" { int float int int }
659 : ffi_test_57 ( x y -- test-struct-11 )
660 test-struct-11 "f-fastcall" "ffi_test_57" { int int }
662 : ffi_test_58 ( x y z -- test-struct-11 )
663 test-struct-11 "f-fastcall" "ffi_test_58" { int int int }
666 ! Make sure that large longlong/ulonglong are correctly dealt with
667 FUNCTION: longlong ffi_test_59 ( longlong x ) ;
668 FUNCTION: ulonglong ffi_test_60 ( ulonglong x ) ;
670 [ t ] [ most-positive-fixnum 1 + [ ffi_test_59 ] keep = ] unit-test
671 [ t ] [ most-positive-fixnum 1 + [ ffi_test_60 ] keep = ] unit-test
673 [ -1 ] [ -1 ffi_test_59 ] unit-test
674 [ -1 ] [ 0xffffffffffffffff ffi_test_59 ] unit-test
675 [ 0xffffffffffffffff ] [ -1 ffi_test_60 ] unit-test
676 [ 0xffffffffffffffff ] [ 0xffffffffffffffff ffi_test_60 ] unit-test
680 [ 13 ] [ 3 4.0 5 ffi_test_52 ] unit-test
682 [ 19 ] [ 3 4.0 5 6 ffi_test_53 ] unit-test
685 [ S{ test-struct-11 f 7 -1 } ] [ 3 4 ffi_test_57 ] unit-test
687 [ S{ test-struct-11 f 7 -3 } ] [ 3 4 7 ffi_test_58 ] unit-test
689 : fastcall-ii-indirect ( x y ptr -- result )
690 int { int int } fastcall alien-indirect ;
692 : fastcall-iii-indirect ( x y z ptr -- result )
693 int { int int int } fastcall alien-indirect ;
695 : fastcall-ifi-indirect ( x y z ptr -- result )
696 int { int float int } fastcall alien-indirect ;
698 : fastcall-ifii-indirect ( x y z w ptr -- result )
699 int { int float int int } fastcall alien-indirect ;
701 : fastcall-struct-return-ii-indirect ( x y ptr -- result )
702 test-struct-11 { int int } fastcall alien-indirect ;
704 : fastcall-struct-return-iii-indirect ( x y z ptr -- result )
705 test-struct-11 { int int int } fastcall alien-indirect ;
707 : win32? ( -- ? ) os windows? cpu x86.32? and ;
711 win32? [ &: @ffi_test_50@8 ] [ &: ffi_test_50 ] if
717 win32? [ &: @ffi_test_51@12 ] [ &: ffi_test_51 ] if
718 fastcall-iii-indirect
724 win32? [ &: @ffi_test_52@12 ] [ &: ffi_test_52 ] if
725 fastcall-ifi-indirect
730 win32? [ &: @ffi_test_53@16 ] [ &: ffi_test_53 ] if
731 fastcall-ifii-indirect
735 [ S{ test-struct-11 f 7 -1 } ]
738 win32? [ &: @ffi_test_57@8 ] [ &: ffi_test_57 ] if
739 fastcall-struct-return-ii-indirect
742 [ S{ test-struct-11 f 7 -3 } ]
745 win32? [ &: @ffi_test_58@12 ] [ &: ffi_test_58 ] if
746 fastcall-struct-return-iii-indirect
749 : fastcall-ii-callback ( -- ptr )
750 int { int int } fastcall [ + 1 + ] alien-callback ;
752 : fastcall-iii-callback ( -- ptr )
753 int { int int int } fastcall [ + + 1 + ] alien-callback ;
755 : fastcall-ifi-callback ( -- ptr )
756 int { int float int } fastcall
757 [ [ >integer ] dip + + 1 + ] alien-callback ;
759 : fastcall-ifii-callback ( -- ptr )
760 int { int float int int } fastcall
761 [ [ >integer ] 2dip + + + 1 + ] alien-callback ;
763 : fastcall-struct-return-ii-callback ( -- ptr )
764 test-struct-11 { int int } fastcall
765 [ [ + ] [ - ] 2bi test-struct-11 <struct-boa> ] alien-callback ;
767 : fastcall-struct-return-iii-callback ( -- ptr )
768 test-struct-11 { int int int } fastcall
769 [ [ drop + ] [ - nip ] 3bi test-struct-11 <struct-boa> ] alien-callback ;
771 [ 8 ] [ 3 4 fastcall-ii-callback fastcall-ii-indirect ] unit-test
773 [ 13 ] [ 3 4 5 fastcall-iii-callback fastcall-iii-indirect ] unit-test
775 [ 13 ] [ 3 4.0 5 fastcall-ifi-callback fastcall-ifi-indirect ] unit-test
777 [ 19 ] [ 3 4.0 5 6 fastcall-ifii-callback fastcall-ifii-indirect ] unit-test
779 [ S{ test-struct-11 f 7 -1 } ]
780 [ 3 4 fastcall-struct-return-ii-callback fastcall-struct-return-ii-indirect ] unit-test
782 [ S{ test-struct-11 f 7 -3 } ]
783 [ 3 4 7 fastcall-struct-return-iii-callback fastcall-struct-return-iii-indirect ] unit-test
785 : x64-regression-1 ( -- c )
786 int { int int int int int } cdecl [ + + + + ] alien-callback ;
788 : x64-regression-2 ( x x x x x c -- y )
789 int { int int int int int } cdecl alien-indirect ; inline
791 [ 661 ] [ 100 500 50 10 1 x64-regression-1 x64-regression-2 ] unit-test
794 : blah ( -- x ) { RECT } [ 1.5 >>x 2.0 >>y [ x>> ] [ y>> ] bi * >fixnum ] with-scoped-allocation ;
796 [ 3 ] [ blah ] unit-test
798 : out-param-test-1 ( -- b )
799 { int } [ [ 12 ] dip 0 int set-alien-value ] with-out-parameters ;
801 [ 12 ] [ out-param-test-1 ] unit-test
803 : out-param-test-2 ( -- b )
804 { { int initial: 12 } } [ drop ] with-out-parameters ;
806 [ 12 ] [ out-param-test-2 ] unit-test
808 : out-param-test-3 ( -- x y )
809 { { RECT initial: S{ RECT { x 3 } { y 4 } } } } [ drop ]
813 [ 3.0 4.0 ] [ out-param-test-3 ] unit-test
815 : out-param-callback ( -- a )
816 void { int pointer: int } cdecl
817 [ [ 2 * ] dip 0 int set-alien-value ] alien-callback ;
819 : out-param-indirect ( a a -- b )
821 swap void { int pointer: int } cdecl
823 ] with-out-parameters ;
825 [ 12 ] [ 6 out-param-callback out-param-indirect ] unit-test
827 ! Alias analysis regression
828 : aa-callback-1 ( -- c )
829 double { } cdecl [ 5.0 ] alien-callback ;
831 : aa-indirect-1 ( c -- x )
832 double { } cdecl alien-indirect ; inline
834 TUPLE: some-tuple x ;
836 [ T{ some-tuple f 5.0 } ] [
845 : anton's-regression ( -- )
848 [ ] [ anton's-regression ] unit-test