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 | } |
