Clear frame gaps in recorder to avoid resurrecting previous refs.

This commit is contained in:
Mike Pall 2010-02-18 02:45:03 +01:00
parent 4a7ee2cb66
commit 00ad80c9e4

View File

@ -600,7 +600,7 @@ static BCReg rec_mm_prep(jit_State *J, ASMFunction cont)
#endif #endif
J->base[top] = trcont | TREF_CONT; J->base[top] = trcont | TREF_CONT;
for (s = J->maxslot; s < top; s++) for (s = J->maxslot; s < top; s++)
J->base[s] = TREF_NIL; J->base[s] = 0; /* Clear frame gap to avoid resurrecting previous refs. */
return top+1; return top+1;
} }
@ -1982,7 +1982,11 @@ void lj_record_ins(jit_State *J)
/* -- Constant and move ops --------------------------------------------- */ /* -- Constant and move ops --------------------------------------------- */
case BC_KSTR: case BC_KNUM: case BC_KPRI: case BC_MOV: case BC_MOV:
/* Clear gap of method call to avoid resurrecting previous refs. */
if (ra > J->maxslot) J->base[ra-1] = 0;
break;
case BC_KSTR: case BC_KNUM: case BC_KPRI:
break; break;
case BC_KSHORT: case BC_KSHORT:
rc = lj_ir_kint(J, (int32_t)(int16_t)rc); rc = lj_ir_kint(J, (int32_t)(int16_t)rc);