summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeth Tisue <seth@tisue.net>2015-12-15 13:30:23 -0500
committerSeth Tisue <seth@tisue.net>2015-12-15 13:30:23 -0500
commit7559aed3c5b9ccf7e995d8094772340234769017 (patch)
tree917d8cfdad6b9c777dc9426e7dac829ecaaac2ad
parenta0dabe37bd761f344109cde13d917575690371a5 (diff)
parentc17b18e173e07f421f9171272d94d84908526609 (diff)
downloadscala-7559aed3c5b9ccf7e995d8094772340234769017.tar.gz
scala-7559aed3c5b9ccf7e995d8094772340234769017.tar.bz2
scala-7559aed3c5b9ccf7e995d8094772340234769017.zip
Merge pull request #4876 from ruippeixotog/issue/9581
SI-9581 Fix overflow on Vector take and drop methods
-rw-r--r--src/library/scala/collection/immutable/Vector.scala4
-rw-r--r--test/junit/scala/collection/immutable/VectorTest.scala30
2 files changed, 32 insertions, 2 deletions
diff --git a/src/library/scala/collection/immutable/Vector.scala b/src/library/scala/collection/immutable/Vector.scala
index cd2d3f843b..5a9734a99e 100644
--- a/src/library/scala/collection/immutable/Vector.scala
+++ b/src/library/scala/collection/immutable/Vector.scala
@@ -156,7 +156,7 @@ override def companion: GenericCompanion[Vector] = Vector
override def take(n: Int): Vector[A] = {
if (n <= 0)
Vector.empty
- else if (startIndex + n < endIndex)
+ else if (startIndex < endIndex - n)
dropBack0(startIndex + n)
else
this
@@ -165,7 +165,7 @@ override def companion: GenericCompanion[Vector] = Vector
override def drop(n: Int): Vector[A] = {
if (n <= 0)
this
- else if (startIndex + n < endIndex)
+ else if (startIndex < endIndex - n)
dropFront0(startIndex + n)
else
Vector.empty
diff --git a/test/junit/scala/collection/immutable/VectorTest.scala b/test/junit/scala/collection/immutable/VectorTest.scala
new file mode 100644
index 0000000000..69f74872d0
--- /dev/null
+++ b/test/junit/scala/collection/immutable/VectorTest.scala
@@ -0,0 +1,30 @@
+package scala.collection.immutable
+
+import org.junit.Assert._
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.Test
+
+@RunWith(classOf[JUnit4])
+class VectorTest {
+
+ @Test
+ def hasCorrectDropAndTakeMethods() {
+ val v = Vector(0) ++ Vector(1 to 64: _*)
+
+ assertEquals(Vector(0, 1), v take 2)
+ assertEquals(Vector(63, 64), v takeRight 2)
+ assertEquals(Vector(2 to 64: _*), v drop 2)
+ assertEquals(Vector(0 to 62: _*), v dropRight 2)
+
+ assertEquals(v, v take Int.MaxValue)
+ assertEquals(v, v takeRight Int.MaxValue)
+ assertEquals(Vector.empty[Int], v drop Int.MaxValue)
+ assertEquals(Vector.empty[Int], v dropRight Int.MaxValue)
+
+ assertEquals(Vector.empty[Int], v take Int.MinValue)
+ assertEquals(Vector.empty[Int], v takeRight Int.MinValue)
+ assertEquals(v, v drop Int.MinValue)
+ assertEquals(v, v dropRight Int.MinValue)
+ }
+}