diff options
Diffstat (limited to 'src/lj_err.c')
-rw-r--r-- | src/lj_err.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/lj_err.c b/src/lj_err.c index 239f6e4f..12f32af2 100644 --- a/src/lj_err.c +++ b/src/lj_err.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include "lj_state.h" | 17 | #include "lj_state.h" |
18 | #include "lj_frame.h" | 18 | #include "lj_frame.h" |
19 | #include "lj_bc.h" | 19 | #include "lj_bc.h" |
20 | #include "lj_ff.h" | ||
20 | #include "lj_trace.h" | 21 | #include "lj_trace.h" |
21 | #include "lj_vm.h" | 22 | #include "lj_vm.h" |
22 | 23 | ||
@@ -903,10 +904,19 @@ LJ_NOINLINE void lj_err_callermsg(lua_State *L, const char *msg) | |||
903 | { | 904 | { |
904 | TValue *frame = L->base-1; | 905 | TValue *frame = L->base-1; |
905 | TValue *pframe = NULL; | 906 | TValue *pframe = NULL; |
906 | if (frame_islua(frame)) | 907 | if (frame_islua(frame)) { |
907 | pframe = frame_prevl(frame); | 908 | pframe = frame_prevl(frame); |
908 | else if (frame_iscont(frame)) | 909 | } else if (frame_iscont(frame)) { |
909 | L->base = (pframe = frame_prevd(frame))+1; /* Remove metamethod frame. */ | 910 | pframe = frame_prevd(frame); |
911 | #if LJ_HASFFI | ||
912 | /* Remove frame for FFI metamethods. */ | ||
913 | if (frame_func(frame)->c.ffid >= FF_ffi_meta___index && | ||
914 | frame_func(frame)->c.ffid <= FF_ffi_meta___tostring) { | ||
915 | L->base = pframe+1; | ||
916 | L->top = frame; | ||
917 | } | ||
918 | #endif | ||
919 | } | ||
910 | err_loc(L, msg, pframe, frame); | 920 | err_loc(L, msg, pframe, frame); |
911 | lj_err_run(L); | 921 | lj_err_run(L); |
912 | } | 922 | } |