Reusing methods from java.lang.reflect.Array when creating new instances of one-dimensional arrays
1.1 --- a/emul/src/main/java/java/lang/Object.java Fri Jan 18 16:52:20 2013 +0100
1.2 +++ b/emul/src/main/java/java/lang/Object.java Fri Jan 18 17:04:16 2013 +0100
1.3 @@ -25,6 +25,7 @@
1.4
1.5 package java.lang;
1.6
1.7 +import java.lang.reflect.Array;
1.8 import org.apidesign.bck2brwsr.core.JavaScriptBody;
1.9 import org.apidesign.bck2brwsr.core.JavaScriptPrototype;
1.10
1.11 @@ -40,8 +41,13 @@
1.12 @JavaScriptPrototype(container = "Object.prototype", prototype = "new Object")
1.13 public class Object {
1.14
1.15 - @JavaScriptBody(args = {}, body = "")
1.16 - private static native void registerNatives();
1.17 + private static void registerNatives() {
1.18 + try {
1.19 + Array.get(null, 0);
1.20 + } catch (Throwable ex) {
1.21 + // ignore
1.22 + }
1.23 + }
1.24 static {
1.25 registerNatives();
1.26 }
2.1 --- a/emul/src/main/java/java/lang/reflect/Array.java Fri Jan 18 16:52:20 2013 +0100
2.2 +++ b/emul/src/main/java/java/lang/reflect/Array.java Fri Jan 18 17:04:16 2013 +0100
2.3 @@ -26,6 +26,7 @@
2.4 package java.lang.reflect;
2.5
2.6 import org.apidesign.bck2brwsr.core.JavaScriptBody;
2.7 +import org.apidesign.bck2brwsr.core.JavaScriptPrototype;
2.8
2.9 /**
2.10 * The {@code Array} class provides static methods to dynamically create and
2.11 @@ -37,6 +38,7 @@
2.12 *
2.13 * @author Nakul Saraiya
2.14 */
2.15 +@JavaScriptPrototype(prototype = "new Array", container = "Array.prototype")
2.16 public final
2.17 class Array {
2.18
3.1 --- a/emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js Fri Jan 18 16:52:20 2013 +0100
3.2 +++ b/emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js Fri Jan 18 17:04:16 2013 +0100
3.3 @@ -1,4 +1,5 @@
3.4 -// initialize methods on String constants
3.5 +// initialize methods on arrays and String constants
3.6 +vm.java_lang_reflect_Array(false);
3.7 vm.java_lang_String(false);
3.8
3.9 // we need initialized arrays
4.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jan 18 16:52:20 2013 +0100
4.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jan 18 17:04:16 2013 +0100
4.3 @@ -926,7 +926,7 @@
4.4 case 11: jvmType = "[J"; break;
4.5 default: throw new IllegalStateException("Array type: " + atype);
4.6 }
4.7 - emit(out, "@2 = new Array(@1).initWith('@3', 0);",
4.8 + emit(out, "@2 = Array.prototype.newArray__Ljava_lang_Object_2ZLjava_lang_String_2I(true, '@3', @1);",
4.9 smapper.popI(), smapper.pushA(), jvmType);
4.10 break;
4.11 case opc_anewarray: {
4.12 @@ -938,7 +938,7 @@
4.13 } else {
4.14 typeName = "[L" + typeName + ";";
4.15 }
4.16 - emit(out, "@2 = new Array(@1).initWith('@3', null);",
4.17 + emit(out, "@2 = Array.prototype.newArray__Ljava_lang_Object_2ZLjava_lang_String_2I(false, '@3', @1);",
4.18 smapper.popI(), smapper.pushA(), typeName);
4.19 break;
4.20 }