summaryrefslogtreecommitdiff
path: root/src/lj_record.c
diff options
context:
space:
mode:
authorMike Pall <mike>2011-11-20 17:59:41 +0100
committerMike Pall <mike>2011-11-20 17:59:41 +0100
commitcc7a12be93660677a5128124c11c68127cfe33eb (patch)
tree8cf364b49db9a107c26908226561a4c99529decd /src/lj_record.c
parentf8a4769fb2bd398d526dfe0bdd6814875a2fa39e (diff)
downloadluajit-cc7a12be93660677a5128124c11c68127cfe33eb.tar.gz
luajit-cc7a12be93660677a5128124c11c68127cfe33eb.tar.bz2
luajit-cc7a12be93660677a5128124c11c68127cfe33eb.zip
Count frames with same prototype in call unroll limit check.
Diffstat (limited to 'src/lj_record.c')
-rw-r--r--src/lj_record.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/lj_record.c b/src/lj_record.c
index c8502d5d..61e09b6d 100644
--- a/src/lj_record.c
+++ b/src/lj_record.c
@@ -1297,12 +1297,16 @@ static TRef rec_upvalue(jit_State *J, uint32_t uv, TRef val)
1297/* Check unroll limits for calls. */ 1297/* Check unroll limits for calls. */
1298static void check_call_unroll(jit_State *J, TraceNo lnk) 1298static void check_call_unroll(jit_State *J, TraceNo lnk)
1299{ 1299{
1300 IRRef fref = tref_ref(J->base[-1]); 1300 cTValue *frame = J->L->base - 1;
1301 void *pc = mref(frame_func(frame)->l.pc, void);
1302 int32_t depth = J->framedepth;
1301 int32_t count = 0; 1303 int32_t count = 0;
1302 BCReg s; 1304 if ((J->pt->flags & PROTO_VARARG)) depth--; /* Vararg frame still missing. */
1303 for (s = J->baseslot - 1; s > 0; s--) 1305 for (; depth > 0; depth--) { /* Count frames with same prototype. */
1304 if ((J->slot[s] & TREF_FRAME) && tref_ref(J->slot[s]) == fref) 1306 frame = frame_prev(frame);
1307 if (mref(frame_func(frame)->l.pc, void) == pc)
1305 count++; 1308 count++;
1309 }
1306 if (J->pc == J->startpc) { 1310 if (J->pc == J->startpc) {
1307 if (count + J->tailcalled > J->param[JIT_P_recunroll]) { 1311 if (count + J->tailcalled > J->param[JIT_P_recunroll]) {
1308 J->pc++; 1312 J->pc++;