aboutsummaryrefslogtreecommitdiff
path: root/src/lj_err.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lj_err.c35
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 */