From 0f8b878e2f3ea280648fc04309c5527cf261bfc8 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Wed, 3 Jul 2024 23:43:29 +0200 Subject: Fix typo. Reported by Sergey Bronnikov. #1223 --- src/jit/bcsave.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jit/bcsave.lua b/src/jit/bcsave.lua index 55fae993..030e6a16 100644 --- a/src/jit/bcsave.lua +++ b/src/jit/bcsave.lua @@ -553,7 +553,7 @@ typedef struct { o.sym_entry.strx = 1 ffi.copy(o.space+1, symname) - -- Write Macho-O object file. + -- Write Mach-O object file. local fp = savefile(output, "wb") fp:write(ffi.string(o, mach_size)) bcsave_tail(fp, output, s) -- cgit v1.2.3-55-g6feb From f2a1cd43281361035149b6eedbd267b5e71d64d0 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Wed, 3 Jul 2024 23:43:57 +0200 Subject: FFI: Fix __tostring metamethod access to enum cdata value. Thanks to Sergey Kaplun. #1232 --- 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 cf9cf9f5..1422dea6 100644 --- a/src/lib_ffi.c +++ b/src/lib_ffi.c @@ -304,7 +304,7 @@ LJLIB_CF(ffi_meta___tostring) p = *(void **)p; } else if (ctype_isenum(ct->info)) { msg = "cdata<%s>: %d"; - p = (void *)(uintptr_t)*(uint32_t **)p; + p = (void *)(uintptr_t)*(uint32_t *)p; } else { if (ctype_isptr(ct->info)) { p = cdata_getptr(p, ct->size); -- cgit v1.2.3-55-g6feb From f602f0154b644211283cfeea92a570ca38f71947 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Wed, 3 Jul 2024 23:45:16 +0200 Subject: Fix predict_next() in parser (for real now). Reported by Sergey Kaplun. #1226 #1054 --- src/lj_parse.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/lj_parse.c b/src/lj_parse.c index afdbcc3d..cb200663 100644 --- a/src/lj_parse.c +++ b/src/lj_parse.c @@ -2527,11 +2527,9 @@ static void parse_for_num(LexState *ls, GCstr *varname, BCLine line) */ static int predict_next(LexState *ls, FuncState *fs, BCPos pc) { - BCIns ins; + BCIns ins = fs->bcbase[pc].ins; GCstr *name; cTValue *o; - if (pc >= fs->bclim) return 0; - ins = fs->bcbase[pc].ins; switch (bc_op(ins)) { case BC_MOV: if (bc_d(ins) >= fs->nactvar) return 0; @@ -2579,7 +2577,7 @@ static void parse_for_iter(LexState *ls, GCstr *indexname) line = ls->linenumber; assign_adjust(ls, 3, expr_list(ls, &e), &e); bcreg_bump(fs, 3); /* The iterator needs another 3 slots (func + 2 args). */ - isnext = (nvars <= 5 && predict_next(ls, fs, exprpc)); + isnext = (nvars <= 5 && fs->pc > exprpc && predict_next(ls, fs, exprpc)); var_add(ls, 3); /* Hidden control variables. */ lex_check(ls, TK_do); loop = bcemit_AJ(fs, isnext ? BC_ISNEXT : BC_JMP, base, NO_JMP); -- cgit v1.2.3-55-g6feb From 7a608e4425ce0777f5c980dad9f4fdc1bcce0b8c Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Wed, 3 Jul 2024 23:46:47 +0200 Subject: FFI: Fix various issues in recff_cdata_arith. Thanks to Sergey Kaplun. #1224 --- src/lj_crecord.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/lj_crecord.c b/src/lj_crecord.c index 63a72aa4..1f6396f6 100644 --- a/src/lj_crecord.c +++ b/src/lj_crecord.c @@ -1367,7 +1367,8 @@ static TRef crec_arith_meta(jit_State *J, TRef *sp, CType **s, CTState *cts, void LJ_FASTCALL recff_cdata_arith(jit_State *J, RecordFFData *rd) { - CTState *cts = ctype_ctsG(J2G(J)); + CTState *cts = ctype_cts(J->L); + MMS mm = (MMS)rd->data; TRef sp[2]; CType *s[2]; MSize i; @@ -1417,6 +1418,8 @@ void LJ_FASTCALL recff_cdata_arith(jit_State *J, RecordFFData *rd) } } } else if (tref_isnil(tr)) { + if (!(mm == MM_len || mm == MM_eq || mm == MM_lt || mm == MM_le)) + lj_trace_err(J, LJ_TRERR_BADTYPE); tr = lj_ir_kptr(J, NULL); ct = ctype_get(cts, CTID_P_VOID); } else if (tref_isinteger(tr)) { @@ -1435,12 +1438,12 @@ void LJ_FASTCALL recff_cdata_arith(jit_State *J, RecordFFData *rd) ct = ctype_child(cts, cct); tr = lj_ir_kint(J, (int32_t)ofs); } else { /* Interpreter will throw or return false. */ - ct = ctype_get(cts, CTID_P_VOID); + lj_trace_err(J, LJ_TRERR_BADTYPE); } } else if (ctype_isptr(ct->info)) { tr = emitir(IRT(IR_ADD, IRT_PTR), tr, lj_ir_kintp(J, sizeof(GCstr))); } else { - ct = ctype_get(cts, CTID_P_VOID); + lj_trace_err(J, LJ_TRERR_BADTYPE); } } else if (!tref_isnum(tr)) { tr = 0; @@ -1452,7 +1455,6 @@ void LJ_FASTCALL recff_cdata_arith(jit_State *J, RecordFFData *rd) } { TRef tr; - MMS mm = (MMS)rd->data; if ((mm == MM_len || mm == MM_concat || (!(tr = crec_arith_int64(J, sp, s, mm)) && !(tr = crec_arith_ptr(J, sp, s, mm)))) && -- cgit v1.2.3-55-g6feb