Reusing methods from java.lang.reflect.Array when creating new instances of one-dimensional arrays ArrayReflect
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Fri, 18 Jan 2013 17:04:16 +0100
branchArrayReflect
changeset 47934931e381886
parent 477 22e99afe5083
child 480 dfebf4fbb711
Reusing methods from java.lang.reflect.Array when creating new instances of one-dimensional arrays
emul/src/main/java/java/lang/Object.java
emul/src/main/java/java/lang/reflect/Array.java
emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
     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                  }