diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lj_state.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/lj_state.c b/src/lj_state.c index 275dde44..2164b900 100644 --- a/src/lj_state.c +++ b/src/lj_state.c | |||
| @@ -94,9 +94,18 @@ void lj_state_shrinkstack(lua_State *L, MSize used) | |||
| 94 | /* Try to grow stack. */ | 94 | /* Try to grow stack. */ |
| 95 | void LJ_FASTCALL lj_state_growstack(lua_State *L, MSize need) | 95 | void LJ_FASTCALL lj_state_growstack(lua_State *L, MSize need) |
| 96 | { | 96 | { |
| 97 | if (L->stacksize > LJ_STACK_MAXEX) /* overflow while handling overflow? */ | 97 | MSize n; |
| 98 | if (L->stacksize > LJ_STACK_MAXEX) /* Overflow while handling overflow? */ | ||
| 98 | lj_err_throw(L, LUA_ERRERR); | 99 | lj_err_throw(L, LUA_ERRERR); |
| 99 | resizestack(L, L->stacksize + (need > L->stacksize ? need : L->stacksize)); | 100 | n = L->stacksize + need; |
| 101 | if (n > LJ_STACK_MAX) { | ||
| 102 | n += 2*LUA_MINSTACK; | ||
| 103 | } else if (n < 2*L->stacksize) { | ||
| 104 | n = 2*L->stacksize; | ||
| 105 | if (n >= LJ_STACK_MAX) | ||
| 106 | n = LJ_STACK_MAX; | ||
| 107 | } | ||
| 108 | resizestack(L, n); | ||
| 100 | if (L->stacksize > LJ_STACK_MAXEX) | 109 | if (L->stacksize > LJ_STACK_MAXEX) |
| 101 | lj_err_msg(L, LJ_ERR_STKOV); | 110 | lj_err_msg(L, LJ_ERR_STKOV); |
| 102 | } | 111 | } |
