mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-12 17:24:09 +00:00
Rechain pseudo-resurrected string keys with colliding hashes.
This commit is contained in:
parent
bbd1584d5f
commit
7d5a3cb5d4
12
src/lj_tab.c
12
src/lj_tab.c
@ -439,6 +439,18 @@ TValue *lj_tab_newkey(lua_State *L, GCtab *t, cTValue *key)
|
|||||||
freenode->next = n->next;
|
freenode->next = n->next;
|
||||||
setmref(n->next, NULL);
|
setmref(n->next, NULL);
|
||||||
setnilV(&n->val);
|
setnilV(&n->val);
|
||||||
|
/* Rechain pseudo-resurrected string keys with colliding hashes. */
|
||||||
|
while (nextnode(freenode)) {
|
||||||
|
Node *nn = nextnode(freenode);
|
||||||
|
if (tvisstr(&nn->key) && !tvisnil(&nn->val) &&
|
||||||
|
hashstr(t, strV(&nn->key)) == n) {
|
||||||
|
freenode->next = nn->next;
|
||||||
|
nn->next = n->next;
|
||||||
|
setmref(n->next, nn);
|
||||||
|
} else {
|
||||||
|
freenode = nn;
|
||||||
|
}
|
||||||
|
}
|
||||||
} else { /* Otherwise use free node. */
|
} else { /* Otherwise use free node. */
|
||||||
setmrefr(freenode->next, n->next); /* Insert into chain. */
|
setmrefr(freenode->next, n->next); /* Insert into chain. */
|
||||||
setmref(n->next, freenode);
|
setmref(n->next, freenode);
|
||||||
|
Loading…
Reference in New Issue
Block a user