diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2023-11-07 17:26:15 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2023-11-07 17:26:15 -0300 |
commit | 37c215b43f27a1c41e8a920987e1c3bd7b34330d (patch) | |
tree | f14f4417384cffb9d2e5ef3c09621555a5d1e9a2 /lgc.c | |
parent | 9e99f3071d07767f9e882c4abf3537f75ce2d161 (diff) | |
parent | fa075b79530af1cbc977349f2e467d69ce01202c (diff) | |
download | lua-37c215b43f27a1c41e8a920987e1c3bd7b34330d.tar.gz lua-37c215b43f27a1c41e8a920987e1c3bd7b34330d.tar.bz2 lua-37c215b43f27a1c41e8a920987e1c3bd7b34330d.zip |
Merge branch 'newarray' into nextversion
Diffstat (limited to 'lgc.c')
-rw-r--r-- | lgc.c | 25 |
1 files changed, 18 insertions, 7 deletions
@@ -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? */ |