From 7d5a3cb5d4f661a703c7e9d67682eaeb206d828b Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sun, 4 Jul 2010 23:07:21 +0200 Subject: [PATCH] Rechain pseudo-resurrected string keys with colliding hashes. --- src/lj_tab.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/lj_tab.c b/src/lj_tab.c index 5d68cc54..006a87ff 100644 --- a/src/lj_tab.c +++ b/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);