diff -r 48053538940a -r 4185cdeeee7e rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue Mar 22 02:51:04 2016 +0100 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Apr 17 13:16:31 2016 +0200 @@ -1997,7 +1997,7 @@ return mn; } - private static CharSequence mangleCallbacks(String pkgName, String body) { + private CharSequence mangleCallbacks(String pkgName, String body) { StringBuilder sb = new StringBuilder(); int pos = 0; for (;;) { @@ -2029,14 +2029,18 @@ String params = body.substring(sigBeg, sigEnd + 1); int paramBeg = body.indexOf('(', sigEnd + 1); - + int paramEnd = closingParenthesis(body, paramBeg); + + sb.append(accessClass("java_lang_Class")).append("(false).toJS("); sb.append("vm.").append(mangleClassName(pkgName)).append("_$JsCallbacks$(false)._VM()."); sb.append(mangleJsCallbacks(fqn, method, params, false)); sb.append("(").append(refId); if (body.charAt(paramBeg + 1) != ')') { sb.append(","); } - pos = paramBeg + 1; + sb.append(body.substring(paramBeg + 1, paramEnd)); + sb.append(")"); + pos = paramEnd; } sb = null; pos = 0; @@ -2066,11 +2070,15 @@ String params = body.substring(sigBeg, sigEnd + 1); int paramBeg = body.indexOf('(', sigEnd + 1); - + int paramEnd = closingParenthesis(body, paramBeg); + + sb.append(accessClass("java_lang_Class")).append("(false).toJS("); sb.append("vm.").append(mangleClassName(pkgName)).append("_$JsCallbacks$(false)._VM()."); sb.append(mangleJsCallbacks(fqn, method, params, true)); sb.append("("); - pos = paramBeg + 1; + sb.append(body.substring(paramBeg + 1, paramEnd)); + sb.append(")"); + pos = paramEnd; } } @@ -2449,6 +2457,19 @@ System.err.println(msg); } + private static int closingParenthesis(String body, int at) { + int cnt = 0; + for (;;) { + switch (body.charAt(at++)) { + case '(': cnt++; break; + case ')': cnt--; break; + } + if (cnt == 0) { + return at; + } + } + } + private class GenerateAnno extends AnnotationParser { public GenerateAnno(boolean textual, boolean iterateArray) { super(textual, iterateArray);