aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2018-02-27 23:18:32 +0100
committerMike Pall <mike>2018-02-27 23:18:32 +0100
commit66c1614828d0041baece3ab2002763f2a2fd83b3 (patch)
tree7ba4d6aa73003054366077e645c6ae542e2821b6
parentfddef924097f28c46a0a5b45483a6086b33cab81 (diff)
parent046129dbdda5261c1b17469a2895a113d14c070a (diff)
downloadluajit-66c1614828d0041baece3ab2002763f2a2fd83b3.tar.gz
luajit-66c1614828d0041baece3ab2002763f2a2fd83b3.tar.bz2
luajit-66c1614828d0041baece3ab2002763f2a2fd83b3.zip
Merge branch 'master' into v2.1
-rw-r--r--src/lj_tab.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/lj_tab.c b/src/lj_tab.c
index 47c0cfd3..c51666d3 100644
--- a/src/lj_tab.c
+++ b/src/lj_tab.c
@@ -491,6 +491,29 @@ TValue *lj_tab_newkey(lua_State *L, GCtab *t, cTValue *key)
491 freenode->next = nn->next; 491 freenode->next = nn->next;
492 nn->next = n->next; 492 nn->next = n->next;
493 setmref(n->next, nn); 493 setmref(n->next, nn);
494 /*
495 ** Rechaining a resurrected string key creates a new dilemma:
496 ** Another string key may have originally been resurrected via
497 ** _any_ of the previous nodes as a chain anchor. Including
498 ** a node that had to be moved, which makes them unreachable.
499 ** It's not feasible to check for all previous nodes, so rechain
500 ** any string key that's currently in a non-main positions.
501 */
502 while ((nn = nextnode(freenode))) {
503 if (tvisstr(&nn->key) && !tvisnil(&nn->val)) {
504 Node *mn = hashstr(t, strV(&nn->key));
505 if (mn != freenode) {
506 freenode->next = nn->next;
507 nn->next = mn->next;
508 setmref(mn->next, nn);
509 } else {
510 freenode = nn;
511 }
512 } else {
513 freenode = nn;
514 }
515 }
516 break;
494 } else { 517 } else {
495 freenode = nn; 518 freenode = nn;
496 } 519 }