diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2020-08-13 14:31:27 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2020-08-13 14:31:27 -0300 |
| commit | f7ce7e5faae69fcab0126d8bfd34b685f1dcb019 (patch) | |
| tree | 1e2aa3f512d224c58f8cc639f93582d3659bae1a /lgc.c | |
| parent | 65141832d29824ebfbf26e8af9e6e4b8549518d4 (diff) | |
| download | lua-f7ce7e5faae69fcab0126d8bfd34b685f1dcb019.tar.gz lua-f7ce7e5faae69fcab0126d8bfd34b685f1dcb019.tar.bz2 lua-f7ce7e5faae69fcab0126d8bfd34b685f1dcb019.zip | |
TOUCHED2 objects are not always black
This commit fixes a bug introduced in commit 9cf3299fa. TOUCHED2
objects are always black while the mutator runs, but they can become
temporarily gray inside a minor collection (e.g., if the object is a
weak table).
Diffstat (limited to 'lgc.c')
| -rw-r--r-- | lgc.c | 10 |
1 files changed, 2 insertions, 8 deletions
| @@ -1146,15 +1146,9 @@ static GCObject **correctgraylist (GCObject **p) { | |||
| 1146 | } | 1146 | } |
| 1147 | else { /* everything else is removed */ | 1147 | else { /* everything else is removed */ |
| 1148 | lua_assert(isold(curr)); /* young objects should be white here */ | 1148 | lua_assert(isold(curr)); /* young objects should be white here */ |
| 1149 | if (getage(curr) == G_TOUCHED2) { /* advance from TOUCHED2... */ | 1149 | if (getage(curr) == G_TOUCHED2) /* advance from TOUCHED2... */ |
| 1150 | changeage(curr, G_TOUCHED2, G_OLD); /* ... to OLD */ | 1150 | changeage(curr, G_TOUCHED2, G_OLD); /* ... to OLD */ |
| 1151 | lua_assert(isblack(curr)); /* TOUCHED2 objects are always black */ | 1151 | gray2black(curr); /* make object black (to be removed) */ |
| 1152 | } | ||
| 1153 | else { | ||
| 1154 | /* everything else in a gray list should be gray */ | ||
| 1155 | lua_assert(isgray(curr)); | ||
| 1156 | gray2black(curr); /* make object black (to be removed) */ | ||
| 1157 | } | ||
| 1158 | goto remove; | 1152 | goto remove; |
| 1159 | } | 1153 | } |
| 1160 | remove: *p = *next; continue; | 1154 | remove: *p = *next; continue; |
