]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Rechain pseudo-resurrected string keys with colliding hashes.
authorMike Pall <mike>
Sun, 4 Jul 2010 21:07:21 +0000 (23:07 +0200)
committerMike Pall <mike>
Sun, 4 Jul 2010 21:07:21 +0000 (23:07 +0200)
src/lj_tab.c

index 5d68cc54dd431838c83f2354cf6b52e9610a5e69..006a87ffd52c08b5508004a1e101c94af9af7cba 100644 (file)
@@ -439,6 +439,18 @@ TValue *lj_tab_newkey(lua_State *L, GCtab *t, cTValue *key)
       freenode->next = n->next;
       setmref(n->next, NULL);
       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. */
       setmrefr(freenode->next, n->next);  /* Insert into chain. */
       setmref(n->next, freenode);