# HG changeset patch # User Jaroslav Tulach # Date 1358530517 -3600 # Node ID dfebf4fbb7110ff1c4fcf8abc7493c44c8de7e08 # Parent 34931e3818869f13fe02c4319c4a85e6e32a7278 Array.newInstance with multiple dimensions diff -r 34931e381886 -r dfebf4fbb711 emul/src/main/java/java/lang/reflect/Array.java --- a/emul/src/main/java/java/lang/reflect/Array.java Fri Jan 18 17:04:16 2013 +0100 +++ b/emul/src/main/java/java/lang/reflect/Array.java Fri Jan 18 18:35:17 2013 +0100 @@ -143,7 +143,12 @@ */ public static Object newInstance(Class componentType, int... dimensions) throws IllegalArgumentException, NegativeArraySizeException { - return multiNewArray(componentType, dimensions); + StringBuilder sig = new StringBuilder(); + for (int i = 1; i < dimensions.length; i++) { + sig.append('['); + } + sig.append(findSignature(componentType)); + return multiNewArray(sig.toString(), dimensions, 0); } /** @@ -521,9 +526,18 @@ ) private static native Object newArray(boolean primitive, String sig, int length); - private static native Object multiNewArray(Class componentType, - int[] dimensions) - throws IllegalArgumentException, NegativeArraySizeException; + private static Object multiNewArray(String sig, int[] dims, int index) + throws IllegalArgumentException, NegativeArraySizeException { + if (dims.length == index + 1) { + return newArray(sig.length() == 2, sig, dims[index]); + } + Object[] arr = (Object[]) newArray(false, sig, dims[index]); + String compsig = sig.substring(1); + for (int i = 0; i < arr.length; i++) { + arr[i] = multiNewArray(compsig, dims, index + 1); + } + return arr; + } diff -r 34931e381886 -r dfebf4fbb711 vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionArrayTest.java --- a/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionArrayTest.java Fri Jan 18 17:04:16 2013 +0100 +++ b/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionArrayTest.java Fri Jan 18 18:35:17 2013 +0100 @@ -55,6 +55,15 @@ return Array.newInstance(int.class, -5); } + @Compare public int multiIntArray() { + int[][][] arr = (int[][][]) Array.newInstance(int.class, 3, 3, 3); + return arr[0][1][2] + 5 + arr[2][2][0]; + } + + @Compare public String multiIntArrayCompType() { + return Array.newInstance(int.class, 3, 3, 3).getClass().getName(); + } + @Factory public static Object[] create() {