Copy the array before passing it to JavaScript when using net.java.html.js.JavaScriptBody
1.1 --- a/rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/lang/System.java Wed Jan 08 14:06:21 2014 +0100
1.2 +++ b/rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/lang/System.java Thu Jan 09 08:21:26 2014 +0100
1.3 @@ -19,6 +19,7 @@
1.4
1.5 import java.lang.reflect.Method;
1.6 import org.apidesign.bck2brwsr.core.JavaScriptBody;
1.7 +import org.apidesign.bck2brwsr.core.JavaScriptOnly;
1.8
1.9 /**
1.10 *
1.11 @@ -71,4 +72,27 @@
1.12 }
1.13 @JavaScriptBody(args = { "obj" }, body="return vm.java_lang_Object(false).hashCode__I.call(obj);")
1.14 public static native int identityHashCode(Object obj);
1.15 +
1.16 + @JavaScriptOnly(name = "toJS", value = "function(v) {\n" +
1.17 + " if (v === null) return null;\n" +
1.18 + " if (Object.prototype.toString.call(v) === '[object Array]') {\n" +
1.19 + " return vm.org_apidesign_bck2brwsr_emul_lang_System(false).convArray__Ljava_lang_Object_2Ljava_lang_Object_2(v);\n" +
1.20 + " }\n" +
1.21 + " return v.valueOf();\n" +
1.22 + "}\n"
1.23 + )
1.24 + public static native int toJS();
1.25 +
1.26 + private static Object convArray(Object o) {
1.27 + if (o instanceof Object[]) {
1.28 + Object[] arr = (Object[]) o;
1.29 + final int l = arr.length;
1.30 + Object[] ret = new Object[l];
1.31 + for (int i = 0; i < l; i++) {
1.32 + ret[i] = convArray(arr[i]);
1.33 + }
1.34 + return ret;
1.35 + }
1.36 + return o;
1.37 + }
1.38 }
2.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Wed Jan 08 14:06:21 2014 +0100
2.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Jan 09 08:21:26 2014 +0100
2.3 @@ -1623,6 +1623,7 @@
2.4 String[] args = new String[30];
2.5 String body;
2.6 boolean javacall;
2.7 + boolean html4j;
2.8
2.9 @Override
2.10 protected void visitAttr(String type, String attr, String at, String value) {
2.11 @@ -1636,6 +1637,7 @@
2.12 }
2.13 }
2.14 if (type.equals(htmlType)) {
2.15 + html4j = true;
2.16 if ("body".equals(attr)) {
2.17 body = value;
2.18 } else if ("args".equals(attr)) {
2.19 @@ -1659,12 +1661,18 @@
2.20 out.append(" = function(");
2.21 String space = "";
2.22 int index = 0;
2.23 + StringBuilder toValue = new StringBuilder();
2.24 for (int i = 0; i < cnt.length(); i++) {
2.25 out.append(space);
2.26 space = outputArg(out, p.args, index);
2.27 + if (p.html4j && space.length() > 0) {
2.28 + toValue.append("\n ").append(p.args[index]).append(" = vm.org_apidesign_bck2brwsr_emul_lang_System(false).toJS(").
2.29 + append(p.args[index]).append(");");
2.30 + }
2.31 index++;
2.32 }
2.33 out.append(") {").append("\n");
2.34 + out.append(toValue.toString());
2.35 if (p.javacall) {
2.36 int lastSlash = jc.getClassName().lastIndexOf('/');
2.37 final String pkg = jc.getClassName().substring(0, lastSlash);