diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2010-04-29 18:43:36 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2010-04-29 18:43:36 -0300 |
commit | 23001d860789860ef53fc86f1a2a4af63c44e03f (patch) | |
tree | 4f9dda4def7e173355fd019edcbb28097910fe7a /lfunc.c | |
parent | 5d79c6684b185888319d46837394a0fbcfde921f (diff) | |
download | lua-23001d860789860ef53fc86f1a2a4af63c44e03f.tar.gz lua-23001d860789860ef53fc86f1a2a4af63c44e03f.tar.bz2 lua-23001d860789860ef53fc86f1a2a4af63c44e03f.zip |
nasty GC bug: upvalue must be turned white when not keeping invariant,
but barrier was not being called when uv->v were already white.
Diffstat (limited to '')
-rw-r--r-- | lfunc.c | 8 |
1 files changed, 2 insertions, 6 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lfunc.c,v 2.21 2010/03/26 20:58:11 roberto Exp roberto $ | 2 | ** $Id: lfunc.c,v 2.22 2010/04/29 17:34:35 roberto Exp roberto $ |
3 | ** Auxiliary functions to manipulate prototypes and closures | 3 | ** Auxiliary functions to manipulate prototypes and closures |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -101,11 +101,7 @@ void luaF_close (lua_State *L, StkId level) { | |||
101 | uv->v = &uv->u.value; /* now current value lives here */ | 101 | uv->v = &uv->u.value; /* now current value lives here */ |
102 | gch(o)->next = g->allgc; /* link upvalue into 'allgc' list */ | 102 | gch(o)->next = g->allgc; /* link upvalue into 'allgc' list */ |
103 | g->allgc = o; | 103 | g->allgc = o; |
104 | lua_assert(!isblack(o)); /* open upvalues are never black */ | 104 | luaC_checkupvalcolor(g, uv); |
105 | if (isgray(o)) { /* is it marked? */ | ||
106 | gray2black(o); /* could not be black; now it can */ | ||
107 | luaC_barrier(L, uv, uv->v); | ||
108 | } | ||
109 | } | 105 | } |
110 | } | 106 | } |
111 | } | 107 | } |