aboutsummaryrefslogtreecommitdiff
path: root/src/lj_err.c
diff options
context:
space:
mode:
authorMike Pall <mike>2024-02-04 16:47:14 +0100
committerMike Pall <mike>2024-02-04 16:47:14 +0100
commit0d313b243194a0b8d2399d8b549ca5a0ff234db5 (patch)
treee483bc17d481f168e47da7042d46b7a66a1cf79c /src/lj_err.c
parent9cc2e42b17148036d7d9ef36ab7afe52df345163 (diff)
parentdefe61a56751a0db5f00ff3ab7b8f45436ba74c8 (diff)
downloadluajit-0d313b243194a0b8d2399d8b549ca5a0ff234db5.tar.gz
luajit-0d313b243194a0b8d2399d8b549ca5a0ff234db5.tar.bz2
luajit-0d313b243194a0b8d2399d8b549ca5a0ff234db5.zip
Merge branch 'master' into v2.1
Diffstat (limited to 'src/lj_err.c')
-rw-r--r--src/lj_err.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/lj_err.c b/src/lj_err.c
index 7b11e4d0..414ef477 100644
--- a/src/lj_err.c
+++ b/src/lj_err.c
@@ -818,7 +818,14 @@ LJ_NOINLINE void lj_err_mem(lua_State *L)
818 TValue *base = tvref(G(L)->jit_base); 818 TValue *base = tvref(G(L)->jit_base);
819 if (base) L->base = base; 819 if (base) L->base = base;
820 } 820 }
821 if (curr_funcisL(L)) L->top = curr_topL(L); 821 if (curr_funcisL(L)) {
822 L->top = curr_topL(L);
823 if (LJ_UNLIKELY(L->top > tvref(L->maxstack))) {
824 /* The current Lua frame violates the stack. Replace it with a dummy. */
825 L->top = L->base;
826 setframe_gc(L->base - 1 - LJ_FR2, obj2gco(L), LJ_TTHREAD);
827 }
828 }
822 setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRMEM)); 829 setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRMEM));
823 lj_err_throw(L, LUA_ERRMEM); 830 lj_err_throw(L, LUA_ERRMEM);
824} 831}
@@ -879,9 +886,11 @@ LJ_NOINLINE void LJ_FASTCALL lj_err_run(lua_State *L)
879{ 886{
880 ptrdiff_t ef = (LJ_HASJIT && tvref(G(L)->jit_base)) ? 0 : finderrfunc(L); 887 ptrdiff_t ef = (LJ_HASJIT && tvref(G(L)->jit_base)) ? 0 : finderrfunc(L);
881 if (ef) { 888 if (ef) {
882 TValue *errfunc = restorestack(L, ef); 889 TValue *errfunc, *top;
883 TValue *top = L->top; 890 lj_state_checkstack(L, LUA_MINSTACK * 2); /* Might raise new error. */
884 lj_trace_abort(G(L)); 891 lj_trace_abort(G(L));
892 errfunc = restorestack(L, ef);
893 top = L->top;
885 if (!tvisfunc(errfunc) || L->status == LUA_ERRERR) { 894 if (!tvisfunc(errfunc) || L->status == LUA_ERRERR) {
886 setstrV(L, top-1, lj_err_str(L, LJ_ERR_ERRERR)); 895 setstrV(L, top-1, lj_err_str(L, LJ_ERR_ERRERR));
887 lj_err_throw(L, LUA_ERRERR); 896 lj_err_throw(L, LUA_ERRERR);
@@ -896,7 +905,15 @@ LJ_NOINLINE void LJ_FASTCALL lj_err_run(lua_State *L)
896 lj_err_throw(L, LUA_ERRRUN); 905 lj_err_throw(L, LUA_ERRRUN);
897} 906}
898 907
908/* Stack overflow error. */
909void LJ_FASTCALL lj_err_stkov(lua_State *L)
910{
911 lj_debug_addloc(L, err2msg(LJ_ERR_STKOV), L->base-1, NULL);
912 lj_err_run(L);
913}
914
899#if LJ_HASJIT 915#if LJ_HASJIT
916/* Rethrow error after doing a trace exit. */
900LJ_NOINLINE void LJ_FASTCALL lj_err_trace(lua_State *L, int errcode) 917LJ_NOINLINE void LJ_FASTCALL lj_err_trace(lua_State *L, int errcode)
901{ 918{
902 if (errcode == LUA_ERRRUN) 919 if (errcode == LUA_ERRRUN)