Optimistic support for Class.newInstance reflection
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 01 Dec 2012 15:48:12 +0100
branchreflection
changeset 231dde8422fb5ae
parent 230 b22dbc9329ec
child 233 5e8f219d60ba
Optimistic support for Class.newInstance
emul/src/main/java/java/lang/Class.java
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java
vm/src/test/java/org/apidesign/vm4brwsr/Classes.java
     1.1 --- a/emul/src/main/java/java/lang/Class.java	Sat Dec 01 15:30:56 2012 +0100
     1.2 +++ b/emul/src/main/java/java/lang/Class.java	Sat Dec 01 15:48:12 2012 +0100
     1.3 @@ -191,10 +191,15 @@
     1.4       *             </ul>
     1.5       *
     1.6       */
     1.7 +    @JavaScriptBody(args = "self", body =
     1.8 +          "var inst = self.cnstr();"
     1.9 +        + "inst.consV(inst);"
    1.10 +        + "return inst;"
    1.11 +    )
    1.12      public T newInstance()
    1.13          throws InstantiationException, IllegalAccessException
    1.14      {
    1.15 -        throw new UnsupportedOperationException("Should be somehow supported");
    1.16 +        throw new UnsupportedOperationException();
    1.17      }
    1.18  
    1.19      /**
     2.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Sat Dec 01 15:30:56 2012 +0100
     2.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Sat Dec 01 15:48:12 2012 +0100
     2.3 @@ -118,6 +118,7 @@
     2.4          out.append("\n    CLS.$class = java_lang_Class(true);");
     2.5          out.append("\n    CLS.$class.jvmName = '").append(jc.getClassName()).append("';");
     2.6          out.append("\n    CLS.$class.superclass = sprcls;");
     2.7 +        out.append("\n    CLS.$class.cnstr = CLS;");
     2.8          out.append("\n  }");
     2.9          out.append("\n  if (arguments.length === 0) {");
    2.10          out.append("\n    if (!(this instanceof CLS)) {");
     3.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java	Sat Dec 01 15:30:56 2012 +0100
     3.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java	Sat Dec 01 15:48:12 2012 +0100
     3.3 @@ -68,6 +68,12 @@
     3.4      @Test public void jsCanonicalName() throws Exception {
     3.5          assertExec("I/O simple name", Classes.class, "canonicalNameLjava_lang_String", "java.io.IOException");
     3.6      }
     3.7 +    @Test public void javaNewInstance() throws Exception {
     3.8 +        assertTrue(Classes.newInstance());
     3.9 +    }
    3.10 +    @Test public void jsNewInstance() throws Exception {
    3.11 +        assertExec("Check new instance", Classes.class, "newInstanceZ", Double.valueOf(1));
    3.12 +    }
    3.13      
    3.14      private static CharSequence codeSeq;
    3.15      private static Invocable code;
     4.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java	Sat Dec 01 15:30:56 2012 +0100
     4.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java	Sat Dec 01 15:48:12 2012 +0100
     4.3 @@ -47,7 +47,11 @@
     4.4      public static String canonicalName() {
     4.5          return IOException.class.getCanonicalName();
     4.6      }
     4.7 -    public static IOException newInstance() throws InstantiationException, IllegalAccessException {
     4.8 -        return IOException.class.newInstance();
     4.9 +    public static boolean newInstance() throws Exception {
    4.10 +        IOException ioe = IOException.class.newInstance();
    4.11 +        if (ioe instanceof IOException) {
    4.12 +            return ioe.getClass() == IOException.class;
    4.13 +        }
    4.14 +        throw new IllegalStateException("Not a subtype: " + ioe);
    4.15      }
    4.16  }