aboutsummaryrefslogtreecommitdiff
path: root/src/lj_err.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_err.c')
-rw-r--r--src/lj_err.c33
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)
113 frame = frame_prevl(frame); 113 frame = frame_prevl(frame);
114 break; 114 break;
115 case FRAME_C: /* C frame. */ 115 case FRAME_C: /* C frame. */
116#if LJ_HASFFI
117 unwind_c:
118#endif
116#if LJ_UNWIND_EXT 119#if LJ_UNWIND_EXT
117 if (errcode) { 120 if (errcode) {
118 L->cframe = cframe_prev(cf); 121 L->cframe = cframe_prev(cf);
@@ -145,6 +148,10 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode)
145 } 148 }
146 return cf; 149 return cf;
147 case FRAME_CONT: /* Continuation frame. */ 150 case FRAME_CONT: /* Continuation frame. */
151#if LJ_HASFFI
152 if ((frame-1)->u32.lo == LJ_CONT_FFI_CALLBACK)
153 goto unwind_c;
154#endif
148 case FRAME_VARG: /* Vararg frame. */ 155 case FRAME_VARG: /* Vararg frame. */
149 frame = frame_prevd(frame); 156 frame = frame_prevd(frame);
150 break; 157 break;
@@ -464,6 +471,10 @@ static ptrdiff_t finderrfunc(lua_State *L)
464 cf = cframe_prev(cf); 471 cf = cframe_prev(cf);
465 /* fallthrough */ 472 /* fallthrough */
466 case FRAME_CONT: 473 case FRAME_CONT:
474#if LJ_HASFFI
475 if ((frame-1)->u32.lo == LJ_CONT_FFI_CALLBACK)
476 cf = cframe_prev(cf);
477#endif
467 case FRAME_VARG: 478 case FRAME_VARG:
468 frame = frame_prevd(frame); 479 frame = frame_prevd(frame);
469 break; 480 break;
@@ -591,15 +602,23 @@ LJ_NOINLINE void lj_err_callermsg(lua_State *L, const char *msg)
591 if (frame_islua(frame)) { 602 if (frame_islua(frame)) {
592 pframe = frame_prevl(frame); 603 pframe = frame_prevl(frame);
593 } else if (frame_iscont(frame)) { 604 } else if (frame_iscont(frame)) {
594 pframe = frame_prevd(frame);
595#if LJ_HASFFI 605#if LJ_HASFFI
596 /* Remove frame for FFI metamethods. */ 606 if ((frame-1)->u32.lo == LJ_CONT_FFI_CALLBACK) {
597 if (frame_func(frame)->c.ffid >= FF_ffi_meta___index && 607 pframe = frame;
598 frame_func(frame)->c.ffid <= FF_ffi_meta___tostring) { 608 frame = NULL;
599 L->base = pframe+1; 609 } else
600 L->top = frame; 610#endif
601 } 611 {
612 pframe = frame_prevd(frame);
613#if LJ_HASFFI
614 /* Remove frame for FFI metamethods. */
615 if (frame_func(frame)->c.ffid >= FF_ffi_meta___index &&
616 frame_func(frame)->c.ffid <= FF_ffi_meta___tostring) {
617 L->base = pframe+1;
618 L->top = frame;
619 }
602#endif 620#endif
621 }
603 } 622 }
604 lj_debug_addloc(L, msg, pframe, frame); 623 lj_debug_addloc(L, msg, pframe, frame);
605 lj_err_run(L); 624 lj_err_run(L);