# HG changeset patch # User Jaroslav Tulach # Date 1358525056 -3600 # Node ID 34931e3818869f13fe02c4319c4a85e6e32a7278 # Parent 22e99afe50830bd4724584952aa2fdb7142c2345 Reusing methods from java.lang.reflect.Array when creating new instances of one-dimensional arrays diff -r 22e99afe5083 -r 34931e381886 emul/src/main/java/java/lang/Object.java --- a/emul/src/main/java/java/lang/Object.java Fri Jan 18 16:52:20 2013 +0100 +++ b/emul/src/main/java/java/lang/Object.java Fri Jan 18 17:04:16 2013 +0100 @@ -25,6 +25,7 @@ package java.lang; +import java.lang.reflect.Array; import org.apidesign.bck2brwsr.core.JavaScriptBody; import org.apidesign.bck2brwsr.core.JavaScriptPrototype; @@ -40,8 +41,13 @@ @JavaScriptPrototype(container = "Object.prototype", prototype = "new Object") public class Object { - @JavaScriptBody(args = {}, body = "") - private static native void registerNatives(); + private static void registerNatives() { + try { + Array.get(null, 0); + } catch (Throwable ex) { + // ignore + } + } static { registerNatives(); } diff -r 22e99afe5083 -r 34931e381886 emul/src/main/java/java/lang/reflect/Array.java --- a/emul/src/main/java/java/lang/reflect/Array.java Fri Jan 18 16:52:20 2013 +0100 +++ b/emul/src/main/java/java/lang/reflect/Array.java Fri Jan 18 17:04:16 2013 +0100 @@ -26,6 +26,7 @@ package java.lang.reflect; import org.apidesign.bck2brwsr.core.JavaScriptBody; +import org.apidesign.bck2brwsr.core.JavaScriptPrototype; /** * The {@code Array} class provides static methods to dynamically create and @@ -37,6 +38,7 @@ * * @author Nakul Saraiya */ +@JavaScriptPrototype(prototype = "new Array", container = "Array.prototype") public final class Array { diff -r 22e99afe5083 -r 34931e381886 emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js --- a/emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js Fri Jan 18 16:52:20 2013 +0100 +++ b/emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js Fri Jan 18 17:04:16 2013 +0100 @@ -1,4 +1,5 @@ -// initialize methods on String constants +// initialize methods on arrays and String constants +vm.java_lang_reflect_Array(false); vm.java_lang_String(false); // we need initialized arrays diff -r 22e99afe5083 -r 34931e381886 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jan 18 16:52:20 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jan 18 17:04:16 2013 +0100 @@ -926,7 +926,7 @@ case 11: jvmType = "[J"; break; default: throw new IllegalStateException("Array type: " + atype); } - emit(out, "@2 = new Array(@1).initWith('@3', 0);", + emit(out, "@2 = Array.prototype.newArray__Ljava_lang_Object_2ZLjava_lang_String_2I(true, '@3', @1);", smapper.popI(), smapper.pushA(), jvmType); break; case opc_anewarray: { @@ -938,7 +938,7 @@ } else { typeName = "[L" + typeName + ";"; } - emit(out, "@2 = new Array(@1).initWith('@3', null);", + emit(out, "@2 = Array.prototype.newArray__Ljava_lang_Object_2ZLjava_lang_String_2I(false, '@3', @1);", smapper.popI(), smapper.pushA(), typeName); break; }