2009-08-25 11:59:33 -04:00
USING: accessors alien alien.c-types alien.libraries
2009-08-26 12:01:39 -04:00
alien.syntax arrays classes.struct combinators
2009-08-25 11:59:33 -04:00
compiler continuations effects io io.backend io.pathnames
io.streams.string kernel math memory namespaces
namespaces.private parser quotations sequences
2009-09-09 23:33:34 -04:00
specialized-arrays stack-checker stack-checker.errors
2009-09-28 09:48:39 -04:00
system threads tools.test words alien.complex ;
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
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
{
2009-03-26 19:56:10 -04:00
{ [ os winnt? ] [ "libfactor-ffi-test.dll" ] }
{ [ 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
"f-cdecl" libfactor-ffi-tests-path "cdecl" add-library
"f-stdcall" libfactor-ffi-tests-path "stdcall" add-library
>>
2009-03-27 18:58:31 -04:00
LIBRARY: f-cdecl
2008-08-22 16:30:57 -04:00
FUNCTION: void ffi_test_0 ;
[ ] [ ffi_test_0 ] unit-test
FUNCTION: int ffi_test_1 ;
[ 3 ] [ ffi_test_1 ] unit-test
FUNCTION: int ffi_test_2 int x int y ;
[ 5 ] [ 2 3 ffi_test_2 ] unit-test
[ "hi" 3 ffi_test_2 ] must-fail
FUNCTION: int ffi_test_3 int x int y int z int t ;
[ 25 ] [ 2 3 4 5 ffi_test_3 ] unit-test
FUNCTION: float ffi_test_4 ;
[ 1.5 ] [ ffi_test_4 ] unit-test
FUNCTION: double ffi_test_5 ;
[ 1.5 ] [ ffi_test_5 ] unit-test
FUNCTION: int ffi_test_9 int a int b int c int d int e int f int g ;
[ 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
2009-08-25 11:59:33 -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
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 ;
[ 66 ] [ 1 2 3 4 5 6 7 8 9 10 11 ffi_test_13 ] unit-test
2009-08-25 11:59:33 -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
FUNCTION: char* ffi_test_15 char* x char* y ;
[ "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
2009-08-25 11:59:33 -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
2009-08-25 11:59:33 -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 )
2009-10-21 22:10:11 -04:00
int { } "cdecl" alien-indirect ;
2008-08-22 16:30:57 -04:00
{ 1 1 } [ indirect-test-1 ] must-infer-as
2009-12-21 21:42:49 -05:00
[ B{ } indirect-test-1 ] [ { "kernel-error" 3 6 B{ } } = ] must-fail-with
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 -- )
2009-10-21 22:10:11 -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 )
2009-10-21 22:10:11 -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 )
2009-10-21 22:10:11 -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
2008-09-02 02:53:01 -04:00
[ "stdcall" ] [ "f-stdcall" library abi>> ] unit-test
2008-08-22 16:30:57 -04:00
: ffi_test_18 ( w x y z -- int )
2009-10-21 19:44:00 -04:00
int "f-stdcall" "ffi_test_18" { int int int int }
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 )
2009-10-21 19:44:00 -04:00
BAR "f-stdcall" "ffi_test_19" { long long long }
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
FUNCTION: double ffi_test_6 float x float y ;
[ 6.0 ] [ 3.0 2.0 ffi_test_6 ] unit-test
[ "a" "b" ffi_test_6 ] must-fail
FUNCTION: double ffi_test_7 double x double y ;
[ 6.0 ] [ 3.0 2.0 ffi_test_7 ] unit-test
FUNCTION: double ffi_test_8 double x float y double z float t int w ;
[ 19.0 ] [ 3.0 2.0 1.0 6.0 7 ffi_test_8 ] unit-test
FUNCTION: int ffi_test_10 int a int b double c int d float e int f int g int h ;
[ -34 ] [ 1 2 3.0 4 5.0 6 7 8 ffi_test_10 ] unit-test
FUNCTION: void ffi_test_20 double x1, double x2, double x3,
double y1, double y2, double y3,
double z1, double z2, double z3 ;
[ ] [ 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"
2009-10-21 19:44:00 -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 }
2008-08-22 16:30:57 -04:00
alien-invoke gc 3 ;
2008-11-17 13:23:44 -05:00
[ 861 3 ] [ 42 [ ] each ffi_test_31 ] unit-test
: 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"
2009-10-21 19:44:00 -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 }
2008-11-17 13:23:44 -05:00
alien-invoke ;
[ 861.0 ] [ 42 [ >float ] each ffi_test_31_point_5 ] unit-test
2008-08-22 16:30:57 -04:00
FUNCTION: longlong ffi_test_21 long x long y ;
[ 121932631112635269 ]
[ 123456789 987654321 ffi_test_21 ] unit-test
FUNCTION: long ffi_test_22 long x longlong y longlong z ;
[ 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
2009-08-25 11:59:33 -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
FUNCTION: float ffi_test_23 ( float[3] x, float[3] y ) ;
2008-11-14 21:18:16 -05:00
[ 32.0 ] [
2009-02-06 05:37:28 -05:00
{ 1.0 2.0 3.0 } >float-array
{ 4.0 5.0 6.0 } >float-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
FUNCTION: test-struct-1 ffi_test_24 ;
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
FUNCTION: test-struct-2 ffi_test_25 ;
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
FUNCTION: test-struct-3 ffi_test_26 ;
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
FUNCTION: test-struct-4 ffi_test_27 ;
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
FUNCTION: test-struct-5 ffi_test_28 ;
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
FUNCTION: test-struct-6 ffi_test_29 ;
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
FUNCTION: test-struct-7 ffi_test_30 ;
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
FUNCTION: double ffi_test_32 test-struct-8 x int y ;
[ 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
FUNCTION: double ffi_test_33 test-struct-9 x int y ;
[ 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
FUNCTION: double ffi_test_34 test-struct-10 x int y ;
[ 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
FUNCTION: double ffi_test_35 test-struct-11 x int y ;
[ 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
FUNCTION: double ffi_test_36 ( test-struct-12 x ) ;
[ 1.23456 ] [ 1.23456 make-struct-12 ffi_test_36 ] unit-test
FUNCTION: ulonglong ffi_test_38 ( ulonglong x, ulonglong y ) ;
[ t ] [ 31 2^ 32 2^ ffi_test_38 63 2^ = ] unit-test
! Test callbacks
2009-10-21 22:10:11 -04:00
: callback-1 ( -- callback ) void { } "cdecl" [ ] alien-callback ;
2008-08-22 16:30:57 -04:00
2008-08-29 13:00:54 -04:00
[ 0 1 ] [ [ callback-1 ] infer [ in>> ] [ out>> ] bi ] unit-test
2008-08-22 16:30:57 -04:00
[ t ] [ callback-1 alien? ] unit-test
2009-10-21 22:10:11 -04:00
: callback_test_1 ( ptr -- ) void { } "cdecl" alien-indirect ;
2008-08-22 16:30:57 -04:00
[ ] [ callback-1 callback_test_1 ] unit-test
2009-10-21 22:10:11 -04:00
: callback-2 ( -- callback ) void { } "cdecl" [ [ 5 throw ] ignore-errors ] alien-callback ;
2008-08-22 16:30:57 -04:00
[ ] [ callback-2 callback_test_1 ] unit-test
2009-10-21 22:10:11 -04:00
: callback-3 ( -- callback ) void { } "cdecl" [ 5 "x" set ] alien-callback ;
2008-08-22 16:30:57 -04:00
[ t ] [
namestack*
3 "x" set callback-3 callback_test_1
namestack* eq?
] unit-test
[ 5 ] [
[
3 "x" set callback-3 callback_test_1 "x" get
] with-scope
] unit-test
: callback-4 ( -- callback )
2009-10-21 22:10:11 -04:00
void { } "cdecl" [ "Hello world" write ] alien-callback
2008-08-22 16:30:57 -04:00
gc ;
[ "Hello world" ] [
[ callback-4 callback_test_1 ] with-string-writer
] unit-test
: callback-5 ( -- callback )
2009-10-21 22:10:11 -04:00
void { } "cdecl" [ gc ] alien-callback ;
2008-08-22 16:30:57 -04:00
[ "testing" ] [
"testing" callback-5 callback_test_1
] unit-test
2009-10-16 12:39:22 -04:00
: callback-5b ( -- callback )
2009-10-21 22:10:11 -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" ] [
"testing" callback-5b callback_test_1
] unit-test
2008-08-22 16:30:57 -04:00
: callback-6 ( -- callback )
2009-10-21 22:10:11 -04:00
void { } "cdecl" [ [ continue ] callcc0 ] alien-callback ;
2008-08-22 16:30:57 -04:00
[ 1 2 3 ] [ callback-6 callback_test_1 1 2 3 ] unit-test
: callback-7 ( -- callback )
2009-10-21 22:10:11 -04:00
void { } "cdecl" [ 1000000 sleep ] alien-callback ;
2008-08-22 16:30:57 -04:00
[ 1 2 3 ] [ callback-7 callback_test_1 1 2 3 ] unit-test
[ f ] [ namespace global eq? ] unit-test
: callback-8 ( -- callback )
2010-01-12 09:09:43 -05:00
void { } "cdecl" [ [ ] in-thread yield ] alien-callback ;
2008-08-22 16:30:57 -04:00
[ ] [ callback-8 callback_test_1 ] unit-test
: callback-9 ( -- callback )
2009-10-21 22:10:11 -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 ;
FUNCTION: void ffi_test_36_point_5 ( ) ;
[ ] [ ffi_test_36_point_5 ] unit-test
FUNCTION: int ffi_test_37 ( void* func ) ;
[ 1 ] [ callback-9 ffi_test_37 ] unit-test
[ 7 ] [ callback-9 ffi_test_37 ] unit-test
2008-09-09 04:10:43 -04:00
2009-08-25 11:59:33 -04:00
STRUCT: test_struct_13
2009-08-25 13:00:06 -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
FUNCTION: int ffi_test_39 ( long a, long b, test_struct_13 s ) ;
[ 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
2009-08-25 13:00:06 -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 )
2009-10-21 22:10:11 -04:00
void { void* void* double-rect } "cdecl"
2008-09-12 01:04:56 -04:00
[ "example" set-global 2drop ] alien-callback ;
: double-rect-test ( arg -- arg' )
f f rot
double-rect-callback
2009-10-21 22:10:11 -04:00
void { void* void* double-rect } "cdecl" alien-indirect
2008-09-12 01:04:56 -04:00
"example" get-global ;
[ 1.0 2.0 3.0 4.0 ]
[ 1.0 2.0 3.0 4.0 <double-rect> double-rect-test >double-rect< ] 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
FUNCTION: test_struct_14 ffi_test_40 ( double x1, double x2 ) ;
[ 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 )
2009-10-21 22:10:11 -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 )
2009-10-21 22:10:11 -04:00
test_struct_14 { double double } "cdecl" alien-indirect ;
2008-09-13 21:28:13 -04:00
[ 1.0 2.0 ] [
1.0 2.0 callback-10 callback-10-test
2009-08-25 11:59:33 -04:00
[ x1>> ] [ x2>> ] bi
2008-09-13 21:28:13 -04:00
] unit-test
FUNCTION: test-struct-12 ffi_test_41 ( int a, double x ) ;
[ 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 )
2009-10-21 22:10:11 -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 )
2009-10-21 22:10:11 -04:00
test-struct-12 { int double } "cdecl" alien-indirect ;
2008-09-13 21:28:13 -04:00
[ 1 2.0 ] [
1 2.0 callback-11 callback-11-test
2009-08-25 11:59:33 -04:00
[ a>> ] [ x>> ] bi
2008-09-13 21:28:13 -04:00
] unit-test
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
FUNCTION: test_struct_15 ffi_test_42 ( float x, float y ) ;
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 )
2009-10-21 22:10:11 -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 )
2009-10-21 22:10:11 -04:00
test_struct_15 { float float } "cdecl" alien-indirect ;
2008-09-13 21:28:13 -04:00
[ 1.0 2.0 ] [
2009-08-25 11:59:33 -04:00
1.0 2.0 callback-12 callback-12-test [ x>> ] [ y>> ] bi
2008-09-13 21:28:13 -04:00
] unit-test
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
FUNCTION: test_struct_16 ffi_test_43 ( float x, int a ) ;
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 )
2009-10-21 22:10:11 -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 )
2009-10-21 22:10:11 -04:00
test_struct_16 { float int } "cdecl" alien-indirect ;
2008-09-13 21:28:13 -04:00
[ 1.0 2 ] [
1.0 2 callback-13 callback-13-test
2009-08-25 11:59:33 -04:00
[ x>> ] [ a>> ] bi
2008-09-13 21:28:13 -04:00
] unit-test
FUNCTION: test_struct_14 ffi_test_44 ( ) ; inline
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
2009-02-06 13:21:53 -05:00
FUNCTION: complex-float ffi_test_45 ( int x ) ;
2009-02-06 13:30:11 -05:00
[ C{ 3.0 0.0 } ] [ 3 ffi_test_45 ] unit-test
2009-02-06 13:21:53 -05:00
FUNCTION: complex-double ffi_test_46 ( int x ) ;
2009-02-06 13:30:11 -05:00
[ C{ 3.0 0.0 } ] [ 3 ffi_test_46 ] unit-test
2009-02-06 13:21:53 -05:00
FUNCTION: complex-float ffi_test_47 ( complex-float x, complex-double y ) ;
2009-02-06 05:02:00 -05:00
[ C{ 4.0 4.0 } ] [
C{ 1.0 2.0 }
2009-02-06 13:21:53 -05:00
C{ 1.5 1.0 } ffi_test_47
] unit-test
2009-05-05 19:37:40 -04:00
! Reported by jedahu
2009-08-25 11:59:33 -04:00
STRUCT: bool-field-test
2009-08-25 17:31:58 -04:00
{ name char* }
{ on bool }
2009-08-25 11:59:33 -04:00
{ parents short } ;
2009-05-05 19:37:40 -04:00
FUNCTION: short ffi_test_48 ( bool-field-test x ) ;
[ 123 ] [
2009-08-25 11:59:33 -04:00
bool-field-test <struct>
123 >>parents
2009-05-05 19:37:40 -04:00
ffi_test_48
2009-08-13 20:21:44 -04:00
] unit-test
2009-09-25 19:08:33 -04:00
! Regression: calling an undefined function would raise a protection fault
FUNCTION: void this_does_not_exist ( ) ;
2009-11-06 02:04:02 -05:00
[ this_does_not_exist ] [ { "kernel-error" 9 f f } = ] must-fail-with
2010-01-06 23:39:22 -05:00
! More alien-assembly tests are in cpu.* vocabs
: assembly-test-1 ( -- ) void { } "cdecl" [ ] alien-assembly ;
[ ] [ assembly-test-1 ] unit-test