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)