# HG changeset patch # User Jaroslav Tulach # Date 1365151267 -7200 # Node ID 0cb657a2b88877bbfe3d434b005d9e3457a6affd # Parent 0dd6343a91f511dfdf5871037df6014f0ad9c47c Any JavaScript array is treated as Java array of Objects diff -r 0dd6343a91f5 -r 0cb657a2b888 rt/emul/mini/src/main/java/java/lang/Class.java --- a/rt/emul/mini/src/main/java/java/lang/Class.java Fri Apr 05 10:12:20 2013 +0200 +++ b/rt/emul/mini/src/main/java/java/lang/Class.java Fri Apr 05 10:41:07 2013 +0200 @@ -1252,6 +1252,7 @@ } @JavaScriptBody(args = { "sig" }, body = + "if (!sig) sig = '[Ljava/lang/Object;';\n" + "var c = Array[sig];\n" + "if (c) return c;\n" + "c = vm.java_lang_Class(true);\n" + diff -r 0dd6343a91f5 -r 0cb657a2b888 rt/vm/src/test/java/org/apidesign/vm4brwsr/StringSample.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/StringSample.java Fri Apr 05 10:12:20 2013 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/StringSample.java Fri Apr 05 10:41:07 2013 +0200 @@ -18,6 +18,7 @@ package org.apidesign.vm4brwsr; import java.io.UnsupportedEncodingException; +import org.apidesign.bck2brwsr.core.JavaScriptBody; /** * @@ -129,4 +130,18 @@ public String toString() { return HELLO + cnt; } + + @JavaScriptBody(args = {}, body = "return [1, 2];") + private static native Object crtarr(); + @JavaScriptBody(args = { "o" }, body = "return o.valueOf();") + private static native String valueOf(Object o); + + public static String toStringArray(boolean fakeArr, boolean toString) { + final Object arr = fakeArr ? crtarr() : new Object[2]; + final String whole = toString ? arr.toString() : valueOf(arr); + int zav = whole.indexOf('@'); + assert zav >= 0 : "There should be @ in: " + whole; + return whole.substring(0, zav).toString().toString(); + } + } diff -r 0dd6343a91f5 -r 0cb657a2b888 rt/vm/src/test/java/org/apidesign/vm4brwsr/StringTest.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/StringTest.java Fri Apr 05 10:12:20 2013 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/StringTest.java Fri Apr 05 10:41:07 2013 +0200 @@ -194,6 +194,36 @@ } + @Test public void toStringOnJSArray() throws Exception { + String exp = StringSample.toStringArray(false, true); + + assertExec( + "Treated as Java Object array", + StringSample.class, "toStringArray__Ljava_lang_String_2ZZ", + exp, true, true + ); + } + + @Test public void toStringOnRealArray() throws Exception { + String exp = StringSample.toStringArray(false, true); + + assertExec( + "Is Java Object array", + StringSample.class, "toStringArray__Ljava_lang_String_2ZZ", + exp, false, true + ); + } + + @Test public void valueOfOnJSArray() throws Exception { + String exp = "[1, 2]"; + + assertExec( + "Treated as classical JavaScript array", + StringSample.class, "toStringArray__Ljava_lang_String_2ZZ", + exp, true, false + ); + } + private static TestVM code; @BeforeClass diff -r 0dd6343a91f5 -r 0cb657a2b888 rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionArrayTest.java --- a/rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionArrayTest.java Fri Apr 05 10:12:20 2013 +0200 +++ b/rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionArrayTest.java Fri Apr 05 10:41:07 2013 +0200 @@ -18,6 +18,8 @@ package org.apidesign.bck2brwsr.tck; import java.lang.reflect.Array; +import org.apidesign.bck2brwsr.core.JavaScriptBody; +import org.apidesign.bck2brwsr.vmtest.BrwsrTest; import org.apidesign.bck2brwsr.vmtest.Compare; import org.apidesign.bck2brwsr.vmtest.VMTest; import org.testng.annotations.Factory; @@ -127,6 +129,30 @@ return Array.newInstance(int.class, 3, 3, 3).getClass().getName(); } + @JavaScriptBody(args = {}, body = "return [1, 2];") + private static native Object crtarr(); + + @JavaScriptBody(args = {}, body = "return new Object();") + private static native Object newobj(); + + @BrwsrTest + public static void toStringArray() { + final Object arr = crtarr(); + final Object real = new Object[2]; + assert arr instanceof Object[] : "Any array is Java array: " + arr; + assert arr.getClass() == real.getClass() : "Same classes " + arr + " and " + real.getClass(); + final String str = arr.toString(); + assert str != null; + assert str.startsWith("[Ljava.lang.Object;@") : str; + } + + @BrwsrTest + public static void objectToString() { + String s = newobj().toString(); + assert s != null : "Some string computed"; + assert s.startsWith("java.lang.Object@") : "Regular object toString(): " + s; + } + @Factory public static Object[] create() {