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