summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@typesafe.com>2014-01-15 14:17:05 -0800
committerAdriaan Moors <adriaan.moors@typesafe.com>2014-01-15 14:17:05 -0800
commit97be1ddf7170bb8c4f8cf71d73a9d49f27523d16 (patch)
treef6ebc13328d9006fe4bf29637250a872b97020f6 /src/library
parent4f7ff0ad530fee6d75c95194ecec87a8c1ce4486 (diff)
parentbfa70315d72d61ee867d69184863bda52f6d3281 (diff)
downloadscala-97be1ddf7170bb8c4f8cf71d73a9d49f27523d16.tar.gz
scala-97be1ddf7170bb8c4f8cf71d73a9d49f27523d16.tar.bz2
scala-97be1ddf7170bb8c4f8cf71d73a9d49f27523d16.zip
Merge pull request #3366 from Ichoran/issue/6457
SI-6457 ImmutableSetFactory.empty results in StackOverflowError
Diffstat (limited to 'src/library')
-rw-r--r--src/library/scala/collection/generic/ImmutableSetFactory.scala3
-rw-r--r--src/library/scala/collection/immutable/HashSet.scala4
-rw-r--r--src/library/scala/collection/immutable/ListSet.scala3
-rw-r--r--src/library/scala/collection/immutable/Set.scala4
4 files changed, 8 insertions, 6 deletions
diff --git a/src/library/scala/collection/generic/ImmutableSetFactory.scala b/src/library/scala/collection/generic/ImmutableSetFactory.scala
index f4d4e061bb..a72caf2633 100644
--- a/src/library/scala/collection/generic/ImmutableSetFactory.scala
+++ b/src/library/scala/collection/generic/ImmutableSetFactory.scala
@@ -15,6 +15,7 @@ import scala.language.higherKinds
abstract class ImmutableSetFactory[CC[X] <: immutable.Set[X] with SetLike[X, CC[X]]]
extends SetFactory[CC] {
-
+ private[collection] def emptyInstance: CC[Any]
+ override def empty[A] = emptyInstance.asInstanceOf[CC[A]]
def newBuilder[A]: Builder[A, CC[A]] = new SetBuilder[A, CC[A]](empty[A])
}
diff --git a/src/library/scala/collection/immutable/HashSet.scala b/src/library/scala/collection/immutable/HashSet.scala
index 115be09502..d5787a660a 100644
--- a/src/library/scala/collection/immutable/HashSet.scala
+++ b/src/library/scala/collection/immutable/HashSet.scala
@@ -123,10 +123,10 @@ object HashSet extends ImmutableSetFactory[HashSet] {
/** $setCanBuildFromInfo */
implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, HashSet[A]] = setCanBuildFrom[A]
- override def empty[A]: HashSet[A] = EmptyHashSet.asInstanceOf[HashSet[A]]
private object EmptyHashSet extends HashSet[Any] { }
-
+ private[collection] def emptyInstance: HashSet[Any] = EmptyHashSet
+
// utility method to create a HashTrieSet from two leaf HashSets (HashSet1 or HashSetCollision1) with non-colliding hash code)
private def makeHashTrieSet[A](hash0:Int, elem0:HashSet[A], hash1:Int, elem1:HashSet[A], level:Int) : HashTrieSet[A] = {
val index0 = (hash0 >>> level) & 0x1f
diff --git a/src/library/scala/collection/immutable/ListSet.scala b/src/library/scala/collection/immutable/ListSet.scala
index 7ebaa26d26..1bb07eb02d 100644
--- a/src/library/scala/collection/immutable/ListSet.scala
+++ b/src/library/scala/collection/immutable/ListSet.scala
@@ -22,10 +22,11 @@ import mutable.{ ListBuffer, Builder }
object ListSet extends ImmutableSetFactory[ListSet] {
/** setCanBuildFromInfo */
implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, ListSet[A]] = setCanBuildFrom[A]
- override def empty[A] = EmptyListSet.asInstanceOf[ListSet[A]]
+
override def newBuilder[A]: Builder[A, ListSet[A]] = new ListSetBuilder[A]
private object EmptyListSet extends ListSet[Any] { }
+ private[collection] def emptyInstance: ListSet[Any] = EmptyListSet
/** A custom builder because forgetfully adding elements one at
* a time to a list backed set puts the "squared" in N^2. There is a
diff --git a/src/library/scala/collection/immutable/Set.scala b/src/library/scala/collection/immutable/Set.scala
index a888955bb2..e21a8dfa8a 100644
--- a/src/library/scala/collection/immutable/Set.scala
+++ b/src/library/scala/collection/immutable/Set.scala
@@ -53,8 +53,7 @@ trait Set[A] extends Iterable[A]
object Set extends ImmutableSetFactory[Set] {
/** $setCanBuildFromInfo */
implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, Set[A]] = setCanBuildFrom[A]
- override def empty[A]: Set[A] = EmptySet.asInstanceOf[Set[A]]
-
+
/** An optimized representation for immutable empty sets */
private object EmptySet extends AbstractSet[Any] with Set[Any] with Serializable {
override def size: Int = 0
@@ -64,6 +63,7 @@ object Set extends ImmutableSetFactory[Set] {
def iterator: Iterator[Any] = Iterator.empty
override def foreach[U](f: Any => U): Unit = {}
}
+ private[collection] def emptyInstance: Set[Any] = EmptySet
/** An optimized representation for immutable sets of size 1 */
@SerialVersionUID(1233385750652442003L)