diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-11-08 15:45:31 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-11-08 15:45:31 -0200 |
| commit | 2fb7d94bd606715d0163cab7b4546f8a4d1f3426 (patch) | |
| tree | 44d3830b92678ab692cdb7a14f3ef0252d158b9d | |
| parent | c23f7053495934bc7fbce7328af1e7f03f248de1 (diff) | |
| download | lua-2fb7d94bd606715d0163cab7b4546f8a4d1f3426.tar.gz lua-2fb7d94bd606715d0163cab7b4546f8a4d1f3426.tar.bz2 lua-2fb7d94bd606715d0163cab7b4546f8a4d1f3426.zip | |
bug: Call to macro 'luai_userstateclose' should be done only
after the calls to __gc methods.
| -rw-r--r-- | lstate.c | 11 |
1 files changed, 6 insertions, 5 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lstate.c,v 2.99 2012/10/02 17:40:53 roberto Exp $ | 2 | ** $Id: lstate.c,v 2.99.1.1 2013/04/12 18:48:47 roberto Exp roberto $ |
| 3 | ** Global State | 3 | ** Global State |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -192,6 +192,8 @@ static void f_luaopen (lua_State *L, void *ud) { | |||
| 192 | g->memerrmsg = luaS_newliteral(L, MEMERRMSG); | 192 | g->memerrmsg = luaS_newliteral(L, MEMERRMSG); |
| 193 | luaS_fix(g->memerrmsg); /* it should never be collected */ | 193 | luaS_fix(g->memerrmsg); /* it should never be collected */ |
| 194 | g->gcrunning = 1; /* allow gc */ | 194 | g->gcrunning = 1; /* allow gc */ |
| 195 | g->version = lua_version(NULL); | ||
| 196 | luai_userstateopen(L); | ||
| 195 | } | 197 | } |
| 196 | 198 | ||
| 197 | 199 | ||
| @@ -222,6 +224,8 @@ static void close_state (lua_State *L) { | |||
| 222 | global_State *g = G(L); | 224 | global_State *g = G(L); |
| 223 | luaF_close(L, L->stack); /* close all upvalues for this thread */ | 225 | luaF_close(L, L->stack); /* close all upvalues for this thread */ |
| 224 | luaC_freeallobjects(L); /* collect all objects */ | 226 | luaC_freeallobjects(L); /* collect all objects */ |
| 227 | if (g->version) /* closing a fully built state? */ | ||
| 228 | luai_userstateclose(L); | ||
| 225 | luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size); | 229 | luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size); |
| 226 | luaZ_freebuffer(L, &g->buff); | 230 | luaZ_freebuffer(L, &g->buff); |
| 227 | freestack(L); | 231 | freestack(L); |
| @@ -287,7 +291,7 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { | |||
| 287 | setnilvalue(&g->l_registry); | 291 | setnilvalue(&g->l_registry); |
| 288 | luaZ_initbuffer(L, &g->buff); | 292 | luaZ_initbuffer(L, &g->buff); |
| 289 | g->panic = NULL; | 293 | g->panic = NULL; |
| 290 | g->version = lua_version(NULL); | 294 | g->version = NULL; |
| 291 | g->gcstate = GCSpause; | 295 | g->gcstate = GCSpause; |
| 292 | g->allgc = NULL; | 296 | g->allgc = NULL; |
| 293 | g->finobj = NULL; | 297 | g->finobj = NULL; |
| @@ -306,8 +310,6 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { | |||
| 306 | close_state(L); | 310 | close_state(L); |
| 307 | L = NULL; | 311 | L = NULL; |
| 308 | } | 312 | } |
| 309 | else | ||
| 310 | luai_userstateopen(L); | ||
| 311 | return L; | 313 | return L; |
| 312 | } | 314 | } |
| 313 | 315 | ||
| @@ -315,7 +317,6 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { | |||
| 315 | LUA_API void lua_close (lua_State *L) { | 317 | LUA_API void lua_close (lua_State *L) { |
| 316 | L = G(L)->mainthread; /* only the main thread can be closed */ | 318 | L = G(L)->mainthread; /* only the main thread can be closed */ |
| 317 | lua_lock(L); | 319 | lua_lock(L); |
| 318 | luai_userstateclose(L); | ||
| 319 | close_state(L); | 320 | close_state(L); |
| 320 | } | 321 | } |
| 321 | 322 | ||
