# HG changeset patch # User Jaroslav Tulach # Date 1354373292 -3600 # Node ID dde8422fb5ae17bb720cf861b792b729dc04124c # Parent b22dbc9329ece460ce1200eecf361f9393536b97 Optimistic support for Class.newInstance diff -r b22dbc9329ec -r dde8422fb5ae emul/src/main/java/java/lang/Class.java --- a/emul/src/main/java/java/lang/Class.java Sat Dec 01 15:30:56 2012 +0100 +++ b/emul/src/main/java/java/lang/Class.java Sat Dec 01 15:48:12 2012 +0100 @@ -191,10 +191,15 @@ * * */ + @JavaScriptBody(args = "self", body = + "var inst = self.cnstr();" + + "inst.consV(inst);" + + "return inst;" + ) public T newInstance() throws InstantiationException, IllegalAccessException { - throw new UnsupportedOperationException("Should be somehow supported"); + throw new UnsupportedOperationException(); } /** diff -r b22dbc9329ec -r dde8422fb5ae vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Dec 01 15:30:56 2012 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Dec 01 15:48:12 2012 +0100 @@ -118,6 +118,7 @@ out.append("\n CLS.$class = java_lang_Class(true);"); out.append("\n CLS.$class.jvmName = '").append(jc.getClassName()).append("';"); out.append("\n CLS.$class.superclass = sprcls;"); + out.append("\n CLS.$class.cnstr = CLS;"); out.append("\n }"); out.append("\n if (arguments.length === 0) {"); out.append("\n if (!(this instanceof CLS)) {"); diff -r b22dbc9329ec -r dde8422fb5ae vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java Sat Dec 01 15:30:56 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java Sat Dec 01 15:48:12 2012 +0100 @@ -68,6 +68,12 @@ @Test public void jsCanonicalName() throws Exception { assertExec("I/O simple name", Classes.class, "canonicalNameLjava_lang_String", "java.io.IOException"); } + @Test public void javaNewInstance() throws Exception { + assertTrue(Classes.newInstance()); + } + @Test public void jsNewInstance() throws Exception { + assertExec("Check new instance", Classes.class, "newInstanceZ", Double.valueOf(1)); + } private static CharSequence codeSeq; private static Invocable code; diff -r b22dbc9329ec -r dde8422fb5ae vm/src/test/java/org/apidesign/vm4brwsr/Classes.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java Sat Dec 01 15:30:56 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java Sat Dec 01 15:48:12 2012 +0100 @@ -47,7 +47,11 @@ public static String canonicalName() { return IOException.class.getCanonicalName(); } - public static IOException newInstance() throws InstantiationException, IllegalAccessException { - return IOException.class.newInstance(); + public static boolean newInstance() throws Exception { + IOException ioe = IOException.class.newInstance(); + if (ioe instanceof IOException) { + return ioe.getClass() == IOException.class; + } + throw new IllegalStateException("Not a subtype: " + ioe); } }