# HG changeset patch # User Jaroslav Tulach # Date 1465532821 -7200 # Node ID a83ae75ebf89ce164c142c9123c8d4f48a6a019e # Parent de609e0cdab56e70a5838e2417962c671b62e333 Recognizes and invokes direct library constructor diff -r de609e0cdab5 -r a83ae75ebf89 rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jun 10 05:52:44 2016 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jun 10 06:27:01 2016 +0200 @@ -1200,9 +1200,18 @@ case opc_new: { int indx = readUShortArg(byteCodes, i); String ci = jc.getClassName(indx); - emit(smapper, this, "var @1 = new @2;", - smapper.pushA(), accessClass(mangleClassName(ci))); - addReference(ci); + if (DirectlLibraries.isScriptLibrary(ci)) { + int last = ci.lastIndexOf('/'); + emit(smapper, this, "var @1 = new @2", + smapper.pushA(), ci.substring(last + 1) + ); + // no new line + outChanged = false; + } else { + emit(smapper, this, "var @1 = new @2;", + smapper.pushA(), accessClass(mangleClassName(ci))); + addReference(ci); + } i += 2; break; } @@ -1822,15 +1831,25 @@ final String in = mi[0]; String mcn; + final boolean direct = DirectlLibraries.isScriptLibrary(in); + boolean skipThis = false; if (callbacks && ( in.equals("org/apidesign/html/boot/spi/Fn") || in.equals("org/netbeans/html/boot/spi/Fn") )) { mcn = "java_lang_Class"; - } else if (DirectlLibraries.isScriptLibrary(in) && in.endsWith("/Exports")) { - append(mi[1]); - append('('); - mcn = null; + } else if (direct) { + if (in.endsWith("/Exports")) { + append(mi[1]); + append('('); + mcn = null; + } else if (mn.startsWith("cons_")) { + append('('); + mcn = null; + skipThis = true; + } else { + mcn = mangleClassName(in); + } } else { mcn = mangleClassName(in); } @@ -1848,10 +1867,17 @@ addReference(in); } if (numArguments > 0) { - append(vars[0]); + String sep; + if (!skipThis) { + append(vars[0]); + sep = ", "; + } else { + sep = ""; + } for (int j = 1; j < numArguments; ++j) { - append(", "); + append(sep); append(vars[j]); + sep = ", "; } } append(");"); diff -r de609e0cdab5 -r a83ae75ebf89 rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUse.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUse.java Fri Jun 10 05:52:44 2016 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUse.java Fri Jun 10 06:27:01 2016 +0200 @@ -17,6 +17,7 @@ */ package org.apidesign.vm4brwsr; +import net.java.html.lib.Date; import static net.java.html.lib.Exports.NaN; import static net.java.html.lib.Exports.eval; import static net.java.html.lib.Exports.isNaN; @@ -57,4 +58,9 @@ return isNaN(nan); } + public double dateOperation() throws Exception { + Date eleven = new Date(2016, 1, 10); + return eleven.getFullYear() + eleven.getMonth(); + } + } diff -r de609e0cdab5 -r a83ae75ebf89 rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUseTest.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUseTest.java Fri Jun 10 05:52:44 2016 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUseTest.java Fri Jun 10 06:27:01 2016 +0200 @@ -82,4 +82,13 @@ true ); } + + @Test + public void assertDateOperation() throws Exception { + code.assertExec( + "Create and read date", LibUse.class, + "dateOperation__D", + 2017.0 + ); + } }