2014-11-12 02:13:17 -05:00
USING: accessors alien alien.c-types alien.complex alien.data alien.libraries
alien.syntax arrays byte-arrays classes classes.struct combinators
combinators.extras compiler compiler.test concurrency.promises continuations
destructors effects generalizations io io.backend io.pathnames
io.streams.string kernel kernel.private libc layouts math math.bitwise
math.private memory namespaces namespaces.private random parser quotations
sequences slots.private specialized-arrays stack-checker stack-checker.errors
system threads tools.test words ;
2009-09-16 10:20:47 -04:00
FROM: alien.c-types => float short ;
2009-09-09 23:33:34 -04:00
SPECIALIZED-ARRAY: float
SPECIALIZED-ARRAY: char
2009-04-26 01:51:47 -04:00
IN: compiler.tests.alien
2008-08-22 16:30:57 -04:00
2010-05-18 18:46:31 -04:00
! Make sure that invalid inputs don't pass the stack checker
[ [ void { } "cdecl" alien-indirect ] infer ] must-fail
[ [ "void" { } cdecl alien-indirect ] infer ] must-fail
[ [ void* 3 cdecl alien-indirect ] infer ] must-fail
[ [ void* { "int" } cdecl alien-indirect ] infer ] must-fail
[ [ void* { int } cdecl { } alien-callback ] infer ] must-fail
2009-03-25 14:05:34 -04:00
<<
: libfactor-ffi-tests-path ( -- string )
2009-10-28 18:25:50 -04:00
"resource:" absolute-path
2009-03-25 14:05:34 -04:00
{
2011-09-18 21:25:06 -04:00
{ [ os windows? ] [ "libfactor-ffi-test.dll" ] }
2009-03-26 19:56:10 -04:00
{ [ os macosx? ] [ "libfactor-ffi-test.dylib" ] }
2009-03-28 15:41:48 -04:00
{ [ os unix? ] [ "libfactor-ffi-test.so" ] }
2009-03-26 19:56:10 -04:00
} cond append-path ;
2009-03-25 14:05:34 -04:00
2010-04-12 19:14:18 -04:00
: mingw? ( -- ? ) os windows? vm-compiler "GCC" head? and ;
"f-cdecl" libfactor-ffi-tests-path mingw? mingw cdecl ? add-library
2009-03-25 14:05:34 -04:00
2010-03-31 22:29:04 -04:00
"f-stdcall" libfactor-ffi-tests-path stdcall add-library
2010-04-01 05:22:42 -04:00
"f-fastcall" libfactor-ffi-tests-path fastcall add-library
2009-03-25 14:05:34 -04:00
>>
2009-03-27 18:58:31 -04:00
LIBRARY: f-cdecl
2015-07-19 22:55:38 -04:00
FUNCTION: void ffi_test_0 ( )
2008-08-22 16:30:57 -04:00
[ ] [ ffi_test_0 ] unit-test
2015-07-19 22:55:38 -04:00
FUNCTION: int ffi_test_1 ( )
2008-08-22 16:30:57 -04:00
[ 3 ] [ ffi_test_1 ] unit-test
2010-07-28 00:49:26 -04:00
[ ] [ \ ffi_test_1 def>> [ drop ] append compile-call ] unit-test
2015-07-19 22:55:38 -04:00
FUNCTION: int ffi_test_2 ( int x, int y )
2008-08-22 16:30:57 -04:00
[ 5 ] [ 2 3 ffi_test_2 ] unit-test
[ "hi" 3 ffi_test_2 ] must-fail
2015-07-19 22:55:38 -04:00
FUNCTION: int ffi_test_3 ( int x, int y, int z, int t )
2008-08-22 16:30:57 -04:00
[ 25 ] [ 2 3 4 5 ffi_test_3 ] unit-test
2015-07-19 22:55:38 -04:00
FUNCTION: float ffi_test_4 ( )
2008-08-22 16:30:57 -04:00
[ 1.5 ] [ ffi_test_4 ] unit-test
2015-07-19 22:55:38 -04:00
FUNCTION: double ffi_test_5 ( )
2008-08-22 16:30:57 -04:00
[ 1.5 ] [ ffi_test_5 ] unit-test
2015-07-20 01:55:24 -04:00
FUNCTION: int ffi_test_9 ( int a, int b, int c, int d, int e, int f, int g )
2008-08-22 16:30:57 -04:00
[ 28 ] [ 1 2 3 4 5 6 7 ffi_test_9 ] unit-test
[ "a" 2 3 4 5 6 7 ffi_test_9 ] must-fail
[ 1 2 3 4 5 6 "a" ffi_test_9 ] must-fail
2009-08-25 11:59:33 -04:00
STRUCT: FOO { x int } { y int } ;
2008-08-22 16:30:57 -04:00
2009-08-25 11:59:33 -04:00
: make-FOO ( x y -- FOO )
FOO <struct> swap >>y swap >>x ;
2008-08-22 16:30:57 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: int ffi_test_11 ( int a, FOO b, int c )
2008-08-22 16:30:57 -04:00
2009-08-25 11:59:33 -04:00
[ 14 ] [ 1 2 3 make-FOO 4 ffi_test_11 ] unit-test
2008-08-22 16:30:57 -04:00
2015-07-19 22:55:38 -04:00
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 )
2008-08-22 16:30:57 -04:00
[ 66 ] [ 1 2 3 4 5 6 7 8 9 10 11 ffi_test_13 ] unit-test
2015-07-19 22:55:38 -04:00
FUNCTION: FOO ffi_test_14 ( int x, int y )
2008-08-22 16:30:57 -04:00
2009-08-25 11:59:33 -04:00
[ 11 6 ] [ 11 6 ffi_test_14 [ x>> ] [ y>> ] bi ] unit-test
2008-08-22 16:30:57 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: c-string ffi_test_15 ( c-string x, c-string y )
2008-08-22 16:30:57 -04:00
[ "foo" ] [ "xy" "zt" ffi_test_15 ] unit-test
[ "bar" ] [ "xy" "xy" ffi_test_15 ] unit-test
[ 1 2 ffi_test_15 ] must-fail
2009-08-25 11:59:33 -04:00
STRUCT: BAR { x long } { y long } { z long } ;
2008-08-22 16:30:57 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: BAR ffi_test_16 ( long x, long y, long z )
2008-08-22 16:30:57 -04:00
[ 11 6 -7 ] [
2009-08-25 11:59:33 -04:00
11 6 -7 ffi_test_16 [ x>> ] [ y>> ] [ z>> ] tri
2008-08-22 16:30:57 -04:00
] unit-test
2009-08-25 11:59:33 -04:00
STRUCT: TINY { x int } ;
2008-08-22 16:30:57 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: TINY ffi_test_17 ( int x )
2008-08-22 16:30:57 -04:00
2009-08-25 11:59:33 -04:00
[ 11 ] [ 11 ffi_test_17 x>> ] unit-test
2008-08-22 16:30:57 -04:00
[ [ alien-indirect ] infer ] [ inference-error? ] must-fail-with
: indirect-test-1 ( ptr -- result )
2010-03-31 22:20:35 -04:00
int { } cdecl alien-indirect ;
2008-08-22 16:30:57 -04:00
{ 1 1 } [ indirect-test-1 ] must-infer-as
2008-12-11 01:03:58 -05:00
[ 3 ] [ &: ffi_test_1 indirect-test-1 ] unit-test
2008-08-22 16:30:57 -04:00
2008-09-01 03:04:42 -04:00
: indirect-test-1' ( ptr -- )
2010-03-31 22:20:35 -04:00
int { } cdecl alien-indirect drop ;
2008-09-01 03:04:42 -04:00
{ 1 0 } [ indirect-test-1' ] must-infer-as
2008-12-11 01:03:58 -05:00
[ ] [ &: ffi_test_1 indirect-test-1' ] unit-test
2008-09-01 03:04:42 -04:00
2008-08-22 16:30:57 -04:00
[ -1 indirect-test-1 ] must-fail
: indirect-test-2 ( x y ptr -- result )
2010-03-31 22:20:35 -04:00
int { int int } cdecl alien-indirect gc ;
2008-08-22 16:30:57 -04:00
{ 3 1 } [ indirect-test-2 ] must-infer-as
[ 5 ]
2008-12-11 01:03:58 -05:00
[ 2 3 &: ffi_test_2 indirect-test-2 ]
2008-08-22 16:30:57 -04:00
unit-test
: indirect-test-3 ( a b c d ptr -- result )
2010-03-31 22:29:04 -04:00
int { int int int int } stdcall alien-indirect
2008-08-22 16:30:57 -04:00
gc ;
2009-03-25 14:05:34 -04:00
[ f ] [ "f-stdcall" load-library f = ] unit-test
2013-03-24 00:23:23 -04:00
[ stdcall ] [ "f-stdcall" lookup-library abi>> ] unit-test
2008-08-22 16:30:57 -04:00
: ffi_test_18 ( w x y z -- int )
2016-08-09 19:18:52 -04:00
int "f-stdcall" "ffi_test_18" { int int int int } f
2008-08-22 16:30:57 -04:00
alien-invoke gc ;
[ 25 ] [ 2 3 4 5 ffi_test_18 ] unit-test
2009-08-25 11:59:33 -04:00
: ffi_test_19 ( x y z -- BAR )
2016-08-09 19:18:52 -04:00
BAR "f-stdcall" "ffi_test_19" { long long long } f
2008-08-22 16:30:57 -04:00
alien-invoke gc ;
[ 11 6 -7 ] [
2009-08-25 11:59:33 -04:00
11 6 -7 ffi_test_19 [ x>> ] [ y>> ] [ z>> ] tri
2008-08-22 16:30:57 -04:00
] unit-test
2010-04-01 21:48:12 -04:00
: multi_ffi_test_18 ( w x y z w' x' y' z' -- int int )
2016-08-09 19:18:52 -04:00
[ int "f-stdcall" "ffi_test_18" { int int int int } f alien-invoke ]
2010-04-01 21:48:12 -04:00
4 ndip
2016-08-09 19:18:52 -04:00
int "f-stdcall" "ffi_test_18" { int int int int } f alien-invoke
2010-04-01 21:48:12 -04:00
gc ;
[ 25 85 ] [ 2 3 4 5 6 7 8 9 multi_ffi_test_18 ] unit-test
2015-07-19 22:55:38 -04:00
FUNCTION: double ffi_test_6 ( float x, float y )
2008-08-22 16:30:57 -04:00
[ 6.0 ] [ 3.0 2.0 ffi_test_6 ] unit-test
[ "a" "b" ffi_test_6 ] must-fail
2015-07-19 22:55:38 -04:00
FUNCTION: double ffi_test_7 ( double x, double y )
2008-08-22 16:30:57 -04:00
[ 6.0 ] [ 3.0 2.0 ffi_test_7 ] unit-test
2015-07-19 22:55:38 -04:00
FUNCTION: double ffi_test_8 ( double x, float y, double z, float t, int w )
2008-08-22 16:30:57 -04:00
[ 19.0 ] [ 3.0 2.0 1.0 6.0 7 ffi_test_8 ] unit-test
2015-07-19 22:55:38 -04:00
FUNCTION: int ffi_test_10 ( int a, int b, double c, int d, float e, int f, int g, int h )
2008-08-22 16:30:57 -04:00
[ -34 ] [ 1 2 3.0 4 5.0 6 7 8 ffi_test_10 ] unit-test
2015-07-19 22:55:38 -04:00
FUNCTION: void ffi_test_20 ( double x1, double x2, double x3,
2008-08-22 16:30:57 -04:00
double y1, double y2, double y3,
2015-07-19 22:55:38 -04:00
double z1, double z2, double z3 )
2008-08-22 16:30:57 -04:00
[ ] [ 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 ffi_test_20 ] unit-test
! Make sure XT doesn't get clobbered in stack frame
2008-11-17 13:23:44 -05:00
: 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 )
2009-10-21 19:44:00 -04:00
int
2009-03-27 15:39:45 -04:00
"f-cdecl" "ffi_test_31"
2016-08-09 19:18:52 -04:00
{ 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 } f
2008-08-22 16:30:57 -04:00
alien-invoke gc 3 ;
2010-01-14 10:10:13 -05:00
[ 861 3 ] [ 42 [ ] each-integer ffi_test_31 ] unit-test
2008-11-17 13:23:44 -05:00
: 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 )
2009-10-21 19:44:00 -04:00
float
2009-03-27 18:58:31 -04:00
"f-cdecl" "ffi_test_31_point_5"
2016-08-09 19:18:52 -04:00
{ 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 } f
2008-11-17 13:23:44 -05:00
alien-invoke ;
2010-01-14 10:10:13 -05:00
[ 861.0 ] [ 42 [ >float ] each-integer ffi_test_31_point_5 ] unit-test
2008-08-22 16:30:57 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: longlong ffi_test_21 ( long x, long y )
2008-08-22 16:30:57 -04:00
[ 121932631112635269 ]
[ 123456789 987654321 ffi_test_21 ] unit-test
2015-07-19 22:55:38 -04:00
FUNCTION: long ffi_test_22 ( long x, longlong y, longlong z )
2008-08-22 16:30:57 -04:00
[ 987655432 ]
[ 1111 121932631112635269 123456789 ffi_test_22 ] unit-test
[ 1111 f 123456789 ffi_test_22 ] must-fail
2009-08-25 11:59:33 -04:00
STRUCT: RECT
2009-08-25 13:00:06 -04:00
{ x float } { y float }
{ w float } { h float } ;
2008-08-22 16:30:57 -04:00
2009-08-25 11:59:33 -04:00
: <RECT> ( x y w h -- rect )
RECT <struct>
swap >>h
swap >>w
swap >>y
swap >>x ;
2008-08-22 16:30:57 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: int ffi_test_12 ( int a, int b, RECT c, int d, int e, int f )
2008-08-22 16:30:57 -04:00
2009-08-25 11:59:33 -04:00
[ 45 ] [ 1 2 3.0 4.0 5.0 6.0 <RECT> 7 8 9 ffi_test_12 ] unit-test
2008-08-22 16:30:57 -04:00
[ 1 2 { 1 2 3 } 7 8 9 ffi_test_12 ] must-fail
2015-07-19 22:55:38 -04:00
FUNCTION: float ffi_test_23 ( float[3] x, float[3] y )
2008-08-22 16:30:57 -04:00
2008-11-14 21:18:16 -05:00
[ 32.0 ] [
2011-09-25 14:49:27 -04:00
{ 1.0 2.0 3.0 } float >c-array
{ 4.0 5.0 6.0 } float >c-array
2008-11-14 21:18:16 -05:00
ffi_test_23
] unit-test
2008-08-22 16:30:57 -04:00
! Test odd-size structs
2009-08-26 12:01:39 -04:00
STRUCT: test-struct-1 { x char[1] } ;
2008-08-22 16:30:57 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: test-struct-1 ffi_test_24 ( )
2008-08-22 16:30:57 -04:00
2009-08-26 12:01:39 -04:00
[ S{ test-struct-1 { x char-array{ 1 } } } ] [ ffi_test_24 ] unit-test
2008-08-22 16:30:57 -04:00
2009-08-26 12:01:39 -04:00
STRUCT: test-struct-2 { x char[2] } ;
2008-08-22 16:30:57 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: test-struct-2 ffi_test_25 ( )
2008-08-22 16:30:57 -04:00
2009-08-26 12:01:39 -04:00
[ S{ test-struct-2 { x char-array{ 1 2 } } } ] [ ffi_test_25 ] unit-test
2008-08-22 16:30:57 -04:00
2009-08-26 12:01:39 -04:00
STRUCT: test-struct-3 { x char[3] } ;
2008-08-22 16:30:57 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: test-struct-3 ffi_test_26 ( )
2008-08-22 16:30:57 -04:00
2009-08-26 12:01:39 -04:00
[ S{ test-struct-3 { x char-array{ 1 2 3 } } } ] [ ffi_test_26 ] unit-test
2008-08-22 16:30:57 -04:00
2009-08-26 12:01:39 -04:00
STRUCT: test-struct-4 { x char[4] } ;
2008-08-22 16:30:57 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: test-struct-4 ffi_test_27 ( )
2008-08-22 16:30:57 -04:00
2009-08-26 12:01:39 -04:00
[ S{ test-struct-4 { x char-array{ 1 2 3 4 } } } ] [ ffi_test_27 ] unit-test
2008-08-22 16:30:57 -04:00
2009-08-26 12:01:39 -04:00
STRUCT: test-struct-5 { x char[5] } ;
2008-08-22 16:30:57 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: test-struct-5 ffi_test_28 ( )
2008-08-22 16:30:57 -04:00
2009-08-26 12:01:39 -04:00
[ S{ test-struct-5 { x char-array{ 1 2 3 4 5 } } } ] [ ffi_test_28 ] unit-test
2008-08-22 16:30:57 -04:00
2009-08-26 12:01:39 -04:00
STRUCT: test-struct-6 { x char[6] } ;
2008-08-22 16:30:57 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: test-struct-6 ffi_test_29 ( )
2008-08-22 16:30:57 -04:00
2009-08-26 12:01:39 -04:00
[ S{ test-struct-6 { x char-array{ 1 2 3 4 5 6 } } } ] [ ffi_test_29 ] unit-test
2008-08-22 16:30:57 -04:00
2009-08-26 12:01:39 -04:00
STRUCT: test-struct-7 { x char[7] } ;
2008-08-22 16:30:57 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: test-struct-7 ffi_test_30 ( )
2008-08-22 16:30:57 -04:00
2009-08-26 12:01:39 -04:00
[ S{ test-struct-7 { x char-array{ 1 2 3 4 5 6 7 } } } ] [ ffi_test_30 ] unit-test
2008-08-22 16:30:57 -04:00
2009-08-25 13:00:06 -04:00
STRUCT: test-struct-8 { x double } { y double } ;
2008-08-22 16:30:57 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: double ffi_test_32 ( test-struct-8 x, int y )
2008-08-22 16:30:57 -04:00
[ 9.0 ] [
2009-08-25 11:59:33 -04:00
test-struct-8 <struct>
1.0 >>x
2.0 >>y
2008-08-22 16:30:57 -04:00
3 ffi_test_32
] unit-test
2009-08-25 13:00:06 -04:00
STRUCT: test-struct-9 { x float } { y float } ;
2008-08-22 16:30:57 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: double ffi_test_33 ( test-struct-9 x, int y )
2008-08-22 16:30:57 -04:00
[ 9.0 ] [
2009-08-25 11:59:33 -04:00
test-struct-9 <struct>
1.0 >>x
2.0 >>y
2008-08-22 16:30:57 -04:00
3 ffi_test_33
] unit-test
2009-08-25 13:00:06 -04:00
STRUCT: test-struct-10 { x float } { y int } ;
2008-08-22 16:30:57 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: double ffi_test_34 ( test-struct-10 x, int y )
2008-08-22 16:30:57 -04:00
[ 9.0 ] [
2009-08-25 11:59:33 -04:00
test-struct-10 <struct>
1.0 >>x
2 >>y
2008-08-22 16:30:57 -04:00
3 ffi_test_34
] unit-test
2009-08-25 11:59:33 -04:00
STRUCT: test-struct-11 { x int } { y int } ;
2008-08-22 16:30:57 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: double ffi_test_35 ( test-struct-11 x, int y )
2008-08-22 16:30:57 -04:00
[ 9.0 ] [
2009-08-25 11:59:33 -04:00
test-struct-11 <struct>
1 >>x
2 >>y
2008-08-22 16:30:57 -04:00
3 ffi_test_35
] unit-test
2009-08-25 13:00:06 -04:00
STRUCT: test-struct-12 { a int } { x double } ;
2008-08-22 16:30:57 -04:00
2008-09-09 04:10:43 -04:00
: make-struct-12 ( x -- alien )
2009-08-25 11:59:33 -04:00
test-struct-12 <struct>
swap >>x ;
2008-08-22 16:30:57 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: double ffi_test_36 ( test-struct-12 x )
2008-08-22 16:30:57 -04:00
[ 1.23456 ] [ 1.23456 make-struct-12 ffi_test_36 ] unit-test
2015-07-19 22:55:38 -04:00
FUNCTION: ulonglong ffi_test_38 ( ulonglong x, ulonglong y )
2008-08-22 16:30:57 -04:00
[ t ] [ 31 2^ 32 2^ ffi_test_38 63 2^ = ] unit-test
! Test callbacks
2011-10-02 22:52:02 -04:00
: callback-throws ( -- x )
int { } cdecl [ "Hi" throw ] alien-callback ;
2014-10-22 08:44:10 -04:00
{ t } [
callback-throws [ alien? ] with-callback
] unit-test
2008-08-22 16:30:57 -04:00
2010-03-31 22:20:35 -04:00
: callback-1 ( -- callback ) void { } cdecl [ ] alien-callback ;
2008-08-22 16:30:57 -04:00
2010-01-14 10:10:13 -05:00
[ 0 1 ] [ [ callback-1 ] infer [ in>> length ] [ out>> length ] bi ] unit-test
2008-08-22 16:30:57 -04:00
2014-10-22 08:44:10 -04:00
{ t } [ callback-1 [ alien? ] with-callback ] unit-test
2008-08-22 16:30:57 -04:00
2010-03-31 22:20:35 -04:00
: callback_test_1 ( ptr -- ) void { } cdecl alien-indirect ;
2008-08-22 16:30:57 -04:00
2014-10-22 08:44:10 -04:00
{ } [ callback-1 [ callback_test_1 ] with-callback ] unit-test
2008-08-22 16:30:57 -04:00
2010-03-31 22:20:35 -04:00
: callback-2 ( -- callback ) void { } cdecl [ [ 5 throw ] ignore-errors ] alien-callback ;
2008-08-22 16:30:57 -04:00
2014-10-22 08:44:10 -04:00
{ } [ callback-2 [ callback_test_1 ] with-callback ] unit-test
2008-08-22 16:30:57 -04:00
2010-03-31 22:20:35 -04:00
: callback-3 ( -- callback ) void { } cdecl [ 5 "x" set ] alien-callback ;
2008-08-22 16:30:57 -04:00
2014-09-29 08:26:08 -04:00
{ t 3 5 } [
2008-08-22 16:30:57 -04:00
[
2015-08-13 20:53:07 -04:00
(get-namestack)
2014-10-22 08:44:10 -04:00
3 "x" set callback-3 [ callback_test_1 ] with-callback
2015-08-13 20:53:07 -04:00
(get-namestack) eq?
2010-03-18 05:06:00 -04:00
"x" get "x" get-global
2008-08-22 16:30:57 -04:00
] with-scope
2014-10-22 08:44:10 -04:00
] unit-test
2008-08-22 16:30:57 -04:00
: callback-5 ( -- callback )
2010-03-31 22:20:35 -04:00
void { } cdecl [ gc ] alien-callback ;
2008-08-22 16:30:57 -04:00
2014-09-29 08:26:08 -04:00
{ "testing" } [
2014-10-22 08:44:10 -04:00
"testing" callback-5 [ callback_test_1 ] with-callback
] unit-test
2008-08-22 16:30:57 -04:00
2009-10-16 12:39:22 -04:00
: callback-5b ( -- callback )
2010-03-31 22:20:35 -04:00
void { } cdecl [ compact-gc ] alien-callback ;
2008-08-22 16:30:57 -04:00
2009-10-16 12:39:22 -04:00
[ "testing" ] [
2014-10-22 08:44:10 -04:00
"testing" callback-5b [ callback_test_1 ] with-callback
] unit-test
2008-08-22 16:30:57 -04:00
: callback-6 ( -- callback )
2010-03-31 22:20:35 -04:00
void { } cdecl [ [ continue ] callcc0 ] alien-callback ;
2008-08-22 16:30:57 -04:00
2014-09-29 08:26:08 -04:00
[ 1 2 3 ] [
2014-10-22 08:44:10 -04:00
callback-6 [ callback_test_1 1 2 3 ] with-callback
] unit-test
2008-08-22 16:30:57 -04:00
: callback-7 ( -- callback )
2010-03-31 22:20:35 -04:00
void { } cdecl [ 1000000 sleep ] alien-callback ;
2008-08-22 16:30:57 -04:00
2014-10-22 08:44:10 -04:00
[ 1 2 3 ] [ callback-7 [ callback_test_1 1 2 3 ] with-callback ] unit-test
2008-08-22 16:30:57 -04:00
[ f ] [ namespace global eq? ] unit-test
: callback-8 ( -- callback )
2010-03-31 22:20:35 -04:00
void { } cdecl [ [ ] in-thread yield ] alien-callback ;
2008-08-22 16:30:57 -04:00
2014-10-22 08:44:10 -04:00
[ ] [ callback-8 [ callback_test_1 ] with-callback ] unit-test
2008-08-22 16:30:57 -04:00
: callback-9 ( -- callback )
2010-03-31 22:20:35 -04:00
int { int int int } cdecl [
2009-08-13 20:21:44 -04:00
+ + 1 +
2008-08-22 16:30:57 -04:00
] alien-callback ;
2015-07-19 22:55:38 -04:00
FUNCTION: void ffi_test_36_point_5 ( )
2008-08-22 16:30:57 -04:00
[ ] [ ffi_test_36_point_5 ] unit-test
2015-07-19 22:55:38 -04:00
FUNCTION: int ffi_test_37 ( void* func )
2008-08-22 16:30:57 -04:00
2014-10-22 08:44:10 -04:00
[ 1 ] [ callback-9 [ ffi_test_37 ] with-callback ] unit-test
2008-08-22 16:30:57 -04:00
2014-10-22 08:44:10 -04:00
[ 7 ] [ callback-9 [ ffi_test_37 ] with-callback ] unit-test
2008-09-09 04:10:43 -04:00
2009-08-25 11:59:33 -04:00
STRUCT: test_struct_13
2016-08-02 17:36:02 -04:00
{ x1 float }
{ x2 float }
{ x3 float }
{ x4 float }
{ x5 float }
{ x6 float } ;
2008-09-09 04:10:43 -04:00
: make-test-struct-13 ( -- alien )
2009-08-25 11:59:33 -04:00
test_struct_13 <struct>
1.0 >>x1
2.0 >>x2
3.0 >>x3
4.0 >>x4
5.0 >>x5
6.0 >>x6 ;
2008-09-09 04:10:43 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: int ffi_test_39 ( long a, long b, test_struct_13 s )
2008-09-09 04:10:43 -04:00
[ 21 ] [ 12347 12347 make-test-struct-13 ffi_test_39 ] unit-test
2008-09-12 01:04:56 -04:00
! Joe Groff found this problem
2009-08-25 11:59:33 -04:00
STRUCT: double-rect
2016-08-02 17:36:02 -04:00
{ a double }
{ b double }
{ c double }
{ d double } ;
2008-09-12 01:04:56 -04:00
: <double-rect> ( a b c d -- foo )
2009-08-25 11:59:33 -04:00
double-rect <struct>
swap >>d
swap >>c
swap >>b
swap >>a ;
2008-09-12 01:04:56 -04:00
: >double-rect< ( foo -- a b c d )
{
2009-08-25 11:59:33 -04:00
[ a>> ]
[ b>> ]
[ c>> ]
[ d>> ]
2008-09-12 01:04:56 -04:00
} cleave ;
: double-rect-callback ( -- alien )
2010-03-31 22:20:35 -04:00
void { void* void* double-rect } cdecl
2008-09-12 01:04:56 -04:00
[ "example" set-global 2drop ] alien-callback ;
2010-04-10 03:41:20 -04:00
: double-rect-test ( arg callback -- arg' )
2010-04-01 20:06:18 -04:00
[ f f ] 2dip
2010-03-31 22:20:35 -04:00
void { void* void* double-rect } cdecl alien-indirect
2008-09-12 01:04:56 -04:00
"example" get-global ;
2014-09-29 08:26:08 -04:00
{ byte-array 1.0 2.0 3.0 4.0 } [
2010-04-01 20:06:18 -04:00
1.0 2.0 3.0 4.0 <double-rect>
2014-10-22 08:44:10 -04:00
double-rect-callback [
double-rect-test
[ >c-ptr class-of ] [ >double-rect< ] bi
] with-callback
] unit-test
2008-09-13 21:28:13 -04:00
2009-08-25 11:59:33 -04:00
STRUCT: test_struct_14
2009-08-25 13:00:06 -04:00
{ x1 double }
{ x2 double } ;
2008-09-13 21:28:13 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: test_struct_14 ffi_test_40 ( double x1, double x2 )
2008-09-13 21:28:13 -04:00
[ 1.0 2.0 ] [
2009-08-25 11:59:33 -04:00
1.0 2.0 ffi_test_40 [ x1>> ] [ x2>> ] bi
2008-09-13 21:28:13 -04:00
] unit-test
: callback-10 ( -- callback )
2010-03-31 22:20:35 -04:00
test_struct_14 { double double } cdecl
2008-09-13 21:28:13 -04:00
[
2009-08-25 11:59:33 -04:00
test_struct_14 <struct>
swap >>x2
swap >>x1
2008-09-13 21:28:13 -04:00
] alien-callback ;
: callback-10-test ( x1 x2 callback -- result )
2010-03-31 22:20:35 -04:00
test_struct_14 { double double } cdecl alien-indirect ;
2008-09-13 21:28:13 -04:00
2014-09-29 08:26:08 -04:00
{ 1.0 2.0 } [
2014-10-22 08:44:10 -04:00
1.0 2.0 callback-10 [
callback-10-test [ x1>> ] [ x2>> ] bi
] with-callback
] unit-test
2008-09-13 21:28:13 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: test-struct-12 ffi_test_41 ( int a, double x )
2008-09-13 21:28:13 -04:00
[ 1 2.0 ] [
1 2.0 ffi_test_41
2009-08-25 11:59:33 -04:00
[ a>> ] [ x>> ] bi
2008-09-13 21:28:13 -04:00
] unit-test
: callback-11 ( -- callback )
2010-03-31 22:20:35 -04:00
test-struct-12 { int double } cdecl
2008-09-13 21:28:13 -04:00
[
2009-08-25 11:59:33 -04:00
test-struct-12 <struct>
swap >>x
swap >>a
2008-09-13 21:28:13 -04:00
] alien-callback ;
: callback-11-test ( x1 x2 callback -- result )
2010-03-31 22:20:35 -04:00
test-struct-12 { int double } cdecl alien-indirect ;
2008-09-13 21:28:13 -04:00
2014-09-29 08:26:08 -04:00
{ 1 2.0 } [
2014-10-22 08:44:10 -04:00
1 2.0 callback-11 [
callback-11-test [ a>> ] [ x>> ] bi
] with-callback
] unit-test
2008-09-13 21:28:13 -04:00
2009-08-25 11:59:33 -04:00
STRUCT: test_struct_15
2009-08-25 13:00:06 -04:00
{ x float }
{ y float } ;
2008-09-13 21:28:13 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: test_struct_15 ffi_test_42 ( float x, float y )
2008-09-13 21:28:13 -04:00
2009-08-25 11:59:33 -04:00
[ 1.0 2.0 ] [ 1.0 2.0 ffi_test_42 [ x>> ] [ y>> ] bi ] unit-test
2008-09-13 21:28:13 -04:00
: callback-12 ( -- callback )
2010-03-31 22:20:35 -04:00
test_struct_15 { float float } cdecl
2008-09-13 21:28:13 -04:00
[
2009-08-25 11:59:33 -04:00
test_struct_15 <struct>
swap >>y
swap >>x
2008-09-13 21:28:13 -04:00
] alien-callback ;
: callback-12-test ( x1 x2 callback -- result )
2010-03-31 22:20:35 -04:00
test_struct_15 { float float } cdecl alien-indirect ;
2008-09-13 21:28:13 -04:00
[ 1.0 2.0 ] [
2014-10-22 08:44:10 -04:00
1.0 2.0 callback-12 [
callback-12-test [ x>> ] [ y>> ] bi
] with-callback
] unit-test
2008-09-13 21:28:13 -04:00
2009-08-25 11:59:33 -04:00
STRUCT: test_struct_16
2009-08-25 13:00:06 -04:00
{ x float }
2009-08-25 11:59:33 -04:00
{ a int } ;
2008-09-13 21:28:13 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: test_struct_16 ffi_test_43 ( float x, int a )
2008-09-13 21:28:13 -04:00
2009-08-25 11:59:33 -04:00
[ 1.0 2 ] [ 1.0 2 ffi_test_43 [ x>> ] [ a>> ] bi ] unit-test
2008-09-13 21:28:13 -04:00
: callback-13 ( -- callback )
2010-03-31 22:20:35 -04:00
test_struct_16 { float int } cdecl
2008-09-13 21:28:13 -04:00
[
2009-08-25 11:59:33 -04:00
test_struct_16 <struct>
swap >>a
swap >>x
2008-09-13 21:28:13 -04:00
] alien-callback ;
: callback-13-test ( x1 x2 callback -- result )
2010-03-31 22:20:35 -04:00
test_struct_16 { float int } cdecl alien-indirect ;
2008-09-13 21:28:13 -04:00
2014-09-29 08:26:08 -04:00
{ 1.0 2 } [
2014-10-22 08:44:10 -04:00
1.0 2 callback-13 [
callback-13-test [ x>> ] [ a>> ] bi
] with-callback
] unit-test
2008-09-13 21:28:13 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: test_struct_14 ffi_test_44 ( ) inline
2008-09-13 21:28:13 -04:00
2009-08-25 11:59:33 -04:00
[ 1.0 2.0 ] [ ffi_test_44 [ x1>> ] [ x2>> ] bi ] unit-test
2008-09-13 21:28:13 -04:00
: stack-frame-bustage ( -- a b ) ffi_test_44 gc 3 ;
[ ] [ stack-frame-bustage 2drop ] unit-test
2009-02-06 05:02:00 -05:00
2010-02-02 05:01:12 -05:00
! C99 tests
os windows? [
2015-07-19 22:55:38 -04:00
FUNCTION: complex-float ffi_test_45 ( int x )
2009-02-06 13:21:53 -05:00
2014-11-09 13:52:16 -05:00
[ C{ 3.0 0.0 } ] [ 3 ffi_test_45 ] unit-test
2009-02-06 13:21:53 -05:00
2015-07-19 22:55:38 -04:00
FUNCTION: complex-double ffi_test_46 ( int x )
2009-02-06 13:21:53 -05:00
2014-11-09 13:52:16 -05:00
[ C{ 3.0 0.0 } ] [ 3 ffi_test_46 ] unit-test
2009-02-06 13:21:53 -05:00
2015-07-19 22:55:38 -04:00
FUNCTION: complex-float ffi_test_47 ( complex-float x, complex-double y )
2009-02-06 05:02:00 -05:00
2014-11-09 13:52:16 -05:00
[ C{ 4.0 4.0 } ] [
C{ 1.0 2.0 }
C{ 1.5 1.0 } ffi_test_47
] unit-test
2009-05-05 19:37:40 -04:00
2014-11-09 13:52:16 -05:00
! Reported by jedahu
STRUCT: bool-field-test
{ name c-string }
{ on bool }
{ parents short } ;
2009-05-05 19:37:40 -04:00
2015-07-19 22:55:38 -04:00
FUNCTION: short ffi_test_48 ( bool-field-test x )
2009-05-05 19:37:40 -04:00
2014-11-09 13:52:16 -05:00
[ 123 ] [
bool-field-test <struct>
123 >>parents
ffi_test_48
] unit-test
2009-09-25 19:08:33 -04:00
2010-02-02 05:01:12 -05:00
] unless
2010-03-26 22:44:43 -04:00
! Test interaction between threads and callbacks
: thread-callback-1 ( -- callback )
2010-03-31 22:20:35 -04:00
int { } cdecl [ yield 100 ] alien-callback ;
2010-03-26 22:44:43 -04:00
: thread-callback-2 ( -- callback )
2010-03-31 22:20:35 -04:00
int { } cdecl [ yield 200 ] alien-callback ;
2010-03-26 22:44:43 -04:00
: thread-callback-invoker ( callback -- n )
2010-03-31 22:20:35 -04:00
int { } cdecl alien-indirect ;
2010-03-26 22:44:43 -04:00
<promise> "p" set
2014-09-29 08:26:08 -04:00
[
2014-10-22 08:44:10 -04:00
thread-callback-1 [
thread-callback-invoker
] with-callback "p" get fulfill
2014-09-29 08:26:08 -04:00
] in-thread
{ 200 } [
2014-10-22 08:44:10 -04:00
thread-callback-2 [ thread-callback-invoker ] with-callback
] unit-test
2010-03-26 22:44:43 -04:00
[ 100 ] [ "p" get ?promise ] unit-test
2010-01-06 23:39:22 -05:00
! More alien-assembly tests are in cpu.* vocabs
2010-03-31 22:20:35 -04:00
: assembly-test-1 ( -- ) void { } cdecl [ ] alien-assembly ;
2010-01-06 23:39:22 -05:00
[ ] [ assembly-test-1 ] unit-test
2010-04-01 05:22:42 -04:00
2010-04-01 17:15:34 -04:00
[ f ] [ "f-fastcall" load-library f = ] unit-test
2013-03-24 00:23:23 -04:00
[ fastcall ] [ "f-fastcall" lookup-library abi>> ] unit-test
2010-04-01 05:22:42 -04:00
2010-04-01 17:15:34 -04:00
: ffi_test_49 ( x -- int )
2016-08-09 19:18:52 -04:00
int "f-fastcall" "ffi_test_49" { int } f
2010-04-01 17:15:34 -04:00
alien-invoke gc ;
: ffi_test_50 ( x y -- int )
2016-08-09 19:18:52 -04:00
int "f-fastcall" "ffi_test_50" { int int } f
2010-04-01 17:15:34 -04:00
alien-invoke gc ;
: ffi_test_51 ( x y z -- int )
2016-08-09 19:18:52 -04:00
int "f-fastcall" "ffi_test_51" { int int int } f
2010-04-01 17:15:34 -04:00
alien-invoke gc ;
2010-04-01 21:48:12 -04:00
: multi_ffi_test_51 ( x y z x' y' z' -- int int )
2016-08-09 19:18:52 -04:00
[ int "f-fastcall" "ffi_test_51" { int int int } f alien-invoke ]
2010-04-01 21:48:12 -04:00
3dip
2016-08-09 19:18:52 -04:00
int "f-fastcall" "ffi_test_51" { int int int } f alien-invoke gc ;
2014-09-29 08:26:08 -04:00
2010-04-01 05:22:42 -04:00
[ 4 ] [ 3 ffi_test_49 ] unit-test
[ 8 ] [ 3 4 ffi_test_50 ] unit-test
[ 13 ] [ 3 4 5 ffi_test_51 ] unit-test
2010-04-01 21:48:12 -04:00
[ 13 22 ] [ 3 4 5 6 7 8 multi_ffi_test_51 ] unit-test
2010-04-02 01:47:16 -04:00
: ffi_test_52 ( x y z -- int )
2016-08-09 19:18:52 -04:00
int "f-fastcall" "ffi_test_52" { int float int } f
2010-04-02 01:47:16 -04:00
alien-invoke gc ;
: ffi_test_53 ( x y z w -- int )
2016-08-09 19:18:52 -04:00
int "f-fastcall" "ffi_test_53" { int float int int } f
2010-04-02 01:47:16 -04:00
alien-invoke gc ;
2010-04-02 02:52:56 -04:00
: ffi_test_57 ( x y -- test-struct-11 )
2016-08-09 19:18:52 -04:00
test-struct-11 "f-fastcall" "ffi_test_57" { int int } f
2010-04-02 02:52:56 -04:00
alien-invoke gc ;
: ffi_test_58 ( x y z -- test-struct-11 )
2016-08-09 19:18:52 -04:00
test-struct-11 "f-fastcall" "ffi_test_58" { int int int } f
2010-04-02 02:52:56 -04:00
alien-invoke gc ;
2010-04-02 01:47:16 -04:00
2014-07-07 20:02:36 -04:00
! Make sure that large longlong/ulonglong are correctly dealt with
2015-07-19 22:55:38 -04:00
FUNCTION: longlong ffi_test_59 ( longlong x )
FUNCTION: ulonglong ffi_test_60 ( ulonglong x )
2014-07-07 20:02:36 -04:00
[ t ] [ most-positive-fixnum 1 + [ ffi_test_59 ] keep = ] unit-test
[ t ] [ most-positive-fixnum 1 + [ ffi_test_60 ] keep = ] unit-test
[ -1 ] [ -1 ffi_test_59 ] unit-test
[ -1 ] [ 0xffffffffffffffff ffi_test_59 ] unit-test
[ 0xffffffffffffffff ] [ -1 ffi_test_60 ] unit-test
[ 0xffffffffffffffff ] [ 0xffffffffffffffff ffi_test_60 ] unit-test
2010-04-12 19:14:18 -04:00
! GCC bugs
mingw? [
[ 13 ] [ 3 4.0 5 ffi_test_52 ] unit-test
[ 19 ] [ 3 4.0 5 6 ffi_test_53 ] unit-test
] unless
2010-04-02 02:52:56 -04:00
[ S{ test-struct-11 f 7 -1 } ] [ 3 4 ffi_test_57 ] unit-test
2010-04-12 19:14:18 -04:00
2010-04-02 02:52:56 -04:00
[ S{ test-struct-11 f 7 -3 } ] [ 3 4 7 ffi_test_58 ] unit-test
2010-04-02 02:43:55 -04:00
: fastcall-ii-indirect ( x y ptr -- result )
int { int int } fastcall alien-indirect ;
2010-04-12 19:14:18 -04:00
2010-04-02 03:23:39 -04:00
: fastcall-iii-indirect ( x y z ptr -- result )
int { int int int } fastcall alien-indirect ;
2010-04-12 19:14:18 -04:00
2010-04-02 02:43:55 -04:00
: fastcall-ifi-indirect ( x y z ptr -- result )
int { int float int } fastcall alien-indirect ;
2010-04-12 19:14:18 -04:00
2010-04-02 03:23:39 -04:00
: fastcall-ifii-indirect ( x y z w ptr -- result )
int { int float int int } fastcall alien-indirect ;
2010-04-12 19:14:18 -04:00
2010-04-02 03:23:39 -04:00
: fastcall-struct-return-ii-indirect ( x y ptr -- result )
2010-04-02 03:00:34 -04:00
test-struct-11 { int int } fastcall alien-indirect ;
2010-04-12 19:14:18 -04:00
2010-04-02 03:23:39 -04:00
: fastcall-struct-return-iii-indirect ( x y z ptr -- result )
test-struct-11 { int int int } fastcall alien-indirect ;
2010-04-02 02:43:55 -04:00
2010-04-12 19:14:18 -04:00
[ 8 ] [
2015-09-01 08:40:32 -04:00
3 4 &: ffi_test_50 fastcall-ii-indirect
2010-04-12 19:14:18 -04:00
] unit-test
[ 13 ] [
2015-09-01 08:40:32 -04:00
3 4 5 &: ffi_test_51 fastcall-iii-indirect
2010-04-12 19:14:18 -04:00
] unit-test
mingw? [
[ 13 ] [
2015-09-01 08:40:32 -04:00
3 4.0 5 &: ffi_test_52 fastcall-ifi-indirect
2010-04-12 19:14:18 -04:00
] unit-test
[ 19 ] [
2015-09-01 08:40:32 -04:00
3 4.0 5 6 &: ffi_test_53 fastcall-ifii-indirect
2010-04-12 19:14:18 -04:00
] unit-test
] unless
2010-04-02 03:23:39 -04:00
[ S{ test-struct-11 f 7 -1 } ]
2010-04-12 19:14:18 -04:00
[
2015-09-01 08:40:32 -04:00
3 4 &: ffi_test_57 fastcall-struct-return-ii-indirect
2010-04-12 19:14:18 -04:00
] unit-test
2010-04-02 03:23:39 -04:00
[ S{ test-struct-11 f 7 -3 } ]
2010-04-12 19:14:18 -04:00
[
2015-09-01 08:40:32 -04:00
3 4 7 &: ffi_test_58 fastcall-struct-return-iii-indirect
2010-04-12 19:14:18 -04:00
] unit-test
2010-04-02 03:23:39 -04:00
: fastcall-ii-callback ( -- ptr )
int { int int } fastcall [ + 1 + ] alien-callback ;
2010-04-12 19:14:18 -04:00
2010-04-02 03:23:39 -04:00
: fastcall-iii-callback ( -- ptr )
int { int int int } fastcall [ + + 1 + ] alien-callback ;
2010-04-12 19:14:18 -04:00
2010-04-02 03:23:39 -04:00
: fastcall-ifi-callback ( -- ptr )
int { int float int } fastcall
[ [ >integer ] dip + + 1 + ] alien-callback ;
2010-04-12 19:14:18 -04:00
2010-04-02 03:23:39 -04:00
: fastcall-ifii-callback ( -- ptr )
int { int float int int } fastcall
[ [ >integer ] 2dip + + + 1 + ] alien-callback ;
2010-04-12 19:14:18 -04:00
2010-04-02 03:23:39 -04:00
: fastcall-struct-return-ii-callback ( -- ptr )
test-struct-11 { int int } fastcall
[ [ + ] [ - ] 2bi test-struct-11 <struct-boa> ] alien-callback ;
2010-04-12 19:14:18 -04:00
2010-04-02 03:23:39 -04:00
: fastcall-struct-return-iii-callback ( -- ptr )
test-struct-11 { int int int } fastcall
[ [ drop + ] [ - nip ] 3bi test-struct-11 <struct-boa> ] alien-callback ;
2014-09-29 08:26:08 -04:00
{ 8 } [
2014-10-22 08:44:10 -04:00
3 4 fastcall-ii-callback [ fastcall-ii-indirect ] with-callback
] unit-test
2010-04-12 19:14:18 -04:00
2014-09-29 08:26:08 -04:00
[ 13 ] [
2014-10-22 08:44:10 -04:00
3 4 5 fastcall-iii-callback [ fastcall-iii-indirect ] with-callback
] unit-test
2010-04-12 19:14:18 -04:00
2014-09-29 08:26:08 -04:00
[ 13 ] [
2014-10-22 08:44:10 -04:00
3 4.0 5 fastcall-ifi-callback [ fastcall-ifi-indirect ] with-callback
] unit-test
2010-04-12 19:14:18 -04:00
2014-09-29 08:26:08 -04:00
[ 19 ] [
2014-10-22 08:44:10 -04:00
3 4.0 5 6 fastcall-ifii-callback [ fastcall-ifii-indirect ] with-callback
] unit-test
2010-04-02 03:23:39 -04:00
2014-09-29 08:26:08 -04:00
[ S{ test-struct-11 f 7 -1 } ] [
2014-10-22 08:44:10 -04:00
3 4 fastcall-struct-return-ii-callback [
fastcall-struct-return-ii-indirect
] with-callback
] unit-test
2010-04-02 03:23:39 -04:00
2014-09-29 08:26:08 -04:00
[ S{ test-struct-11 f 7 -3 } ] [
2014-10-22 08:44:10 -04:00
3 4 7 fastcall-struct-return-iii-callback [
fastcall-struct-return-iii-indirect
] with-callback
] unit-test
2010-05-19 00:33:36 -04:00
2010-05-23 03:00:53 -04:00
: x64-regression-1 ( -- c )
int { int int int int int } cdecl [ + + + + ] alien-callback ;
: x64-regression-2 ( x x x x x c -- y )
int { int int int int int } cdecl alien-indirect ; inline
2014-09-29 08:26:08 -04:00
[ 661 ] [
2014-10-22 08:44:10 -04:00
100 500 50 10 1 x64-regression-1 [ x64-regression-2 ] with-callback
] unit-test
2010-05-23 03:00:53 -04:00
2010-05-19 00:33:36 -04:00
! Stack allocation
2014-10-22 08:44:10 -04:00
: blah ( -- x ) { RECT } [
1.5 >>x 2.0 >>y [ x>> ] [ y>> ] bi * >fixnum
] with-scoped-allocation ;
2010-05-19 00:33:36 -04:00
[ 3 ] [ blah ] unit-test
2010-05-22 01:25:10 -04:00
2010-07-16 17:13:38 -04:00
: out-param-test-1 ( -- b )
2010-07-16 17:32:05 -04:00
{ int } [ [ 12 ] dip 0 int set-alien-value ] with-out-parameters ;
2010-05-22 01:25:10 -04:00
2010-07-16 17:13:38 -04:00
[ 12 ] [ out-param-test-1 ] unit-test
: out-param-test-2 ( -- b )
2010-07-16 17:32:05 -04:00
{ { int initial: 12 } } [ drop ] with-out-parameters ;
2010-07-16 17:13:38 -04:00
[ 12 ] [ out-param-test-2 ] unit-test
: out-param-test-3 ( -- x y )
{ { RECT initial: S{ RECT { x 3 } { y 4 } } } } [ drop ]
2010-07-16 17:32:05 -04:00
with-out-parameters
2010-07-16 17:13:38 -04:00
[ x>> ] [ y>> ] bi ;
[ 3.0 4.0 ] [ out-param-test-3 ] unit-test
2010-05-22 01:25:10 -04:00
: out-param-callback ( -- a )
void { int pointer: int } cdecl
[ [ 2 * ] dip 0 int set-alien-value ] alien-callback ;
: out-param-indirect ( a a -- b )
{ int } [
swap void { int pointer: int } cdecl
alien-indirect
2010-07-16 17:32:05 -04:00
] with-out-parameters ;
2010-05-22 01:25:10 -04:00
2014-09-29 08:26:08 -04:00
[ 12 ] [
2014-10-22 08:44:10 -04:00
6 out-param-callback [ out-param-indirect ] with-callback
] unit-test
2010-07-19 19:56:00 -04:00
! Alias analysis regression
: aa-callback-1 ( -- c )
double { } cdecl [ 5.0 ] alien-callback ;
: aa-indirect-1 ( c -- x )
double { } cdecl alien-indirect ; inline
TUPLE: some-tuple x ;
[ T{ some-tuple f 5.0 } ] [
[
some-tuple new
2014-10-22 08:44:10 -04:00
aa-callback-1 [
aa-indirect-1
] with-callback >>x
2010-07-19 19:56:00 -04:00
] compile-call
2014-10-22 08:44:10 -04:00
] unit-test
2010-09-30 23:48:52 -04:00
! GC maps regression
: anton's-regression ( -- )
f (free) f (free) ;
[ ] [ anton's-regression ] unit-test
2014-11-07 18:34:10 -05:00
2014-11-09 13:52:16 -05:00
os windows? [
STRUCT: bool-and-ptr
{ b bool }
{ ptr void* } ;
2014-11-07 18:34:10 -05:00
2015-07-19 22:55:38 -04:00
FUNCTION: bool-and-ptr ffi_test_61 ( )
2014-11-08 16:39:47 -05:00
2014-11-24 11:20:28 -05:00
! { S{ bool-and-ptr { b t } { ptr f } } } [ ffi_test_61 ] unit-test
{ t } [ ffi_test_61 bool-and-ptr? ] unit-test
{ { t f } } [ ffi_test_61 [ b>> ] [ ptr>> ] bi 2array ] unit-test
2014-11-08 16:39:47 -05:00
2014-11-10 13:30:35 -05:00
] unless
2014-11-08 16:39:47 -05:00
2014-11-10 13:30:35 -05:00
STRUCT: uint-pair
{ a uint }
{ b uint } ;
2014-11-08 16:39:47 -05:00
2015-07-19 22:55:38 -04:00
FUNCTION: uint-pair ffi_test_62 ( )
2014-11-08 16:39:47 -05:00
2014-11-10 13:30:35 -05:00
{
S{ uint-pair { a 0xabcdefab } { b 0x12345678 } }
} [ ffi_test_62 ] unit-test
2014-11-08 16:39:47 -05:00
2014-11-10 13:30:35 -05:00
STRUCT: ulonglong-pair
{ a ulonglong }
{ b ulonglong } ;
2014-11-09 13:52:16 -05:00
2015-07-19 22:55:38 -04:00
FUNCTION: ulonglong-pair ffi_test_63 ( )
2014-11-10 13:30:35 -05:00
{
S{ ulonglong-pair { a 0xabcdefabcdefabcd } { b 0x1234567891234567 } }
} [ ffi_test_63 ] unit-test
2014-11-08 16:39:47 -05:00
2015-07-19 22:55:38 -04:00
FUNCTION: void* bug1021_test_1 ( void* s, int x )
2014-11-12 02:13:17 -05:00
! Sanity test the formula: x sq s +
{ t } [
10 [ [ 100 random ] twice 2array ] replicate
[ [ first2 [ <alien> ] dip bug1021_test_1 alien-address ] map ]
[ [ first2 sq + ] map ] bi =
] unit-test
: each-to100 ( ... quot: ( ... i -- ... ) i -- ... )
dup 100 < [
2dup swap (call) 1 + each-to100
] [ 2drop ] if ; inline recursive
: run-test ( alien -- seq )
100 33 <array> swap over
[
pick swapd
bug1021_test_1
-rot swap 2 fixnum+fast
set-slot
] curry curry 0 each-to100 ;
{ } [
minor-gc 2000 [
101 <alien> run-test
! If #1021 ever comes back it will blow up here because
! alien-address wants an alien not a fixnum.
[ alien-address ] map drop
] times
] unit-test
2016-08-02 17:36:02 -04:00
! Varargs with non-float parameters works.
FUNCTION-ALIAS: do-sum-ints2 int ffi_test_64 ( int n, int a, int b )
FUNCTION-ALIAS: do-sum-ints3 int ffi_test_64 ( int n, int a, int b, int c )
2016-08-09 19:18:52 -04:00
{ 30 60 } [
2016-08-02 17:36:02 -04:00
2 10 20 do-sum-ints2
3 10 20 30 do-sum-ints3
] unit-test
! Varargs with non-floats doesn't work on windows
FUNCTION-ALIAS: do-sum-doubles2 double ffi_test_65 ( int n, double a, double b )
FUNCTION-ALIAS: do-sum-doubles3 double ffi_test_65 ( int n, double a, double b, double c )
os windows? [
{ 27.0 22.0 } [
2 7 20 do-sum-doubles2
3 5 10 7 do-sum-doubles3
] unit-test
] unless
2015-07-19 22:55:38 -04:00
FUNCTION: int bug1021_test_2 ( int a, char* b, void* c )
FUNCTION: void* bug1021_test_3 ( c-string a )
2014-11-12 02:13:17 -05:00
: doit ( a -- d )
33 1byte-array "bar" bug1021_test_3 bug1021_test_2 ;
{ } [
10000 [ 0 doit 33 assert= ] times
] unit-test