diff --git a/src/lj_state.c b/src/lj_state.c index 66c0b99f..711869a2 100644 --- a/src/lj_state.c +++ b/src/lj_state.c @@ -242,12 +242,17 @@ LUA_API void lua_close(lua_State *L) G2J(g)->state = LJ_TRACE_IDLE; lj_dispatch_update(g); #endif - do { + for (;;) { hook_enter(g); L->status = 0; L->cframe = NULL; L->base = L->top = tvref(L->stack) + 1; - } while (lj_vm_cpcall(L, NULL, NULL, cpfinalize) != 0); + if (lj_vm_cpcall(L, NULL, NULL, cpfinalize) == 0) { + lj_gc_separateudata(g, 1); /* Separate udata again. */ + if (gcref(g->gc.mmudata) == NULL) /* Until nothing is left to do. */ + break; + } + } close_state(L); }