diff options
author | Paul Phillips <paulp@improving.org> | 2009-11-18 14:45:11 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2009-11-18 14:45:11 +0000 |
commit | 06713afedffebde4cbb50de882763c95889cdcdf (patch) | |
tree | 47eb89caff5bd505954f2946d864a5683185926e | |
parent | 39a1e1fceaa1f3cacfb4cce22a2e34bb8d754611 (diff) | |
download | scala-06713afedffebde4cbb50de882763c95889cdcdf.tar.gz scala-06713afedffebde4cbb50de882763c95889cdcdf.tar.bz2 scala-06713afedffebde4cbb50de882763c95889cdcdf.zip |
Fixed a bug in Range which was causing take and...
Fixed a bug in Range which was causing take and drop to overflow and
return empty if the argument was larger than the actual length
of the Range and arg * step > MaxInt.
-rw-r--r-- | src/library/scala/collection/immutable/Range.scala | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/library/scala/collection/immutable/Range.scala b/src/library/scala/collection/immutable/Range.scala index d9a7725d1a..651c03a5d9 100644 --- a/src/library/scala/collection/immutable/Range.scala +++ b/src/library/scala/collection/immutable/Range.scala @@ -64,14 +64,17 @@ class Range(val start: Int, val end: Int, val step: Int) extends IndexedSeq[Int] start + idx * step } + // take and drop have to be tolerant of large values without overflowing + private def locationAfterN(n: Int) = start + step * (0 max n min length) + final override def take(n: Int): Range = { - val limit1 = start + step * (n max 0) + val limit1 = locationAfterN(n) if (step > 0) Range(start, limit1 min limit, step) else Range(start, limit1 max limit, step) } final override def drop(n: Int): Range = - copy(start + step * (n max 0), end, step) + copy(locationAfterN(n), end, step) final override def init: Range = take(length - 1) |