aboutsummaryrefslogtreecommitdiff
path: root/src/lj_err.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lj_err.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/lj_err.c b/src/lj_err.c
index a824ee66..5be938e4 100644
--- a/src/lj_err.c
+++ b/src/lj_err.c
@@ -106,7 +106,7 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode)
106 return cf; 106 return cf;
107 } 107 }
108 } 108 }
109 if (frame <= tvref(L->stack)) 109 if (frame <= tvref(L->stack)+LJ_FR2)
110 break; 110 break;
111 switch (frame_typep(frame)) { 111 switch (frame_typep(frame)) {
112 case FRAME_LUA: /* Lua frame. */ 112 case FRAME_LUA: /* Lua frame. */
@@ -171,7 +171,7 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode)
171 } 171 }
172 /* No C frame. */ 172 /* No C frame. */
173 if (errcode) { 173 if (errcode) {
174 L->base = tvref(L->stack)+1; 174 L->base = tvref(L->stack)+1+LJ_FR2;
175 L->cframe = NULL; 175 L->cframe = NULL;
176 unwindstack(L, L->base); 176 unwindstack(L, L->base);
177 if (G(L)->panic) 177 if (G(L)->panic)
@@ -494,7 +494,7 @@ LJ_NOINLINE void lj_err_mem(lua_State *L)
494/* Find error function for runtime errors. Requires an extra stack traversal. */ 494/* Find error function for runtime errors. Requires an extra stack traversal. */
495static ptrdiff_t finderrfunc(lua_State *L) 495static ptrdiff_t finderrfunc(lua_State *L)
496{ 496{
497 cTValue *frame = L->base-1, *bot = tvref(L->stack); 497 cTValue *frame = L->base-1, *bot = tvref(L->stack)+LJ_FR2;
498 void *cf = L->cframe; 498 void *cf = L->cframe;
499 while (frame > bot && cf) { 499 while (frame > bot && cf) {
500 while (cframe_nres(cframe_raw(cf)) < 0) { /* cframe without frame? */ 500 while (cframe_nres(cframe_raw(cf)) < 0) { /* cframe without frame? */
@@ -530,8 +530,8 @@ static ptrdiff_t finderrfunc(lua_State *L)
530 break; 530 break;
531 case FRAME_PCALL: 531 case FRAME_PCALL:
532 case FRAME_PCALLH: 532 case FRAME_PCALLH:
533 if (frame_ftsz(frame) >= (ptrdiff_t)(2*sizeof(TValue))) /* xpcall? */ 533 if (frame_func(frame_prevd(frame))->c.ffid == FF_xpcall)
534 return savestack(L, frame-1); /* Point to xpcall's errorfunc. */ 534 return savestack(L, frame_prevd(frame)+1); /* xpcall's errorfunc. */
535 return 0; 535 return 0;
536 default: 536 default:
537 lua_assert(0); 537 lua_assert(0);
@@ -554,8 +554,9 @@ LJ_NOINLINE void lj_err_run(lua_State *L)
554 lj_err_throw(L, LUA_ERRERR); 554 lj_err_throw(L, LUA_ERRERR);
555 } 555 }
556 L->status = LUA_ERRERR; 556 L->status = LUA_ERRERR;
557 copyTV(L, top, top-1); 557 copyTV(L, top+LJ_FR2, top-1);
558 copyTV(L, top-1, errfunc); 558 copyTV(L, top-1, errfunc);
559 if (LJ_FR2) setnilV(top++);
559 L->top = top+1; 560 L->top = top+1;
560 lj_vm_call(L, top, 1+1); /* Stack: |errfunc|msg| -> |msg| */ 561 lj_vm_call(L, top, 1+1); /* Stack: |errfunc|msg| -> |msg| */
561 } 562 }
@@ -630,6 +631,7 @@ LJ_NOINLINE void lj_err_optype_call(lua_State *L, TValue *o)
630 const BCIns *pc = cframe_Lpc(L); 631 const BCIns *pc = cframe_Lpc(L);
631 if (((ptrdiff_t)pc & FRAME_TYPE) != FRAME_LUA) { 632 if (((ptrdiff_t)pc & FRAME_TYPE) != FRAME_LUA) {
632 const char *tname = lj_typename(o); 633 const char *tname = lj_typename(o);
634 if (LJ_FR2) o++;
633 setframe_pc(o, pc); 635 setframe_pc(o, pc);
634 setframe_gc(o, obj2gco(L), LJ_TTHREAD); 636 setframe_gc(o, obj2gco(L), LJ_TTHREAD);
635 L->top = L->base = o+1; 637 L->top = L->base = o+1;