From d4b6bb80ea3b26c4c65b568c1b808ee848f19221 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Thu, 2 Jun 2022 13:18:10 +0200 Subject: [PATCH] Fix ITERN loop detection when hook checks are enabled. Reported by Myria. --- src/lj_record.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/lj_record.c b/src/lj_record.c index 533f4995..faa9a508 100644 --- a/src/lj_record.c +++ b/src/lj_record.c @@ -664,12 +664,17 @@ static LoopEvent rec_itern(jit_State *J, BCReg ra, BCReg rb) RecordIndex ix; /* Since ITERN is recorded at the start, we need our own loop detection. */ if (J->pc == J->startpc && - (J->cur.nins > REF_FIRST+1 || - (J->cur.nins == REF_FIRST+1 && J->cur.ir[REF_FIRST].o != IR_PROF)) && J->framedepth + J->retdepth == 0 && J->parent == 0 && J->exitno == 0) { - J->instunroll = 0; /* Cannot continue unrolling across an ITERN. */ - lj_record_stop(J, LJ_TRLINK_LOOP, J->cur.traceno); /* Looping trace. */ - return LOOPEV_ENTER; + IRRef ref = REF_FIRST + LJ_HASPROFILE; +#ifdef LUAJIT_ENABLE_CHECKHOOK + ref += 3; +#endif + if (J->cur.nins > ref || + (LJ_HASPROFILE && J->cur.nins == ref && J->cur.ir[ref-1].o != IR_PROF)) { + J->instunroll = 0; /* Cannot continue unrolling across an ITERN. */ + lj_record_stop(J, LJ_TRLINK_LOOP, J->cur.traceno); /* Looping trace. */ + return LOOPEV_ENTER; + } } J->maxslot = ra; lj_snap_add(J); /* Required to make JLOOP the first ins in a side-trace. */