Przeglądaj źródła

Rechain pseudo-resurrected string keys with colliding hashes.

Mike Pall 15 lat temu
rodzic
commit
7d5a3cb5d4
1 zmienionych plików z 12 dodań i 0 usunięć
  1. 12 0
      src/lj_tab.c

+ 12 - 0
src/lj_tab.c

@@ -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);