summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@typesafe.com>2014-01-15 14:13:01 -0800
committerAdriaan Moors <adriaan.moors@typesafe.com>2014-01-15 14:13:01 -0800
commit6ea9933e262ab286165511a90f3e1df341e032a4 (patch)
tree64358e1a7e4c66a09ce1b396fd79a5184d7ebe1f /src/library
parent8782954fa4cfe965d2323d575b09eca754d357e3 (diff)
parent2477bbd9d64df3dbfac063e1fc71115daf0f3ea7 (diff)
downloadscala-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.
Diffstat (limited to 'src/library')
-rw-r--r--src/library/scala/collection/immutable/Stream.scala18
1 files changed, 10 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]] {