From c258a4e2f4c7185ee37218f2831a2755a37a088c Mon Sep 17 00:00:00 2001 From: kusumotonorio <47816570+kusumotonorio@users.noreply.github.com> Date: Sun, 19 Jan 2020 21:57:05 +0900 Subject: [PATCH] Add Callback Tests --- basis/compiler/tests/alien.factor | 70 ++++++++++++++++++++++++++++++- vm/ffi_test.c | 21 ++++++++++ vm/ffi_test.h | 21 ++++++++++ 3 files changed, 111 insertions(+), 1 deletion(-) diff --git a/basis/compiler/tests/alien.factor b/basis/compiler/tests/alien.factor index 3e4f149077..83a7aa32f7 100644 --- a/basis/compiler/tests/alien.factor +++ b/basis/compiler/tests/alien.factor @@ -2,7 +2,7 @@ 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 +io.streams.string kernel kernel.private libc layouts locals 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 ; @@ -963,3 +963,71 @@ FUNCTION: void* bug1021_test_3 ( c-string a ) { } [ 10000 [ 0 doit 33 assert= ] times ] unit-test + +! Tests for System V AMD64 ABI +STRUCT: test_struct_66 { mem1 ulong } { mem2 ulong } ; +STRUCT: test_struct_68 { mem1 ulong } { mem2 ulong } { mem3 ulong } ; +FUNCTION: ulong ffi_test_66 ( ulong a, ulong b, ulong c, test_struct_66 d, test_struct_66 e ) +FUNCTION: ulong ffi_test_67 ( ulong a, ulong b, ulong c, test_struct_66 d, test_struct_66 e ulong _f ) +FUNCTION: ulong ffi_test_68 ( ulong a, ulong b, ulong c, test_struct_66 d, test_struct_68 e test_struct_66 _f ) + +{ 28 } [ 1 2 3 S{ test_struct_66 f 4 5 } S{ test_struct_66 f 6 7 } ffi_test_66 ] unit-test + +: callback-14 ( -- callback ) + ulong { ulong ulong ulong test_struct_66 test_struct_66 } cdecl + [| a b c d e | + a b + c + + d [ mem1>> + ] [ mem2>> + ] bi + e [ mem1>> + ] [ mem2>> + ] bi + ] alien-callback ; + +: callback-14-test ( a b c d e callback -- result ) + ulong { ulong ulong ulong test_struct_66 test_struct_66 } cdecl alien-indirect ; + +{ 28 } [ + 1 2 3 S{ test_struct_66 f 4 5 } S{ test_struct_66 f 6 7 } callback-14 [ + callback-14-test + ] with-callback +] unit-test + +{ 44 } [ 1 2 3 S{ test_struct_66 f 4 5 } S{ test_struct_66 f 6 7 } 8 ffi_test_67 ] unit-test + +: callback-15 ( -- callback ) + ulong { ulong ulong ulong test_struct_66 test_struct_66 ulong } cdecl + [| a b c d e _f | + a b + c + + d [ mem1>> + ] [ mem2>> + ] bi + e [ mem1>> + ] [ mem2>> + ] bi + _f 2 * + + ] alien-callback ; + +: callback-15-test ( a b c d e _f callback -- result ) + ulong { ulong ulong ulong test_struct_66 test_struct_66 ulong } cdecl alien-indirect ; + +{ 44 } [ + 1 2 3 S{ test_struct_66 f 4 5 } S{ test_struct_66 f 6 7 } 8 callback-15 [ + callback-15-test + ] with-callback +] unit-test + +{ 55 } [ + 1 2 3 S{ test_struct_66 f 4 5 } S{ test_struct_68 f 6 7 8 } S{ test_struct_66 f 9 10 } ffi_test_68 +] unit-test + +: callback-16 ( -- callback ) + ulong { ulong ulong ulong test_struct_66 test_struct_68 test_struct_66 } cdecl + [| a b c d e _f | + a b + c + + d [ mem1>> + ] [ mem2>> + ] bi + e [ mem1>> + ] [ mem2>> + ] [ mem3>> + ] tri + _f [ mem1>> + ] [ mem2>> + ] bi + ] alien-callback ; + +: callback-16-test ( a b c d e _f callback -- result ) + ulong { ulong ulong ulong test_struct_66 test_struct_68 test_struct_66 } cdecl alien-indirect ; + +{ 55 } [ + 1 2 3 S{ test_struct_66 f 4 5 } S{ test_struct_68 f 6 7 8 } S{ test_struct_66 f 9 10 } callback-16 [ + callback-16-test + ] with-callback +] unit-test diff --git a/vm/ffi_test.c b/vm/ffi_test.c index 1927a8d988..f2dbd2bd50 100644 --- a/vm/ffi_test.c +++ b/vm/ffi_test.c @@ -357,6 +357,27 @@ double ffi_test_65(int n, ...) { return sum; } +unsigned long ffi_test_66(unsigned long a, unsigned long b, unsigned long c, + struct test_struct_66 d, struct test_struct_66 e) { + unsigned long x; + x = a + b + c + d.mem1 + d.mem2 + e.mem1 + e.mem2; + return x; +} + +unsigned long ffi_test_67(unsigned long a, unsigned long b, unsigned long c, + struct test_struct_66 d, struct test_struct_66 e, + unsigned long f) { + unsigned long x; + x = a + b + c + d.mem1 + d.mem2 + e.mem1 + e.mem2 + f*2; + return x; +} + +unsigned long ffi_test_68(unsigned long a, unsigned long b, unsigned long c, + struct test_struct_66 d, struct test_struct_68 e, struct test_struct_66 f) { + unsigned long x; + x = a + b + c + d.mem1 + d.mem2 + e.mem1 + e.mem2 + e.mem3 + f.mem1 + f.mem2; + return x; +} void* bug1021_test_1(void* x, int y) { return (void*)(y * y + (size_t)x); diff --git a/vm/ffi_test.h b/vm/ffi_test.h index 1c7ae7ddb3..97ee793302 100644 --- a/vm/ffi_test.h +++ b/vm/ffi_test.h @@ -232,6 +232,27 @@ FACTOR_EXPORT struct ulonglong_pair ffi_test_63(void); FACTOR_EXPORT int ffi_test_64(int n, ...); FACTOR_EXPORT double ffi_test_65(int n, ...); + +struct test_struct_66 { + unsigned long mem1; + unsigned long mem2; +}; + +struct test_struct_68 { + unsigned long mem1; + unsigned long mem2; + unsigned long mem3; +}; + +FACTOR_EXPORT unsigned long ffi_test_66(unsigned long a, unsigned long b, unsigned long c, + struct test_struct_66 d, struct test_struct_66 e); + +FACTOR_EXPORT unsigned long ffi_test_67(unsigned long a, unsigned long b, unsigned long c, + struct test_struct_66 d, struct test_struct_66 e, unsigned long f); + +FACTOR_EXPORT unsigned long ffi_test_68(unsigned long a, unsigned long b, unsigned long c, + struct test_struct_66 d, struct test_struct_68 e, struct test_struct_66 f); + FACTOR_EXPORT void* bug1021_test_1(void* x, int y); FACTOR_EXPORT int bug1021_test_2(int x, char* y, void *z); FACTOR_EXPORT void* bug1021_test_3(int x); -- 2.34.1