summaryrefslogtreecommitdiff
path: root/src/lj_record.c
diff options
context:
space:
mode:
authorMike Pall <mike>2010-04-25 03:32:29 +0200
committerMike Pall <mike>2010-04-25 03:32:29 +0200
commit721b73fecbbeda5b5cb76628511c5b3fac41eb4d (patch)
treece72efaa313ab16eda652e4d277413c31a8d2af3 /src/lj_record.c
parent3a32bbc7cb5c2287e8d4e24e362281c165f50976 (diff)
downloadluajit-721b73fecbbeda5b5cb76628511c5b3fac41eb4d.tar.gz
luajit-721b73fecbbeda5b5cb76628511c5b3fac41eb4d.tar.bz2
luajit-721b73fecbbeda5b5cb76628511c5b3fac41eb4d.zip
Turn traces into true GC objects (GCtrace).
Diffstat (limited to 'src/lj_record.c')
-rw-r--r--src/lj_record.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/src/lj_record.c b/src/lj_record.c
index c13c67fd..a3f5b9c0 100644
--- a/src/lj_record.c
+++ b/src/lj_record.c
@@ -265,7 +265,7 @@ static TRef find_kinit(jit_State *J, const BCIns *endpc, BCReg slot, IRType t)
265 if (op == BC_KSHORT || op == BC_KNUM) { /* Found const. initializer. */ 265 if (op == BC_KSHORT || op == BC_KNUM) { /* Found const. initializer. */
266 /* Now try to verify there's no forward jump across it. */ 266 /* Now try to verify there's no forward jump across it. */
267 const BCIns *kpc = pc; 267 const BCIns *kpc = pc;
268 for ( ; pc > startpc; pc--) 268 for (; pc > startpc; pc--)
269 if (bc_op(*pc) == BC_JMP) { 269 if (bc_op(*pc) == BC_JMP) {
270 const BCIns *target = pc+bc_j(*pc)+1; 270 const BCIns *target = pc+bc_j(*pc)+1;
271 if (target > kpc && target <= endpc) 271 if (target > kpc && target <= endpc)
@@ -2237,10 +2237,10 @@ void lj_record_ins(jit_State *J)
2237 break; 2237 break;
2238 2238
2239 case BC_JFORL: 2239 case BC_JFORL:
2240 rec_loop_jit(J, rc, rec_for(J, pc+bc_j(J->trace[rc]->startins), 1)); 2240 rec_loop_jit(J, rc, rec_for(J, pc+bc_j(traceref(J, rc)->startins), 1));
2241 break; 2241 break;
2242 case BC_JITERL: 2242 case BC_JITERL:
2243 rec_loop_jit(J, rc, rec_iterl(J, J->trace[rc]->startins)); 2243 rec_loop_jit(J, rc, rec_iterl(J, traceref(J, rc)->startins));
2244 break; 2244 break;
2245 case BC_JLOOP: 2245 case BC_JLOOP:
2246 rec_loop_jit(J, rc, rec_loop(J, ra)); 2246 rec_loop_jit(J, rc, rec_loop(J, ra));
@@ -2412,7 +2412,7 @@ static const BCIns *rec_setup_root(jit_State *J)
2412} 2412}
2413 2413
2414/* Setup recording for a side trace. */ 2414/* Setup recording for a side trace. */
2415static void rec_setup_side(jit_State *J, Trace *T) 2415static void rec_setup_side(jit_State *J, GCtrace *T)
2416{ 2416{
2417 SnapShot *snap = &T->snap[J->exitno]; 2417 SnapShot *snap = &T->snap[J->exitno];
2418 SnapEntry *map = &T->snapmap[snap->mapofs]; 2418 SnapEntry *map = &T->snapmap[snap->mapofs];
@@ -2500,10 +2500,9 @@ void lj_record_setup(jit_State *J)
2500 } 2500 }
2501 J->cur.nk = REF_TRUE; 2501 J->cur.nk = REF_TRUE;
2502 2502
2503 setgcref(J->cur.startpt, obj2gco(J->pt));
2504 J->startpc = J->pc; 2503 J->startpc = J->pc;
2505 if (J->parent) { /* Side trace. */ 2504 if (J->parent) { /* Side trace. */
2506 Trace *T = J->trace[J->parent]; 2505 GCtrace *T = traceref(J, J->parent);
2507 TraceNo root = T->root ? T->root : J->parent; 2506 TraceNo root = T->root ? T->root : J->parent;
2508 J->cur.root = (uint16_t)root; 2507 J->cur.root = (uint16_t)root;
2509 J->cur.startins = BCINS_AD(BC_JMP, 0, 0); 2508 J->cur.startins = BCINS_AD(BC_JMP, 0, 0);
@@ -2521,7 +2520,7 @@ void lj_record_setup(jit_State *J)
2521 } 2520 }
2522 rec_setup_side(J, T); 2521 rec_setup_side(J, T);
2523 sidecheck: 2522 sidecheck:
2524 if (J->trace[J->cur.root]->nchild >= J->param[JIT_P_maxside] || 2523 if (traceref(J, J->cur.root)->nchild >= J->param[JIT_P_maxside] ||
2525 T->snap[J->exitno].count >= J->param[JIT_P_hotexit] + 2524 T->snap[J->exitno].count >= J->param[JIT_P_hotexit] +
2526 J->param[JIT_P_tryside]) 2525 J->param[JIT_P_tryside])
2527 rec_stop(J, TRACE_INTERP); 2526 rec_stop(J, TRACE_INTERP);