summaryrefslogtreecommitdiff
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
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.
-rw-r--r--src/library/scala/collection/immutable/Stream.scala18
-rw-r--r--test/files/run/t8100.check1
-rw-r--r--test/files/run/t8100.scala8
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))
+ }
+}