From fffe75a03b16e11327040d36f2769f763d1c29c6 Mon Sep 17 00:00:00 2001
From: Mike Pall <mike>
Date: Tue, 3 Sep 2013 15:53:21 +0200
Subject: Fix frame traversal for backtraces.

---
 src/lj_debug.c | 17 ++++++++++++-----
 1 file 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);
     }
   }
-- 
cgit v1.2.3-55-g6feb