diff -r 12e866a32b40 -r b107ed66f2e7 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jan 11 16:36:28 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Jan 14 10:57:51 2013 +0100 @@ -249,7 +249,7 @@ new LocalsMapper(stackMapIterator.getArguments()); out.append(prefix).append(name).append(" = function("); - lmapper.outputArguments(out); + lmapper.outputArguments(out, m.isStatic()); out.append(") {").append("\n"); final byte[] byteCodes = m.getCode(); @@ -275,6 +275,9 @@ out.append(';'); } } + if (!m.isStatic()) { + out.append(" var ").append(" lcA0 = this;\n"); + } // maxStack includes two stack positions for every pushed long / double // so this might generate more stack variables than we need @@ -1330,7 +1333,11 @@ out.append("constructor."); } out.append(mn); - out.append('('); + if (isStatic) { + out.append('('); + } else { + out.append(".call("); + } if (numArguments > 0) { out.append(vars[0]); for (int j = 1; j < numArguments; ++j) { @@ -1366,10 +1373,11 @@ out.append(vars[0]).append('.'); out.append(mn); out.append('('); - out.append(vars[0]); + String sep = ""; for (int j = 1; j < numArguments; ++j) { - out.append(", "); + out.append(sep); out.append(vars[j]); + sep = ", "; } out.append(");"); i += 2; @@ -1443,13 +1451,11 @@ final String mn = findMethodName(m, cnt); out.append(prefix).append(mn); out.append(" = function("); - String space; + String space = ""; int index; if (!isStatic) { - space = outputArg(out, p.args, 0); index = 1; } else { - space = ""; index = 0; } for (int i = 0; i < cnt.length(); i++) { @@ -1458,6 +1464,9 @@ index++; } out.append(") {").append("\n"); + if (!isStatic) { + out.append(" var ").append(p.args[0]).append(" = this;\n"); + } out.append(p.body); out.append("\n}\n"); return mn; @@ -1600,7 +1609,7 @@ out.append(" stA0 = e;"); out.append("} else {"); out.append(" stA0 = vm.java_lang_Throwable(true);"); - out.append(" vm.java_lang_Throwable.cons__VLjava_lang_String_2(stA0, e.toString());"); + out.append(" vm.java_lang_Throwable.cons__VLjava_lang_String_2.call(stA0, e.toString());"); out.append("}"); out.append("gt=" + e.handler_pc + "; continue;"); } else {