Widening/Narrowing opertaions in j.l.reflect.Array. Adds correct narrowing and widening operations in Array.java. Change-Id: I8583263f7142337143709cf006c1033b5dadcd47 Review-Link: https://gwt-review.googlesource.com/#/c/19300/
diff --git a/user/super/com/google/gwt/emul/java/lang/reflect/Array.java b/user/super/com/google/gwt/emul/java/lang/reflect/Array.java index f9a3a6c..4695ebc 100644 --- a/user/super/com/google/gwt/emul/java/lang/reflect/Array.java +++ b/user/super/com/google/gwt/emul/java/lang/reflect/Array.java
@@ -82,8 +82,24 @@ } public static double getDouble(Object array, int index) { - checkArgument(array instanceof double[]); - return getDoubleImpl(array, index); + if (array instanceof double[]) { + return getDoubleImpl(array, index); + } else if (array instanceof byte[]) { + return getByteImpl(array, index); + } else if (array instanceof char[]) { + return getCharImpl(array, index); + } else if (array instanceof float[]) { + return getFloatImpl(array, index); + } else if (array instanceof int[]) { + return getIntImpl(array, index); + } else if (array instanceof long[]) { + return getLongImpl(array, index); + } else if (array instanceof short[]) { + return getShortImpl(array, index); + } else { + checkArgument(false); + return 0; + } } private static double getDoubleImpl(Object array, int index) { @@ -92,8 +108,22 @@ } public static float getFloat(Object array, int index) { - checkArgument(array instanceof float[]); - return getFloatImpl(array, index); + if (array instanceof float[]) { + return getFloatImpl(array, index); + } else if (array instanceof byte[]) { + return getByteImpl(array, index); + } else if (array instanceof char[]) { + return getCharImpl(array, index); + } else if (array instanceof int[]) { + return getIntImpl(array, index); + } else if (array instanceof long[]) { + return getLongImpl(array, index); + } else if (array instanceof short[]) { + return getShortImpl(array, index); + } else { + checkArgument(false); + return 0; + } } private static float getFloatImpl(Object array, int index) { @@ -102,8 +132,18 @@ } public static int getInt(Object array, int index) { - checkArgument(array instanceof int[]); - return getIntImpl(array, index); + if (array instanceof int[]) { + return getIntImpl(array, index); + } else if (array instanceof byte[]) { + return getByteImpl(array, index); + } else if (array instanceof char[]) { + return getCharImpl(array, index); + } else if (array instanceof short[]) { + return getShortImpl(array, index); + } else { + checkArgument(false); + return 0; + } } private static int getIntImpl(Object array, int index) { @@ -117,8 +157,20 @@ } public static long getLong(Object array, int index) { - checkArgument(array instanceof long[]); - return getLongImpl(array, index); + if (array instanceof long[]) { + return getLongImpl(array, index); + } else if (array instanceof byte[]) { + return getByteImpl(array, index); + } else if (array instanceof char[]) { + return getCharImpl(array, index); + } else if (array instanceof int[]) { + return getIntImpl(array, index); + } else if (array instanceof short[]) { + return getShortImpl(array, index); + } else { + checkArgument(false); + return 0; + } } private static long getLongImpl(Object array, int index) { @@ -127,8 +179,14 @@ } public static short getShort(Object array, int index) { - checkArgument(array instanceof short[]); - return getShortImpl(array, index); + if (array instanceof short[]) { + return getShortImpl(array, index); + } else if (array instanceof byte[]) { + return getByteImpl(array, index); + } else { + checkArgument(false); + return 0; + } } private static short getShortImpl(Object array, int index) { @@ -137,26 +195,29 @@ } public static void set(Object array, int index, Object value) { - if (array instanceof boolean[]) { - setBooleanImpl(array, index, (Boolean) value); - } else if (array instanceof byte[]) { - setByteImpl(array, index, (Byte) value); - } else if (array instanceof char[]) { - setCharImpl(array, index, (Character) value); - } else if (array instanceof double[]) { - setDoubleImpl(array, index, (Double) value); - } else if (array instanceof float[]) { - setFloatImpl(array, index, (Float) value); - } else if (array instanceof int[]) { - setIntImpl(array, index, (Integer) value); - } else if (array instanceof long[]) { - setLongImpl(array, index, (Long) value); - } else if (array instanceof short[]) { - setShortImpl(array, index, (Short) value); - } else { - checkArgument(array instanceof Object[]); + if (array instanceof Object[]) { Object[] typedArray = (Object[]) array; typedArray[index] = value; + } else { + if (value instanceof Boolean) { + setBoolean(array, index, ((Boolean) value).booleanValue()); + } else if (value instanceof Byte) { + setByte(array, index, ((Byte) value).byteValue()); + } else if (value instanceof Character) { + setChar(array, index, ((Character) value).charValue()); + } else if (value instanceof Short) { + setShort(array, index, ((Short) value).shortValue()); + } else if (value instanceof Integer) { + setInt(array, index, ((Integer) value).intValue()); + } else if (value instanceof Long) { + setLong(array, index, ((Long) value).longValue()); + } else if (value instanceof Float) { + setFloat(array, index, ((Float) value).floatValue()); + } else if (value instanceof Double) { + setDouble(array, index, ((Double) value).doubleValue()); + } else { + checkArgument(false); + } } } @@ -171,8 +232,21 @@ } public static void setByte(Object array, int index, byte value) { - checkArgument(array instanceof byte[]); - setByteImpl(array, index, value); + if (array instanceof byte[]) { + setByteImpl(array, index, value); + } else if (array instanceof double[]) { + setDoubleImpl(array, index, value); + } else if (array instanceof float[]) { + setFloatImpl(array, index, value); + } else if (array instanceof int[]) { + setIntImpl(array, index, value); + } else if (array instanceof long[]) { + setLongImpl(array, index, value); + } else if (array instanceof short[]) { + setShortImpl(array, index, value); + } else { + checkArgument(false); + } } private static void setByteImpl(Object array, int index, byte value) { @@ -181,8 +255,19 @@ } public static void setChar(Object array, int index, char value) { - checkArgument(array instanceof char[]); - setCharImpl(array, index, value); + if (array instanceof char[]) { + setCharImpl(array, index, value); + } else if (array instanceof double[]) { + setDoubleImpl(array, index, value); + } else if (array instanceof float[]) { + setFloatImpl(array, index, value); + } else if (array instanceof int[]) { + setIntImpl(array, index, value); + } else if (array instanceof long[]) { + setLongImpl(array, index, value); + } else { + checkArgument(false); + } } private static void setCharImpl(Object array, int index, char value) { @@ -201,8 +286,13 @@ } public static void setFloat(Object array, int index, float value) { - checkArgument(array instanceof float[]); - setFloatImpl(array, index, value); + if (array instanceof float[]) { + setFloatImpl(array, index, value); + } else if (array instanceof double[]) { + setDoubleImpl(array, index, value); + } else { + checkArgument(false); + } } private static void setFloatImpl(Object array, int index, float value) { @@ -211,8 +301,17 @@ } public static void setInt(Object array, int index, int value) { - checkArgument(array instanceof int[]); - setIntImpl(array, index, value); + if (array instanceof int[]) { + setIntImpl(array, index, value); + } else if (array instanceof double[]) { + setDoubleImpl(array, index, value); + } else if (array instanceof float[]) { + setFloatImpl(array, index, value); + } else if (array instanceof long[]) { + setLongImpl(array, index, value); + } else { + checkArgument(false); + } } private static void setIntImpl(Object array, int index, int value) { @@ -221,8 +320,15 @@ } public static void setLong(Object array, int index, long value) { - checkArgument(array instanceof long[]); - setLongImpl(array, index, value); + if (array instanceof long[]) { + setLongImpl(array, index, value); + } else if (array instanceof double[]) { + setDoubleImpl(array, index, value); + } else if (array instanceof float[]) { + setFloatImpl(array, index, value); + } else { + checkArgument(false); + } } private static void setLongImpl(Object array, int index, long value) { @@ -231,8 +337,19 @@ } public static void setShort(Object array, int index, short value) { - checkArgument(array instanceof short[]); - setShortImpl(array, index, value); + if (array instanceof short[]) { + setShortImpl(array, index, value); + } else if (array instanceof double[]) { + setDoubleImpl(array, index, value); + } else if (array instanceof float[]) { + setFloatImpl(array, index, value); + } else if (array instanceof int[]) { + setIntImpl(array, index, value); + } else if (array instanceof long[]) { + setLongImpl(array, index, value); + } else { + checkArgument(false); + } } private static void setShortImpl(Object array, int index, short value) {
diff --git a/user/test/com/google/gwt/emultest/java/lang/reflect/ArrayTest.java b/user/test/com/google/gwt/emultest/java/lang/reflect/ArrayTest.java index 420248c..9a8472f 100644 --- a/user/test/com/google/gwt/emultest/java/lang/reflect/ArrayTest.java +++ b/user/test/com/google/gwt/emultest/java/lang/reflect/ArrayTest.java
@@ -143,6 +143,12 @@ } assertEquals(1.0d, Array.getDouble(new double[] {1.0d}, 0)); + assertEquals(1.0d, Array.getDouble(new float[] {1.0f}, 0)); + assertEquals(1.0d, Array.getDouble(new byte[] {1}, 0)); + assertEquals(1.0d, Array.getDouble(new char[] {1}, 0)); + assertEquals(1.0d, Array.getDouble(new int[] {1}, 0)); + assertEquals(1.0d, Array.getDouble(new long[] {1}, 0)); + assertEquals(1.0d, Array.getDouble(new short[] {1}, 0)); } public void testGetFloat() { @@ -165,6 +171,11 @@ } assertEquals(1.0f, Array.getFloat(new float[] {1.0f}, 0)); + assertEquals(1.0f, Array.getFloat(new byte[] {1}, 0)); + assertEquals(1.0f, Array.getFloat(new char[] {1}, 0)); + assertEquals(1.0f, Array.getFloat(new int[] {1}, 0)); + assertEquals(1.0f, Array.getFloat(new long[] {1}, 0)); + assertEquals(1.0f, Array.getFloat(new short[] {1}, 0)); } public void testGetInt() { @@ -187,6 +198,9 @@ } assertEquals(1, Array.getInt(new int[] {1}, 0)); + assertEquals(1, Array.getInt(new byte[] {1}, 0)); + assertEquals(1, Array.getInt(new char[] {1}, 0)); + assertEquals(1, Array.getInt(new short[] {1}, 0)); } public void testGetLength() { @@ -222,6 +236,10 @@ } assertEquals(1L, Array.getLong(new long[] {1L}, 0)); + assertEquals(1L, Array.getLong(new byte[] {1}, 0)); + assertEquals(1L, Array.getLong(new char[] {1}, 0)); + assertEquals(1L, Array.getLong(new int[] {1}, 0)); + assertEquals(1L, Array.getLong(new short[] {1}, 0)); } public void testGetShort() { @@ -244,6 +262,7 @@ } assertEquals((short) 1, Array.getShort(new short[] {(short) 1}, 0)); + assertEquals((short) 1, Array.getShort(new short[] {1}, 0)); } public void testSet() { @@ -294,6 +313,39 @@ short[] shortArray = new short[1]; Array.set(shortArray, 0, (short) 1); assertEquals((short) 1, shortArray[0]); + + // test widening + long[] otherLongArray = new long[10]; + Array.set(otherLongArray, 0, (byte) 2); + assertEquals(2L, otherLongArray[0]); + + Array.set(otherLongArray, 1, (short) 3); + assertEquals(3L, otherLongArray[1]); + + Array.set(otherLongArray, 2, (char) 4); + assertEquals(4L, otherLongArray[2]); + + Array.set(otherLongArray, 3, 5); + assertEquals(5L, otherLongArray[3]); + + double[] otherDoubleArray = new double[10]; + Array.set(otherDoubleArray, 0, (byte) 2); + assertEquals(2d, otherDoubleArray[0], 0.00001); + + Array.set(otherDoubleArray, 1, (short) 3); + assertEquals(3d, otherDoubleArray[1], 0.00001); + + Array.set(otherDoubleArray, 2, (char) 4); + assertEquals(4d, otherDoubleArray[2], 0.00001); + + Array.set(otherDoubleArray, 3, 5); + assertEquals(5d, otherDoubleArray[3], 0.00001); + + Array.set(otherDoubleArray, 4, (float) 6); + assertEquals(6d, otherDoubleArray[4], 0.00001); + + Array.set(otherDoubleArray, 5, (double) 7); + assertEquals(7d, otherDoubleArray[5], 0.00001); } public void testSetBoolean() { @@ -328,10 +380,29 @@ } catch (RuntimeException expected) { } - byte[] array = new byte[1]; + byte[] bArray = new byte[1]; + Array.setByte(bArray, 0, (byte) 1); + assertEquals((byte) 1, bArray[0]); - Array.setByte(array, 0, (byte) 1); - assertEquals((byte) 1, array[0]); + double[] dArray = new double[1]; + Array.setByte(dArray, 0, (byte) 1); + assertEquals((byte) 1, (byte) dArray[0]); + + float[] fArray = new float[1]; + Array.setByte(fArray, 0, (byte) 1); + assertEquals((byte) 1, (byte) fArray[0]); + + int[] iArray = new int[1]; + Array.setByte(iArray, 0, (byte) 1); + assertEquals((byte) 1, (byte) iArray[0]); + + long[] lArray = new long[1]; + Array.setByte(lArray, 0, (byte) 1); + assertEquals((byte) 1, (byte) lArray[0]); + + short[] sArray = new short[1]; + Array.setByte(sArray, 0, (byte) 1); + assertEquals((byte) 1, (byte) sArray[0]); } public void testSetChar() { @@ -351,6 +422,22 @@ Array.setChar(array, 0, 'a'); assertEquals('a', array[0]); + + double[] dArray = new double[1]; + Array.setChar(dArray, 0, (char) 1); + assertEquals((byte) 1, (byte) dArray[0]); + + float[] fArray = new float[1]; + Array.setChar(fArray, 0, (char) 1); + assertEquals((byte) 1, (byte) fArray[0]); + + int[] iArray = new int[1]; + Array.setChar(iArray, 0, (char) 1); + assertEquals((byte) 1, (byte) iArray[0]); + + long[] lArray = new long[1]; + Array.setChar(lArray, 0, (char) 1); + assertEquals((byte) 1, (byte) lArray[0]); } public void testSetDouble() { @@ -389,6 +476,10 @@ Array.setFloat(array, 0, 1.0f); assertEquals(1.0f, array[0]); + + double[] dArray = new double[1]; + Array.setFloat(dArray, 0, 1); + assertEquals((float) 1, (float) dArray[0]); } public void testSetInt() { @@ -408,6 +499,18 @@ Array.setInt(array, 0, 1); assertEquals(1, array[0]); + + double[] dArray = new double[1]; + Array.setInt(dArray, 0, 1); + assertEquals(1, (int) dArray[0]); + + float[] fArray = new float[1]; + Array.setInt(fArray, 0, 1); + assertEquals(1, (int) fArray[0]); + + long[] lArray = new long[1]; + Array.setInt(lArray, 0, 1); + assertEquals(1, (int) lArray[0]); } public void testSetLong() { @@ -427,6 +530,14 @@ Array.setLong(array, 0, 1L); assertEquals(1L, array[0]); + + double[] dArray = new double[1]; + Array.setLong(dArray, 0, 1); + assertEquals(1L, (long) dArray[0]); + + float[] fArray = new float[1]; + Array.setLong(fArray, 0, 1); + assertEquals(1L, (long) fArray[0]); } public void testSetShort() { @@ -446,5 +557,21 @@ Array.setShort(array, 0, (short) 1); assertEquals((short) 1, array[0]); + + int[] iArray = new int[1]; + Array.setShort(iArray, 0, (short) 1); + assertEquals((short) 1, (short) iArray[0]); + + double[] dArray = new double[1]; + Array.setShort(dArray, 0, (short) 1); + assertEquals((short) 1, (short) dArray[0]); + + float[] fArray = new float[1]; + Array.setShort(fArray, 0, (short) 1); + assertEquals((short) 1, (short) fArray[0]); + + long[] lArray = new long[1]; + Array.setShort(lArray, 0, (short) 1); + assertEquals((short) 1, (short) lArray[0]); } }