mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-07 23:24:09 +00:00
Fixup PC in tracebacks after exits from down-recursive traces.
This commit is contained in:
parent
e5f310eefa
commit
f50075a9d7
@ -93,7 +93,7 @@ lj_ctype.o: lj_ctype.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
|
|||||||
lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_ctype.h
|
lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_ctype.h
|
||||||
lj_debug.o: lj_debug.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
|
lj_debug.o: lj_debug.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
|
||||||
lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_tab.h lj_state.h lj_frame.h \
|
lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_tab.h lj_state.h lj_frame.h \
|
||||||
lj_bc.h
|
lj_bc.h lj_jit.h lj_ir.h
|
||||||
lj_dispatch.o: lj_dispatch.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
|
lj_dispatch.o: lj_dispatch.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
|
||||||
lj_err.h lj_errmsg.h lj_debug.h lj_state.h lj_frame.h lj_bc.h lj_ff.h \
|
lj_err.h lj_errmsg.h lj_debug.h lj_state.h lj_frame.h lj_bc.h lj_ff.h \
|
||||||
lj_ffdef.h lj_jit.h lj_ir.h lj_trace.h lj_dispatch.h lj_traceerr.h \
|
lj_ffdef.h lj_jit.h lj_ir.h lj_trace.h lj_dispatch.h lj_traceerr.h \
|
||||||
|
@ -14,6 +14,9 @@
|
|||||||
#include "lj_state.h"
|
#include "lj_state.h"
|
||||||
#include "lj_frame.h"
|
#include "lj_frame.h"
|
||||||
#include "lj_bc.h"
|
#include "lj_bc.h"
|
||||||
|
#if LJ_HASJIT
|
||||||
|
#include "lj_jit.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/* -- Frames -------------------------------------------------------------- */
|
/* -- Frames -------------------------------------------------------------- */
|
||||||
|
|
||||||
@ -49,6 +52,8 @@ cTValue *lj_debug_frame(lua_State *L, int level, int *size)
|
|||||||
static BCPos debug_framepc(lua_State *L, GCfunc *fn, cTValue *nextframe)
|
static BCPos debug_framepc(lua_State *L, GCfunc *fn, cTValue *nextframe)
|
||||||
{
|
{
|
||||||
const BCIns *ins;
|
const BCIns *ins;
|
||||||
|
GCproto *pt;
|
||||||
|
BCPos pos;
|
||||||
lua_assert(fn->c.gct == ~LJ_TFUNC || fn->c.gct == ~LJ_TTHREAD);
|
lua_assert(fn->c.gct == ~LJ_TFUNC || fn->c.gct == ~LJ_TTHREAD);
|
||||||
if (!isluafunc(fn)) { /* Cannot derive a PC for non-Lua functions. */
|
if (!isluafunc(fn)) { /* Cannot derive a PC for non-Lua functions. */
|
||||||
return NO_BCPOS;
|
return NO_BCPOS;
|
||||||
@ -82,7 +87,16 @@ static BCPos debug_framepc(lua_State *L, GCfunc *fn, cTValue *nextframe)
|
|||||||
ins = cframe_pc(cf);
|
ins = cframe_pc(cf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return proto_bcpos(funcproto(fn), ins) - 1;
|
pt = funcproto(fn);
|
||||||
|
pos = proto_bcpos(pt, ins) - 1;
|
||||||
|
#if LJ_HASJIT
|
||||||
|
if (pos >= pt->sizebc) { /* Undo the effects of lj_trace_exit for JLOOP. */
|
||||||
|
GCtrace *T = (GCtrace *)((char *)(ins-1) - offsetof(GCtrace, startins));
|
||||||
|
lua_assert(bc_isret(bc_op(ins[-1])));
|
||||||
|
pos = proto_bcpos(pt, mref(T->startpc, const BCIns));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- Line numbers -------------------------------------------------------- */
|
/* -- Line numbers -------------------------------------------------------- */
|
||||||
|
Loading…
Reference in New Issue
Block a user