diff options
-rw-r--r-- | ldo.c | 13 |
1 files changed, 8 insertions, 5 deletions
@@ -221,14 +221,17 @@ static int stackinuse (lua_State *L) { | |||
221 | void luaD_shrinkstack (lua_State *L) { | 221 | void luaD_shrinkstack (lua_State *L) { |
222 | int inuse = stackinuse(L); | 222 | int inuse = stackinuse(L); |
223 | int goodsize = inuse + (inuse / 8) + 2*EXTRA_STACK; | 223 | int goodsize = inuse + (inuse / 8) + 2*EXTRA_STACK; |
224 | if (goodsize > LUAI_MAXSTACK) goodsize = LUAI_MAXSTACK; | 224 | if (goodsize > LUAI_MAXSTACK) |
225 | if (L->stacksize > LUAI_MAXSTACK) /* was handling stack overflow? */ | 225 | goodsize = LUAI_MAXSTACK; /* respect stack limit */ |
226 | if (L->stacksize > LUAI_MAXSTACK) /* had been handling stack overflow? */ | ||
226 | luaE_freeCI(L); /* free all CIs (list grew because of an error) */ | 227 | luaE_freeCI(L); /* free all CIs (list grew because of an error) */ |
227 | else | 228 | else |
228 | luaE_shrinkCI(L); /* shrink list */ | 229 | luaE_shrinkCI(L); /* shrink list */ |
229 | if (inuse <= LUAI_MAXSTACK && /* not handling stack overflow? */ | 230 | /* if thread is currently not handling a stack overflow and its |
230 | goodsize < L->stacksize) /* trying to shrink? */ | 231 | good size is smaller than current size, shrink its stack */ |
231 | luaD_reallocstack(L, goodsize); /* shrink it */ | 232 | if (inuse <= (LUAI_MAXSTACK - EXTRA_STACK) && |
233 | goodsize < L->stacksize) | ||
234 | luaD_reallocstack(L, goodsize); | ||
232 | else | 235 | else |
233 | condmovestack(L,,); /* don't change stack (change only for debugging) */ | 236 | condmovestack(L,,); /* don't change stack (change only for debugging) */ |
234 | } | 237 | } |