Any JavaScript array is treated as Java array of Objects model
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Fri, 05 Apr 2013 10:41:07 +0200
branchmodel
changeset 9330cb657a2b888
parent 932 0dd6343a91f5
child 934 19b4ddc302a6
Any JavaScript array is treated as Java array of Objects
rt/emul/mini/src/main/java/java/lang/Class.java
rt/vm/src/test/java/org/apidesign/vm4brwsr/StringSample.java
rt/vm/src/test/java/org/apidesign/vm4brwsr/StringTest.java
rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionArrayTest.java
     1.1 --- a/rt/emul/mini/src/main/java/java/lang/Class.java	Fri Apr 05 10:12:20 2013 +0200
     1.2 +++ b/rt/emul/mini/src/main/java/java/lang/Class.java	Fri Apr 05 10:41:07 2013 +0200
     1.3 @@ -1252,6 +1252,7 @@
     1.4      }
     1.5      
     1.6      @JavaScriptBody(args = { "sig" }, body = 
     1.7 +        "if (!sig) sig = '[Ljava/lang/Object;';\n" +
     1.8          "var c = Array[sig];\n" +
     1.9          "if (c) return c;\n" +
    1.10          "c = vm.java_lang_Class(true);\n" +
     2.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/StringSample.java	Fri Apr 05 10:12:20 2013 +0200
     2.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/StringSample.java	Fri Apr 05 10:41:07 2013 +0200
     2.3 @@ -18,6 +18,7 @@
     2.4  package org.apidesign.vm4brwsr;
     2.5  
     2.6  import java.io.UnsupportedEncodingException;
     2.7 +import org.apidesign.bck2brwsr.core.JavaScriptBody;
     2.8  
     2.9  /**
    2.10   *
    2.11 @@ -129,4 +130,18 @@
    2.12      public String toString() {
    2.13          return HELLO + cnt;
    2.14      }
    2.15 +    
    2.16 +    @JavaScriptBody(args = {}, body = "return [1, 2];")
    2.17 +    private static native Object crtarr();
    2.18 +    @JavaScriptBody(args = { "o" }, body = "return o.valueOf();")
    2.19 +    private static native String valueOf(Object o);
    2.20 +    
    2.21 +    public static String toStringArray(boolean fakeArr, boolean toString) {
    2.22 +        final Object arr = fakeArr ? crtarr() : new Object[2];
    2.23 +        final String whole = toString ? arr.toString() : valueOf(arr);
    2.24 +        int zav = whole.indexOf('@');
    2.25 +        assert zav >= 0 : "There should be @ in: " + whole;
    2.26 +        return whole.substring(0, zav).toString().toString();
    2.27 +    }
    2.28 +    
    2.29  }
     3.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/StringTest.java	Fri Apr 05 10:12:20 2013 +0200
     3.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/StringTest.java	Fri Apr 05 10:41:07 2013 +0200
     3.3 @@ -194,6 +194,36 @@
     3.4          
     3.5      }
     3.6      
     3.7 +    @Test public void toStringOnJSArray() throws Exception {
     3.8 +        String exp = StringSample.toStringArray(false, true);
     3.9 +        
    3.10 +        assertExec(
    3.11 +            "Treated as Java Object array",
    3.12 +            StringSample.class, "toStringArray__Ljava_lang_String_2ZZ",
    3.13 +            exp, true, true
    3.14 +        );
    3.15 +    }
    3.16 +
    3.17 +    @Test public void toStringOnRealArray() throws Exception {
    3.18 +        String exp = StringSample.toStringArray(false, true);
    3.19 +        
    3.20 +        assertExec(
    3.21 +            "Is Java Object array",
    3.22 +            StringSample.class, "toStringArray__Ljava_lang_String_2ZZ",
    3.23 +            exp, false, true
    3.24 +        );
    3.25 +    }
    3.26 +
    3.27 +    @Test public void valueOfOnJSArray() throws Exception {
    3.28 +        String exp = "[1, 2]";
    3.29 +        
    3.30 +        assertExec(
    3.31 +            "Treated as classical JavaScript array",
    3.32 +            StringSample.class, "toStringArray__Ljava_lang_String_2ZZ",
    3.33 +            exp, true, false
    3.34 +        );
    3.35 +    }
    3.36 +    
    3.37      private static TestVM code;
    3.38      
    3.39      @BeforeClass 
     4.1 --- a/rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionArrayTest.java	Fri Apr 05 10:12:20 2013 +0200
     4.2 +++ b/rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionArrayTest.java	Fri Apr 05 10:41:07 2013 +0200
     4.3 @@ -18,6 +18,8 @@
     4.4  package org.apidesign.bck2brwsr.tck;
     4.5  
     4.6  import java.lang.reflect.Array;
     4.7 +import org.apidesign.bck2brwsr.core.JavaScriptBody;
     4.8 +import org.apidesign.bck2brwsr.vmtest.BrwsrTest;
     4.9  import org.apidesign.bck2brwsr.vmtest.Compare;
    4.10  import org.apidesign.bck2brwsr.vmtest.VMTest;
    4.11  import org.testng.annotations.Factory;
    4.12 @@ -127,6 +129,30 @@
    4.13          return Array.newInstance(int.class, 3, 3, 3).getClass().getName();
    4.14      }
    4.15      
    4.16 +    @JavaScriptBody(args = {}, body = "return [1, 2];")
    4.17 +    private static native Object crtarr();
    4.18 +
    4.19 +    @JavaScriptBody(args = {}, body = "return new Object();")
    4.20 +    private static native Object newobj();
    4.21 +
    4.22 +    @BrwsrTest
    4.23 +    public static void toStringArray() {
    4.24 +        final Object arr = crtarr();
    4.25 +        final Object real = new Object[2];
    4.26 +        assert arr instanceof Object[] : "Any array is Java array: " + arr;
    4.27 +        assert arr.getClass() == real.getClass() : "Same classes " + arr + " and " + real.getClass();
    4.28 +        final String str = arr.toString();
    4.29 +        assert str != null;
    4.30 +        assert str.startsWith("[Ljava.lang.Object;@") : str;
    4.31 +    }
    4.32 +    
    4.33 +    @BrwsrTest
    4.34 +    public static void objectToString() {
    4.35 +        String s = newobj().toString();
    4.36 +        assert s != null : "Some string computed";
    4.37 +        assert s.startsWith("java.lang.Object@") : "Regular object toString(): " + s;
    4.38 +    }
    4.39 +
    4.40      
    4.41      @Factory
    4.42      public static Object[] create() {