aboutsummaryrefslogtreecommitdiff
path: root/lgc.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2023-11-07 17:26:15 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2023-11-07 17:26:15 -0300
commit37c215b43f27a1c41e8a920987e1c3bd7b34330d (patch)
treef14f4417384cffb9d2e5ef3c09621555a5d1e9a2 /lgc.c
parent9e99f3071d07767f9e882c4abf3537f75ce2d161 (diff)
parentfa075b79530af1cbc977349f2e467d69ce01202c (diff)
downloadlua-37c215b43f27a1c41e8a920987e1c3bd7b34330d.tar.gz
lua-37c215b43f27a1c41e8a920987e1c3bd7b34330d.tar.bz2
lua-37c215b43f27a1c41e8a920987e1c3bd7b34330d.zip
Merge branch 'newarray' into nextversion
Diffstat (limited to 'lgc.c')
-rw-r--r--lgc.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/lgc.c b/lgc.c
index 81682454..e4f8e396 100644
--- a/lgc.c
+++ b/lgc.c
@@ -73,6 +73,13 @@
73#define gcvalueN(o) (iscollectable(o) ? gcvalue(o) : NULL) 73#define gcvalueN(o) (iscollectable(o) ? gcvalue(o) : NULL)
74 74
75 75
76/*
77** Access to collectable objects in array part of tables
78*/
79#define gcvalarr(t,i) \
80 ((*getArrTag(t,i) & BIT_ISCOLLECTABLE) ? getArrVal(t,i)->gc : NULL)
81
82
76#define markvalue(g,o) { checkliveness(g->mainthread,o); \ 83#define markvalue(g,o) { checkliveness(g->mainthread,o); \
77 if (valiswhite(o)) reallymarkobject(g,gcvalue(o)); } 84 if (valiswhite(o)) reallymarkobject(g,gcvalue(o)); }
78 85
@@ -477,9 +484,10 @@ static int traverseephemeron (global_State *g, Table *h, int inv) {
477 unsigned int nsize = sizenode(h); 484 unsigned int nsize = sizenode(h);
478 /* traverse array part */ 485 /* traverse array part */
479 for (i = 0; i < asize; i++) { 486 for (i = 0; i < asize; i++) {
480 if (valiswhite(&h->array[i])) { 487 GCObject *o = gcvalarr(h, i);
488 if (o != NULL && iswhite(o)) {
481 marked = 1; 489 marked = 1;
482 reallymarkobject(g, gcvalue(&h->array[i])); 490 reallymarkobject(g, o);
483 } 491 }
484 } 492 }
485 /* traverse hash part; if 'inv', traverse descending 493 /* traverse hash part; if 'inv', traverse descending
@@ -515,8 +523,11 @@ static void traversestrongtable (global_State *g, Table *h) {
515 Node *n, *limit = gnodelast(h); 523 Node *n, *limit = gnodelast(h);
516 unsigned int i; 524 unsigned int i;
517 unsigned int asize = luaH_realasize(h); 525 unsigned int asize = luaH_realasize(h);
518 for (i = 0; i < asize; i++) /* traverse array part */ 526 for (i = 0; i < asize; i++) { /* traverse array part */
519 markvalue(g, &h->array[i]); 527 GCObject *o = gcvalarr(h, i);
528 if (o != NULL && iswhite(o))
529 reallymarkobject(g, o);
530 }
520 for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */ 531 for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */
521 if (isempty(gval(n))) /* entry is empty? */ 532 if (isempty(gval(n))) /* entry is empty? */
522 clearkey(n); /* clear its key */ 533 clearkey(n); /* clear its key */
@@ -741,9 +752,9 @@ static l_obj clearbyvalues (global_State *g, GCObject *l, GCObject *f) {
741 unsigned int i; 752 unsigned int i;
742 unsigned int asize = luaH_realasize(h); 753 unsigned int asize = luaH_realasize(h);
743 for (i = 0; i < asize; i++) { 754 for (i = 0; i < asize; i++) {
744 TValue *o = &h->array[i]; 755 GCObject *o = gcvalarr(h, i);
745 if (iscleared(g, gcvalueN(o))) /* value was collected? */ 756 if (iscleared(g, o)) /* value was collected? */
746 setempty(o); /* remove entry */ 757 *getArrTag(h, i) = LUA_VEMPTY; /* remove entry */
747 } 758 }
748 for (n = gnode(h, 0); n < limit; n++) { 759 for (n = gnode(h, 0); n < limit; n++) {
749 if (iscleared(g, gcvalueN(gval(n)))) /* unmarked value? */ 760 if (iscleared(g, gcvalueN(gval(n)))) /* unmarked value? */