1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jun 10 06:41:04 2016 +0200
1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jun 10 08:24:36 2016 +0200
1.3 @@ -1908,14 +1908,20 @@
1.4
1.5 i += 2;
1.6 if (DirectlLibraries.isScriptLibrary(mi[0])) {
1.7 - if ("$get__Ljava_lang_Object_2Ljava_lang_String_2".equals(mn)) {
1.8 + if (
1.9 + "$get__Ljava_lang_Object_2Ljava_lang_String_2".equals(mn) ||
1.10 + "$get__Ljava_lang_Object_2D".equals(mn)
1.11 + ) {
1.12 append(vars[0].toString())
1.13 .append('[')
1.14 .append(vars[1])
1.15 .append("];");
1.16 return i;
1.17 }
1.18 - if ("$set__VLjava_lang_String_2Ljava_lang_Object_2".equals(mn)) {
1.19 + if (
1.20 + "$set__VLjava_lang_String_2Ljava_lang_Object_2".equals(mn) ||
1.21 + "$set__VDLjava_lang_Object_2".equals(mn)
1.22 + ) {
1.23 append(vars[0].toString())
1.24 .append('[')
1.25 .append(vars[1])
2.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUse.java Fri Jun 10 06:41:04 2016 +0200
2.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUse.java Fri Jun 10 08:24:36 2016 +0200
2.3 @@ -17,6 +17,7 @@
2.4 */
2.5 package org.apidesign.vm4brwsr;
2.6
2.7 +import net.java.html.js.JavaScriptBody;
2.8 import net.java.html.lib.Date;
2.9 import static net.java.html.lib.Exports.NaN;
2.10 import static net.java.html.lib.Exports.eval;
2.11 @@ -63,4 +64,75 @@
2.12 return eleven.getFullYear() + eleven.getMonth();
2.13 }
2.14
2.15 + public static double arrayForEach() throws Exception {
2.16 + net.java.html.lib.Array<java.lang.Number> arr = new net.java.html.lib.Array<>();
2.17 + assertNumber(arr.length.get(), 0.0, "Empty at first");
2.18 + arr.push(1.1, 2.2, 3);
2.19 + assertNumber(arr.$get(0), 1.1, "1.1 is on position 0");
2.20 + assertNumber(arr.$get(1), 2.2, "2.2 is on position 1");
2.21 + assertNumber(arr.$get(2), 3.0, "3 is on position 2");
2.22 + final boolean[] called = { false };
2.23 + final double[] sum = { 0.0 };
2.24 + arr.forEach(new net.java.html.lib.Function.A1<java.lang.Number,Void>() {
2.25 + @Override
2.26 + public Void call(java.lang.Number p1) {
2.27 + called[0] = true;
2.28 + sum[0] += p1.doubleValue();
2.29 + return null;
2.30 + }
2.31 +
2.32 + @Override
2.33 + public Void call(Number p1, Object p2) {
2.34 + return call(p1);
2.35 + }
2.36 +
2.37 + @Override
2.38 + public Void call(Number p1, Object p2, Object p3) {
2.39 + return call(p1);
2.40 + }
2.41 +
2.42 + @Override
2.43 + public Void call(Number p1, Object p2, Object p3, Object p4) {
2.44 + return call(p1);
2.45 + }
2.46 +
2.47 + @Override
2.48 + public Void call(Number p1, Object p2, Object p3, Object p4, Object p5) {
2.49 + return call(p1);
2.50 + }
2.51 + });
2.52 + assertTrue(called[0], "forEach invoked");
2.53 + assertEquals(sum[0], 6.3, 0.1, "Sum computed");
2.54 +
2.55 + return sum[0];
2.56 + }
2.57 +
2.58 + private static void assertEquals(double real, double expected, double delta, String msg) {
2.59 + if (expected - delta < real && real < expected + delta) {
2.60 + return;
2.61 + }
2.62 + raise(msg + " exp: " + expected + " but was: " + real);
2.63 + }
2.64 +
2.65 + @JavaScriptBody(args = { "msg" }, body = "throw msg;")
2.66 + private static native void raise(String msg);
2.67 +
2.68 + private static void assertNumber(Object value, double expected, String msg) {
2.69 + if (value instanceof Number) {
2.70 + assertEquals(((Number)value).doubleValue(), expected, 0.1, msg);
2.71 + } else {
2.72 + if (value == null) {
2.73 + raise("null is not a number");
2.74 + return;
2.75 + }
2.76 + raise("Not a number: " + value + " type: " + value.getClass());
2.77 + }
2.78 + }
2.79 +
2.80 + private static void assertTrue(boolean b, String msg) {
2.81 + if (!b) {
2.82 + raise(msg);
2.83 + }
2.84 + }
2.85 +
2.86 }
3.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUseTest.java Fri Jun 10 06:41:04 2016 +0200
3.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/LibUseTest.java Fri Jun 10 08:24:36 2016 +0200
3.3 @@ -91,4 +91,13 @@
3.4 2017.0
3.5 );
3.6 }
3.7 +
3.8 + @Test
3.9 + public void directArray() throws Exception {
3.10 + code.assertExec(
3.11 + "Create and read date", LibUse.class,
3.12 + "arrayForEach__D",
3.13 + 6.3
3.14 + );
3.15 + }
3.16 }