Skip to content

Commit 31597ce

Browse files
committed
Check targetNode.ownerBy in mutableRemove to know if newNode can have a single element
1 parent 363df27 commit 31597ce

File tree

1 file changed

+5
-3
lines changed
  • core/commonMain/src/implementations/immutableSet

1 file changed

+5
-3
lines changed

core/commonMain/src/implementations/immutableSet/TrieNode.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,6 @@ internal class TrieNode<E>(
139139

140140
/** The given [newNode] must not be a part of any persistent set instance. */
141141
private fun mutableUpdateNodeAtIndex(nodeIndex: Int, newNode: TrieNode<E>, owner: MutabilityOwnership): TrieNode<E> {
142-
// assert(buffer[nodeIndex] !== newNode)
143-
144142
val cell: Any?
145143

146144
val newNodeBuffer = newNode.buffer
@@ -832,7 +830,11 @@ internal class TrieNode<E>(
832830
} else {
833831
targetNode.mutableRemove(elementHash, element, shift + LOG_MAX_BRANCHING_FACTOR, mutator)
834832
}
835-
if (ownedBy === mutator.ownership || targetNode !== newNode) {
833+
// If newNode is a single-element node, it is newly created, or targetNode is owned by mutator and a cell was removed in-place.
834+
// Otherwise the single element would have been lifted up.
835+
// If targetNode is owned by mutator, this node is also owned by mutator. Thus no new node will be created to replace this node.
836+
// If newNode !== targetNode, it is newly created.
837+
if (targetNode.ownedBy === mutator.ownership || targetNode !== newNode) {
836838
return mutableUpdateNodeAtIndex(cellIndex, newNode, mutator.ownership)
837839
}
838840
return this

0 commit comments

Comments
 (0)