summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan@lightbend.com>2017-04-07 16:50:27 -0700
committerAdriaan Moors <adriaan@lightbend.com>2017-04-07 16:50:27 -0700
commit76babbb6728e5daf4fb95444273f6f8e0a4098d7 (patch)
treeb6257a5fac0263fde213ae7ada8760443b7ad5c5
parenta11918d1053f3b0af32d7bd7fb5b75acb31724ff (diff)
downloadscala-76babbb6728e5daf4fb95444273f6f8e0a4098d7.tar.gz
scala-76babbb6728e5daf4fb95444273f6f8e0a4098d7.tar.bz2
scala-76babbb6728e5daf4fb95444273f6f8e0a4098d7.zip
Revert "Optimised implementation of List.filter/filterNot"
This reverts commit eb5c51383a63c5c3420e53ef021607ff5fd20296.
-rw-r--r--bincompat-forward.whitelist.conf17
-rw-r--r--src/library/scala/collection/immutable/FilteredTraversableInternal.scala104
-rw-r--r--src/library/scala/collection/immutable/List.scala2
-rw-r--r--src/reflect/scala/reflect/runtime/JavaUniverseForce.scala2
-rw-r--r--test/files/run/repl-colon-type.check8
5 files changed, 5 insertions, 128 deletions
diff --git a/bincompat-forward.whitelist.conf b/bincompat-forward.whitelist.conf
index dc2199bcb6..8c5718ac7d 100644
--- a/bincompat-forward.whitelist.conf
+++ b/bincompat-forward.whitelist.conf
@@ -383,23 +383,6 @@ filter {
matchName="scala.collection.mutable.ArrayOps#ofFloat.emptyImpl"
problemName=DirectMissingMethodProblem
},
- // introduce FilteredTraversableInternal
- {
- matchName="scala.collection.immutable.Nil$"
- problemName=MissingTypesProblem
- },
- {
- matchName="scala.collection.immutable.FilteredTraversableInternal"
- problemName=MissingClassProblem
- },
- {
- matchName="scala.collection.immutable.List"
- problemName=MissingTypesProblem
- },
- {
- matchName="scala.collection.immutable.$colon$colon"
- problemName=MissingTypesProblem
- },
{
matchName="scala.annotation.showAsInfix$"
problemName=MissingClassProblem
diff --git a/src/library/scala/collection/immutable/FilteredTraversableInternal.scala b/src/library/scala/collection/immutable/FilteredTraversableInternal.scala
deleted file mode 100644
index 35585b7826..0000000000
--- a/src/library/scala/collection/immutable/FilteredTraversableInternal.scala
+++ /dev/null
@@ -1,104 +0,0 @@
-/* __ *\
-** ________ ___ / / ___ Scala API **
-** / __/ __// _ | / / / _ | (c) 2003-2013, LAMP/EPFL **
-** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
-** /____/\___/_/ |_/____/_/ | | **
-** |/ **
-\* */
-
-package scala
-package collection
-package immutable
-
-import scala.annotation.tailrec
-
-/**
- * Optimised filter functions for List
- * n.b. this is an internal class to help maintain compatibility and should not be used directly.
- */
-private[immutable] trait FilteredTraversableInternal[+A, +Repr <: AnyRef with TraversableLike[A, Repr]] extends TraversableLike[A, Repr] {
-
- // Optimized for List
-
- override def filter(p: A => Boolean): Self = filterImpl(p, isFlipped = false)
-
- override def filterNot(p: A => Boolean): Self = filterImpl(p, isFlipped = true)
-
- private[this] def filterImpl(p: A => Boolean, isFlipped: Boolean): Self = {
-
- // everything seen so far so far is not included
- @tailrec def noneIn(l: Repr): Repr = {
- if (l.isEmpty)
- Nil.asInstanceOf[Repr]
- else {
- val h = l.head
- val t = l.tail
- if (p(h) != isFlipped)
- allIn(l, t)
- else
- noneIn(t)
- }
- }
-
- // everything from 'start' is included, if everything from this point is in we can return the origin
- // start otherwise if we discover an element that is out we must create a new partial list.
- @tailrec def allIn(start: Repr, remaining: Repr): Repr = {
- if (remaining.isEmpty)
- start
- else {
- val x = remaining.head
- if (p(x) != isFlipped)
- allIn(start, remaining.tail)
- else
- partialFill(start, remaining)
- }
- }
-
- // we have seen elements that should be included then one that should be excluded, start building
- def partialFill(origStart: Repr, firstMiss: Repr): Repr = {
- val newHead = new ::(origStart.head, Nil)
- var toProcess = origStart.tail
- var currentLast = newHead
-
- // we know that all elements are :: until at least firstMiss.tail
- while (!(toProcess eq firstMiss)) {
- val newElem = new ::(toProcess.head, Nil)
- currentLast.tl = newElem
- currentLast = newElem
- toProcess = toProcess.tail
- }
-
- // at this point newHead points to a list which is a duplicate of all the 'in' elements up to the first miss.
- // currentLast is the last element in that list.
-
- // now we are going to try and share as much of the tail as we can, only moving elements across when we have to.
- var next = firstMiss.tail
- var nextToCopy = next // the next element we would need to copy to our list if we cant share.
- while (!next.isEmpty) {
- // generally recommended is next.isNonEmpty but this incurs an extra method call.
- val head: A = next.head
- if (p(head) != isFlipped) {
- next = next.tail
- } else {
- // its not a match - do we have outstanding elements?
- while (!(nextToCopy eq next)) {
- val newElem = new ::(nextToCopy.head, Nil)
- currentLast.tl = newElem
- currentLast = newElem
- nextToCopy = nextToCopy.tail
- }
- nextToCopy = next.tail
- next = next.tail
- }
- }
-
- // we have remaining elements - they are unchanged attach them to the end
- if (!nextToCopy.isEmpty)
- currentLast.tl = nextToCopy.asInstanceOf[List[A]]
-
- newHead.asInstanceOf[Repr]
- }
-
- noneIn(repr)
- }
-} \ No newline at end of file
diff --git a/src/library/scala/collection/immutable/List.scala b/src/library/scala/collection/immutable/List.scala
index e12ce7c2eb..550b987cb6 100644
--- a/src/library/scala/collection/immutable/List.scala
+++ b/src/library/scala/collection/immutable/List.scala
@@ -88,7 +88,6 @@ sealed abstract class List[+A] extends AbstractSeq[A]
with Product
with GenericTraversableTemplate[A, List]
with LinearSeqOptimized[A, List[A]]
- with FilteredTraversableInternal[A, List[A]]
with scala.Serializable {
override def companion: GenericCompanion[List] = List
@@ -414,7 +413,6 @@ sealed abstract class List[+A] extends AbstractSeq[A]
// Create a proxy for Java serialization that allows us to avoid mutation
// during deserialization. This is the Serialization Proxy Pattern.
protected final def writeReplace(): AnyRef = new List.SerializationProxy(this)
-
}
/** The empty list.
diff --git a/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala b/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala
index 72e21f67fe..9138ed3f02 100644
--- a/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala
+++ b/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala
@@ -459,8 +459,8 @@ trait JavaUniverseForce { self: runtime.JavaUniverse =>
definitions.DoubleTpe
definitions.BooleanTpe
definitions.ScalaNumericValueClasses
- definitions.ScalaValueClasses
definitions.ScalaValueClassesNoUnit
+ definitions.ScalaValueClasses
uncurry.VarargsSymbolAttachment
uncurry.DesugaredParameterType
diff --git a/test/files/run/repl-colon-type.check b/test/files/run/repl-colon-type.check
index 5b7a3c7506..1217e8d8c2 100644
--- a/test/files/run/repl-colon-type.check
+++ b/test/files/run/repl-colon-type.check
@@ -75,7 +75,7 @@ TypeRef(
)
TypeRef(
TypeSymbol(
- sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A,List] with LinearSeqOptimized[A,List[A]] with FilteredTraversableInternal[A,List[A]] with Serializable
+ sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A,List] with LinearSeqOptimized[A,List[A]] with Serializable
)
args = List(
@@ -142,7 +142,7 @@ TypeRef(
args = List(
TypeRef(
TypeSymbol(
- sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A,List] with LinearSeqOptimized[A,List[A]] with FilteredTraversableInternal[A,List[A]] with Serializable
+ sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A,List] with LinearSeqOptimized[A,List[A]] with Serializable
)
args = List(
@@ -175,7 +175,7 @@ PolyType(
args = List(
TypeRef(
TypeSymbol(
- sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A,List] with LinearSeqOptimized[A,List[A]] with FilteredTraversableInternal[A,List[A]] with Serializable
+ sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A,List] with LinearSeqOptimized[A,List[A]] with Serializable
)
args = List(TypeParamTypeRef(TypeParam(T <: AnyVal)))
@@ -198,7 +198,7 @@ PolyType(
params = List(TermSymbol(x: T), TermSymbol(y: List[U]))
resultType = TypeRef(
TypeSymbol(
- sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A,List] with LinearSeqOptimized[A,List[A]] with FilteredTraversableInternal[A,List[A]] with Serializable
+ sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A,List] with LinearSeqOptimized[A,List[A]] with Serializable
)
args = List(TypeParamTypeRef(TypeParam(U >: T)))