From: Mike Pall Date: Sun, 4 Jul 2010 21:07:21 +0000 (+0200) Subject: Rechain pseudo-resurrected string keys with colliding hashes. X-Git-Tag: v2.0.0-beta5~19 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7d5a3cb5d4f661a703c7e9d67682eaeb206d828b;p=thirdparty%2FLuaJIT.git Rechain pseudo-resurrected string keys with colliding hashes. --- 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);