diff options
Diffstat (limited to '')
-rw-r--r-- | src/lj_err.c | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/src/lj_err.c b/src/lj_err.c index 42cd12b4..007d9d9f 100644 --- a/src/lj_err.c +++ b/src/lj_err.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include "lj_ff.h" | 16 | #include "lj_ff.h" |
17 | #include "lj_trace.h" | 17 | #include "lj_trace.h" |
18 | #include "lj_vm.h" | 18 | #include "lj_vm.h" |
19 | #include "lj_strfmt.h" | ||
19 | 20 | ||
20 | /* | 21 | /* |
21 | ** LuaJIT can either use internal or external frame unwinding: | 22 | ** LuaJIT can either use internal or external frame unwinding: |
@@ -98,8 +99,8 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode) | |||
98 | TValue *top = restorestack(L, -nres); | 99 | TValue *top = restorestack(L, -nres); |
99 | if (frame < top) { /* Frame reached? */ | 100 | if (frame < top) { /* Frame reached? */ |
100 | if (errcode) { | 101 | if (errcode) { |
101 | L->cframe = cframe_prev(cf); | ||
102 | L->base = frame+1; | 102 | L->base = frame+1; |
103 | L->cframe = cframe_prev(cf); | ||
103 | unwindstack(L, top); | 104 | unwindstack(L, top); |
104 | } | 105 | } |
105 | return cf; | 106 | return cf; |
@@ -118,8 +119,8 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode) | |||
118 | #endif | 119 | #endif |
119 | #if LJ_UNWIND_EXT | 120 | #if LJ_UNWIND_EXT |
120 | if (errcode) { | 121 | if (errcode) { |
121 | L->cframe = cframe_prev(cf); | ||
122 | L->base = frame_prevd(frame) + 1; | 122 | L->base = frame_prevd(frame) + 1; |
123 | L->cframe = cframe_prev(cf); | ||
123 | unwindstack(L, frame); | 124 | unwindstack(L, frame); |
124 | } else if (cf != stopcf) { | 125 | } else if (cf != stopcf) { |
125 | cf = cframe_prev(cf); | 126 | cf = cframe_prev(cf); |
@@ -143,8 +144,8 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode) | |||
143 | return cf; | 144 | return cf; |
144 | } | 145 | } |
145 | if (errcode) { | 146 | if (errcode) { |
146 | L->cframe = cframe_prev(cf); | ||
147 | L->base = frame_prevd(frame) + 1; | 147 | L->base = frame_prevd(frame) + 1; |
148 | L->cframe = cframe_prev(cf); | ||
148 | unwindstack(L, frame); | 149 | unwindstack(L, frame); |
149 | } | 150 | } |
150 | return cf; | 151 | return cf; |
@@ -165,8 +166,8 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode) | |||
165 | } | 166 | } |
166 | if (frame_typep(frame) == FRAME_PCALL) | 167 | if (frame_typep(frame) == FRAME_PCALL) |
167 | hook_leave(G(L)); | 168 | hook_leave(G(L)); |
168 | L->cframe = cf; | ||
169 | L->base = frame_prevd(frame) + 1; | 169 | L->base = frame_prevd(frame) + 1; |
170 | L->cframe = cf; | ||
170 | unwindstack(L, L->base); | 171 | unwindstack(L, L->base); |
171 | } | 172 | } |
172 | return (void *)((intptr_t)cf | CFRAME_UNWIND_FF); | 173 | return (void *)((intptr_t)cf | CFRAME_UNWIND_FF); |
@@ -174,8 +175,8 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode) | |||
174 | } | 175 | } |
175 | /* No C frame. */ | 176 | /* No C frame. */ |
176 | if (errcode) { | 177 | if (errcode) { |
177 | L->cframe = NULL; | ||
178 | L->base = tvref(L->stack)+1; | 178 | L->base = tvref(L->stack)+1; |
179 | L->cframe = NULL; | ||
179 | unwindstack(L, L->base); | 180 | unwindstack(L, L->base); |
180 | if (G(L)->panic) | 181 | if (G(L)->panic) |
181 | G(L)->panic(L); | 182 | G(L)->panic(L); |
@@ -452,7 +453,7 @@ LJ_NOINLINE void LJ_FASTCALL lj_err_throw(lua_State *L, int errcode) | |||
452 | { | 453 | { |
453 | global_State *g = G(L); | 454 | global_State *g = G(L); |
454 | lj_trace_abort(g); | 455 | lj_trace_abort(g); |
455 | setgcrefnull(g->jit_L); | 456 | setmref(g->jit_base, NULL); |
456 | L->status = 0; | 457 | L->status = 0; |
457 | #if LJ_UNWIND_EXT | 458 | #if LJ_UNWIND_EXT |
458 | err_raise_ext(errcode); | 459 | err_raise_ext(errcode); |
@@ -573,7 +574,7 @@ LJ_NORET LJ_NOINLINE static void err_msgv(lua_State *L, ErrMsg em, ...) | |||
573 | va_list argp; | 574 | va_list argp; |
574 | va_start(argp, em); | 575 | va_start(argp, em); |
575 | if (curr_funcisL(L)) L->top = curr_topL(L); | 576 | if (curr_funcisL(L)) L->top = curr_topL(L); |
576 | msg = lj_str_pushvf(L, err2msg(em), argp); | 577 | msg = lj_strfmt_pushvf(L, err2msg(em), argp); |
577 | va_end(argp); | 578 | va_end(argp); |
578 | lj_debug_addloc(L, msg, L->base-1, NULL); | 579 | lj_debug_addloc(L, msg, L->base-1, NULL); |
579 | lj_err_run(L); | 580 | lj_err_run(L); |
@@ -591,11 +592,11 @@ LJ_NOINLINE void lj_err_lex(lua_State *L, GCstr *src, const char *tok, | |||
591 | { | 592 | { |
592 | char buff[LUA_IDSIZE]; | 593 | char buff[LUA_IDSIZE]; |
593 | const char *msg; | 594 | const char *msg; |
594 | lj_debug_shortname(buff, src); | 595 | lj_debug_shortname(buff, src, line); |
595 | msg = lj_str_pushvf(L, err2msg(em), argp); | 596 | msg = lj_strfmt_pushvf(L, err2msg(em), argp); |
596 | msg = lj_str_pushf(L, "%s:%d: %s", buff, line, msg); | 597 | msg = lj_strfmt_pushf(L, "%s:%d: %s", buff, line, msg); |
597 | if (tok) | 598 | if (tok) |
598 | lj_str_pushf(L, err2msg(LJ_ERR_XNEAR), msg, tok); | 599 | lj_strfmt_pushf(L, err2msg(LJ_ERR_XNEAR), msg, tok); |
599 | lj_err_throw(L, LUA_ERRSYNTAX); | 600 | lj_err_throw(L, LUA_ERRSYNTAX); |
600 | } | 601 | } |
601 | 602 | ||
@@ -679,7 +680,7 @@ LJ_NOINLINE void lj_err_callerv(lua_State *L, ErrMsg em, ...) | |||
679 | const char *msg; | 680 | const char *msg; |
680 | va_list argp; | 681 | va_list argp; |
681 | va_start(argp, em); | 682 | va_start(argp, em); |
682 | msg = lj_str_pushvf(L, err2msg(em), argp); | 683 | msg = lj_strfmt_pushvf(L, err2msg(em), argp); |
683 | va_end(argp); | 684 | va_end(argp); |
684 | lj_err_callermsg(L, msg); | 685 | lj_err_callermsg(L, msg); |
685 | } | 686 | } |
@@ -699,9 +700,9 @@ LJ_NORET LJ_NOINLINE static void err_argmsg(lua_State *L, int narg, | |||
699 | if (narg < 0 && narg > LUA_REGISTRYINDEX) | 700 | if (narg < 0 && narg > LUA_REGISTRYINDEX) |
700 | narg = (int)(L->top - L->base) + narg + 1; | 701 | narg = (int)(L->top - L->base) + narg + 1; |
701 | if (ftype && ftype[3] == 'h' && --narg == 0) /* Check for "method". */ | 702 | if (ftype && ftype[3] == 'h' && --narg == 0) /* Check for "method". */ |
702 | msg = lj_str_pushf(L, err2msg(LJ_ERR_BADSELF), fname, msg); | 703 | msg = lj_strfmt_pushf(L, err2msg(LJ_ERR_BADSELF), fname, msg); |
703 | else | 704 | else |
704 | msg = lj_str_pushf(L, err2msg(LJ_ERR_BADARG), narg, fname, msg); | 705 | msg = lj_strfmt_pushf(L, err2msg(LJ_ERR_BADARG), narg, fname, msg); |
705 | lj_err_callermsg(L, msg); | 706 | lj_err_callermsg(L, msg); |
706 | } | 707 | } |
707 | 708 | ||
@@ -711,7 +712,7 @@ LJ_NOINLINE void lj_err_argv(lua_State *L, int narg, ErrMsg em, ...) | |||
711 | const char *msg; | 712 | const char *msg; |
712 | va_list argp; | 713 | va_list argp; |
713 | va_start(argp, em); | 714 | va_start(argp, em); |
714 | msg = lj_str_pushvf(L, err2msg(em), argp); | 715 | msg = lj_strfmt_pushvf(L, err2msg(em), argp); |
715 | va_end(argp); | 716 | va_end(argp); |
716 | err_argmsg(L, narg, msg); | 717 | err_argmsg(L, narg, msg); |
717 | } | 718 | } |
@@ -727,7 +728,7 @@ LJ_NOINLINE void lj_err_argtype(lua_State *L, int narg, const char *xname) | |||
727 | { | 728 | { |
728 | TValue *o = narg < 0 ? L->top + narg : L->base + narg-1; | 729 | TValue *o = narg < 0 ? L->top + narg : L->base + narg-1; |
729 | const char *tname = o < L->top ? lj_typename(o) : lj_obj_typename[0]; | 730 | const char *tname = o < L->top ? lj_typename(o) : lj_obj_typename[0]; |
730 | const char *msg = lj_str_pushf(L, err2msg(LJ_ERR_BADTYPE), xname, tname); | 731 | const char *msg = lj_strfmt_pushf(L, err2msg(LJ_ERR_BADTYPE), xname, tname); |
731 | err_argmsg(L, narg, msg); | 732 | err_argmsg(L, narg, msg); |
732 | } | 733 | } |
733 | 734 | ||
@@ -777,7 +778,7 @@ LUALIB_API int luaL_error(lua_State *L, const char *fmt, ...) | |||
777 | const char *msg; | 778 | const char *msg; |
778 | va_list argp; | 779 | va_list argp; |
779 | va_start(argp, fmt); | 780 | va_start(argp, fmt); |
780 | msg = lj_str_pushvf(L, fmt, argp); | 781 | msg = lj_strfmt_pushvf(L, fmt, argp); |
781 | va_end(argp); | 782 | va_end(argp); |
782 | lj_err_callermsg(L, msg); | 783 | lj_err_callermsg(L, msg); |
783 | return 0; /* unreachable */ | 784 | return 0; /* unreachable */ |