| 766 | } |
| 767 | |
| 768 | function mergeIntoNode(node, ownerID, shift, keyHash, entry) { |
| 769 | if (node.keyHash === keyHash) { |
| 770 | return new HashCollisionNode(ownerID, keyHash, [node.entry, entry]); |
| 771 | } |
| 772 | |
| 773 | const idx1 = (shift === 0 ? node.keyHash : node.keyHash >>> shift) & MASK; |
| 774 | const idx2 = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; |
| 775 | |
| 776 | let newNode; |
| 777 | const nodes = |
| 778 | idx1 === idx2 |
| 779 | ? [mergeIntoNode(node, ownerID, shift + SHIFT, keyHash, entry)] |
| 780 | : ((newNode = new ValueNode(ownerID, keyHash, entry)), |
| 781 | idx1 < idx2 ? [node, newNode] : [newNode, node]); |
| 782 | |
| 783 | return new BitmapIndexedNode(ownerID, (1 << idx1) | (1 << idx2), nodes); |
| 784 | } |
| 785 | |
| 786 | function createNodes(ownerID, entries, key, value) { |
| 787 | if (!ownerID) { |