From 4c35a42d9cd3b8be98fa419c68e4724ccdf4f2cf Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sat, 8 Jul 2023 19:30:56 +0200 Subject: [PATCH 1/3] FFI: Fix ffi.metatype() for non-raw types. Reported by 999pingGG. #1005 --- src/lib_ffi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib_ffi.c b/src/lib_ffi.c index 654e71a2..3978a83e 100644 --- a/src/lib_ffi.c +++ b/src/lib_ffi.c @@ -749,7 +749,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); From b7a8c7c184257858699454408420dd5f0b6c8a75 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sat, 8 Jul 2023 19:36:24 +0200 Subject: [PATCH 2/3] Fix register mask for stack check in head of side trace. Analyzed by Sergey Kaplun. #1016 --- src/lj_asm.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lj_asm.c b/src/lj_asm.c index 9ff9215f..cfdfa99f 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c @@ -1365,6 +1365,7 @@ static void asm_head_side(ASMState *as) IRRef1 sloadins[RID_MAX]; RegSet allow = RSET_ALL; /* Inverse of all coalesced registers. */ RegSet live = RSET_EMPTY; /* Live parent registers. */ + RegSet pallow = RSET_GPR; /* Registers needed by the parent stack check. */ IRIns *irp = &as->parent->ir[REF_BASE]; /* Parent base. */ int32_t spadj, spdelta; int pass2 = 0; @@ -1404,6 +1405,7 @@ static void asm_head_side(ASMState *as) sloadins[rs] = (IRRef1)i; rset_set(live, rs); /* Block live parent register. */ } + if (!ra_hasspill(regsp_spill(rs))) rset_clear(pallow, regsp_reg(rs)); } /* Calculate stack frame adjustment. */ @@ -1520,7 +1522,7 @@ static void asm_head_side(ASMState *as) ExitNo exitno = as->J->exitno; #endif as->T->topslot = (uint8_t)as->topslot; /* Remember for child traces. */ - asm_stack_check(as, as->topslot, irp, allow & RSET_GPR, exitno); + asm_stack_check(as, as->topslot, irp, pallow, exitno); } } From 94ada59628dd6ce5d6d2dad1d35a68ad30127f53 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sat, 8 Jul 2023 19:40:12 +0200 Subject: [PATCH 3/3] Fix maxslots when recording BC_VARG. Analyzed by Sergey Kaplun. #1024 --- src/lj_record.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lj_record.c b/src/lj_record.c index 10a14a6f..c9933968 100644 --- a/src/lj_record.c +++ b/src/lj_record.c @@ -1556,8 +1556,7 @@ static void rec_varg(jit_State *J, BCReg dst, ptrdiff_t nresults) } for (i = nvararg; i < nresults; i++) J->base[dst+i] = TREF_NIL; - if (dst + (BCReg)nresults > J->maxslot) - J->maxslot = dst + (BCReg)nresults; + J->maxslot = dst + (BCReg)nresults; } else if (select_detect(J)) { /* y = select(x, ...) */ TRef tridx = J->base[dst-1]; TRef tr = TREF_NIL;