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 <jaroslav.tul...@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 "comm...@netbeans.apache.org" <comm...@netbeans.apache.org>.