diff options
Diffstat (limited to 'src/lj_state.c')
-rw-r--r-- | src/lj_state.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/lj_state.c b/src/lj_state.c index 486e66e3..f11467fe 100644 --- a/src/lj_state.c +++ b/src/lj_state.c | |||
@@ -91,7 +91,7 @@ void lj_state_shrinkstack(lua_State *L, MSize used) | |||
91 | if (4*used < L->stacksize && | 91 | if (4*used < L->stacksize && |
92 | 2*(LJ_STACK_START+LJ_STACK_EXTRA) < L->stacksize && | 92 | 2*(LJ_STACK_START+LJ_STACK_EXTRA) < L->stacksize && |
93 | /* Don't shrink stack of live trace. */ | 93 | /* Don't shrink stack of live trace. */ |
94 | (tvref(G(L)->jit_base) == NULL || obj2gco(L) != gcref(G(L)->jit_L))) | 94 | (tvref(G(L)->jit_base) == NULL || obj2gco(L) != gcref(G(L)->cur_L))) |
95 | resizestack(L, L->stacksize >> 1); | 95 | resizestack(L, L->stacksize >> 1); |
96 | } | 96 | } |
97 | 97 | ||
@@ -237,6 +237,7 @@ LUA_API void lua_close(lua_State *L) | |||
237 | { | 237 | { |
238 | global_State *g = G(L); | 238 | global_State *g = G(L); |
239 | int i; | 239 | int i; |
240 | setgcrefnull(g->cur_L); | ||
240 | L = mainthread(g); /* Only the main thread can be closed. */ | 241 | L = mainthread(g); /* Only the main thread can be closed. */ |
241 | lj_func_closeuv(L, tvref(L->stack)); | 242 | lj_func_closeuv(L, tvref(L->stack)); |
242 | lj_gc_separateudata(g, 1); /* Separate udata which have GC metamethods. */ | 243 | lj_gc_separateudata(g, 1); /* Separate udata which have GC metamethods. */ |
@@ -248,8 +249,8 @@ LUA_API void lua_close(lua_State *L) | |||
248 | for (i = 0;;) { | 249 | for (i = 0;;) { |
249 | hook_enter(g); | 250 | hook_enter(g); |
250 | L->status = 0; | 251 | L->status = 0; |
251 | L->cframe = NULL; | ||
252 | L->base = L->top = tvref(L->stack) + 1; | 252 | L->base = L->top = tvref(L->stack) + 1; |
253 | L->cframe = NULL; | ||
253 | if (lj_vm_cpcall(L, NULL, NULL, cpfinalize) == 0) { | 254 | if (lj_vm_cpcall(L, NULL, NULL, cpfinalize) == 0) { |
254 | if (++i >= 10) break; | 255 | if (++i >= 10) break; |
255 | lj_gc_separateudata(g, 1); /* Separate udata again. */ | 256 | lj_gc_separateudata(g, 1); /* Separate udata again. */ |
@@ -281,6 +282,8 @@ lua_State *lj_state_new(lua_State *L) | |||
281 | void LJ_FASTCALL lj_state_free(global_State *g, lua_State *L) | 282 | void LJ_FASTCALL lj_state_free(global_State *g, lua_State *L) |
282 | { | 283 | { |
283 | lua_assert(L != mainthread(g)); | 284 | lua_assert(L != mainthread(g)); |
285 | if (obj2gco(L) == gcref(g->cur_L)) | ||
286 | setgcrefnull(g->cur_L); | ||
284 | lj_func_closeuv(L, tvref(L->stack)); | 287 | lj_func_closeuv(L, tvref(L->stack)); |
285 | lua_assert(gcref(L->openupval) == NULL); | 288 | lua_assert(gcref(L->openupval) == NULL); |
286 | lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue); | 289 | lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue); |