diff options
author | David Andrzejewski <david@sumologic.com> | 2012-04-04 09:26:34 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-04-06 11:57:41 -0700 |
commit | 581a2e1a9653b06b6d2c431070e6b1d21383285d (patch) | |
tree | 0e7265e799f926acd99fa1e377ba187a82cb17a4 /src/library | |
parent | e593d8b9ed6d8d98c698d0a7dc47c3341d59c357 (diff) | |
download | scala-581a2e1a9653b06b6d2c431070e6b1d21383285d.tar.gz scala-581a2e1a9653b06b6d2c431070e6b1d21383285d.tar.bz2 scala-581a2e1a9653b06b6d2c431070e6b1d21383285d.zip |
fix memory leak in Iterator.++
Diffstat (limited to 'src/library')
-rw-r--r-- | src/library/scala/collection/Iterator.scala | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/src/library/scala/collection/Iterator.scala b/src/library/scala/collection/Iterator.scala index 7b57a91c41..65de60c8fe 100644 --- a/src/library/scala/collection/Iterator.scala +++ b/src/library/scala/collection/Iterator.scala @@ -329,14 +329,16 @@ trait Iterator[+A] extends TraversableOnce[A] { def ++[B >: A](that: => GenTraversableOnce[B]): Iterator[B] = new AbstractIterator[B] { // optimize a little bit to prevent n log n behavior. private var cur : Iterator[B] = self + private var selfExhausted : Boolean = false // since that is by-name, make sure it's only referenced once - // if "val it = that" is inside the block, then hasNext on an empty // iterator will continually reevaluate it. (ticket #3269) lazy val it = that.toIterator // the eq check is to avoid an infinite loop on "x ++ x" - def hasNext = cur.hasNext || ((cur eq self) && { + def hasNext = cur.hasNext || (!selfExhausted && { it.hasNext && { cur = it + selfExhausted = true true } }) |