You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by jt...@apache.org on 2017/12/02 18:33:10 UTC

[incubator-netbeans-html4j] 01/02: NETBEANS-193: Recognize primitive arrays in the JNI signatures

This is an automated email from the ASF dual-hosted git repository.

jtulach pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-netbeans-html4j.git

commit ba45f10dccac4e5caad487520ac55126ad7205a2
Author: Jaroslav Tulach <ja...@oracle.com>
AuthorDate: Sat Dec 2 07:59:36 2017 +0100

    NETBEANS-193: Recognize primitive arrays in the JNI signatures
---
 .../html/boot/impl/JavaScriptProcesor.java         | 10 ++--
 .../java/org/netbeans/html/boot/impl/Arithm.java   | 16 ++++++
 .../java/org/netbeans/html/boot/impl/FnTest.java   | 11 ++--
 .../netbeans/html/boot/impl/JsClassLoaderBase.java | 13 +++++
 .../netbeans/html/boot/impl/JsClassLoaderTest.java | 16 +++---
 .../org/netbeans/html/boot/impl/JsMethods.java     | 28 ++++++++--
 .../java/org/netbeans/html/boot/impl/JsUtils.java  | 61 ++++++++++++++++++++++
 7 files changed, 137 insertions(+), 18 deletions(-)

diff --git a/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java b/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java
index cdaa652..956f11f 100644
--- a/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java
+++ b/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java
@@ -259,6 +259,10 @@ public final class JavaScriptProcesor extends AbstractProcessor {
             StringBuilder sb = new StringBuilder();
             sb.append('(');
             for (TypeMirror tm : t.getParameterTypes()) {
+                while (tm.getKind() == TypeKind.ARRAY) {
+                    sb.append('[');
+                    tm = ((ArrayType) tm).getComponentType();
+                }
                 if (tm.getKind().isPrimitive()) {
                     switch (tm.getKind()) {
                         case INT: sb.append('I'); break;
@@ -270,13 +274,9 @@ public final class JavaScriptProcesor extends AbstractProcessor {
                         case FLOAT: sb.append('F'); break;
                         case LONG: sb.append('J'); break;
                         default:
-                            throw new IllegalStateException("Uknown " + tm.getKind());
+                            throw new IllegalStateException("Unknown " + tm.getKind());
                     }
                 } else {
-                    while (tm.getKind() == TypeKind.ARRAY) {
-                        sb.append('[');
-                        tm = ((ArrayType)tm).getComponentType();
-                    }
                     sb.append('L');
                     Types tu = processingEnv.getTypeUtils();
                     Element elm = tu.asElement(tu.erasure(tm));
diff --git a/boot/src/test/java/org/netbeans/html/boot/impl/Arithm.java b/boot/src/test/java/org/netbeans/html/boot/impl/Arithm.java
index 69a3a4b..6df88af 100644
--- a/boot/src/test/java/org/netbeans/html/boot/impl/Arithm.java
+++ b/boot/src/test/java/org/netbeans/html/boot/impl/Arithm.java
@@ -26,4 +26,20 @@ public class Arithm {
     public int sumTwo(int a, int b) {
         return a + b;
     }
+
+    public int sumInts(int[] arr) {
+        int s = 0;
+        for (int e : arr) {
+            s += e;
+        }
+        return s;
+    }
+
+    public int sumArr(java.lang.Object[] arr) {
+        int[] copy = new int[arr.length];
+        for (int i = 0; i < arr.length; i++) {
+            copy[i] = ((Number)arr[i]).intValue();
+        }
+        return sumInts(copy);
+    }
 }
diff --git a/boot/src/test/java/org/netbeans/html/boot/impl/FnTest.java b/boot/src/test/java/org/netbeans/html/boot/impl/FnTest.java
index f5e4d29..89689bc 100644
--- a/boot/src/test/java/org/netbeans/html/boot/impl/FnTest.java
+++ b/boot/src/test/java/org/netbeans/html/boot/impl/FnTest.java
@@ -30,7 +30,6 @@ import java.util.Collection;
 import java.util.List;
 import javax.script.Invocable;
 import javax.script.ScriptEngine;
-import javax.script.ScriptEngineManager;
 import javax.script.ScriptException;
 import org.netbeans.html.boot.spi.Fn;
 import static org.testng.Assert.assertEquals;
@@ -50,14 +49,13 @@ public class FnTest extends JsClassLoaderBase {
 
     @BeforeClass
     public static void createClassLoader() throws Exception {
-        ScriptEngineManager sem = new ScriptEngineManager();
-        final ScriptEngine eng = sem.getEngineByMimeType("text/javascript");
+        final ScriptEngine eng = JsUtils.initializeEngine();
         
         final URL my = FnTest.class.getProtectionDomain().getCodeSource().getLocation();
         ClassLoader parent = JsClassLoaderTest.class.getClassLoader().getParent();
         final URLClassLoader ul = new URLClassLoader(new URL[] { my }, parent);
         
-        class Impl implements FindResources, Fn.Presenter {
+        class Impl implements FindResources, Fn.Presenter, Fn.FromJavaScript {
             @Override
             public void findResources(String path, Collection<? super URL> results, boolean oneIsEnough) {
                 URL u = ul.findResource(path);
@@ -112,6 +110,11 @@ public class FnTest extends JsClassLoaderBase {
             public void loadScript(Reader code) throws Exception {
                 eng.eval(code);
             }
+
+            @Override
+            public java.lang.Object toJava(java.lang.Object js) {
+                return JsUtils.toJava(eng, js);
+            }
         }
         Impl impl = new Impl();
         ClassLoader loader = FnUtils.newLoader(impl, impl, parent);
diff --git a/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderBase.java b/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderBase.java
index 1f9cf7a..620459c 100644
--- a/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderBase.java
+++ b/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderBase.java
@@ -258,4 +258,17 @@ public class JsClassLoaderBase {
             assertEquals(ex.getMessage(), "No presenter active. Use BrwsrCtx.execute!");
         }
     }    
+
+   @Test public void sumInts() throws Throwable {
+        Method st = methodClass.getMethod("sumInts");
+        java.lang.Object res = st.invoke(null);
+        assertEquals(res, 3, "The right value");
+    }
+
+   @Test public void sumArr() throws Throwable {
+        Method st = methodClass.getMethod("sumArr");
+        java.lang.Object res = st.invoke(null);
+        assertEquals(res, 3, "The right value");
+    }
+
 }
diff --git a/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderTest.java b/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderTest.java
index c460885..ee33dc5 100644
--- a/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderTest.java
+++ b/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderTest.java
@@ -29,7 +29,6 @@ import java.util.Enumeration;
 import java.util.List;
 import javax.script.Invocable;
 import javax.script.ScriptEngine;
-import javax.script.ScriptEngineManager;
 import javax.script.ScriptException;
 import org.netbeans.html.boot.spi.Fn;
 import org.testng.annotations.AfterClass;
@@ -45,13 +44,12 @@ public class JsClassLoaderTest extends JsClassLoaderBase{
 
     @BeforeClass
     public static void setUpClass() throws Exception {
-        ScriptEngineManager sem = new ScriptEngineManager();
-        final ScriptEngine eng = sem.getEngineByMimeType("text/javascript");
-        
+        final ScriptEngine eng = JsUtils.initializeEngine();
+
         final URL my = JsClassLoaderTest.class.getProtectionDomain().getCodeSource().getLocation();
         ClassLoader parent = JsClassLoaderTest.class.getClassLoader().getParent();
         final URLClassLoader ul = new URLClassLoader(new URL[] { my }, parent);
-        class MyCL extends FnUtils.JsClassLoaderImpl implements Fn.Presenter {
+        class MyCL extends FnUtils.JsClassLoaderImpl implements Fn.Presenter, Fn.FromJavaScript {
 
             public MyCL(ClassLoader parent) {
                 super(parent, null, null);
@@ -117,7 +115,13 @@ public class JsClassLoaderTest extends JsClassLoaderBase{
             public void displayPage(URL page, Runnable onPageLoad) {
                 throw new UnsupportedOperationException();
             }
-        };
+
+            @Override
+            public java.lang.Object toJava(java.lang.Object js) {
+                return JsUtils.toJava(eng, js);
+            }
+        }
+;
         
         MyCL l = new MyCL(parent);
         Closeable close = FnContext.activate(l);
diff --git a/boot/src/test/java/org/netbeans/html/boot/impl/JsMethods.java b/boot/src/test/java/org/netbeans/html/boot/impl/JsMethods.java
index 5266b32..cbf5079 100644
--- a/boot/src/test/java/org/netbeans/html/boot/impl/JsMethods.java
+++ b/boot/src/test/java/org/netbeans/html/boot/impl/JsMethods.java
@@ -65,12 +65,34 @@ public class JsMethods {
         + "}\n"
         + "return a;"
     )
-    private static native int sumArr(Arithm at, int... arr);
-    
+    private static native int sumTwo(Arithm at, int... arr);
+
     public static int sumArr(int... arr) {
-        return sumArr(new Arithm(), arr);
+        return sumTwo(new Arithm(), arr);
+    }
+
+    @JavaScriptBody(args = {"r"}, javacall = true, body =
+        "var array = new Array();\n"
+      + "array[0]=1; array[1]=2;\n"
+      + "return r.@org.netbeans.html.boot.impl.Arithm::sumInts([I)(array);\n"
+    )
+    private static native int sumInts(Arithm r);
+
+    @JavaScriptBody(args = {"r"}, javacall = true, body =
+        "var array = new Array();\n"
+      + "array[0]=1; array[1]=2;\n"
+      + "return r.@org.netbeans.html.boot.impl.Arithm::sumArr([Ljava/lang/Object;)(array);\n"
+    )
+    private static native int sumArr(Arithm r);
+
+    public static int sumInts() {
+        return sumInts(new Arithm());
     }
     
+    public static int sumArr() {
+        return sumArr(new Arithm());
+    }
+
     @JavaScriptBody(args = { "x", "y" }, body = "return mul(x, y);")
     public static native int useExternalMul(int x, int y);
     
diff --git a/boot/src/test/java/org/netbeans/html/boot/impl/JsUtils.java b/boot/src/test/java/org/netbeans/html/boot/impl/JsUtils.java
new file mode 100644
index 0000000..47e8fc6
--- /dev/null
+++ b/boot/src/test/java/org/netbeans/html/boot/impl/JsUtils.java
@@ -0,0 +1,61 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.html.boot.impl;
+
+import javax.script.Invocable;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+
+final class JsUtils {
+    public static ScriptEngine initializeEngine() throws Exception {
+        ScriptEngineManager sem = new ScriptEngineManager();
+        final ScriptEngine eng = sem.getEngineByMimeType("text/javascript");
+
+        eng.eval("function checkArray(arr, to) {\n"
+                + "  if (to === null) {\n"
+                + "    if (Object.prototype.toString.call(arr) === '[object Array]') return arr.length;\n"
+                + "    else return -1;\n"
+                + "  } else {\n"
+                + "    var l = arr.length;\n"
+                + "    for (var i = 0; i < l; i++) {\n"
+                + "      to[i] = arr[i] === undefined ? null : arr[i];\n"
+                + "    }\n"
+                + "    return l;\n"
+                + "  }\n"
+                + "}\n"
+        );
+
+        return eng;
+    }
+
+    static java.lang.Object toJava(ScriptEngine eng, java.lang.Object js) {
+        try {
+            Number len = (Number) ((Invocable) eng).invokeFunction("checkArray", js, null);
+            if (len != null && len.intValue() >= 0) {
+                java.lang.Object[] arr = new java.lang.Object[len.intValue()];
+                ((Invocable) eng).invokeFunction("checkArray", js, arr);
+                return arr;
+            }
+            return js;
+        } catch (Exception ex) {
+            throw new IllegalStateException(ex);
+        }
+    }
+
+}

-- 
To stop receiving notification emails like this one, please contact
"commits@netbeans.apache.org" <co...@netbeans.apache.org>.