aboutsummaryrefslogtreecommitdiff
path: root/lgc.c
diff options
context:
space:
mode:
Diffstat (limited to 'lgc.c')
-rw-r--r--lgc.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/lgc.c b/lgc.c
index 2e401cbd..b0e3c363 100644
--- a/lgc.c
+++ b/lgc.c
@@ -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) {
472static void traversestrongtable (global_State *g, Table *h) { 473static 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 */