Skip to content

Commit 48809df

Browse files
committed
RedBlackTree should not allocation if the Key and Value are the same JVM instance
1 parent 3ead93a commit 48809df

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

library/src/scala/collection/immutable/RedBlackTree.scala

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -209,18 +209,31 @@ private[collection] object RedBlackTree {
209209
RedTree(k, v, null, null)
210210
} else {
211211
val cmp = ordering.compare(k, tree.key)
212-
if (cmp < 0) balanceLeft(isBlackTree(tree), tree.key, tree.value, upd(tree.left, k, v, overwrite), tree.right)
213-
else if (cmp > 0) balanceRight(isBlackTree(tree), tree.key, tree.value, tree.left, upd(tree.right, k, v, overwrite))
214-
else if (overwrite || k != tree.key) mkTree(isBlackTree(tree), tree.key, v, tree.left, tree.right)
212+
if (cmp < 0) {
213+
val newLeft = upd(tree.left, k, v, overwrite)
214+
if (newLeft eq tree.left) tree
215+
else balanceLeft(isBlackTree(tree), tree.key, tree.value, newLeft, tree.right)
216+
} else if (cmp > 0) {
217+
val newRight = upd(tree.right, k, v, overwrite)
218+
if (newRight eq tree.right) tree
219+
else balanceRight(isBlackTree(tree), tree.key, tree.value, tree.left, newRight)
220+
} else if (overwrite && (v.asInstanceOf[AnyRef] ne tree.value.asInstanceOf[AnyRef]))
221+
mkTree(isBlackTree(tree), tree.key, v, tree.left, tree.right)
215222
else tree
216223
}
217224
private[this] def updNth[A, B, B1 >: B](tree: Tree[A, B], idx: Int, k: A, v: B1): Tree[A, B1] = if (tree eq null) {
218225
RedTree(k, v, null, null)
219226
} else {
220227
val rank = count(tree.left) + 1
221-
if (idx < rank) balanceLeft(isBlackTree(tree), tree.key, tree.value, updNth(tree.left, idx, k, v), tree.right)
222-
else if (idx > rank) balanceRight(isBlackTree(tree), tree.key, tree.value, tree.left, updNth(tree.right, idx - rank, k, v))
223-
else tree
228+
if (idx < rank) {
229+
val newLeft = updNth(tree.left, idx, k, v)
230+
if (newLeft eq tree.left) tree
231+
else balanceLeft(isBlackTree(tree), tree.key, tree.value, newLeft, tree.right)
232+
} else if (idx > rank) {
233+
val newRight = updNth(tree.right, idx - rank, k, v)
234+
if (newRight eq tree.right) tree
235+
else balanceRight(isBlackTree(tree), tree.key, tree.value, tree.left, newRight)
236+
} else tree
224237
}
225238

226239
private[this] def doFrom[A, B](tree: Tree[A, B], from: A)(implicit ordering: Ordering[A]): Tree[A, B] = {

0 commit comments

Comments
 (0)