summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
authorSean McDirmid <sean.mcdirmid@gmail.com>2007-11-24 05:57:36 +0000
committerSean McDirmid <sean.mcdirmid@gmail.com>2007-11-24 05:57:36 +0000
commit8e5450bb0944236c0a512f087946ddc5a54dfe19 (patch)
treea6b81e383c9ce8e2a8f9a2e244682dc2e7142929 /src/library
parentcad2ace82f22389c32d2d472f450dc264f6a17c8 (diff)
downloadscala-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.
Diffstat (limited to 'src/library')
-rw-r--r--src/library/scala/Iterator.scala21
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)