summaryrefslogtreecommitdiff
path: root/src/lj_state.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_state.c')
-rw-r--r--src/lj_state.c9
1 files changed, 7 insertions, 2 deletions
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);
}