Following standard object oriented calling conventions. Method run of Runnable r can now be called as r.run__V() UseFunctionCall
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 14 Jan 2013 10:57:51 +0100
branchUseFunctionCall
changeset 442b107ed66f2e7
parent 437 d7ec46950980
child 443 9359b006782b
Following standard object oriented calling conventions. Method run of Runnable r can now be called as r.run__V()
emul/src/main/java/java/lang/Class.java
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
vm/src/main/java/org/apidesign/vm4brwsr/LocalsMapper.java
vm/src/main/java/org/apidesign/vm4brwsr/VM.java
vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java
vm/src/test/java/org/apidesign/vm4brwsr/Instance.java
vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java
     1.1 --- a/emul/src/main/java/java/lang/Class.java	Sun Jan 13 06:59:05 2013 +0100
     1.2 +++ b/emul/src/main/java/java/lang/Class.java	Mon Jan 14 10:57:51 2013 +0100
     1.3 @@ -216,7 +216,7 @@
     1.4          + "\nif (c['cons__V']) {"
     1.5          + "\n  if ((c.cons__V.access & 0x1) != 0) {"
     1.6          + "\n    var inst = c();"
     1.7 -        + "\n    c.cons__V(inst);"
     1.8 +        + "\n    c.cons__V.call(inst);"
     1.9          + "\n    return inst;"
    1.10          + "\n  }"
    1.11          + "\n  return illegal;"
     2.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Sun Jan 13 06:59:05 2013 +0100
     2.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Mon Jan 14 10:57:51 2013 +0100
     2.3 @@ -249,7 +249,7 @@
     2.4                  new LocalsMapper(stackMapIterator.getArguments());
     2.5  
     2.6          out.append(prefix).append(name).append(" = function(");
     2.7 -        lmapper.outputArguments(out);
     2.8 +        lmapper.outputArguments(out, m.isStatic());
     2.9          out.append(") {").append("\n");
    2.10  
    2.11          final byte[] byteCodes = m.getCode();
    2.12 @@ -275,6 +275,9 @@
    2.13                  out.append(';');
    2.14              }
    2.15          }
    2.16 +        if (!m.isStatic()) {
    2.17 +            out.append("  var ").append(" lcA0 = this;\n");
    2.18 +        }
    2.19  
    2.20          // maxStack includes two stack positions for every pushed long / double
    2.21          // so this might generate more stack variables than we need
    2.22 @@ -1330,7 +1333,11 @@
    2.23              out.append("constructor.");
    2.24          }
    2.25          out.append(mn);
    2.26 -        out.append('(');
    2.27 +        if (isStatic) {
    2.28 +            out.append('(');
    2.29 +        } else {
    2.30 +            out.append(".call(");
    2.31 +        }
    2.32          if (numArguments > 0) {
    2.33              out.append(vars[0]);
    2.34              for (int j = 1; j < numArguments; ++j) {
    2.35 @@ -1366,10 +1373,11 @@
    2.36          out.append(vars[0]).append('.');
    2.37          out.append(mn);
    2.38          out.append('(');
    2.39 -        out.append(vars[0]);
    2.40 +        String sep = "";
    2.41          for (int j = 1; j < numArguments; ++j) {
    2.42 -            out.append(", ");
    2.43 +            out.append(sep);
    2.44              out.append(vars[j]);
    2.45 +            sep = ", ";
    2.46          }
    2.47          out.append(");");
    2.48          i += 2;
    2.49 @@ -1443,13 +1451,11 @@
    2.50          final String mn = findMethodName(m, cnt);
    2.51          out.append(prefix).append(mn);
    2.52          out.append(" = function(");
    2.53 -        String space;
    2.54 +        String space = "";
    2.55          int index;
    2.56          if (!isStatic) {                
    2.57 -            space = outputArg(out, p.args, 0);
    2.58              index = 1;
    2.59          } else {
    2.60 -            space = "";
    2.61              index = 0;
    2.62          }
    2.63          for (int i = 0; i < cnt.length(); i++) {
    2.64 @@ -1458,6 +1464,9 @@
    2.65              index++;
    2.66          }
    2.67          out.append(") {").append("\n");
    2.68 +        if (!isStatic) {
    2.69 +            out.append("  var ").append(p.args[0]).append(" = this;\n");
    2.70 +        }
    2.71          out.append(p.body);
    2.72          out.append("\n}\n");
    2.73          return mn;
    2.74 @@ -1600,7 +1609,7 @@
    2.75                      out.append("  stA0 = e;");
    2.76                      out.append("} else {");
    2.77                      out.append("  stA0 = vm.java_lang_Throwable(true);");
    2.78 -                    out.append("  vm.java_lang_Throwable.cons__VLjava_lang_String_2(stA0, e.toString());");
    2.79 +                    out.append("  vm.java_lang_Throwable.cons__VLjava_lang_String_2.call(stA0, e.toString());");
    2.80                      out.append("}");
    2.81                      out.append("gt=" + e.handler_pc + "; continue;");
    2.82                  } else {
     3.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/LocalsMapper.java	Sun Jan 13 06:59:05 2013 +0100
     3.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/LocalsMapper.java	Mon Jan 14 10:57:51 2013 +0100
     3.3 @@ -33,13 +33,14 @@
     3.4          localTypeRecords = new TypeArray(initTypeRecords);
     3.5      }
     3.6  
     3.7 -    public void outputArguments(final Appendable out) throws IOException {
     3.8 +    public void outputArguments(final Appendable out, boolean isStatic) throws IOException {
     3.9          final int argRecordCount = argTypeRecords.getSize();
    3.10 -        if (argRecordCount > 0) {
    3.11 -            Variable variable = getVariable(argTypeRecords, 0);
    3.12 +        int first = isStatic ? 0 : 1;
    3.13 +        if (argRecordCount > first) {
    3.14 +            Variable variable = getVariable(argTypeRecords, first);
    3.15              out.append(variable);
    3.16  
    3.17 -            int i = variable.isCategory2() ? 2 : 1;
    3.18 +            int i = first + (variable.isCategory2() ? 2 : 1);
    3.19              while (i < argRecordCount) {
    3.20                  variable = getVariable(argTypeRecords, i);
    3.21                  out.append(", ");
     4.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Sun Jan 13 06:59:05 2013 +0100
     4.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Mon Jan 14 10:57:51 2013 +0100
     4.3 @@ -117,7 +117,7 @@
     4.4              + "    var loader = {};\n"
     4.5              + "    loader.vm = vm;\n"
     4.6              + "    loader.loadClass = function(name) {\n"
     4.7 -            + "      var attr = name.replace__Ljava_lang_String_2CC(name, '.','_');\n"
     4.8 +            + "      var attr = name.replace__Ljava_lang_String_2CC('.','_');\n"
     4.9              + "      var fn = vm[attr];\n"
    4.10              + "      if (fn) return fn(false);\n"
    4.11              + "      if (!args[0]) throw 'bck2brwsr initialized without loader function, cannot load ' + name;\n"
     5.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java	Sun Jan 13 06:59:05 2013 +0100
     5.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java	Mon Jan 14 10:57:51 2013 +0100
     5.3 @@ -114,15 +114,15 @@
     5.4          
     5.5          @JavaScriptBody(args = {"self", "n"},
     5.6          body =
     5.7 -        "var cls = n.replace__Ljava_lang_String_2CC(n, '/','_').toString();"
     5.8 -        + "\nvar dot = n.replace__Ljava_lang_String_2CC(n,'/','.').toString();"
     5.9 +        "var cls = n.replace__Ljava_lang_String_2CC('/','_').toString();"
    5.10 +        + "\nvar dot = n.replace__Ljava_lang_String_2CC('/','.').toString();"
    5.11          + "\nvar lazy = self.fld_lazy;"
    5.12          + "\nvar loader = lazy.fld_loader;"
    5.13          + "\nvar vm = loader.vm;"
    5.14          + "\nif (vm[cls]) return false;"
    5.15          + "\nvm[cls] = function() {"
    5.16          + "\n  var instance = arguments.length == 0 || arguments[0] === true;"
    5.17 -        + "\n  return lazy.load__Ljava_lang_Object_2Ljava_lang_String_2Z(lazy, dot, instance);"
    5.18 +        + "\n  return lazy.load__Ljava_lang_Object_2Ljava_lang_String_2Z(dot, instance);"
    5.19          + "\n};"
    5.20          + "\nreturn true;")
    5.21          @Override
     6.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java	Sun Jan 13 06:59:05 2013 +0100
     6.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java	Mon Jan 14 10:57:51 2013 +0100
     6.3 @@ -125,4 +125,11 @@
     6.4      public static boolean iofObject() {
     6.5          return jsObj() instanceof Object;
     6.6      }
     6.7 +    
     6.8 +    public static int jscall() {
     6.9 +        return jsgetbytes(new Instance());
    6.10 +    }
    6.11 +    
    6.12 +    @JavaScriptBody(args = { "instance" }, body = "return instance.getByte__B();")
    6.13 +    private static native int jsgetbytes(Instance instance);
    6.14  }
     7.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java	Sun Jan 13 06:59:05 2013 +0100
     7.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java	Mon Jan 14 10:57:51 2013 +0100
     7.3 @@ -131,6 +131,14 @@
     7.4              Double.valueOf(1)
     7.5          );
     7.6      }
     7.7 +
     7.8 +    @Test public void jsCallingConvention() throws Exception {
     7.9 +        assertExec(
    7.10 +            "Pointer to 'this' is passed automatically (and not as a first argument)",
    7.11 +            Instance.class, "jscall__I",
    7.12 +            Double.valueOf(31)
    7.13 +        );
    7.14 +    }
    7.15      
    7.16      protected String startCompilationWith() {
    7.17          return "org/apidesign/vm4brwsr/Instance";