aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2012-04-11 12:08:09 +0200
committerMike Pall <mike>2012-04-11 12:08:09 +0200
commite14b6346b4d4f91eb988c8a6046814a8707e04d5 (patch)
tree52557e6d1ac566666f0838099a730dbd1d3c951f /src
parentd621a6ccc2638fcfea518b7b9f8c377ce93aad8b (diff)
downloadluajit-e14b6346b4d4f91eb988c8a6046814a8707e04d5.tar.gz
luajit-e14b6346b4d4f91eb988c8a6046814a8707e04d5.tar.bz2
luajit-e14b6346b4d4f91eb988c8a6046814a8707e04d5.zip
Ensure running __gc of userdata created in __gc at state close.
Diffstat (limited to 'src')
-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)
242 G2J(g)->state = LJ_TRACE_IDLE; 242 G2J(g)->state = LJ_TRACE_IDLE;
243 lj_dispatch_update(g); 243 lj_dispatch_update(g);
244#endif 244#endif
245 do { 245 for (;;) {
246 hook_enter(g); 246 hook_enter(g);
247 L->status = 0; 247 L->status = 0;
248 L->cframe = NULL; 248 L->cframe = NULL;
249 L->base = L->top = tvref(L->stack) + 1; 249 L->base = L->top = tvref(L->stack) + 1;
250 } while (lj_vm_cpcall(L, NULL, NULL, cpfinalize) != 0); 250 if (lj_vm_cpcall(L, NULL, NULL, cpfinalize) == 0) {
251 lj_gc_separateudata(g, 1); /* Separate udata again. */
252 if (gcref(g->gc.mmudata) == NULL) /* Until nothing is left to do. */
253 break;
254 }
255 }
251 close_state(L); 256 close_state(L);
252} 257}
253 258