Convert content of array properly before entering JavaScript
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 28 Apr 2016 07:13:00 +0200
changeset 1958aa2e9630b6d5
parent 1957 85f1fbb0f2f6
child 1959 fbd86e4b4742
Convert content of array properly before entering JavaScript
rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/vmtest/impl/HtmlAnnotations.java
rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/vmtest/impl/HtmlAnnotationsTest.java
rt/emul/mini/src/main/java/java/lang/Class.java
rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/lang/System.java
     1.1 --- a/rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/vmtest/impl/HtmlAnnotations.java	Thu Apr 28 06:21:04 2016 +0200
     1.2 +++ b/rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/vmtest/impl/HtmlAnnotations.java	Thu Apr 28 07:13:00 2016 +0200
     1.3 @@ -99,4 +99,9 @@
     1.4          + "return b ? 'yes' : 'no';\n"
     1.5      )
     1.6      public static native String yesNo(Callable<Boolean> call);
     1.7 +
     1.8 +    @JavaScriptBody(args = { "arr", "val" }, body =
     1.9 +        "return arr[0] === val;"
    1.10 +    )
    1.11 +    public static native boolean compareArr(Object[] arr, Object val);
    1.12  }
     2.1 --- a/rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/vmtest/impl/HtmlAnnotationsTest.java	Thu Apr 28 06:21:04 2016 +0200
     2.2 +++ b/rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/vmtest/impl/HtmlAnnotationsTest.java	Thu Apr 28 07:13:00 2016 +0200
     2.3 @@ -106,6 +106,13 @@
     2.4          });
     2.5          assertEquals(no, "no", "FALSE is false");
     2.6      }
     2.7 +
     2.8 +    @BrwsrTest
     2.9 +    public void compareArrayOfDoubles() throws Exception {
    2.10 +        Double val = 2.2;
    2.11 +        boolean res = HtmlAnnotations.compareArr(new Object[] { val }, val);
    2.12 +        assertEquals(res, true, "Should be in the array");
    2.13 +    }
    2.14      
    2.15      private static void assertEquals(double real, double exp) {
    2.16          if (real - exp < 0.01) {
     3.1 --- a/rt/emul/mini/src/main/java/java/lang/Class.java	Thu Apr 28 06:21:04 2016 +0200
     3.2 +++ b/rt/emul/mini/src/main/java/java/lang/Class.java	Thu Apr 28 07:13:00 2016 +0200
     3.3 @@ -1870,10 +1870,10 @@
     3.4      )
     3.5      static native Object clone(Object self) throws CloneNotSupportedException;
     3.6  
     3.7 -    @JavaScriptOnly(name = "toJS", value = "function(v) {\n"
     3.8 +    @JavaScriptOnly(name = "toJS", value = "function convToJS(v) {\n"
     3.9          + "  if (v === null) return null;\n"
    3.10          + "  if (Object.prototype.toString.call(v) === '[object Array]') {\n"
    3.11 -        + "    return vm.org_apidesign_bck2brwsr_emul_lang_System(false).convArray__Ljava_lang_Object_2Ljava_lang_Object_2(v);\n"
    3.12 +        + "    return vm.org_apidesign_bck2brwsr_emul_lang_System(false).convArray__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2(v, convToJS);\n"
    3.13          + "  }\n"
    3.14          + "  if (v instanceof Date) return v;\n"
    3.15          + "  return v.valueOf();\n"
     4.1 --- a/rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/lang/System.java	Thu Apr 28 06:21:04 2016 +0200
     4.2 +++ b/rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/lang/System.java	Thu Apr 28 07:13:00 2016 +0200
     4.3 @@ -84,15 +84,17 @@
     4.4          public void close() throws IOException {
     4.5          }
     4.6      };
     4.7 +    @JavaScriptBody(args = { "fn", "p" }, body = "return fn(p);")
     4.8 +    private static native Object invoke(Object fn, Object p);
     4.9      
    4.10      @Exported
    4.11 -    private static Object convArray(Object o) {
    4.12 +    private static Object convArray(Object o, Object convToJS) {
    4.13          if (o instanceof Object[]) {
    4.14              Object[] arr = (Object[]) o;
    4.15              final int l = arr.length;
    4.16              Object[] ret = new Object[l];
    4.17              for (int i = 0; i < l; i++) {
    4.18 -                ret[i] = convArray(arr[i]);
    4.19 +                ret[i] = invoke(convToJS, arr[i]);
    4.20              }
    4.21              return ret;
    4.22          }