summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksandar Pokopec <aleksandar.prokopec@epfl.ch>2011-07-11 15:17:45 +0000
committerAleksandar Pokopec <aleksandar.prokopec@epfl.ch>2011-07-11 15:17:45 +0000
commit7ed18f3300c537600eceaa6b954a867aef91cb81 (patch)
tree08c00ee5cf26f9d0f4a1dd583c2b3ac3db9ada6b
parent9f39fc01244e953290b4734ed135ff4e91d4344e (diff)
downloadscala-7ed18f3300c537600eceaa6b954a867aef91cb81.tar.gz
scala-7ed18f3300c537600eceaa6b954a867aef91cb81.tar.bz2
scala-7ed18f3300c537600eceaa6b954a867aef91cb81.zip
Fixes #4398.
Review by extempore.
-rw-r--r--src/library/scala/collection/immutable/HashSet.scala16
-rw-r--r--test/files/run/t4398.scala11
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)
+ }
+}