[Tarantool-patches] [PATCH v2 luajit 06/26] test: enable <ffi_call.lua> in LuaJIT-tests
Sergey Bronnikov
sergeyb at tarantool.org
Thu Feb 1 18:58:22 MSK 2024
Hi, Sergey
thanks for the patch! LGTM with minor comment below
On 1/29/24 13:45, Sergey Kaplun wrote:
> This patch removes unused `dofile()`. Also, it uses the basename of the
> ctest library to be loaded via ffi. It adds groups with names of
> subtests and enables the test in <index>. Complex type is undefined on
> Windows, so the correponding tests are not enabled for this platform.
> Fastcalls are enabled only for the x86 architecture. Stdcalls are
> enabled only for Windows on x86. Tests with calls with 10 arguments with
> sizes less than 8 bits are dummy for M1. This suite lacks a mechanism to
too much "with" for my taste :) feel free to ignore
Thanks for reformatting testcases, much more readable now.
> skip subtests satisfying complicated conditions, so it is done manually
> by the corresponding `if` check.
>
> Part of tarantool/tarantool#9398
> ---
> test/LuaJIT-tests/lib/ffi/ffi_call.lua | 185 +++++++++++++------------
> test/LuaJIT-tests/lib/ffi/index | 1 +
> 2 files changed, 97 insertions(+), 89 deletions(-)
>
> diff --git a/test/LuaJIT-tests/lib/ffi/ffi_call.lua b/test/LuaJIT-tests/lib/ffi/ffi_call.lua
> index 1eb5e906..0844b686 100644
> --- a/test/LuaJIT-tests/lib/ffi/ffi_call.lua
> +++ b/test/LuaJIT-tests/lib/ffi/ffi_call.lua
> @@ -1,8 +1,5 @@
> -
> local ffi = require("ffi")
>
> -dofile("../common/ffi_util.inc")
> -
> local tonumber = tonumber
>
> ffi.cdef[[
> @@ -73,81 +70,92 @@ double __stdcall stdcall_dd(double a, double b);
> float __stdcall stdcall_ff(float a, float b);
> ]]
>
> -local C = ffi.load("../clib/ctest")
> +local C = ffi.load("ctest")
>
> -assert(C.call_i(-42) == -41)
> -assert(C.call_ii(-42, 17) == -42+17)
> -assert(C.call_10i(-42, 17, 12345, 9987, -100, 11, 51, 0x12345678, 338, -78901234) == -42+17+12345+9987-100+11+51+0x12345678+338-78901234)
> +do --- int enum double float args
> + assert(C.call_i(-42) == -41)
> + assert(C.call_ii(-42, 17) == -42+17)
>
> -assert(C.call_ie(123) == 124)
> + assert(C.call_ie(123) == 124)
>
> -assert(tonumber(C.call_ji(0x123456789LL, -17)) == tonumber(0x123456789LL-17))
> -assert(tonumber(C.call_ij(-17, 0x123456789LL)) == tonumber(0x123456789LL-17))
> -assert(tonumber(C.call_jj(-42, 17)) == -42+17)
> -assert(tonumber(C.call_jj(0x123456789abcdef0LL, -0x789abcde99887766LL)) == tonumber(0x123456789abcdef0LL-0x789abcde99887766LL))
> + assert(tonumber(C.call_ji(0x123456789LL, -17)) == tonumber(0x123456789LL-17))
> + assert(tonumber(C.call_ij(-17, 0x123456789LL)) == tonumber(0x123456789LL-17))
> + assert(tonumber(C.call_jj(-42, 17)) == -42+17)
> + assert(tonumber(C.call_jj(0x123456789abcdef0LL, -0x789abcde99887766LL)) ==
> + tonumber(0x123456789abcdef0LL - 0x789abcde99887766LL))
>
> -assert(C.call_dd(12.5, -3.25) == 12.5-3.25)
> -assert(C.call_10d(-42.5, 17.125, 12345.5, 9987, -100.625, 11, 51, 0x12345678, 338, -78901234.75) == -42.5+17.125+12345.5+9987-100.625+11+51+0x12345678+338-78901234.75)
> + assert(C.call_dd(12.5, -3.25) == 12.5-3.25)
>
> -assert(C.call_ff(12.5, -3.25) == 12.5-3.25)
> -assert(C.call_10f(-42.5, 17.125, 12345.5, 9987, -100.625, 11, 51, 0x123456, 338, -789012.75) == -42.5+17.125+12345.5+9987-100.625+11+51+0x123456+338-789012.75)
> + assert(C.call_ff(12.5, -3.25) == 12.5-3.25)
>
> -assert(C.call_idifjd(-42, 17.125, 0x12345, -100.625, 12345678901234, -789012.75) == -42+17.125+0x12345-100.625+12345678901234-789012.75)
> + assert(C.call_idifjd(-42, 17.125, 0x12345, -100.625, 12345678901234, -789012.75) ==
> + -42 + 17.125 + 0x12345 - 100.625 + 12345678901234 - 789012.75)
> +end
> +
> +do --- 10 ints, 10 floats, 10 doubles
> + if not (jit.os == "OSX" and jit.arch == "arm64") then -- NYI
> + assert(C.call_10i(-42, 17, 12345, 9987, -100, 11, 51, 0x12345678, 338, -78901234) ==
> + -42 + 17 + 12345 + 9987 - 100 + 11 + 51 + 0x12345678 + 338 - 78901234)
> + assert(C.call_10f(-42.5, 17.125, 12345.5, 9987, -100.625, 11, 51, 0x123456, 338, -789012.75) ==
> + -42.5 + 17.125 + 12345.5 + 9987 - 100.625 + 11 + 51 + 0x123456 + 338 - 789012.75)
> + end
> + assert(C.call_10d(-42.5, 17.125, 12345.5, 9987, -100.625, 11, 51, 0x12345678, 338, -78901234.75) ==
> + -42.5 + 17.125 + 12345.5 + 9987 - 100.625 + 11 + 51 + 0x12345678 + 338 - 78901234.75)
> +end
>
> -do
> +do --- pointers
> local a = ffi.new("int[10]", -42)
> assert(C.call_p_i(a) == -42+1)
> assert(tonumber(ffi.cast("intptr_t", C.call_p_p(a+3))) == tonumber(ffi.cast("intptr_t", a+4)))
> assert(C.call_pp_i(a+8, a+5) == 3)
> end
>
> --- vararg
> -assert(C.call_ividi(-42, ffi.new("int", 17), 12.5, ffi.new("int", 131)) == -42+17+12.5+131)
> +do --- vararg
> + assert(C.call_ividi(-42, ffi.new("int", 17), 12.5, ffi.new("int", 131)) == -42+17+12.5+131)
> +end
>
> -- complex
> -if pcall(function() return C.call_dd_cd end) then
> - do
> - local c = C.call_dd_cd(12.5, -3.25)
> - assert(c.re == 12.5 and c.im == -3.25*2)
> - end
> - do
> - local c1 = ffi.new("complex", 12.5, -3.25)
> - local cz = C.call_cd(c1)
> - assert(cz.re == 12.5+1 and cz.im == -3.25-2)
> - end
> - do
> - local c1 = ffi.new("complex", 12.5, -3.25)
> - local c2 = ffi.new("complex", -17.125, 100.625)
> - local cz = C.call_cdcd(c1, c2)
> - assert(cz.re == 12.5-17.125 and cz.im == -3.25+100.625)
> - end
> +do --- complex double, 2 double args -windows
> + local c = C.call_dd_cd(12.5, -3.25)
> + assert(c.re == 12.5 and c.im == -3.25*2)
> +end
> +do --- complex double, 1 complex arg -windows
> + local c1 = ffi.new("complex", 12.5, -3.25)
> + local cz = C.call_cd(c1)
> + assert(cz.re == 12.5+1 and cz.im == -3.25-2)
> +end
> +do --- complex double, 2 complex args -windows
> + local c1 = ffi.new("complex", 12.5, -3.25)
> + local c2 = ffi.new("complex", -17.125, 100.625)
> + local cz = C.call_cdcd(c1, c2)
> + assert(cz.re == 12.5-17.125 and cz.im == -3.25+100.625)
> +end
>
> - do
> - local c = C.call_ff_cf(12.5, -3.25)
> - assert(c.re == 12.5 and c.im == -3.25*2)
> - end
> - do
> - local c1 = ffi.new("complex float", 12.5, -3.25)
> - local cz = C.call_cf(c1)
> - assert(cz.re == 12.5+1 and cz.im == -3.25-2)
> - end
> - do
> - local c1 = ffi.new("complex float", 12.5, -3.25)
> - local c2 = ffi.new("complex float", -17.125, 100.625)
> - local cz = C.call_cfcf(c1, c2)
> - assert(cz.re == 12.5-17.125 and cz.im == -3.25+100.625)
> - end
> +do --- complex float, 2 float args -windows
> + local c = C.call_ff_cf(12.5, -3.25)
> + assert(c.re == 12.5 and c.im == -3.25*2)
> +end
> +do --- complex float, 1 complex float arg -windows
> + local c1 = ffi.new("complex float", 12.5, -3.25)
> + local cz = C.call_cf(c1)
> + assert(cz.re == 12.5+1 and cz.im == -3.25-2)
> +end
> +do --- complex float, 2 complex float args -windows
> + local c1 = ffi.new("complex float", 12.5, -3.25)
> + local c2 = ffi.new("complex float", -17.125, 100.625)
> + local cz = C.call_cfcf(c1, c2)
> + assert(cz.re == 12.5-17.125 and cz.im == -3.25+100.625)
> end
>
> -- structs
> -do
> +do --- struct {int; int;} arg, return struct {int; int;}
> local s1 = ffi.new("s_ii", -42, 17)
> local sz = C.call_sii(s1)
> assert(s1.x == -42 and s1.y == 17)
> assert(sz.x == -42 and sz.y == 17)
> end
>
> -do
> +do --- struct {int64_t; int64_t;} arg, return struct {int64_t; int64_t;}
> local s1 = ffi.new("s_jj", 0x123456789abcdef0LL, -0x789abcde99887766LL)
> local sz = C.call_sjj(s1)
> assert(s1.x == 0x123456789abcdef0LL)
> @@ -156,28 +164,28 @@ do
> assert(sz.y == -0x789abcde99887766LL)
> end
>
> -do
> +do --- struct {float; float;} arg, return struct {float; float;}
> local s1 = ffi.new("s_ff", 12.5, -3.25)
> local sz = C.call_sff(s1)
> assert(s1.x == 12.5 and s1.y == -3.25)
> assert(sz.x == 12.5 and sz.y == -3.25)
> end
>
> -do
> +do --- struct {double; double;} arg, return struct {double; double;}
> local s1 = ffi.new("s_dd", 12.5, -3.25)
> local sz = C.call_sdd(s1)
> assert(s1.x == 12.5 and s1.y == -3.25)
> assert(sz.x == 12.5 and sz.y == -3.25)
> end
>
> -do
> +do --- struct composed of 8 ints arg, same result
> local s1 = ffi.new("s_8i", -42, 17, 12345, 9987, -100, 11, 51, 0x12345678)
> local sz = C.call_s8i(s1)
> assert(s1.a+s1.b+s1.c+s1.d+s1.e+s1.f+s1.g+s1.h == -42+17+12345+9987-100+11+51+0x12345678)
> assert(sz.a+sz.b+sz.c+sz.d+sz.e+sz.f+sz.g+sz.h == -42+17+12345+9987-100+11+51+0x12345678)
> end
>
> -do
> +do --- 2 struct {int; int;} args, return struct {int; int;}
> local s1 = ffi.new("s_ii", -42, 17)
> local s2 = ffi.new("s_ii", 0x12345, -98765)
> local sz = C.call_siisii(s1, s2)
> @@ -186,7 +194,7 @@ do
> assert(sz.x == -42+0x12345 and sz.y == 17-98765)
> end
>
> -do
> +do --- 2 struct {float; float;} args, return struct {float; float;}
> local s1 = ffi.new("s_ff", 12.5, -3.25)
> local s2 = ffi.new("s_ff", -17.125, 100.625)
> local sz = C.call_sffsff(s1, s2)
> @@ -195,7 +203,7 @@ do
> assert(sz.x == 12.5-17.125 and sz.y == -3.25+100.625)
> end
>
> -do
> +do --- 2 struct {double; double;} args, return struct {double; double;}
> local s1 = ffi.new("s_dd", 12.5, -3.25)
> local s2 = ffi.new("s_dd", -17.125, 100.625)
> local sz = C.call_sddsdd(s1, s2)
> @@ -204,7 +212,7 @@ do
> assert(sz.x == 12.5-17.125 and sz.y == -3.25+100.625)
> end
>
> -do
> +do --- 2 struct composed of 8 ints args, same struct in result
> local s1 = ffi.new("s_8i", -42, 17, 12345, 9987, -100, 11, 51, 0x12345678)
> local s2 = ffi.new("s_8i", 99, 311, 98765, -51, 312, 97, 17, 0x44332211)
> local sz = C.call_s8is8i(s1, s2)
> @@ -215,7 +223,7 @@ do
> assert(sz.h == 0x12345678+0x44332211)
> end
>
> -do
> +do --- int, struct composed of 8 ints, int
> local s1 = ffi.new("s_8i", -42, 17, 12345, 9987, -100, 11, 51, 0x12345678)
> local sz = C.call_is8ii(19, s1, -51)
> assert(s1.a+s1.b+s1.c+s1.d+s1.e+s1.f+s1.g+s1.h == -42+17+12345+9987-100+11+51+0x12345678)
> @@ -225,42 +233,41 @@ do
> end
>
> -- target-specific
> -if jit.arch == "x86" then
> +do --- fastcall void int double +x86
> assert(C.fastcall_void() == 1)
> assert(C.fastcall_i(-42) == -41)
> assert(C.fastcall_ii(-42, 17) == -42+17)
> assert(C.fastcall_iii(-42, 17, 139) == -42+17+139)
> assert(tonumber(C.fastcall_ji(0x123456789LL, -17)) == tonumber(0x123456789LL-17))
> assert(C.fastcall_dd(12.5, -3.25) == 12.5-3.25)
> +end
>
> - do
> - local a = ffi.new("int[10]", -42)
> - assert(C.fastcall_pp_i(a+8, a+5) == 3)
> - end
> -
> - do
> - local s1 = ffi.new("s_ii", -42, 17)
> - local s2 = ffi.new("s_ii", 0x12345, -98765)
> - local sz = C.fastcall_siisii(s1, s2)
> - assert(s1.x == -42 and s1.y == 17)
> - assert(s2.x == 0x12345 and s2.y == -98765)
> - assert(sz.x == -42+0x12345 and sz.y == 17-98765)
> - end
> +do --- fastcall 2 pointer args +x86
> + local a = ffi.new("int[10]", -42)
> + assert(C.fastcall_pp_i(a+8, a+5) == 3)
> +end
>
> - do
> - local s1 = ffi.new("s_dd", 12.5, -3.25)
> - local s2 = ffi.new("s_dd", -17.125, 100.625)
> - local sz = C.fastcall_sddsdd(s1, s2)
> - assert(s1.x == 12.5 and s1.y == -3.25)
> - assert(s2.x == -17.125 and s2.y == 100.625)
> - assert(sz.x == 12.5-17.125 and sz.y == -3.25+100.625)
> - end
> +do --- fastcall 2 struct {int; int;} args +x86
> + local s1 = ffi.new("s_ii", -42, 17)
> + local s2 = ffi.new("s_ii", 0x12345, -98765)
> + local sz = C.fastcall_siisii(s1, s2)
> + assert(s1.x == -42 and s1.y == 17)
> + assert(s2.x == 0x12345 and s2.y == -98765)
> + assert(sz.x == -42+0x12345 and sz.y == 17-98765)
> +end
>
> - if jit.os == "Windows" then
> - assert(C.stdcall_i(-42) == -41)
> - assert(C.stdcall_ii(-42, 17) == -42+17)
> - assert(C.stdcall_dd(12.5, -3.25) == 12.5-3.25)
> - assert(C.stdcall_ff(12.5, -3.25) == 12.5-3.25)
> - end
> +do --- fastcall 2 struct {double; double;} args +x86
> + local s1 = ffi.new("s_dd", 12.5, -3.25)
> + local s2 = ffi.new("s_dd", -17.125, 100.625)
> + local sz = C.fastcall_sddsdd(s1, s2)
> + assert(s1.x == 12.5 and s1.y == -3.25)
> + assert(s2.x == -17.125 and s2.y == 100.625)
> + assert(sz.x == 12.5-17.125 and sz.y == -3.25+100.625)
> end
>
> +do --- stdcall +x86 +windows
> + assert(C.stdcall_i(-42) == -41)
> + assert(C.stdcall_ii(-42, 17) == -42+17)
> + assert(C.stdcall_dd(12.5, -3.25) == 12.5-3.25)
> + assert(C.stdcall_ff(12.5, -3.25) == 12.5-3.25)
> +end
> diff --git a/test/LuaJIT-tests/lib/ffi/index b/test/LuaJIT-tests/lib/ffi/index
> index 8d833107..599a0182 100644
> --- a/test/LuaJIT-tests/lib/ffi/index
> +++ b/test/LuaJIT-tests/lib/ffi/index
> @@ -4,6 +4,7 @@ copy_fill.lua
> err.lua
> ffi_arith_ptr.lua
> ffi_bitfield.lua
> +ffi_call.lua
> istype.lua
> jit_array.lua
> jit_complex.lua
More information about the Tarantool-patches
mailing list