# HG changeset patch # User Jaroslav Tulach # Date 1373637998 -7200 # Node ID a3eb8b0dfb81e8760f779965de5502b6facc4832 # Parent 48de246584900b6f5105db8b219a64533938f9b1 Needs to mangle the parameters to convert / to _ diff -r 48de24658490 -r a3eb8b0dfb81 rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jul 12 16:05:33 2013 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jul 12 16:06:38 2013 +0200 @@ -1742,12 +1742,14 @@ } StringBuilder sb = new StringBuilder(); final String rfqn = replace(fqn); - sb.append(rfqn).append("$").append(method). - append('$').append(params).append("__Ljava_lang_Object_2"); + final String rm = replace(method); + final String rp = replace(params); + sb.append(rfqn).append("$").append(rm). + append('$').append(rp).append("__Ljava_lang_Object_2"); if (!isStatic) { sb.append('L').append(rfqn).append("_2"); } - sb.append(params); + sb.append(rp); return sb.toString(); } diff -r 48de24658490 -r a3eb8b0dfb81 rt/vm/src/test/java/org/apidesign/vm4brwsr/HtmlAnnotations.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/HtmlAnnotations.java Fri Jul 12 16:05:33 2013 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/HtmlAnnotations.java Fri Jul 12 16:06:38 2013 +0200 @@ -26,6 +26,9 @@ */ @JavaScriptResource("htmlannotations.js") public class HtmlAnnotations { + private Object callback; + + @JavaScriptBody(args = {}, body = "return 42;") public static int fourtyTwo() { return -1; @@ -59,6 +62,14 @@ return l; } + protected void onError(Object obj) throws Exception { + callback = obj; + } + + Object getError() { + return callback; + } + public static Object create() { return new HtmlAnnotations(); } @@ -66,4 +77,10 @@ "return impl.@org.apidesign.vm4brwsr.HtmlAnnotations::chooseLong(ZZJJ)(true, false, a, b);" ) public static native long first(Object impl, long a, long b); + + @JavaScriptBody(args = { "impl", "d" }, javacall = true, body = + "impl.@org.apidesign.vm4brwsr.HtmlAnnotations::onError(Ljava/lang/Object;)(d);" + + "return impl.@org.apidesign.vm4brwsr.HtmlAnnotations::getError()();" + ) + public static native Double onError(Object impl, Double d); } diff -r 48de24658490 -r a3eb8b0dfb81 rt/vm/src/test/java/org/apidesign/vm4brwsr/HtmlAnnotationsTest.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/HtmlAnnotationsTest.java Fri Jul 12 16:05:33 2013 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/HtmlAnnotationsTest.java Fri Jul 12 16:06:38 2013 +0200 @@ -64,6 +64,15 @@ Double.valueOf(42), instance, 42, 31 ); } + + @Test public void callbackWithObjectParamsAndReturnType() throws Exception { + Object instance = code.execCode("Get an HtmlAnnotations instance", HtmlAnnotations.class, "create__Ljava_lang_Object_2", null); + assertNotNull(instance, "Instance created"); + assertExec("called back and forth", HtmlAnnotations.class, + "onError__Ljava_lang_Double_2Ljava_lang_Object_2Ljava_lang_Double_2", + Double.valueOf(42), instance, 42 + ); + } private static TestVM code;