diff options
author | Aleksandar Pokopec <aleksandar.prokopec@epfl.ch> | 2011-07-11 15:17:45 +0000 |
---|---|---|
committer | Aleksandar Pokopec <aleksandar.prokopec@epfl.ch> | 2011-07-11 15:17:45 +0000 |
commit | 7ed18f3300c537600eceaa6b954a867aef91cb81 (patch) | |
tree | 08c00ee5cf26f9d0f4a1dd583c2b3ac3db9ada6b | |
parent | 9f39fc01244e953290b4734ed135ff4e91d4344e (diff) | |
download | scala-7ed18f3300c537600eceaa6b954a867aef91cb81.tar.gz scala-7ed18f3300c537600eceaa6b954a867aef91cb81.tar.bz2 scala-7ed18f3300c537600eceaa6b954a867aef91cb81.zip |
Fixes #4398.
Review by extempore.
-rw-r--r-- | src/library/scala/collection/immutable/HashSet.scala | 16 | ||||
-rw-r--r-- | test/files/run/t4398.scala | 11 |
2 files changed, 21 insertions, 6 deletions
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) + } +} |