Following standard object oriented calling conventions. Method run of Runnable r can now be called as r.run__V()
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";