Hi, Sergey
thanks for the patch! LGTM
From: Mike Pall <mike> Reported by 999pingGG. (cherry picked from commit 4c35a42d9cd3b8be98fa419c68e4724ccdf4f2cf) This patch is a follow-up to the previous commit. Since the child id is used for the index in the lookup table, it has no effect, and metatype methods are not overloaded. This patch fixes the behaviour by using the correct index. Sergey Kaplun: * added the description and the test for the problem Part of tarantool/tarantool#9924 --- src/lib_ffi.c | 2 +- .../lj-861-ctype-attributes.test.lua | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/lib_ffi.c b/src/lib_ffi.c index dfb01658..7ed6fc78 100644 --- a/src/lib_ffi.c +++ b/src/lib_ffi.c @@ -776,7 +776,7 @@ LJLIB_CF(ffi_metatype) if (!(ctype_isstruct(ct->info) || ctype_iscomplex(ct->info) || ctype_isvector(ct->info))) lj_err_arg(L, 1, LJ_ERR_FFI_INVTYPE); - tv = lj_tab_setinth(L, t, -(int32_t)id); + tv = lj_tab_setinth(L, t, -(int32_t)ctype_typeid(cts, ct)); if (!tvisnil(tv)) lj_err_caller(L, LJ_ERR_PROTMT); settabV(L, tv, mt); diff --git a/test/tarantool-tests/lj-861-ctype-attributes.test.lua b/test/tarantool-tests/lj-861-ctype-attributes.test.lua index a407fae0..79121cdb 100644 --- a/test/tarantool-tests/lj-861-ctype-attributes.test.lua +++ b/test/tarantool-tests/lj-861-ctype-attributes.test.lua @@ -2,12 +2,14 @@ local tap = require('tap') -- Test file to demonstrate LuaJIT incorrect behaviour during -- parsing and working with ctypes with attributes. --- See also: https://github.com/LuaJIT/LuaJIT/issues/861. +-- See also: +-- * https://github.com/LuaJIT/LuaJIT/issues/861, +-- * https://github.com/LuaJIT/LuaJIT/issues/1005. local test = tap.test('lj-861-ctype-attributes') local ffi = require('ffi') -test:plan(5) +test:plan(6) local EXPECTED_ALIGN = 4 @@ -37,8 +39,15 @@ test:is(ffi.sizeof('struct test_parsing_sizeof'), EXPECTED_ALIGN, test:is(ffi.sizeof('struct test_parsing_alignof'), EXPECTED_ALIGN, 'correct alignof during C parsing') -local ok, _ = pcall(ffi.metatype, 's_aligned', {}) +local EXPECTED_TOSTR = '__tostring overloaded' +local ok, obj = pcall(ffi.metatype, 's_aligned', { + __tostring = function() + return EXPECTED_TOSTR + end, +}) test:ok(ok, 'ffi.metatype is called at the structure with attributes') +test:is(tostring(obj()), EXPECTED_TOSTR, + '__tostring is overloaded for the structure with attributes') test:done(true)