some nashorn testing

Andreas Rieber rieberandreas at gmail.com
Wed Jan 9 06:51:10 PST 2013


Hi Marcus and Remi,

please find attached a better test to reproduce.

Rhino output:
-------------
data 0 : 1.0
data 1 : 2.0
data 2 : 3.0

Nashorn output:
---------------
Exception in thread "main" java.lang.ClassCastException: Cannot cast 
jdk.nashorn.internal.objects.NativeArray to [Ljava.lang.Object;
     at 
sun.invoke.util.ValueConversions.newClassCastException(ValueConversions.java:461)
     at 
sun.invoke.util.ValueConversions.castReference(ValueConversions.java:456)
     at jdk.nashorn.internal.scripts.Script$\^eval\_.varargFunc(<eval>:10)
     at jdk.nashorn.internal.scripts.Script$\^eval\_.runScript(<eval>:13)
     at 
jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:359)
     at 
jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:310)
     at 
jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:438)
     at 
jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:423)
     at 
jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:150)
     at 
javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
     at ObjectArray.main(ObjectArray.java:16)



On 09.01.13 08:45, Marcus Lagergren wrote:
> Remi, Andreas
>
> I can't reproduce your problem running
>
> java -jar nashorn.jar script.js
>
> where script.js is
>
> --
>   var array;
>   try {
>     array = new (Java.type("java.lang.Object[]"))(len);
>   } catch (x) {
>     array = [];
>   }
> --
>
> Do you have a reproducer you can send me ? I know there was a bug regarding array literal types just before Christmas, but it's in the openjdk as far as I can tell.
>
> Regards
> Marcus
>
>
> On Jan 8, 2013, at 10:56 PM, Remi Forax <forax at univ-mlv.fr> wrote:
>
>> On 01/08/2013 10:49 PM, Attila Szegedi wrote:
>>> Hey Marcus and Jim, this is similar to that bug we saw before with array literals in the ternary operator. Something related to codegen's inference of types…
>> a simple workaround is to change the last line
>>
>>   var array;
>>   try {
>>     array = new (Java.type("java.lang.Object[]"))(len);  // array is Object[]
>>   } catch (x) {
>>     //array = [];                                        // array is NativeArray
>>     array = new (Java.type("java.lang.Object[]"))(0);    // array is Object[]
>>   }
>>
>> Rémi
>>
>>> On Jan 8, 2013, at 9:30 PM, Andreas Rieber <rieberandreas at gmail.com> wrote:
>>>
>>>> I tried some cases and will go for (Nashorn and Rhino):
>>>>
>>>>    var array;
>>>>    try {
>>>>      array = new (Java.type("java.lang.Object[]"))(len);
>>>>    } catch (x) {
>>>>      array = [];
>>>>    }
>>>>
>>>> The catch block works with Rhino but gives with Nashorn:
>>>>
>>>> Exception in thread "main" java.lang.ClassCastException: Cannot cast jdk.nashorn.internal.objects.NativeArray to [Ljava.lang.Object;
>>>>      at sun.invoke.util.ValueConversions.newClassCastException(ValueConversions.java:461)
>>>>      at sun.invoke.util.ValueConversions.castReference(ValueConversions.java:456)
>>>>      at jdk.nashorn.internal.scripts.Script$main.sprintf(main.js:114)
>>>>      at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:350)
>>>>      at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:310)
>>>>      at jdk.nashorn.internal.objects.NativeFunction.apply(NativeFunction.java:133)
>>>>
>>>>
>>>> cheers
>>>> Andreas
>>>>
-------------- next part --------------

import javax.script.*;

public class ObjectArray {

    public static void objFunc(String input, Object[] data) {
        for (int i = 0; i < data.length; i++) {
            System.out.println("data " + i + " : " + data[i]);
        }
    }

    public static void main( String args[]) throws Exception {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");

        engine.eval("\n"
+ "function varargFunc(firstParam) {\n"
+ "    var len = arguments.length - 1;\n"
+ "    var array = [];\n"
+ "\n"
+ "    for (var i = 0; i < len; i++) {\n"
+ "        array[i] = arguments[i+1];\n"
+ "    }\n"
+ "\n"
+ "    return Packages.ObjectArray.objFunc(firstParam, array);\n"
+ "};\n"
+ "\n"
+ "varargFunc('test',1,2,3);\n");
    }
}


More information about the nashorn-dev mailing list