# HG changeset patch # User Jaroslav Tulach # Date 1465539876 -7200 # Node ID a5fc49f9ef409851672f1e9213f3aa17be162397 # Parent 720f1f8bc9c8bd64b32dd90abb58ee09e5a82ecd Including failing arrayForEach test diff -r 720f1f8bc9c8 -r a5fc49f9ef40 rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jun 10 06:41:04 2016 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jun 10 08:24:36 2016 +0200 @@ -1908,14 +1908,20 @@ i += 2; if (DirectlLibraries.isScriptLibrary(mi[0])) { - if ("$get__Ljava_lang_Object_2Ljava_lang_String_2".equals(mn)) { + if ( + "$get__Ljava_lang_Object_2Ljava_lang_String_2".equals(mn) || + "$get__Ljava_lang_Object_2D".equals(mn) + ) { append(vars[0].toString()) .append('[') .append(vars[1]) .append("];"); return i; } - if ("$set__VLjava_lang_String_2Ljava_lang_Object_2".equals(mn)) { + if ( + "$set__VLjava_lang_String_2Ljava_lang_Object_2".equals(mn) || + "$set__VDLjava_lang_Object_2".equals(mn) + ) { append(vars[0].toString()) .append('[') .append(vars[1]) diff -r 720f1f8bc9c8 -r a5fc49f9ef40 rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUse.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUse.java Fri Jun 10 06:41:04 2016 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUse.java Fri Jun 10 08:24:36 2016 +0200 @@ -17,6 +17,7 @@ */ package org.apidesign.vm4brwsr; +import net.java.html.js.JavaScriptBody; import net.java.html.lib.Date; import static net.java.html.lib.Exports.NaN; import static net.java.html.lib.Exports.eval; @@ -63,4 +64,75 @@ return eleven.getFullYear() + eleven.getMonth(); } + public static double arrayForEach() throws Exception { + net.java.html.lib.Array arr = new net.java.html.lib.Array<>(); + assertNumber(arr.length.get(), 0.0, "Empty at first"); + arr.push(1.1, 2.2, 3); + assertNumber(arr.$get(0), 1.1, "1.1 is on position 0"); + assertNumber(arr.$get(1), 2.2, "2.2 is on position 1"); + assertNumber(arr.$get(2), 3.0, "3 is on position 2"); + final boolean[] called = { false }; + final double[] sum = { 0.0 }; + arr.forEach(new net.java.html.lib.Function.A1() { + @Override + public Void call(java.lang.Number p1) { + called[0] = true; + sum[0] += p1.doubleValue(); + return null; + } + + @Override + public Void call(Number p1, Object p2) { + return call(p1); + } + + @Override + public Void call(Number p1, Object p2, Object p3) { + return call(p1); + } + + @Override + public Void call(Number p1, Object p2, Object p3, Object p4) { + return call(p1); + } + + @Override + public Void call(Number p1, Object p2, Object p3, Object p4, Object p5) { + return call(p1); + } + }); + assertTrue(called[0], "forEach invoked"); + assertEquals(sum[0], 6.3, 0.1, "Sum computed"); + + return sum[0]; + } + + private static void assertEquals(double real, double expected, double delta, String msg) { + if (expected - delta < real && real < expected + delta) { + return; + } + raise(msg + " exp: " + expected + " but was: " + real); + } + + @JavaScriptBody(args = { "msg" }, body = "throw msg;") + private static native void raise(String msg); + + private static void assertNumber(Object value, double expected, String msg) { + if (value instanceof Number) { + assertEquals(((Number)value).doubleValue(), expected, 0.1, msg); + } else { + if (value == null) { + raise("null is not a number"); + return; + } + raise("Not a number: " + value + " type: " + value.getClass()); + } + } + + private static void assertTrue(boolean b, String msg) { + if (!b) { + raise(msg); + } + } + } diff -r 720f1f8bc9c8 -r a5fc49f9ef40 rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUseTest.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUseTest.java Fri Jun 10 06:41:04 2016 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUseTest.java Fri Jun 10 08:24:36 2016 +0200 @@ -91,4 +91,13 @@ 2017.0 ); } + + @Test + public void directArray() throws Exception { + code.assertExec( + "Create and read date", LibUse.class, + "arrayForEach__D", + 6.3 + ); + } }