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

Reply via email to