Match AIOBE contract in Arrays and Spliterators
Change-Id: Ibf24d8129c07bfdf91731a2b66a161f7073c91b3
diff --git a/user/super/com/google/gwt/emul/java/util/Spliterators.java b/user/super/com/google/gwt/emul/java/util/Spliterators.java
index 0926bac..78b8fc6 100644
--- a/user/super/com/google/gwt/emul/java/util/Spliterators.java
+++ b/user/super/com/google/gwt/emul/java/util/Spliterators.java
@@ -15,7 +15,6 @@
*/
package java.util;
-import static javaemul.internal.InternalPreconditions.checkCriticalArrayBounds;
import static javaemul.internal.InternalPreconditions.checkCriticalElement;
import static javaemul.internal.InternalPreconditions.checkCriticalState;
import static javaemul.internal.InternalPreconditions.checkNotNull;
@@ -130,6 +129,7 @@
public static <T> Spliterator<T> spliterator(Object[] array, int fromIndex, int toIndex,
int characteristics) {
+ checkCriticalArrayBounds(fromIndex, toIndex, array.length);
return new ArraySpliterator<>(array, fromIndex, toIndex, characteristics);
}
@@ -139,6 +139,7 @@
public static Spliterator.OfInt spliterator(int[] array, int fromIndex, int toIndex,
int characteristics) {
+ checkCriticalArrayBounds(fromIndex, toIndex, array.length);
return new IntArraySpliterator(array, fromIndex, toIndex, characteristics);
}
@@ -148,6 +149,7 @@
public static Spliterator.OfLong spliterator(long[] array, int fromIndex, int toIndex,
int characteristics) {
+ checkCriticalArrayBounds(fromIndex, toIndex, array.length);
return new LongArraySpliterator(array, fromIndex, toIndex, characteristics);
}
@@ -157,6 +159,7 @@
public static Spliterator.OfDouble spliterator(double[] array, int fromIndex, int toIndex,
int characteristics) {
+ checkCriticalArrayBounds(fromIndex, toIndex, array.length);
return new DoubleArraySpliterator(array, fromIndex, toIndex, characteristics);
}
@@ -588,8 +591,7 @@
private final int limit;
private final int characteristics;
- BaseArraySpliterator(int from, int limit, int size, int characteristics) {
- checkCriticalArrayBounds(from, limit, size);
+ BaseArraySpliterator(int from, int limit, int characteristics) {
this.index = from;
this.limit = limit;
this.characteristics = sizeKnownSpliteratorCharacteristics(characteristics);
@@ -643,7 +645,7 @@
}
ArraySpliterator(Object[] array, int from, int limit, int characteristics) {
- super(from, limit, array.length, characteristics);
+ super(from, limit, characteristics);
this.array = array;
}
@@ -665,7 +667,7 @@
}
DoubleArraySpliterator(double[] array, int from, int limit, int characteristics) {
- super(from, limit, array.length, characteristics);
+ super(from, limit, characteristics);
this.array = array;
}
@@ -686,7 +688,7 @@
}
IntArraySpliterator(int[] array, int from, int limit, int characteristics) {
- super(from, limit, array.length, characteristics);
+ super(from, limit, characteristics);
this.array = array;
}
@@ -707,7 +709,7 @@
}
LongArraySpliterator(long[] array, int from, int limit, int characteristics) {
- super(from, limit, array.length, characteristics);
+ super(from, limit, characteristics);
this.array = array;
}
@@ -734,6 +736,17 @@
return characteristics & ~(Spliterator.SIZED | Spliterator.SUBSIZED);
}
+ /**
+ * We cant use InternalPreconditions.checkCriticalArrayBounds here because
+ * Spliterators must throw only ArrayIndexOutOfBoundsException on range check by contract.
+ */
+ private static void checkCriticalArrayBounds(int start, int end, int length) {
+ if (start > end || start < 0 || end > length) {
+ throw new ArrayIndexOutOfBoundsException(
+ "fromIndex: " + start + ", toIndex: " + end + ", length: " + length);
+ }
+ }
+
private Spliterators() { }
}
diff --git a/user/super/com/google/gwt/emul/javaemul/internal/InternalPreconditions.java b/user/super/com/google/gwt/emul/javaemul/internal/InternalPreconditions.java
index f6868fa..ff5f30b 100644
--- a/user/super/com/google/gwt/emul/javaemul/internal/InternalPreconditions.java
+++ b/user/super/com/google/gwt/emul/javaemul/internal/InternalPreconditions.java
@@ -524,15 +524,15 @@
* @throws ArrayIndexOutOfBoundsException if the range is not legal
*/
public static void checkCriticalArrayBounds(int start, int end, int length) {
+ if (start > end) {
+ throw new IllegalArgumentException("fromIndex: " + start + " > toIndex: " + end);
+ }
if (start < 0) {
throw new ArrayIndexOutOfBoundsException("fromIndex: " + start + " < 0");
}
if (end > length) {
throw new ArrayIndexOutOfBoundsException("toIndex: " + end + " > length " + length);
}
- if (start > end) {
- throw new IllegalArgumentException("fromIndex: " + start + " > toIndex: " + end);
- }
}
/**