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>.