Pass MULTRES or negated error code in RD to lj_vm_exit_interp.

Fixes overwrite of saved r12 after trace exit.
This commit is contained in:
Mike Pall
2010-03-23 18:31:17 +01:00
parent 097db7317b
commit 6038866f7d
6 changed files with 1867 additions and 1884 deletions

View File

@@ -671,7 +671,7 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr)
exd.exptr = exptr;
errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp);
if (errcode)
return errcode;
return -errcode; /* Return negated error code. */
lj_vmevent_send(L, TEXIT,
ExitState *ex = (ExitState *)exptr;
@@ -694,8 +694,7 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr)
pc = exd.pc;
trace_hotside(J, pc);
cf = cframe_raw(L->cframe);
switch (bc_op(*pc)) {
case BC_JLOOP: {
if (bc_op(*pc) == BC_JLOOP) {
BCIns *retpc = &J->trace[bc_d(*pc)]->startins;
if (bc_isret(bc_op(*retpc))) {
if (J->state == LJ_TRACE_RECORD) {
@@ -706,22 +705,19 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr)
pc = retpc;
}
}
break;
}
case BC_CALLM: case BC_CALLMT:
cframe_multres(cf) = (BCReg)(L->top - L->base) - bc_a(*pc) - bc_c(*pc);
break;
case BC_RETM:
cframe_multres(cf) = (BCReg)(L->top - L->base) + 1 - bc_a(*pc) - bc_d(*pc);
break;
case BC_TSETM:
cframe_multres(cf) = (BCReg)(L->top - L->base) + 1 - bc_a(*pc);
break;
default:
break;
}
setcframe_pc(cf, pc);
return 0;
/* Return MULTRES or 0. */
switch (bc_op(*pc)) {
case BC_CALLM: case BC_CALLMT:
return (int)((BCReg)(L->top - L->base) - bc_a(*pc) - bc_c(*pc));
case BC_RETM:
return (int)((BCReg)(L->top - L->base) + 1 - bc_a(*pc) - bc_d(*pc));
case BC_TSETM:
return (int)((BCReg)(L->top - L->base) + 1 - bc_a(*pc));
default:
return 0;
}
}
#endif