diff options
author | Mike Pall <mike> | 2011-02-16 00:38:23 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2011-02-16 00:38:23 +0100 |
commit | 5fe7282d4ca548e604acb89e88ab0196a98c4065 (patch) | |
tree | 98cb493939c0eb717270db41134bc2940a9ec862 /src/lj_err.c | |
parent | 4dca589af02ee20edfd797ca041ab8d2daf4caed (diff) | |
download | luajit2-5fe7282d4ca548e604acb89e88ab0196a98c4065.tar.gz |
Fix error handling within metamethods. Special-case FFI mm.
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 @@ #include "lj_state.h" #include "lj_frame.h" #include "lj_bc.h" +#include "lj_ff.h" #include "lj_trace.h" #include "lj_vm.h" @@ -903,10 +904,19 @@ LJ_NOINLINE void lj_err_callermsg(lua_State *L, const char *msg) { TValue *frame = L->base-1; TValue *pframe = NULL; - if (frame_islua(frame)) + if (frame_islua(frame)) { pframe = frame_prevl(frame); - else if (frame_iscont(frame)) - L->base = (pframe = frame_prevd(frame))+1; /* Remove metamethod frame. */ + } else if (frame_iscont(frame)) { + pframe = frame_prevd(frame); +#if LJ_HASFFI + /* Remove frame for FFI metamethods. */ + if (frame_func(frame)->c.ffid >= FF_ffi_meta___index && + frame_func(frame)->c.ffid <= FF_ffi_meta___tostring) { + L->base = pframe+1; + L->top = frame; + } +#endif + } err_loc(L, msg, pframe, frame); lj_err_run(L); } |