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 /src | |
parent | d621a6ccc2638fcfea518b7b9f8c377ce93aad8b (diff) | |
download | luajit-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.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) | |||
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 | ||