Hi! Thanks for the patch! LGTM, except for a few nits below. >  >>From: Mike Pall >> >>Analyzed by Sergey Kaplun. >> >>(cherry-picked from commit a01cba9d2d74efc57376822aa43db2d5043af5a4) >> >>This patch is the follow-up for the previous one. It removes the >Typo: s/the/a >Typo: s/for the/to the/ >>condition for `maxslot` changing in the case when varargs are defined >>on the trace (i.e. `framedepth` > 0). >Typo: s/i.e./i.e.,/ >> >>Sergey Kaplun: >>* added the description and the test for the problem >> >>Part of tarantool/tarantool#8825 >>--- >> src/lj_record.c | 8 ++------ >> .../lj-1024-varg-maxslot.test.lua | 19 ++++++++++++++++++- >> 2 files changed, 20 insertions(+), 7 deletions(-) >> >>diff --git a/src/lj_record.c b/src/lj_record.c >>index 112524d3..02d9db9e 100644 >>--- a/src/lj_record.c >>+++ b/src/lj_record.c >>@@ -1775,12 +1775,8 @@ static void rec_varg(jit_State *J, BCReg dst, ptrdiff_t nresults) >>   if (J->framedepth > 0) { /* Simple case: varargs defined on-trace. */ >>     ptrdiff_t i; >>     if (nvararg < 0) nvararg = 0; >>- if (nresults == -1) { >>- nresults = nvararg; >>- J->maxslot = dst + (BCReg)nvararg; >>- } else if (dst + nresults > J->maxslot) { >>- J->maxslot = dst + (BCReg)nresults; >>- } >>+ if (nresults == -1) nresults = nvararg; >>+ J->maxslot = dst + (BCReg)nresults; >>     for (i = 0; i < nresults; i++) >>       J->base[dst+i] = i < nvararg ? getslot(J, i - nvararg - 1 - LJ_FR2) : TREF_NIL; >>   } else { /* Unknown number of varargs passed to trace. */ >>diff --git a/test/tarantool-tests/lj-1024-varg-maxslot.test.lua b/test/tarantool-tests/lj-1024-varg-maxslot.test.lua >>index 14270595..f8d74e8a 100644 >>--- a/test/tarantool-tests/lj-1024-varg-maxslot.test.lua >>+++ b/test/tarantool-tests/lj-1024-varg-maxslot.test.lua >>@@ -3,7 +3,7 @@ local test = tap.test('lj-noticket-varg-usedef'):skipcond({ >>   ['Test requires JIT enabled'] = not jit.status(), >> }) >>  >>-test:plan(1) >>+test:plan(2) >>  >> jit.opt.start('hotloop=1') >>  >>@@ -20,4 +20,21 @@ end >>  >> test:ok(true, 'BC_VARG recording 0th frame depth') >>  >>+-- Now the same case, but with additional frame, so VARG slots >Typo: s/with/with an/ >>+-- are defined on the trace. >>+local function bump_varg_frame(...) >Nit: Not sure about the name here, maybe it is better to call it >just `varg_frame` or something like that. Feel free to ignore, though. >>+ -- BC_VARG 1 1 0. `...` is nil (argument for the script). >>+ -- luacheck: ignore >>+ -- XXX: some condition to use several slots on the Lua stack. >>+ anchor = 1 >= 1, ... >>+end >>+ >>+counter = 0 >>+while counter < 3 do >>+ counter = counter + 1 >>+ bump_varg_frame() >>+end >>+ >>+test:ok(true, 'BC_VARG recording with defined on trace VARG slots') >>+ >> os.exit(test:check() and 0 or 1) >>-- >>2.34.1 >-- >Best regards, >Maxim Kokryashkin >