diff options
author | Mike Pall <mike> | 2013-09-03 15:53:21 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2013-09-03 15:53:21 +0200 |
commit | fffe75a03b16e11327040d36f2769f763d1c29c6 (patch) | |
tree | f067409a7f69fc5d9a62ee96854c9bea2973f3e2 | |
parent | a6936be814adee5d4d61e729d91b2c3dd8e16e6e (diff) | |
download | luajit2-fffe75a03b16e11327040d36f2769f763d1c29c6.tar.gz |
Fix frame traversal for backtraces.
-rw-r--r-- | src/lj_debug.c | 17 |
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); } } |