Recognizes and invokes direct library constructor Libraries
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Fri, 10 Jun 2016 06:27:01 +0200
branchLibraries
changeset 1972a83ae75ebf89
parent 1971 de609e0cdab5
child 1973 720f1f8bc9c8
Recognizes and invokes direct library constructor
rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUse.java
rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUseTest.java
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Fri Jun 10 05:52:44 2016 +0200
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Fri Jun 10 06:27:01 2016 +0200
     1.3 @@ -1200,9 +1200,18 @@
     1.4                  case opc_new: {
     1.5                      int indx = readUShortArg(byteCodes, i);
     1.6                      String ci = jc.getClassName(indx);
     1.7 -                    emit(smapper, this, "var @1 = new @2;",
     1.8 -                         smapper.pushA(), accessClass(mangleClassName(ci)));
     1.9 -                    addReference(ci);
    1.10 +                    if (DirectlLibraries.isScriptLibrary(ci)) {
    1.11 +                        int last = ci.lastIndexOf('/');
    1.12 +                        emit(smapper, this, "var @1 = new @2",
    1.13 +                            smapper.pushA(), ci.substring(last + 1)
    1.14 +                        );
    1.15 +                        // no new line
    1.16 +                        outChanged = false;
    1.17 +                    } else {
    1.18 +                        emit(smapper, this, "var @1 = new @2;",
    1.19 +                             smapper.pushA(), accessClass(mangleClassName(ci)));
    1.20 +                        addReference(ci);
    1.21 +                    }
    1.22                      i += 2;
    1.23                      break;
    1.24                  }
    1.25 @@ -1822,15 +1831,25 @@
    1.26  
    1.27          final String in = mi[0];
    1.28          String mcn;
    1.29 +        final boolean direct = DirectlLibraries.isScriptLibrary(in);
    1.30 +        boolean skipThis = false;
    1.31          if (callbacks && (
    1.32              in.equals("org/apidesign/html/boot/spi/Fn") ||
    1.33              in.equals("org/netbeans/html/boot/spi/Fn")
    1.34          )) {
    1.35              mcn = "java_lang_Class";
    1.36 -        } else if (DirectlLibraries.isScriptLibrary(in) && in.endsWith("/Exports")) {
    1.37 -            append(mi[1]);
    1.38 -            append('(');
    1.39 -            mcn = null;
    1.40 +        } else if (direct) {
    1.41 +            if (in.endsWith("/Exports")) {
    1.42 +                append(mi[1]);
    1.43 +                append('(');
    1.44 +                mcn = null;
    1.45 +            } else if (mn.startsWith("cons_")) {
    1.46 +                append('(');
    1.47 +                mcn = null;
    1.48 +                skipThis = true;
    1.49 +            } else {
    1.50 +                mcn = mangleClassName(in);
    1.51 +            }
    1.52          } else {
    1.53              mcn = mangleClassName(in);
    1.54          }
    1.55 @@ -1848,10 +1867,17 @@
    1.56              addReference(in);
    1.57          }
    1.58          if (numArguments > 0) {
    1.59 -            append(vars[0]);
    1.60 +            String sep;
    1.61 +            if (!skipThis) {
    1.62 +                append(vars[0]);
    1.63 +                sep = ", ";
    1.64 +            } else {
    1.65 +                sep = "";
    1.66 +            }
    1.67              for (int j = 1; j < numArguments; ++j) {
    1.68 -                append(", ");
    1.69 +                append(sep);
    1.70                  append(vars[j]);
    1.71 +                sep = ", ";
    1.72              }
    1.73          }
    1.74          append(");");
     2.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUse.java	Fri Jun 10 05:52:44 2016 +0200
     2.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUse.java	Fri Jun 10 06:27:01 2016 +0200
     2.3 @@ -17,6 +17,7 @@
     2.4   */
     2.5  package org.apidesign.vm4brwsr;
     2.6  
     2.7 +import net.java.html.lib.Date;
     2.8  import static net.java.html.lib.Exports.NaN;
     2.9  import static net.java.html.lib.Exports.eval;
    2.10  import static net.java.html.lib.Exports.isNaN;
    2.11 @@ -57,4 +58,9 @@
    2.12          return isNaN(nan);
    2.13      }
    2.14  
    2.15 +    public double dateOperation() throws Exception {
    2.16 +        Date eleven = new Date(2016, 1, 10);
    2.17 +        return eleven.getFullYear() + eleven.getMonth();
    2.18 +    }
    2.19 +
    2.20  }
     3.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUseTest.java	Fri Jun 10 05:52:44 2016 +0200
     3.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUseTest.java	Fri Jun 10 06:27:01 2016 +0200
     3.3 @@ -82,4 +82,13 @@
     3.4              true
     3.5          );
     3.6      }
     3.7 +
     3.8 +    @Test
     3.9 +    public void assertDateOperation() throws Exception {
    3.10 +        code.assertExec(
    3.11 +            "Create and read date", LibUse.class,
    3.12 +            "dateOperation__D",
    3.13 +            2017.0
    3.14 +        );
    3.15 +    }
    3.16  }