diff options
Diffstat (limited to 'lgc.c')
-rw-r--r-- | lgc.c | 15 |
1 files changed, 9 insertions, 6 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lgc.c,v 2.252 2018/02/26 13:35:03 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 2.253 2018/03/16 14:22:09 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 | */ |
@@ -398,7 +398,7 @@ static void traverseweakvalue (global_State *g, Table *h) { | |||
398 | Node *n, *limit = gnodelast(h); | 398 | Node *n, *limit = gnodelast(h); |
399 | /* if there is array part, assume it may have white values (it is not | 399 | /* if there is array part, assume it may have white values (it is not |
400 | worth traversing it now just to check) */ | 400 | worth traversing it now just to check) */ |
401 | int hasclears = (h->sizearray > 0); | 401 | int hasclears = (h->alimit > 0); |
402 | for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */ | 402 | for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */ |
403 | if (isempty(gval(n))) /* entry is empty? */ | 403 | if (isempty(gval(n))) /* entry is empty? */ |
404 | clearkey(n); /* clear its key */ | 404 | clearkey(n); /* clear its key */ |
@@ -433,8 +433,9 @@ static int traverseephemeron (global_State *g, Table *h) { | |||
433 | int hasww = 0; /* true if table has entry "white-key -> white-value" */ | 433 | int hasww = 0; /* true if table has entry "white-key -> white-value" */ |
434 | Node *n, *limit = gnodelast(h); | 434 | Node *n, *limit = gnodelast(h); |
435 | unsigned int i; | 435 | unsigned int i; |
436 | unsigned int asize = luaH_realasize(h); | ||
436 | /* traverse array part */ | 437 | /* traverse array part */ |
437 | for (i = 0; i < h->sizearray; i++) { | 438 | for (i = 0; i < asize; i++) { |
438 | if (valiswhite(&h->array[i])) { | 439 | if (valiswhite(&h->array[i])) { |
439 | marked = 1; | 440 | marked = 1; |
440 | reallymarkobject(g, gcvalue(&h->array[i])); | 441 | reallymarkobject(g, gcvalue(&h->array[i])); |
@@ -472,7 +473,8 @@ static int traverseephemeron (global_State *g, Table *h) { | |||
472 | static void traversestrongtable (global_State *g, Table *h) { | 473 | static void traversestrongtable (global_State *g, Table *h) { |
473 | Node *n, *limit = gnodelast(h); | 474 | Node *n, *limit = gnodelast(h); |
474 | unsigned int i; | 475 | unsigned int i; |
475 | for (i = 0; i < h->sizearray; i++) /* traverse array part */ | 476 | unsigned int asize = luaH_realasize(h); |
477 | for (i = 0; i < asize; i++) /* traverse array part */ | ||
476 | markvalue(g, &h->array[i]); | 478 | markvalue(g, &h->array[i]); |
477 | for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */ | 479 | for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */ |
478 | if (isempty(gval(n))) /* entry is empty? */ | 480 | if (isempty(gval(n))) /* entry is empty? */ |
@@ -508,7 +510,7 @@ static lu_mem traversetable (global_State *g, Table *h) { | |||
508 | } | 510 | } |
509 | else /* not weak */ | 511 | else /* not weak */ |
510 | traversestrongtable(g, h); | 512 | traversestrongtable(g, h); |
511 | return 1 + h->sizearray + 2 * allocsizenode(h); | 513 | return 1 + h->alimit + 2 * allocsizenode(h); |
512 | } | 514 | } |
513 | 515 | ||
514 | 516 | ||
@@ -719,7 +721,8 @@ static void clearbyvalues (global_State *g, GCObject *l, GCObject *f) { | |||
719 | Table *h = gco2t(l); | 721 | Table *h = gco2t(l); |
720 | Node *n, *limit = gnodelast(h); | 722 | Node *n, *limit = gnodelast(h); |
721 | unsigned int i; | 723 | unsigned int i; |
722 | for (i = 0; i < h->sizearray; i++) { | 724 | unsigned int asize = luaH_realasize(h); |
725 | for (i = 0; i < asize; i++) { | ||
723 | TValue *o = &h->array[i]; | 726 | TValue *o = &h->array[i]; |
724 | if (iscleared(g, gcvalueN(o))) /* value was collected? */ | 727 | if (iscleared(g, gcvalueN(o))) /* value was collected? */ |
725 | setempty(o); /* remove entry */ | 728 | setempty(o); /* remove entry */ |