From c989273edb4302762ac41cb799862cd2f4c8fcc8 Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Sat, 14 May 2011 16:54:42 +0000 Subject: Fix for view+groupBy closes #4558, no review. --- src/library/scala/collection/TraversableViewLike.scala | 8 +++++--- test/files/run/bug4558.scala | 6 ++++++ 2 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 test/files/run/bug4558.scala diff --git a/src/library/scala/collection/TraversableViewLike.scala b/src/library/scala/collection/TraversableViewLike.scala index 6dc0936c61..23e967aea0 100644 --- a/src/library/scala/collection/TraversableViewLike.scala +++ b/src/library/scala/collection/TraversableViewLike.scala @@ -16,6 +16,8 @@ import annotation.migration trait ViewMkString[+A] { self: Traversable[A] => + // It is necessary to use thisSeq rather than toSeq to avoid cycles in the + // eager evaluation of vals in transformed view subclasses, see #4558. protected[this] def thisSeq: Seq[A] = new ArrayBuffer[A] ++= self result // Have to overload all three to work around #4299. The overload @@ -157,17 +159,17 @@ trait TraversableViewLike[+A, override def splitAt(n: Int): (This, This) = (newTaken(n), newDropped(n)) override def scanLeft[B, That](z: B)(op: (B, A) => B)(implicit bf: CanBuildFrom[This, B, That]): That = - newForced(self.toSeq.scanLeft(z)(op)).asInstanceOf[That] + newForced(thisSeq.scanLeft(z)(op)).asInstanceOf[That] @migration(2, 9, "This scanRight definition has changed in 2.9.\n" + "The previous behavior can be reproduced with scanRight.reverse." ) override def scanRight[B, That](z: B)(op: (A, B) => B)(implicit bf: CanBuildFrom[This, B, That]): That = - newForced(self.toSeq.scanRight(z)(op)).asInstanceOf[That] + newForced(thisSeq.scanRight(z)(op)).asInstanceOf[That] override def groupBy[K](f: A => K): immutable.Map[K, This] = - self.toSeq.groupBy(f).mapValues(xs => newForced(xs).asInstanceOf[This]) + thisSeq.groupBy(f).mapValues(xs => newForced(thisSeq)) override def toString = viewToString } diff --git a/test/files/run/bug4558.scala b/test/files/run/bug4558.scala new file mode 100644 index 0000000000..e7661421dc --- /dev/null +++ b/test/files/run/bug4558.scala @@ -0,0 +1,6 @@ +object Test { + def main(args: Array[String]): Unit = { + val xs = Seq(1,2,3).view.groupBy(identity) + assert(xs.size == 3) + } +} -- cgit v1.2.3