# HG changeset patch # User Jaroslav Tulach # Date 1455510197 -3600 # Node ID d0e6c8f97dc38283773969d9118425761ed54b53 # Parent f18b6cc923d8be39f126da28b5a0abee59c6b2fd Returning primitive array should yield ClassCastException during runtime diff -r f18b6cc923d8 -r d0e6c8f97dc3 boot/src/main/java/org/netbeans/html/boot/impl/FnUtils.java --- a/boot/src/main/java/org/netbeans/html/boot/impl/FnUtils.java Thu Feb 11 06:03:40 2016 +0100 +++ b/boot/src/main/java/org/netbeans/html/boot/impl/FnUtils.java Mon Feb 15 05:23:17 2016 +0100 @@ -380,6 +380,11 @@ public void visitClassType(String name) { returnType = Type.getType("[" + Type.getObjectType(name).getDescriptor()); } + + @Override + public void visitBaseType(char descriptor) { + returnType = Type.getType("[" + descriptor); + } }; } loadObject(); diff -r f18b6cc923d8 -r d0e6c8f97dc3 boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderBase.java --- a/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderBase.java Thu Feb 11 06:03:40 2016 +0100 +++ b/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderBase.java Mon Feb 15 05:23:17 2016 +0100 @@ -126,6 +126,18 @@ throw ex.getTargetException(); } } + + @Test public void primitiveArrayReturn() throws Throwable { + Method st = methodClass.getMethod("both", double.class, double.class); + Throwable ex; + try { + Object arr = st.invoke(null, 2, 5); + ex = null; + } catch (InvocationTargetException invoke) { + ex = invoke.getTargetException(); + } + assertTrue(ex instanceof ClassCastException, "Primitive arrays aren't returned from JavaScript: " + ex); + } @Test public void truth() throws Throwable { Method st = methodClass.getMethod("truth"); diff -r f18b6cc923d8 -r d0e6c8f97dc3 boot/src/test/java/org/netbeans/html/boot/impl/JsMethods.java --- a/boot/src/test/java/org/netbeans/html/boot/impl/JsMethods.java Thu Feb 11 06:03:40 2016 +0100 +++ b/boot/src/test/java/org/netbeans/html/boot/impl/JsMethods.java Mon Feb 15 05:23:17 2016 +0100 @@ -146,6 +146,9 @@ "map.@java.util.Map::put(Ljava/lang/Object;Ljava/lang/Object;)('key',value);" ) public static native void callParamTypes(Map map, int value); + + @JavaScriptBody(args = { "a", "b" }, body = "return [ a, b ];") + public static native double[] both(double a, double b); enum Enm { A, B;