diff options
author | Paul Phillips <paulp@improving.org> | 2010-06-07 23:43:14 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2010-06-07 23:43:14 +0000 |
commit | caa6bf0e7a9c02b7519549c289f7a455bad281b1 (patch) | |
tree | ddd2a4da3fe7969776a039f8ccc44dd6aa2d4292 /src/library/scala/Array.scala | |
parent | d6896c490acea8617247cf593060fa67ed82c79c (diff) | |
download | scala-caa6bf0e7a9c02b7519549c289f7a455bad281b1.tar.gz scala-caa6bf0e7a9c02b7519549c289f7a455bad281b1.tar.bz2 scala-caa6bf0e7a9c02b7519549c289f7a455bad281b1.zip |
Most of the iterate implementations were callin...
Most of the iterate implementations were calling the given function one
too many times, leading to tragic failure if the function could not
handle this (such as repeatedly applying tail.) Closes #3540, review by
prokopec.
Diffstat (limited to 'src/library/scala/Array.scala')
-rw-r--r-- | src/library/scala/Array.scala | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/library/scala/Array.scala b/src/library/scala/Array.scala index 9712990d73..250fd09602 100644 --- a/src/library/scala/Array.scala +++ b/src/library/scala/Array.scala @@ -363,13 +363,18 @@ object Array extends FallbackArrayBuilding { */ def iterate[T: ClassManifest](start: T, len: Int)(f: T => T): Array[T] = { val b = newBuilder[T] - b.sizeHint(len) - var acc = start - var i = 0 - while (i < len) { + + if (len > 0) { + b.sizeHint(len) + var acc = start + var i = 1 b += acc - acc = f(acc) - i += 1 + + while (i < len) { + acc = f(acc) + i += 1 + b += acc + } } b.result } |