diff options
author | Sean McDirmid <sean.mcdirmid@gmail.com> | 2007-11-24 05:57:36 +0000 |
---|---|---|
committer | Sean McDirmid <sean.mcdirmid@gmail.com> | 2007-11-24 05:57:36 +0000 |
commit | 8e5450bb0944236c0a512f087946ddc5a54dfe19 (patch) | |
tree | a6b81e383c9ce8e2a8f9a2e244682dc2e7142929 | |
parent | cad2ace82f22389c32d2d472f450dc264f6a17c8 (diff) | |
download | scala-8e5450bb0944236c0a512f087946ddc5a54dfe19.tar.gz scala-8e5450bb0944236c0a512f087946ddc5a54dfe19.tar.bz2 scala-8e5450bb0944236c0a512f087946ddc5a54dfe19.zip |
Removed recursion from predicated iterator fill...
Removed recursion from predicated iterator fill as it caused a stack
overflow.
-rw-r--r-- | src/library/scala/Iterator.scala | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/src/library/scala/Iterator.scala b/src/library/scala/Iterator.scala index 8115796f14..eb9ebc8275 100644 --- a/src/library/scala/Iterator.scala +++ b/src/library/scala/Iterator.scala @@ -282,20 +282,21 @@ trait Iterator[+A] { } protected class PredicatedIterator(p : A => Boolean) extends BufferedIterator.Default[A] { - protected def skip0 : Seq[A] = fill(1) - protected override def fill(sz : Int) : Seq[A] = - if (!Iterator.this.hasNext) return Nil - else { - val ret = Iterator.this.next; - if (p(ret)) return ret :: Nil; - return skip0 + protected def doEnd : Boolean = false + protected override def fill(sz : Int) : Seq[A] = { + while (true) { + if (!Iterator.this.hasNext) return Nil + val ret = Iterator.this.next + if (p(ret)) return ret :: Nil + if (doEnd) return Nil } + throw new Error + } } protected class TakeWhileIterator(p : A => Boolean) extends PredicatedIterator(p) { private var ended = false - override protected def skip0 : Seq[A] = { - ended = true - Nil + override protected def doEnd = { + ended = true; true } override protected def fill(sz : Int) : Seq[A] = if (ended) Nil else super.fill(sz) |