diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-09-01 13:55:08 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-09-01 13:55:08 -0300 |
commit | f59b241315049c73e2b755bf5fb238bff323c3d3 (patch) | |
tree | 25e74b3b8fbe20a0bc7ada4898bffbf5fa5ac41f | |
parent | 8efe9f23faecbb0892a453c6fb503747c7dbb004 (diff) | |
download | lua-f59b241315049c73e2b755bf5fb238bff323c3d3.tar.gz lua-f59b241315049c73e2b755bf5fb238bff323c3d3.tar.bz2 lua-f59b241315049c73e2b755bf5fb238bff323c3d3.zip |
Bug: Ephemeron table can wrongly collect entry with strong key
-rw-r--r-- | lgc.c | 4 |
1 files changed, 2 insertions, 2 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lgc.c,v 2.140.1.1 2013/04/12 18:48:47 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 2.140.1.2 2013/04/26 18:22:05 roberto Exp roberto $ |
3 | ** Garbage Collector | 3 | ** Garbage Collector |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -403,7 +403,7 @@ static int traverseephemeron (global_State *g, Table *h) { | |||
403 | reallymarkobject(g, gcvalue(gval(n))); /* mark it now */ | 403 | reallymarkobject(g, gcvalue(gval(n))); /* mark it now */ |
404 | } | 404 | } |
405 | } | 405 | } |
406 | if (prop) | 406 | if (g->gcstate != GCSatomic || prop) |
407 | linktable(h, &g->ephemeron); /* have to propagate again */ | 407 | linktable(h, &g->ephemeron); /* have to propagate again */ |
408 | else if (hasclears) /* does table have white keys? */ | 408 | else if (hasclears) /* does table have white keys? */ |
409 | linktable(h, &g->allweak); /* may have to clean white keys */ | 409 | linktable(h, &g->allweak); /* may have to clean white keys */ |