diff options
author | Mike Pall <mike> | 2012-04-11 12:08:09 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2012-04-11 12:08:09 +0200 |
commit | e14b6346b4d4f91eb988c8a6046814a8707e04d5 (patch) | |
tree | 52557e6d1ac566666f0838099a730dbd1d3c951f | |
parent | d621a6ccc2638fcfea518b7b9f8c377ce93aad8b (diff) | |
download | luajit2-e14b6346b4d4f91eb988c8a6046814a8707e04d5.tar.gz |
Ensure running __gc of userdata created in __gc at state close.
-rw-r--r-- | src/lj_state.c | 9 |
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); } |