summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2013-09-03 15:53:21 +0200
committerMike Pall <mike>2013-09-03 15:53:21 +0200
commitfffe75a03b16e11327040d36f2769f763d1c29c6 (patch)
treef067409a7f69fc5d9a62ee96854c9bea2973f3e2
parenta6936be814adee5d4d61e729d91b2c3dd8e16e6e (diff)
downloadluajit2-fffe75a03b16e11327040d36f2769f763d1c29c6.tar.gz
Fix frame traversal for backtraces.
-rw-r--r--src/lj_debug.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/lj_debug.c b/src/lj_debug.c
index be7fb2b1..09896462 100644
--- a/src/lj_debug.c
+++ b/src/lj_debug.c
@@ -71,9 +71,18 @@ static BCPos debug_framepc(lua_State *L, GCfunc *fn, cTValue *nextframe)
/* Lua function below errfunc/gc/hook: find cframe to get the PC. */
void *cf = cframe_raw(L->cframe);
TValue *f = L->base-1;
- if (cf == NULL)
- return NO_BCPOS;
- while (f > nextframe) {
+ for (;;) {
+ if (cf == NULL)
+ return NO_BCPOS;
+ while (cframe_nres(cf) < 0) {
+ if (f >= restorestack(L, -cframe_nres(cf)))
+ break;
+ cf = cframe_raw(cframe_prev(cf));
+ if (cf == NULL)
+ return NO_BCPOS;
+ }
+ if (f < nextframe)
+ break;
if (frame_islua(f)) {
f = frame_prevl(f);
} else {
@@ -82,8 +91,6 @@ static BCPos debug_framepc(lua_State *L, GCfunc *fn, cTValue *nextframe)
f = frame_prevd(f);
}
}
- if (cframe_prev(cf))
- cf = cframe_raw(cframe_prev(cf));
ins = cframe_pc(cf);
}
}