# HG changeset patch # User Jaroslav Tulach # Date 1399367560 -7200 # Node ID c02c6d4094616fab5ba4f5b9b37b807cc00ed12c # Parent ca538fb33f48d627bbbd70c6c2ea515b6e21a1da Storing constructor function in last element of multidimensional array diff -r ca538fb33f48 -r c02c6d409461 rt/emul/mini/src/main/java/java/lang/reflect/Array.java --- a/rt/emul/mini/src/main/java/java/lang/reflect/Array.java Tue May 06 10:08:42 2014 +0200 +++ b/rt/emul/mini/src/main/java/java/lang/reflect/Array.java Tue May 06 11:12:40 2014 +0200 @@ -677,16 +677,20 @@ // private static native void log(Object m); @Exported - private static Object multiNewArray(String sig, int[] dims, int index) + private static Object multiNewArray(String sig, int[] dims, Object fn) + throws IllegalArgumentException, NegativeArraySizeException { + return multiNewArray(sig, dims, 0, fn); + } + private static Object multiNewArray(String sig, int[] dims, int index, Object fn) throws IllegalArgumentException, NegativeArraySizeException { if (dims.length == index + 1) { - return newArray(sig.length() == 2, sig, null, dims[index]); + return newArray(sig.length() == 2, sig, fn, dims[index]); } Object arr = newArray(false, sig, null, dims[index]); String compsig = sig.substring(1); int len = getLength(arr); for (int i = 0; i < len; i++) { - setArray(arr, i, multiNewArray(compsig, dims, index + 1)); + setArray(arr, i, multiNewArray(compsig, dims, index + 1, fn)); } return arr; } diff -r ca538fb33f48 -r c02c6d409461 rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue May 06 10:08:42 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue May 06 11:12:40 2014 +0200 @@ -2147,9 +2147,14 @@ dims.insert(1, smapper.popI()); } dims.append(']'); + String fn = "null"; + if (typeName.charAt(dim) == 'L') { + fn = "vm." + mangleClassName(typeName.substring(dim + 1, typeName.length() - 1)); + } emit(smapper, this, - "var @2 = Array.prototype['multiNewArray__Ljava_lang_Object_2Ljava_lang_String_2_3II']('@3', @1, 0);", - dims.toString(), smapper.pushA(), typeName); + "var @2 = Array.prototype['multiNewArray__Ljava_lang_Object_2Ljava_lang_String_2_3ILjava_lang_Object_2']('@3', @1, @4);", + dims.toString(), smapper.pushA(), typeName, fn + ); return i; } diff -r ca538fb33f48 -r c02c6d409461 rt/vm/src/test/java/org/apidesign/vm4brwsr/Array.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/Array.java Tue May 06 10:08:42 2014 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/Array.java Tue May 06 11:12:40 2014 +0200 @@ -77,6 +77,7 @@ } public static double sum() { + disableClassForName(); double sum = 0.0; for (Array[] row : arr()) { int indx = -1; @@ -111,7 +112,11 @@ } public static String objectArrayClass() { - return Object[].class.getName(); + enableClassForName(prevClassForName); + prevClassForName = null; + String s = Object[].class.getName(); + disableClassForName(); + return s; } public static boolean instanceOfArray(Object obj) { @@ -169,13 +174,29 @@ } @JavaScriptBody(args = { }, body = - "if (!vm.java_lang_Class(false).forName__Ljava_lang_Class_2Ljava_lang_String_2) throw 'forName not defined';\n" + "var prev = vm.java_lang_Class(false).forName__Ljava_lang_Class_2Ljava_lang_String_2;\n" + + "if (!prev) throw 'forName not defined';\n" + "vm.java_lang_Class(false).forName__Ljava_lang_Class_2Ljava_lang_String_2 = function(s) {\n" + " throw 'Do not call me: ' + s;\n" - + "};\n") - private static void disableClassForName() { + + "};\n" + + "return prev;\n") + private static Object disableClassForNameImpl() { + return null; } + private static void disableClassForName() { + if (prevClassForName == null) { + prevClassForName = disableClassForNameImpl(); + } + } + + @JavaScriptBody(args = { "fn" }, body = + "if (fn !== null) vm.java_lang_Class(false).forName__Ljava_lang_Class_2Ljava_lang_String_2 = fn;" + ) + private static void enableClassForName(Object fn) { + } + + private static Object prevClassForName; public static String nameOfClonedComponent() { disableClassForName(); Object[] intArr = new Integer[10];