aboutsummaryrefslogtreecommitdiff
path: root/src/lj_state.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_state.c')
-rw-r--r--src/lj_state.c7
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)
281void LJ_FASTCALL lj_state_free(global_State *g, lua_State *L) 282void 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);