diff options
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) | |||
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); |