summaryrefslogtreecommitdiff
path: root/src/lj_err.c
diff options
context:
space:
mode:
authorMike Pall <mike>2011-02-16 00:38:23 +0100
committerMike Pall <mike>2011-02-16 00:38:23 +0100
commit5fe7282d4ca548e604acb89e88ab0196a98c4065 (patch)
tree98cb493939c0eb717270db41134bc2940a9ec862 /src/lj_err.c
parent4dca589af02ee20edfd797ca041ab8d2daf4caed (diff)
downloadluajit2-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.c16
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);
}