From 7ed18f3300c537600eceaa6b954a867aef91cb81 Mon Sep 17 00:00:00 2001 From: Aleksandar Pokopec Date: Mon, 11 Jul 2011 15:17:45 +0000 Subject: Fixes #4398. Review by extempore. --- src/library/scala/collection/immutable/HashSet.scala | 16 ++++++++++------ test/files/run/t4398.scala | 11 +++++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 test/files/run/t4398.scala diff --git a/src/library/scala/collection/immutable/HashSet.scala b/src/library/scala/collection/immutable/HashSet.scala index c4b0c65d99..579edc66cc 100644 --- a/src/library/scala/collection/immutable/HashSet.scala +++ b/src/library/scala/collection/immutable/HashSet.scala @@ -200,13 +200,16 @@ object HashSet extends ImmutableSetFactory[HashSet] { val mask = (1 << index) val offset = Integer.bitCount(bitmap & (mask-1)) if ((bitmap & mask) != 0) { - val elemsNew = new Array[HashSet[A]](elems.length) - Array.copy(elems, 0, elemsNew, 0, elems.length) - val sub = elems(offset) // TODO: might be worth checking if sub is HashTrieSet (-> monomorphic call site) + val sub = elems(offset) val subNew = sub.updated0(key, hash, level + 5) - elemsNew(offset) = subNew - new HashTrieSet(bitmap, elemsNew, size + (subNew.size - sub.size)) + if (sub eq subNew) this + else { + val elemsNew = new Array[HashSet[A]](elems.length) + Array.copy(elems, 0, elemsNew, 0, elems.length) + elemsNew(offset) = subNew + new HashTrieSet(bitmap, elemsNew, size + (subNew.size - sub.size)) + } } else { val elemsNew = new Array[HashSet[A]](elems.length + 1) Array.copy(elems, 0, elemsNew, 0, offset) @@ -225,7 +228,8 @@ object HashSet extends ImmutableSetFactory[HashSet] { val sub = elems(offset) // TODO: might be worth checking if sub is HashTrieMap (-> monomorphic call site) val subNew = sub.removed0(key, hash, level + 5) - if (subNew.isEmpty) { + if (sub eq subNew) this + else if (subNew.isEmpty) { val bitmapNew = bitmap ^ mask if (bitmapNew != 0) { val elemsNew = new Array[HashSet[A]](elems.length - 1) diff --git a/test/files/run/t4398.scala b/test/files/run/t4398.scala new file mode 100644 index 0000000000..1d57eb688d --- /dev/null +++ b/test/files/run/t4398.scala @@ -0,0 +1,11 @@ + + +object Test { + def main(args: Array[String]) { + val x = 1 to 10 toSet + val y = x + 5 + val z = y - 154321 + assert(x eq y) + assert(x eq z) + } +} -- cgit v1.2.3