]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Fix predict_next() in parser (for real now).
authorMike Pall <mike>
Wed, 3 Jul 2024 21:45:16 +0000 (23:45 +0200)
committerMike Pall <mike>
Wed, 3 Jul 2024 21:45:16 +0000 (23:45 +0200)
Reported by Sergey Kaplun. #1226 #1054

src/lj_parse.c

index afdbcc3d5f3cdac2ef3e65abeff81567658a8f1a..cb200663ce4bbb0a66bc60b1fec4df8fc2234601 100644 (file)
@@ -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);