aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-01-29 15:07:40 +0100
committerMike Pall <mike>2010-01-29 15:07:40 +0100
commit96e8a56260cd3bd76bc824e43d824140a303a159 (patch)
treeb4b0cb49e2bfe19b9c7b937351bcb7dd0009bb21 /src
parent8681b7330f9ec97c46d1475ce16e0a2c202936e3 (diff)
downloadluajit-96e8a56260cd3bd76bc824e43d824140a303a159.tar.gz
luajit-96e8a56260cd3bd76bc824e43d824140a303a159.tar.bz2
luajit-96e8a56260cd3bd76bc824e43d824140a303a159.zip
Loop formation test must check for return to lower frame.
Diffstat (limited to 'src')
-rw-r--r--src/lj_record.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/lj_record.c b/src/lj_record.c
index 03fcb966..cded81e0 100644
--- a/src/lj_record.c
+++ b/src/lj_record.c
@@ -368,7 +368,8 @@ static int innerloopleft(jit_State *J, const BCIns *pc)
368static void rec_loop_interp(jit_State *J, const BCIns *pc, LoopEvent ev) 368static void rec_loop_interp(jit_State *J, const BCIns *pc, LoopEvent ev)
369{ 369{
370 if (J->parent == 0) { 370 if (J->parent == 0) {
371 if (pc == J->startpc && J->framedepth == 0) { /* Same loop? */ 371 if (pc == J->startpc && J->framedepth == 0 && !J->chain[IR_RETF]) {
372 /* Same loop? */
372 if (ev == LOOPEV_LEAVE) /* Must loop back to form a root trace. */ 373 if (ev == LOOPEV_LEAVE) /* Must loop back to form a root trace. */
373 lj_trace_err(J, LJ_TRERR_LLEAVE); 374 lj_trace_err(J, LJ_TRERR_LLEAVE);
374 rec_stop(J, J->curtrace); /* Root trace forms a loop. */ 375 rec_stop(J, J->curtrace); /* Root trace forms a loop. */