diff options
author | Mike Pall <mike> | 2010-01-29 15:07:40 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2010-01-29 15:07:40 +0100 |
commit | 96e8a56260cd3bd76bc824e43d824140a303a159 (patch) | |
tree | b4b0cb49e2bfe19b9c7b937351bcb7dd0009bb21 /src | |
parent | 8681b7330f9ec97c46d1475ce16e0a2c202936e3 (diff) | |
download | luajit-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.c | 3 |
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) | |||
368 | static void rec_loop_interp(jit_State *J, const BCIns *pc, LoopEvent ev) | 368 | static 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. */ |