diff options
author | Adriaan Moors <adriaan.moors@typesafe.com> | 2014-01-15 14:13:01 -0800 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@typesafe.com> | 2014-01-15 14:13:01 -0800 |
commit | 6ea9933e262ab286165511a90f3e1df341e032a4 (patch) | |
tree | 64358e1a7e4c66a09ce1b396fd79a5184d7ebe1f | |
parent | 8782954fa4cfe965d2323d575b09eca754d357e3 (diff) | |
parent | 2477bbd9d64df3dbfac063e1fc71115daf0f3ea7 (diff) | |
download | scala-6ea9933e262ab286165511a90f3e1df341e032a4.tar.gz scala-6ea9933e262ab286165511a90f3e1df341e032a4.tar.bz2 scala-6ea9933e262ab286165511a90f3e1df341e032a4.zip |
Merge pull request #3304 from non/bug/stream-flatten2-8100
SI-8100 - prevent possible SOE during Stream#flatten.
-rw-r--r-- | src/library/scala/collection/immutable/Stream.scala | 18 | ||||
-rw-r--r-- | test/files/run/t8100.check | 1 | ||||
-rw-r--r-- | test/files/run/t8100.scala | 8 |
3 files changed, 19 insertions, 8 deletions
diff --git a/src/library/scala/collection/immutable/Stream.scala b/src/library/scala/collection/immutable/Stream.scala index a82e31f5da..49c3b4c3cd 100644 --- a/src/library/scala/collection/immutable/Stream.scala +++ b/src/library/scala/collection/immutable/Stream.scala @@ -960,14 +960,16 @@ self => * }}} */ override def flatten[B](implicit asTraversable: A => /*<:<!!!*/ GenTraversableOnce[B]): Stream[B] = { - def flatten1(t: Traversable[B]): Stream[B] = - if (!t.isEmpty) - cons(t.head, flatten1(t.tail)) - else - tail.flatten - - if (isEmpty) Stream.empty - else flatten1(asTraversable(head).seq.toTraversable) + var st: Stream[A] = this + while (st.nonEmpty) { + val h = asTraversable(st.head) + if (h.isEmpty) { + st = st.tail + } else { + return h.toStream #::: st.tail.flatten + } + } + Stream.empty } override def view = new StreamView[A, Stream[A]] { diff --git a/test/files/run/t8100.check b/test/files/run/t8100.check new file mode 100644 index 0000000000..cdd927fd88 --- /dev/null +++ b/test/files/run/t8100.check @@ -0,0 +1 @@ +Success(0) diff --git a/test/files/run/t8100.scala b/test/files/run/t8100.scala new file mode 100644 index 0000000000..b9d0fe5003 --- /dev/null +++ b/test/files/run/t8100.scala @@ -0,0 +1,8 @@ +object Test { + import scala.util.Try + + def main(args: Array[String]): Unit = { + def stream = Stream.from(0).take(100000).map(n => None) + println(Try(stream.flatten.length)) + } +} |