[Tarantool-patches] [PATCH v2 luajit 06/26] test: enable <ffi_call.lua> in LuaJIT-tests

Sergey Kaplun skaplun at tarantool.org
Mon Jan 29 13:45:06 MSK 2024


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
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
-- 
2.43.0



More information about the Tarantool-patches mailing list