diff options
author | Mike Pall <mike> | 2011-11-14 14:15:57 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2011-11-14 14:18:25 +0100 |
commit | 71d00a56dbab6c29c0346093dbe530d7b7608be4 (patch) | |
tree | 5e28e19b4d2f20168d5ee0e4fe500b1e2b233c1c /src/lj_err.c | |
parent | e9eb4fdb4a08baaa2d9190187a6c38d5b3f8b091 (diff) | |
download | luajit2-71d00a56dbab6c29c0346093dbe530d7b7608be4.tar.gz |
FFI: Add callback support (for x86/x64).
Diffstat (limited to 'src/lj_err.c')
-rw-r--r-- | src/lj_err.c | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/src/lj_err.c b/src/lj_err.c index 406c833d..b0f3e5c7 100644 --- a/src/lj_err.c +++ b/src/lj_err.c @@ -113,6 +113,9 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode) frame = frame_prevl(frame); break; case FRAME_C: /* C frame. */ +#if LJ_HASFFI + unwind_c: +#endif #if LJ_UNWIND_EXT if (errcode) { L->cframe = cframe_prev(cf); @@ -145,6 +148,10 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode) } return cf; case FRAME_CONT: /* Continuation frame. */ +#if LJ_HASFFI + if ((frame-1)->u32.lo == LJ_CONT_FFI_CALLBACK) + goto unwind_c; +#endif case FRAME_VARG: /* Vararg frame. */ frame = frame_prevd(frame); break; @@ -464,6 +471,10 @@ static ptrdiff_t finderrfunc(lua_State *L) cf = cframe_prev(cf); /* fallthrough */ case FRAME_CONT: +#if LJ_HASFFI + if ((frame-1)->u32.lo == LJ_CONT_FFI_CALLBACK) + cf = cframe_prev(cf); +#endif case FRAME_VARG: frame = frame_prevd(frame); break; @@ -591,15 +602,23 @@ LJ_NOINLINE void lj_err_callermsg(lua_State *L, const char *msg) if (frame_islua(frame)) { pframe = frame_prevl(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; - } + if ((frame-1)->u32.lo == LJ_CONT_FFI_CALLBACK) { + pframe = frame; + frame = NULL; + } else +#endif + { + 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 + } } lj_debug_addloc(L, msg, pframe, frame); lj_err_run(L); |