# HG changeset patch # User Jaroslav Tulach # Date 1389252086 -3600 # Node ID b8e33a00bfab2b9002bbe7f2d9a2576e787064f1 # Parent 246ee398b4116874cdd402f00e3a4318f7854f24 Copy the array before passing it to JavaScript when using net.java.html.js.JavaScriptBody diff -r 246ee398b411 -r b8e33a00bfab rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/lang/System.java --- a/rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/lang/System.java Wed Jan 08 14:06:21 2014 +0100 +++ b/rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/lang/System.java Thu Jan 09 08:21:26 2014 +0100 @@ -19,6 +19,7 @@ import java.lang.reflect.Method; import org.apidesign.bck2brwsr.core.JavaScriptBody; +import org.apidesign.bck2brwsr.core.JavaScriptOnly; /** * @@ -71,4 +72,27 @@ } @JavaScriptBody(args = { "obj" }, body="return vm.java_lang_Object(false).hashCode__I.call(obj);") public static native int identityHashCode(Object obj); + + @JavaScriptOnly(name = "toJS", value = "function(v) {\n" + + " if (v === null) return null;\n" + + " if (Object.prototype.toString.call(v) === '[object Array]') {\n" + + " return vm.org_apidesign_bck2brwsr_emul_lang_System(false).convArray__Ljava_lang_Object_2Ljava_lang_Object_2(v);\n" + + " }\n" + + " return v.valueOf();\n" + + "}\n" + ) + public static native int toJS(); + + private static Object convArray(Object o) { + if (o instanceof Object[]) { + Object[] arr = (Object[]) o; + final int l = arr.length; + Object[] ret = new Object[l]; + for (int i = 0; i < l; i++) { + ret[i] = convArray(arr[i]); + } + return ret; + } + return o; + } } diff -r 246ee398b411 -r b8e33a00bfab rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Wed Jan 08 14:06:21 2014 +0100 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Jan 09 08:21:26 2014 +0100 @@ -1623,6 +1623,7 @@ String[] args = new String[30]; String body; boolean javacall; + boolean html4j; @Override protected void visitAttr(String type, String attr, String at, String value) { @@ -1636,6 +1637,7 @@ } } if (type.equals(htmlType)) { + html4j = true; if ("body".equals(attr)) { body = value; } else if ("args".equals(attr)) { @@ -1659,12 +1661,18 @@ out.append(" = function("); String space = ""; int index = 0; + StringBuilder toValue = new StringBuilder(); for (int i = 0; i < cnt.length(); i++) { out.append(space); space = outputArg(out, p.args, index); + if (p.html4j && space.length() > 0) { + toValue.append("\n ").append(p.args[index]).append(" = vm.org_apidesign_bck2brwsr_emul_lang_System(false).toJS("). + append(p.args[index]).append(");"); + } index++; } out.append(") {").append("\n"); + out.append(toValue.toString()); if (p.javacall) { int lastSlash = jc.getClassName().lastIndexOf('/'); final String pkg = jc.getClassName().substring(0, lastSlash);