Browse Source

FFI: Fix frame traversal for backtraces with FFI callbacks.

Mike Pall 11 years ago
parent
commit
5e7b9bb8ed
2 changed files with 4 additions and 2 deletions
  1. 1 1
      src/Makefile.dep
  2. 3 1
      src/lj_debug.c

+ 1 - 1
src/Makefile.dep

@@ -90,7 +90,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_ccallback.h
  lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_ctype.h lj_ccallback.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_jit.h lj_ir.h
+ lj_bc.h lj_vm.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_func.h lj_str.h lj_tab.h lj_meta.h lj_debug.h \
  lj_err.h lj_errmsg.h lj_func.h lj_str.h lj_tab.h lj_meta.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_state.h lj_frame.h lj_bc.h lj_ff.h lj_ffdef.h lj_jit.h lj_ir.h \

+ 3 - 1
src/lj_debug.c

@@ -14,6 +14,7 @@
 #include "lj_state.h"
 #include "lj_state.h"
 #include "lj_frame.h"
 #include "lj_frame.h"
 #include "lj_bc.h"
 #include "lj_bc.h"
+#include "lj_vm.h"
 #if LJ_HASJIT
 #if LJ_HASJIT
 #include "lj_jit.h"
 #include "lj_jit.h"
 #endif
 #endif
@@ -86,7 +87,8 @@ static BCPos debug_framepc(lua_State *L, GCfunc *fn, cTValue *nextframe)
 	if (frame_islua(f)) {
 	if (frame_islua(f)) {
 	  f = frame_prevl(f);
 	  f = frame_prevl(f);
 	} else {
 	} else {
-	  if (frame_isc(f))
+	  if (frame_isc(f) || (LJ_HASFFI && frame_iscont(f) &&
+			       (f-1)->u32.lo == LJ_CONT_FFI_CALLBACK))
 	    cf = cframe_raw(cframe_prev(cf));
 	    cf = cframe_raw(cframe_prev(cf));
 	  f = frame_prevd(f);
 	  f = frame_prevd(f);
 	}
 	}