aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-07-04 23:07:21 +0200
committerMike Pall <mike>2010-07-04 23:07:21 +0200
commit7d5a3cb5d4f661a703c7e9d67682eaeb206d828b (patch)
tree481e7ea1ac5b6f02fdcd21053a2294d776eb0c7e /src
parentbbd1584d5f26e7eb674fb1721de9915e4dda489c (diff)
downloadluajit-7d5a3cb5d4f661a703c7e9d67682eaeb206d828b.tar.gz
luajit-7d5a3cb5d4f661a703c7e9d67682eaeb206d828b.tar.bz2
luajit-7d5a3cb5d4f661a703c7e9d67682eaeb206d828b.zip
Rechain pseudo-resurrected string keys with colliding hashes.
Diffstat (limited to 'src')
-rw-r--r--src/lj_tab.c12
1 files changed, 12 insertions, 0 deletions
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)
439 freenode->next = n->next; 439 freenode->next = n->next;
440 setmref(n->next, NULL); 440 setmref(n->next, NULL);
441 setnilV(&n->val); 441 setnilV(&n->val);
442 /* Rechain pseudo-resurrected string keys with colliding hashes. */
443 while (nextnode(freenode)) {
444 Node *nn = nextnode(freenode);
445 if (tvisstr(&nn->key) && !tvisnil(&nn->val) &&
446 hashstr(t, strV(&nn->key)) == n) {
447 freenode->next = nn->next;
448 nn->next = n->next;
449 setmref(n->next, nn);
450 } else {
451 freenode = nn;
452 }
453 }
442 } else { /* Otherwise use free node. */ 454 } else { /* Otherwise use free node. */
443 setmrefr(freenode->next, n->next); /* Insert into chain. */ 455 setmrefr(freenode->next, n->next); /* Insert into chain. */
444 setmref(n->next, freenode); 456 setmref(n->next, freenode);