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:09 UTC
[incubator-netbeans-html4j] branch master updated (21b5a7f ->
2ee7501)
This is an automated email from the ASF dual-hosted git repository.
jtulach pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-netbeans-html4j.git.
from 21b5a7f Merge branch 'ComputedPropertyChain'
new ba45f10 NETBEANS-193: Recognize primitive arrays in the JNI signatures
new 2ee7501 Print error when using other array than Object[]
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../html/boot/impl/JavaScriptProcesor.java | 42 +++++++++++---
.../java/org/netbeans/html/boot/impl/Arithm.java | 8 +++
.../java/org/netbeans/html/boot/impl/FnTest.java | 11 ++--
.../html/boot/impl/JavaScriptProcesorTest.java | 66 ++++++++++++++++++++++
.../netbeans/html/boot/impl/JsClassLoaderBase.java | 1 +
.../netbeans/html/boot/impl/JsClassLoaderTest.java | 16 ++++--
.../org/netbeans/html/boot/impl/JsMethods.java | 21 +++++--
.../java/org/netbeans/html/boot/impl/JsUtils.java | 61 ++++++++++++++++++++
8 files changed, 202 insertions(+), 24 deletions(-)
create mode 100644 boot/src/test/java/org/netbeans/html/boot/impl/JsUtils.java
--
To stop receiving notification emails like this one, please contact
['"commits@netbeans.apache.org" <co...@netbeans.apache.org>'].
[incubator-netbeans-html4j] 02/02: Print error when using other
array than Object[]
Posted by jt...@apache.org.
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 2ee7501b534f9c36e12b0d3cce384841492a2409
Author: Jaroslav Tulach <ja...@oracle.com>
AuthorDate: Sat Dec 2 19:32:27 2017 +0100
Print error when using other array than Object[]
---
.../html/boot/impl/JavaScriptProcesor.java | 32 +++++++++--
.../java/org/netbeans/html/boot/impl/Arithm.java | 12 +---
.../html/boot/impl/JavaScriptProcesorTest.java | 66 ++++++++++++++++++++++
.../netbeans/html/boot/impl/JsClassLoaderBase.java | 12 ----
.../org/netbeans/html/boot/impl/JsMethods.java | 13 +----
5 files changed, 97 insertions(+), 38 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 956f11f..42b6136 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
@@ -118,6 +118,14 @@ public final class JavaScriptProcesor extends AbstractProcessor {
if (!jsb.javacall() && jsb.body().contains(".@")) {
msg.printMessage(Diagnostic.Kind.WARNING, "Usage of .@ usually requires javacall=true", e);
}
+ if (ee.getReturnType().getKind() == TypeKind.ARRAY) {
+ ArrayType at = (ArrayType) ee.getReturnType();
+ TypeMirror objectType = processingEnv.getElementUtils().getTypeElement("java.lang.Object").asType();
+ final TypeMirror componentType = at.getComponentType();
+ if (!processingEnv.getTypeUtils().isSameType(objectType, componentType)) {
+ wrongArrayError(componentType, e);
+ }
+ }
if (jsb.javacall()) {
JsCallback verify = new VerifyCallback(e);
try {
@@ -201,6 +209,10 @@ public final class JavaScriptProcesor extends AbstractProcessor {
return null;
}
+ final void wrongArrayError(TypeMirror paramType, Element method) {
+ processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Don't use " + paramType + " array. Use Object[].", method);
+ }
+
private class VerifyCallback extends JsCallback {
private final Element e;
public VerifyCallback(Element e) {
@@ -217,13 +229,14 @@ public final class JavaScriptProcesor extends AbstractProcessor {
return "";
}
ExecutableElement found = null;
+ String paramTypes = null;
StringBuilder foundParams = new StringBuilder();
for (Element m : type.getEnclosedElements()) {
if (m.getKind() != ElementKind.METHOD) {
continue;
}
if (m.getSimpleName().contentEquals(method)) {
- String paramTypes = findParamTypes((ExecutableElement)m);
+ paramTypes = findParamTypes((ExecutableElement)m);
if (paramTypes.equals(params)) {
found = (ExecutableElement) m;
break;
@@ -248,7 +261,7 @@ public final class JavaScriptProcesor extends AbstractProcessor {
mangledOnes = new TreeMap<String, ExecutableElement>();
javacalls.put(findPkg(e), mangledOnes);
}
- String mangled = JsCallback.mangle(fqn, method, findParamTypes(found));
+ String mangled = JsCallback.mangle(fqn, method, paramTypes);
mangledOnes.put(mangled, found);
}
return "";
@@ -258,10 +271,13 @@ public final class JavaScriptProcesor extends AbstractProcessor {
ExecutableType t = (ExecutableType) method.asType();
StringBuilder sb = new StringBuilder();
sb.append('(');
- for (TypeMirror tm : t.getParameterTypes()) {
+ for (TypeMirror paramType : t.getParameterTypes()) {
+ TypeMirror tm = paramType;
+ boolean isArray = false;
while (tm.getKind() == TypeKind.ARRAY) {
sb.append('[');
tm = ((ArrayType) tm).getComponentType();
+ isArray = true;
}
if (tm.getKind().isPrimitive()) {
switch (tm.getKind()) {
@@ -276,10 +292,18 @@ public final class JavaScriptProcesor extends AbstractProcessor {
default:
throw new IllegalStateException("Unknown " + tm.getKind());
}
+ if (isArray) {
+ wrongArrayError(paramType, method);
+ }
} else {
sb.append('L');
Types tu = processingEnv.getTypeUtils();
- Element elm = tu.asElement(tu.erasure(tm));
+ final TypeMirror erasedType = tu.erasure(tm);
+ TypeMirror objectType = processingEnv.getElementUtils().getTypeElement("java.lang.Object").asType();
+ if (isArray && !processingEnv.getTypeUtils().isSameType(objectType, erasedType)) {
+ wrongArrayError(paramType, method);
+ }
+ Element elm = tu.asElement(erasedType);
dumpElems(sb, elm, ';');
}
}
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 6df88af..06eb8b8 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
@@ -27,19 +27,11 @@ public class Arithm {
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];
+ Integer[] copy = new Integer[arr.length];
for (int i = 0; i < arr.length; i++) {
copy[i] = ((Number)arr[i]).intValue();
}
- return sumInts(copy);
+ return 0;
}
}
diff --git a/boot/src/test/java/org/netbeans/html/boot/impl/JavaScriptProcesorTest.java b/boot/src/test/java/org/netbeans/html/boot/impl/JavaScriptProcesorTest.java
index 85058fe..a05a600 100644
--- a/boot/src/test/java/org/netbeans/html/boot/impl/JavaScriptProcesorTest.java
+++ b/boot/src/test/java/org/netbeans/html/boot/impl/JavaScriptProcesorTest.java
@@ -95,6 +95,72 @@ public class JavaScriptProcesorTest {
c.assertNoErrors();
}
+ @Test public void primitiveArrayGeneratesAnError() throws IOException {
+ String code = "package x.y.z;\n"
+ + "import net.java.html.js.JavaScriptBody;\n"
+ + "class X {\n"
+ + " @JavaScriptBody(args={\"r\"}, body =\n"
+ + " \"return [ 1, 2 ];\"\n"
+ + " )\n"
+ + " private static native double[] returnPrimitive(Object r);\n"
+ + "}\n";
+
+ Compile c = Compile.create("", code);
+ c.assertErrors();
+ c.assertError("Use Object[]");
+ }
+
+ @Test public void nonObjectArrayGeneratesAnError() throws IOException {
+ String code = "package x.y.z;\n"
+ + "import net.java.html.js.JavaScriptBody;\n"
+ + "class X {\n"
+ + " @JavaScriptBody(args={\"r\"}, body =\n"
+ + " \"return [ 1, 2 ];\"\n"
+ + " )\n"
+ + " private static native Double[] returnPrimitive(Object r);\n"
+ + "}\n";
+
+ Compile c = Compile.create("", code);
+ c.assertErrors();
+ c.assertError("Use Object[]");
+ }
+
+ @Test public void primitiveArrayCallbackGeneratesAnError() throws IOException {
+ String code = "package x.y.z;\n"
+ + "import net.java.html.js.JavaScriptBody;\n"
+ + "class X {\n"
+ + " @JavaScriptBody(args={\"r\"}, javacall = true, body =\n"
+ + " \"return @x.y.z.X::acceptDouble([D)([ 1, 2 ]);\"\n"
+ + " )\n"
+ + " private static native Object[] returnPrimitive(Object r);\n"
+ + " static double[] acceptDouble(double[] arr) {\n"
+ + " return arr;\n"
+ + " }\n"
+ + "}\n";
+
+ Compile c = Compile.create("", code);
+ c.assertErrors();
+ c.assertError("Use Object[]");
+ }
+
+ @Test public void nonObjectArrayCallbackGeneratesAnError() throws IOException {
+ String code = "package x.y.z;\n"
+ + "import net.java.html.js.JavaScriptBody;\n"
+ + "class X {\n"
+ + " @JavaScriptBody(args={\"r\"}, javacall = true, body =\n"
+ + " \"return @x.y.z.X::acceptDouble([Ljava/lang/Double;)([ 1, 2 ]);\"\n"
+ + " )\n"
+ + " private static native Object[] returnPrimitive(Object r);\n"
+ + " static Double[] acceptDouble(Double[] arr) {\n"
+ + " return arr;\n"
+ + " }\n"
+ + "}\n";
+
+ Compile c = Compile.create("", code);
+ c.assertErrors();
+ c.assertError("Use Object[]");
+ }
+
@Test public void misorderNotified() throws IOException {
String code = "package x.y.z;\n"
+ "import net.java.html.js.JavaScriptBody;\n"
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 620459c..e37ffec 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
@@ -259,16 +259,4 @@ public class JsClassLoaderBase {
}
}
- @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/JsMethods.java b/boot/src/test/java/org/netbeans/html/boot/impl/JsMethods.java
index cbf5079..f5b2fe0 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
@@ -74,21 +74,10 @@ public class JsMethods {
@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());
}
@@ -146,7 +135,7 @@ public class JsMethods {
public static native void callParamTypes(Map<String,Integer> map, int value);
@JavaScriptBody(args = { "a", "b" }, body = "return [ a, b ];")
- public static native double[] both(double a, double b);
+ public static native Object both(double a, double b);
enum Enm {
A, B;
--
To stop receiving notification emails like this one, please contact
"commits@netbeans.apache.org" <co...@netbeans.apache.org>.
[incubator-netbeans-html4j] 01/02: NETBEANS-193: Recognize
primitive arrays in the JNI signatures
Posted by jt...@apache.org.
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>.