diff options
| -rw-r--r-- | lgc.c | 38 |
1 files changed, 16 insertions, 22 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lgc.c,v 2.191 2014/07/19 15:14:46 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 2.192 2014/07/29 16:22:24 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 | */ |
| @@ -100,9 +100,9 @@ static void reallymarkobject (global_State *g, GCObject *o); | |||
| 100 | 100 | ||
| 101 | 101 | ||
| 102 | /* | 102 | /* |
| 103 | ** link table 'h' into list pointed by 'p' | 103 | ** link collectable object 'o' into list pointed by 'p' |
| 104 | */ | 104 | */ |
| 105 | #define linktable(h,p) ((h)->gclist = *(p), *(p) = obj2gco(h)) | 105 | #define linkgclist(o,p) ((o)->gclist = (p), (p) = obj2gco(o)) |
| 106 | 106 | ||
| 107 | 107 | ||
| 108 | /* | 108 | /* |
| @@ -159,8 +159,7 @@ void luaC_barrierback_ (lua_State *L, Table *t) { | |||
| 159 | global_State *g = G(L); | 159 | global_State *g = G(L); |
| 160 | lua_assert(isblack(t) && !isdead(g, t)); | 160 | lua_assert(isblack(t) && !isdead(g, t)); |
| 161 | black2gray(t); /* make table gray (again) */ | 161 | black2gray(t); /* make table gray (again) */ |
| 162 | t->gclist = g->grayagain; | 162 | linkgclist(t, g->grayagain); |
| 163 | g->grayagain = obj2gco(t); | ||
| 164 | } | 163 | } |
| 165 | 164 | ||
| 166 | 165 | ||
| @@ -243,27 +242,23 @@ static void reallymarkobject (global_State *g, GCObject *o) { | |||
| 243 | break; | 242 | break; |
| 244 | } | 243 | } |
| 245 | case LUA_TLCL: { | 244 | case LUA_TLCL: { |
| 246 | gco2lcl(o)->gclist = g->gray; | 245 | linkgclist(gco2lcl(o), g->gray); |
| 247 | g->gray = o; | ||
| 248 | break; | 246 | break; |
| 249 | } | 247 | } |
| 250 | case LUA_TCCL: { | 248 | case LUA_TCCL: { |
| 251 | gco2ccl(o)->gclist = g->gray; | 249 | linkgclist(gco2ccl(o), g->gray); |
| 252 | g->gray = o; | ||
| 253 | break; | 250 | break; |
| 254 | } | 251 | } |
| 255 | case LUA_TTABLE: { | 252 | case LUA_TTABLE: { |
| 256 | linktable(gco2t(o), &g->gray); | 253 | linkgclist(gco2t(o), g->gray); |
| 257 | break; | 254 | break; |
| 258 | } | 255 | } |
| 259 | case LUA_TTHREAD: { | 256 | case LUA_TTHREAD: { |
| 260 | gco2th(o)->gclist = g->gray; | 257 | linkgclist(gco2th(o), g->gray); |
| 261 | g->gray = o; | ||
| 262 | break; | 258 | break; |
| 263 | } | 259 | } |
| 264 | case LUA_TPROTO: { | 260 | case LUA_TPROTO: { |
| 265 | gco2p(o)->gclist = g->gray; | 261 | linkgclist(gco2p(o), g->gray); |
| 266 | g->gray = o; | ||
| 267 | break; | 262 | break; |
| 268 | } | 263 | } |
| 269 | default: lua_assert(0); break; | 264 | default: lua_assert(0); break; |
| @@ -357,9 +352,9 @@ static void traverseweakvalue (global_State *g, Table *h) { | |||
| 357 | } | 352 | } |
| 358 | } | 353 | } |
| 359 | if (hasclears) | 354 | if (hasclears) |
| 360 | linktable(h, &g->weak); /* has to be cleared later */ | 355 | linkgclist(h, g->weak); /* has to be cleared later */ |
| 361 | else /* no white values */ | 356 | else /* no white values */ |
| 362 | linktable(h, &g->grayagain); /* no need to clean */ | 357 | linkgclist(h, g->grayagain); /* no need to clean */ |
| 363 | } | 358 | } |
| 364 | 359 | ||
| 365 | 360 | ||
| @@ -392,11 +387,11 @@ static int traverseephemeron (global_State *g, Table *h) { | |||
| 392 | } | 387 | } |
| 393 | } | 388 | } |
| 394 | if (prop) | 389 | if (prop) |
| 395 | linktable(h, &g->ephemeron); /* have to propagate again */ | 390 | linkgclist(h, g->ephemeron); /* have to propagate again */ |
| 396 | else if (hasclears) /* does table have white keys? */ | 391 | else if (hasclears) /* does table have white keys? */ |
| 397 | linktable(h, &g->allweak); /* may have to clean white keys */ | 392 | linkgclist(h, g->allweak); /* may have to clean white keys */ |
| 398 | else /* no white keys */ | 393 | else /* no white keys */ |
| 399 | linktable(h, &g->grayagain); /* no need to clean */ | 394 | linkgclist(h, g->grayagain); /* no need to clean */ |
| 400 | return marked; | 395 | return marked; |
| 401 | } | 396 | } |
| 402 | 397 | ||
| @@ -433,7 +428,7 @@ static lu_mem traversetable (global_State *g, Table *h) { | |||
| 433 | else if (!weakvalue) /* strong values? */ | 428 | else if (!weakvalue) /* strong values? */ |
| 434 | traverseephemeron(g, h); | 429 | traverseephemeron(g, h); |
| 435 | else /* all weak */ | 430 | else /* all weak */ |
| 436 | linktable(h, &g->allweak); /* nothing to traverse now */ | 431 | linkgclist(h, g->allweak); /* nothing to traverse now */ |
| 437 | } | 432 | } |
| 438 | else /* not weak */ | 433 | else /* not weak */ |
| 439 | traversestrongtable(g, h); | 434 | traversestrongtable(g, h); |
| @@ -548,8 +543,7 @@ static void propagatemark (global_State *g) { | |||
| 548 | case LUA_TTHREAD: { | 543 | case LUA_TTHREAD: { |
| 549 | lua_State *th = gco2th(o); | 544 | lua_State *th = gco2th(o); |
| 550 | g->gray = th->gclist; /* remove from 'gray' list */ | 545 | g->gray = th->gclist; /* remove from 'gray' list */ |
| 551 | th->gclist = g->grayagain; | 546 | linkgclist(th, g->grayagain); /* insert into 'grayagain' list */ |
| 552 | g->grayagain = o; /* insert into 'grayagain' list */ | ||
| 553 | black2gray(o); | 547 | black2gray(o); |
| 554 | size = traversethread(g, th); | 548 | size = traversethread(g, th); |
| 555 | break; | 549 | break; |
