< prev index next >

test/jdk/valhalla/valuetypes/ValueArray.java

Print this page
rev 55119 : 8223387: [lworld] reflection support for LW2 arrays

*** 28,46 **** * @compile -XDallowWithFieldOperator ValueArray.java * @run testng/othervm -XX:+EnableValhalla -XX:ValueArrayElemMaxFlatSize=-1 ValueArray * @run testng/othervm -XX:+EnableValhalla -XX:ValueArrayElemMaxFlatSize=0 ValueArray */ ! import java.lang.reflect.*; import java.util.Arrays; import org.testng.annotations.BeforeTest; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import static org.testng.Assert.*; public class ValueArray { @DataProvider(name="arrayTypes") static Object[][] arrayTypes() { return new Object[][] { new Object[] { Object[].class, new Object[] { new Object(), new Object()}}, --- 28,51 ---- * @compile -XDallowWithFieldOperator ValueArray.java * @run testng/othervm -XX:+EnableValhalla -XX:ValueArrayElemMaxFlatSize=-1 ValueArray * @run testng/othervm -XX:+EnableValhalla -XX:ValueArrayElemMaxFlatSize=0 ValueArray */ ! import java.lang.reflect.Array; import java.util.Arrays; import org.testng.annotations.BeforeTest; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import static org.testng.Assert.*; public class ValueArray { + private static Class<?> nullablePointArrayClass() { + Object a = new Point?[0]; + return a.getClass(); + } + @DataProvider(name="arrayTypes") static Object[][] arrayTypes() { return new Object[][] { new Object[] { Object[].class, new Object[] { new Object(), new Object()}},
*** 49,72 **** Point.makePoint(10, 20), Point.makePoint(100, 200)}}, new Object[] { Point[][].class, new Point[][] { new Point[] { Point.makePoint(1, 2), Point.makePoint(10, 20)}}}, ! new Object[] { NonFlattenValue[].class, new NonFlattenValue[] { NonFlattenValue.make(1, 2), NonFlattenValue.make(10, 20), NonFlattenValue.make(100, 200)}}, }; } @Test(dataProvider="arrayTypes") public static void test(Class<?> c, Object[] elements) { ValueArray test = new ValueArray(c, elements.length); test.run(elements); ! if (c.getComponentType().isValue()) { ! test.ensureNonNullable(); } } @Test public static void testPointArray() { --- 54,82 ---- Point.makePoint(10, 20), Point.makePoint(100, 200)}}, new Object[] { Point[][].class, new Point[][] { new Point[] { Point.makePoint(1, 2), Point.makePoint(10, 20)}}}, ! new Object[] { nullablePointArrayClass(), ! new Point?[] { Point.makePoint(11, 22), ! Point.makePoint(110, 220), ! null}}, new Object[] { NonFlattenValue[].class, new NonFlattenValue[] { NonFlattenValue.make(1, 2), NonFlattenValue.make(10, 20), NonFlattenValue.make(100, 200)}}, }; } + @Test(dataProvider="arrayTypes") public static void test(Class<?> c, Object[] elements) { ValueArray test = new ValueArray(c, elements.length); test.run(elements); ! Class<?> compType = c.getComponentType(); ! if (compType.isValue()) { ! test.testSetNullElement(compType == compType.asBoxType()); } } @Test public static void testPointArray() {
*** 74,83 **** --- 84,104 ---- ValueArray test = new ValueArray(array.points); test.run(Point.makePoint(3, 4), Point.makePoint(30, 40)); } @Test + public static void testNullablePointArray() { + Point ?[]array = new Point ?[3]; + array[0] = Point.makePoint(1, 2); + array[1] = null; + array[2] = Point.makePoint(3, 4); + + ValueArray test = new ValueArray(array); + test.run(null, Point.makePoint(3, 4), null); + } + + @Test public static void testIntArray() { int[] array = new int[] { 1, 2, 3}; for (int i=0; i < array.length; i++) { Array.set(array, i, Integer.valueOf(i*10)); }
*** 101,115 **** --- 122,178 ---- Array.set(o, 0, o); throw new AssertionError("IAE not thrown"); } catch (IllegalArgumentException e) {} } + + @Test() + static void testArrayCovariance() { + Point[] lArray = new Point[0]; + Point?[] qArray = new Point?[0]; + + // language instanceof + assertTrue(lArray instanceof Point[]); + assertTrue(qArray instanceof Point?[]); + + // Class.instanceOf (self) + assertTrue(lArray.getClass().isInstance(lArray)); + assertTrue(qArray.getClass().isInstance(qArray)); + + // Class.instanceof inline vs indirect + assertFalse(lArray.getClass().isInstance(qArray)); + assertTrue(qArray.getClass().isInstance(lArray)); + + // Class.isAssignableFrom (self) + assertTrue(lArray.getClass().isAssignableFrom(lArray.getClass())); + assertTrue(qArray.getClass().isAssignableFrom(qArray.getClass())); + + // Class.isAssignableFrom inline vs indirect + assertTrue(qArray.getClass().isAssignableFrom(lArray.getClass())); + assertFalse(lArray.getClass().isAssignableFrom(qArray.getClass())); + + // Class.cast (self) + lArray.getClass().cast(lArray); + qArray.getClass().cast(qArray); + + // Class.cast inline vs indirect + qArray.getClass().cast(lArray); + try { + lArray.getClass().cast(qArray); + fail("cast of Point? to Point should not succeed"); + } catch (ClassCastException cce) { + // expected + } + } + private final Object[] array; + ValueArray(Class<?> arrayClass, int len) { this((Object[])Array.newInstance(arrayClass.getComponentType(), len)); assertTrue(array.getClass() == arrayClass); } + ValueArray(Object[] array) { this.array = array; } void run(Object... elements) {
*** 123,153 **** } Arrays.setAll(array, i -> elements[i]); } ! void ensureNonNullable() { assert(array.getClass().getComponentType().isValue()); for (int i=0; i < array.length; i++) { try { Array.set(array, i, null); throw new AssertionError("NPE not thrown"); ! } catch (NullPointerException e) {} } } static inline class PointArray { ! public Point?[] points; PointArray() { ! points = new Point?[0]; } public static PointArray makeArray(Point... points) { PointArray a = PointArray.default; ! Point?[] boxArray = new Point?[points.length]; for (int i=0; i < points.length; i++) { ! boxArray[i] = points[i]; } ! a = __WithField(a.points, boxArray); return a; } } } --- 186,219 ---- } Arrays.setAll(array, i -> elements[i]); } ! void testSetNullElement(boolean nullable) { assert(array.getClass().getComponentType().isValue()); for (int i=0; i < array.length; i++) { try { Array.set(array, i, null); + if (!nullable) throw new AssertionError("NPE not thrown"); ! } catch (NullPointerException e) { ! assertFalse(nullable); ! } } } static inline class PointArray { ! public Point[] points; PointArray() { ! points = new Point[0]; } public static PointArray makeArray(Point... points) { PointArray a = PointArray.default; ! Point[] array = new Point[points.length]; for (int i=0; i < points.length; i++) { ! array[i] = points[i]; } ! a = __WithField(a.points, array); return a; } } }
< prev index next >