Skip to content

Commit

Permalink
Merge branch 'master' into v2.1
Browse files Browse the repository at this point in the history
  • Loading branch information
Mike Pall committed May 20, 2016
2 parents d4f3b11 + 37e1e70 commit 475a6ae
Show file tree
Hide file tree
Showing 6 changed files with 8 additions and 12 deletions.
6 changes: 0 additions & 6 deletions doc/status.html
Original file line number Diff line number Diff line change
Expand Up @@ -91,12 +91,6 @@ <h2>Current Status</h2>
in LuaJIT (no per-coroutine hooks, no tail call counting).
</li>
<li>
Some checks are missing in the JIT-compiled code for obscure situations
with <b>open upvalues aliasing</b> one of the SSA slots later on (or
vice versa). Bonus points, if you can find a real world test case for
this.
</li>
<li>
Currently some <b>out-of-memory</b> errors from <b>on-trace code</b> are not
handled correctly. The error may fall through an on-trace
<tt>pcall</tt> or it may be passed on to the function set with
Expand Down
1 change: 0 additions & 1 deletion src/lj_asm_arm.h
Original file line number Diff line number Diff line change
Expand Up @@ -909,7 +909,6 @@ static void asm_hrefk(ASMState *as, IRIns *ir)

static void asm_uref(ASMState *as, IRIns *ir)
{
/* NYI: Check that UREFO is still open and not aliasing a slot. */
Reg dest = ra_dest(as, ir, RSET_GPR);
if (irref_isk(ir->op1)) {
GCfunc *fn = ir_kfunc(IR(ir->op1));
Expand Down
1 change: 0 additions & 1 deletion src/lj_asm_mips.h
Original file line number Diff line number Diff line change
Expand Up @@ -810,7 +810,6 @@ static void asm_hrefk(ASMState *as, IRIns *ir)

static void asm_uref(ASMState *as, IRIns *ir)
{
/* NYI: Check that UREFO is still open and not aliasing a slot. */
Reg dest = ra_dest(as, ir, RSET_GPR);
if (irref_isk(ir->op1)) {
GCfunc *fn = ir_kfunc(IR(ir->op1));
Expand Down
1 change: 0 additions & 1 deletion src/lj_asm_ppc.h
Original file line number Diff line number Diff line change
Expand Up @@ -717,7 +717,6 @@ static void asm_hrefk(ASMState *as, IRIns *ir)

static void asm_uref(ASMState *as, IRIns *ir)
{
/* NYI: Check that UREFO is still open and not aliasing a slot. */
Reg dest = ra_dest(as, ir, RSET_GPR);
if (irref_isk(ir->op1)) {
GCfunc *fn = ir_kfunc(IR(ir->op1));
Expand Down
1 change: 0 additions & 1 deletion src/lj_asm_x86.h
Original file line number Diff line number Diff line change
Expand Up @@ -1157,7 +1157,6 @@ static void asm_hrefk(ASMState *as, IRIns *ir)

static void asm_uref(ASMState *as, IRIns *ir)
{
/* NYI: Check that UREFO is still open and not aliasing a slot. */
Reg dest = ra_dest(as, ir, RSET_GPR);
if (irref_isk(ir->op1)) {
GCfunc *fn = ir_kfunc(IR(ir->op1));
Expand Down
10 changes: 8 additions & 2 deletions src/lj_record.c
Original file line number Diff line number Diff line change
Expand Up @@ -1541,13 +1541,17 @@ static TRef rec_upvalue(jit_State *J, uint32_t uv, TRef val)
/* Note: this effectively limits LJ_MAX_UPVAL to 127. */
uv = (uv << 8) | (hashrot(uvp->dhash, uvp->dhash + HASH_BIAS) & 0xff);
if (!uvp->closed) {
uref = tref_ref(emitir(IRTG(IR_UREFO, IRT_P32), fn, uv));
/* In current stack? */
if (uvval(uvp) >= tvref(J->L->stack) &&
uvval(uvp) < tvref(J->L->maxstack)) {
int32_t slot = (int32_t)(uvval(uvp) - (J->L->base - J->baseslot));
if (slot >= 0) { /* Aliases an SSA slot? */
emitir(IRTG(IR_EQ, IRT_P32),
REF_BASE,
emitir(IRT(IR_ADD, IRT_P32), uref,
lj_ir_kint(J, (slot - 1 - LJ_FR2) * -8)));
slot -= (int32_t)J->baseslot; /* Note: slot number may be negative! */
/* NYI: add IR to guard that it's still aliasing the same slot. */
if (val == 0) {
return getslot(J, slot);
} else {
Expand All @@ -1557,7 +1561,9 @@ static TRef rec_upvalue(jit_State *J, uint32_t uv, TRef val)
}
}
}
uref = tref_ref(emitir(IRTG(IR_UREFO, IRT_P32), fn, uv));
emitir(IRTG(IR_UGT, IRT_P32),
emitir(IRT(IR_SUB, IRT_P32), uref, REF_BASE),
lj_ir_kint(J, (J->baseslot + J->maxslot) * 8));
} else {
needbarrier = 1;
uref = tref_ref(emitir(IRTG(IR_UREFC, IRT_P32), fn, uv));
Expand Down

0 comments on commit 475a6ae

Please sign in to comment.