diff options
Diffstat (limited to '')
-rw-r--r-- | src/lj_err.c | 14 |
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. */ |
495 | static ptrdiff_t finderrfunc(lua_State *L) | 495 | static 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; |