eris: weak tables fixed (garbage collector updates sequence data)

This commit is contained in:
2021-07-09 15:03:06 -04:00
parent dba5bccfa0
commit 311575eb30
3 changed files with 30 additions and 20 deletions

View File

@@ -656,7 +656,10 @@ const TValue *luaH_get (Table *t, const TValue *key) {
}
}
static void addsequence(Table *t, ANode *anode) {
/* Change an entry to non-nil. */
/* This means the entry must be added to the sequence */
void luaH_setnonnil(Table *t, ANode *anode, const TValue *value) {
assert(ttisnil(&anode->i_val));
assert(anode->i_sequence == -1);
int index = anodeindex(t, anode);
int totalanodes = t->sizearray + truesizenode(t);
@@ -664,9 +667,15 @@ static void addsequence(Table *t, ANode *anode) {
anode->i_sequence = t->nnkeys++;
assert((anode->i_sequence >= 0) && (anode->i_sequence < totalanodes));
t->sequence[anode->i_sequence] = index;
t->lastdeleted = NULL;
t->lastdelseq = -1;
setobj2t(L, &anode->i_val, value);
}
static void delsequence(Table *t, ANode *anode) {
/* Change an entry to nil. */
/* This means the entry must be removed from the sequence */
void luaH_setnil(Table *t, ANode *anode) {
assert(!ttisnil(&anode->i_val));
assert((anode->i_sequence >= 0) && (anode->i_sequence < t->nnkeys));
/* remove the last item from the sequence, and get a pointer to its anode */
int totalanodes = t->sizearray + truesizenode(t);
@@ -679,11 +688,9 @@ static void delsequence(Table *t, ANode *anode) {
t->sequence[freeslot] = lastanodeindex;
t->nnkeys -= 1;
lastanode->i_sequence = freeslot;
/* set the last deleted variables */
t->lastdeleted = anode;
t->lastdelseq = anode->i_sequence;
/* clear out the anode */
anode->i_sequence = -1;
setnilvalue(&anode->i_val);
}
/*
@@ -691,14 +698,13 @@ static void delsequence(Table *t, ANode *anode) {
** barrier and invalidate the TM cache.
*/
void luaH_setupdate (lua_State *L, Table *t, const TValue *key, TValue *value, const TValue *getres) {
t->lastdeleted = NULL;
t->lastdelseq = -1;
if (!ttisnil(getres)) {
if (ttisnil(value)) {
/* replacing a non-nil value with nil */
TValue *cell = cast(TValue *, getres);
delsequence(t, cast(ANode *, cell));
setobj2t(L, cell, value);
ANode *anode = cast(ANode *, getres);
t->lastdeleted = anode;
t->lastdelseq = anode->i_sequence;
luaH_setnil(t, anode);
checksequence(t);
} else {
/* replacing a non-nil value with a different non-nil value */
@@ -709,16 +715,17 @@ void luaH_setupdate (lua_State *L, Table *t, const TValue *key, TValue *value, c
} else if (getres == luaO_nilobject) {
if (!ttisnil(value)) {
/* creating a new key with a non-nil value */
TValue *cell = luaH_newkey(L, t, key);
addsequence(t, cast(ANode *, cell));
setobj2t(L, cell, value);
t->lastdeleted = NULL;
t->lastdelseq = -1;
ANode *anode = cast(ANode *, luaH_newkey(L, t, key));
luaH_setnonnil(t, anode, value);
checksequence(t);
}
} else if (!ttisnil(value)) {
/* replacing a nil value with a non-nil value */
TValue *cell = cast(TValue *, getres);
addsequence(t, cast(ANode *, cell));
setobj2t(L, cell, value);
t->lastdeleted = NULL;
t->lastdelseq = -1;
luaH_setnonnil(t, cast(ANode *, getres), value);
checksequence(t);
}
}