summaryrefslogtreecommitdiff
path: root/src/library/scala/collection/immutable/Range.scala
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2009-11-18 14:45:11 +0000
committerPaul Phillips <paulp@improving.org>2009-11-18 14:45:11 +0000
commit06713afedffebde4cbb50de882763c95889cdcdf (patch)
tree47eb89caff5bd505954f2946d864a5683185926e /src/library/scala/collection/immutable/Range.scala
parent39a1e1fceaa1f3cacfb4cce22a2e34bb8d754611 (diff)
downloadscala-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.
Diffstat (limited to 'src/library/scala/collection/immutable/Range.scala')
-rw-r--r--src/library/scala/collection/immutable/Range.scala7
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)