diff options
author | Mike Pall <mike> | 2024-02-04 16:47:14 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2024-02-04 16:47:14 +0100 |
commit | 0d313b243194a0b8d2399d8b549ca5a0ff234db5 (patch) | |
tree | e483bc17d481f168e47da7042d46b7a66a1cf79c /src/lj_err.c | |
parent | 9cc2e42b17148036d7d9ef36ab7afe52df345163 (diff) | |
parent | defe61a56751a0db5f00ff3ab7b8f45436ba74c8 (diff) | |
download | luajit-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.c | 23 |
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. */ | ||
909 | void 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. */ | ||
900 | LJ_NOINLINE void LJ_FASTCALL lj_err_trace(lua_State *L, int errcode) | 917 | LJ_NOINLINE void LJ_FASTCALL lj_err_trace(lua_State *L, int errcode) |
901 | { | 918 | { |
902 | if (errcode == LUA_ERRRUN) | 919 | if (errcode == LUA_ERRRUN) |