Fix incorrect comparison of object arrays in Arrays.deepEquals.
Change-Id: I7e1cdaae70f713af6071bb81f410fc25f5239864
diff --git a/user/super/com/google/gwt/emul/java/util/Objects.java b/user/super/com/google/gwt/emul/java/util/Objects.java
index f306edf..58c0c72 100644
--- a/user/super/com/google/gwt/emul/java/util/Objects.java
+++ b/user/super/com/google/gwt/emul/java/util/Objects.java
@@ -37,23 +37,27 @@
if (a == null || b == null) {
return false;
}
- if (a.equals(b)) {
- return true;
- }
- // We have to test and see if these are two arrays of the same type,
- // then see what types of arrays they are and dispatch to the
- // appropriate equals
-
+ // Use object equality check if any of these objects is not an array.
Class<?> class1 = a.getClass();
Class<?> class2 = b.getClass();
- if (!class1.isArray() || !class1.equals(class2)) {
+ if (!class1.isArray() || !class2.isArray()) {
+ return a.equals(b);
+ }
+
+ // Use object array equality check if these objects are object arrays;
+ // if one of these objects is an object array and the other is not, just return false.
+ boolean isObjectArray1 = a instanceof Object[];
+ boolean isObjectArray2 = b instanceof Object[];
+ if (isObjectArray1 || isObjectArray2) {
+ return isObjectArray1 && isObjectArray2 && Arrays.deepEquals((Object[]) a, (Object[]) b);
+ }
+
+ // At this point a and b are primitive arrays so we just check that they have same types.
+ if (!class1.equals(class2)) {
return false;
}
- if (a instanceof Object[]) {
- return Arrays.deepEquals((Object[]) a, (Object[]) b);
- }
if (a instanceof boolean[]) {
return Arrays.equals((boolean[]) a, (boolean[]) b);
}
@@ -75,11 +79,8 @@
if (a instanceof float[]) {
return Arrays.equals((float[]) a, (float[]) b);
}
- if (a instanceof double[]) {
- return Arrays.equals((double[]) a, (double[]) b);
- }
-
- return true;
+ // could only be double[]
+ return Arrays.equals((double[]) a, (double[]) b);
}
public static boolean equals(Object a, Object b) {
diff --git a/user/test/com/google/gwt/emultest/java/util/ObjectsTest.java b/user/test/com/google/gwt/emultest/java/util/ObjectsTest.java
index 3015149..cc1e4e5 100644
--- a/user/test/com/google/gwt/emultest/java/util/ObjectsTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/ObjectsTest.java
@@ -63,11 +63,17 @@
assertTrue(Objects.deepEquals(null, null));
assertFalse(Objects.deepEquals(null, "not null"));
assertFalse(Objects.deepEquals("not null", null));
+ assertTrue(Objects.deepEquals(new Integer("1234"), new Integer(1234)));
assertFalse(Objects.deepEquals(new Object(), new Object()));
Object obj = new Object();
assertTrue(Objects.deepEquals(obj, obj));
+ assertFalse(Objects.deepEquals(new int[]{1}, new double[]{1}));
+ assertFalse(Objects.deepEquals(new int[0], new double[0]));
+ assertTrue(Objects.deepEquals((Object) new Object[]{"a"}, (Object) new String[]{"a"}));
+ assertTrue(Objects.deepEquals((Object) new String[]{"a"}, (Object) new Object[]{"a"}));
+
int[] intArray1 = new int[] { 2, 3, 5};
int[] intArray2 = new int[] { 3, 1};
int[] intArray3 = new int[] { 2, 3, 5};
@@ -75,6 +81,9 @@
assertFalse(Objects.deepEquals(intArray2, intArray3));
assertTrue(Objects.deepEquals(intArray1, intArray1));
assertTrue(Objects.deepEquals(intArray1, intArray3));
+
+ assertTrue(Objects.deepEquals(new int[][]{new int[]{1}}, new int[][]{new int[]{1}}));
+ assertFalse(Objects.deepEquals(new int[][]{new int[]{1}}, new double[][]{new double[]{1}}));
}
@DoNotRunWith(Platform.Devel) // Objects.equals(String, String)