-
Bug
-
Resolution: Fixed
-
P3
-
8, 9
-
b22
-
generic
-
generic
FULL PRODUCT VERSION :
java version "1.8.0_131"
java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [Version 6.3.9600] (windows 8 64bit)
A DESCRIPTION OF THE PROBLEM :
When I call eval (in strict mode) on a nashorn engine with the following script I get an exception:
var yfunc = function () {
(function(){}).apply(null, arguments);
};
yfunc();
The "(function(){})" on line 2 can be replaced with anything between parenthesis or a local variable, either way just something that shouldn't throw a compile error, and it will yield the same result.
The Exception thrown is this:
Exception in thread "main" java.lang.ClassCastException: Cannot cast jdk.nashorn.internal.runtime.Undefined to jdk.nashorn.internal.runtime.ScriptFunction
When I call this method with an owner, the exception thrown changes. Example code:
var yfunc = {
method: function () {
(null).apply(null, arguments);
}
};
var x = yfunc.method();
Then the thrown exception looks like this:
Exception in thread "main" java.lang.ClassCastException: Cannot cast jdk.nashorn.internal.scripts.JO4 to jdk.nashorn.internal.runtime.ScriptFunction
I've reproduced the issue so far on specifically these environments:
- windows 7 64bit -> jdk 1.8.0_60 64bit
- windows 8 64bit -> jdk 1.8.0_131 64bit
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Execute the supplied source in this bug report.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
No output.
ACTUAL -
Throws ClassCastException
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Exception in thread "main" java.lang.ClassCastException: Cannot cast jdk.nashorn.internal.runtime.Undefined to jdk.nashorn.internal.runtime.ScriptFunction
at java.lang.invoke.MethodHandleImpl.newClassCastException(MethodHandleImpl.java:361)
at java.lang.invoke.MethodHandleImpl.castReference(MethodHandleImpl.java:356)
at jdk.nashorn.internal.scripts.Script$\^eval\_.:program(<eval>:4)
at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:637)
at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494)
at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:449)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:406)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:402)
at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:155)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
at root.Main.main(Main.java:19)
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import jdk.nashorn.api.scripting.NashornScriptEngineFactory;
public class Main {
public static void main(String[] args) throws Throwable {
final ScriptEngine engine = ((NashornScriptEngineFactory) new ScriptEngineManager()
.getEngineFactories()
.iterator()
.next())
.getScriptEngine(new String[]{ //
"-strict"
});
engine.eval(""
+ "var yfunc = function () {\n"
+ "(function(){}).apply(null, arguments);\n"
+ "};\n"
+ "yfunc();\n");
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Any of the following:
1. Putting "arguments" in a variable first (but simply wrapping it in parenthesis doesn't work!)
2. Calling something other than apply
3. Passing "arguments" in a different argument slot when calling apply
4. Calling print() (with or without passing any arguments) as a preceding line of code inside the function body of yfunc
5. Defining more than 0 parameters for yfunc()
6. Binding yfunc first and then calling the bound method instead of calling yfunc directly
7. Calling yfunc via Function.apply (not so much with Function.call)
SUPPORT :
YES
java version "1.8.0_131"
java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [Version 6.3.9600] (windows 8 64bit)
A DESCRIPTION OF THE PROBLEM :
When I call eval (in strict mode) on a nashorn engine with the following script I get an exception:
var yfunc = function () {
(function(){}).apply(null, arguments);
};
yfunc();
The "(function(){})" on line 2 can be replaced with anything between parenthesis or a local variable, either way just something that shouldn't throw a compile error, and it will yield the same result.
The Exception thrown is this:
Exception in thread "main" java.lang.ClassCastException: Cannot cast jdk.nashorn.internal.runtime.Undefined to jdk.nashorn.internal.runtime.ScriptFunction
When I call this method with an owner, the exception thrown changes. Example code:
var yfunc = {
method: function () {
(null).apply(null, arguments);
}
};
var x = yfunc.method();
Then the thrown exception looks like this:
Exception in thread "main" java.lang.ClassCastException: Cannot cast jdk.nashorn.internal.scripts.JO4 to jdk.nashorn.internal.runtime.ScriptFunction
I've reproduced the issue so far on specifically these environments:
- windows 7 64bit -> jdk 1.8.0_60 64bit
- windows 8 64bit -> jdk 1.8.0_131 64bit
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Execute the supplied source in this bug report.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
No output.
ACTUAL -
Throws ClassCastException
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Exception in thread "main" java.lang.ClassCastException: Cannot cast jdk.nashorn.internal.runtime.Undefined to jdk.nashorn.internal.runtime.ScriptFunction
at java.lang.invoke.MethodHandleImpl.newClassCastException(MethodHandleImpl.java:361)
at java.lang.invoke.MethodHandleImpl.castReference(MethodHandleImpl.java:356)
at jdk.nashorn.internal.scripts.Script$\^eval\_.:program(<eval>:4)
at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:637)
at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494)
at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:449)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:406)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:402)
at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:155)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
at root.Main.main(Main.java:19)
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import jdk.nashorn.api.scripting.NashornScriptEngineFactory;
public class Main {
public static void main(String[] args) throws Throwable {
final ScriptEngine engine = ((NashornScriptEngineFactory) new ScriptEngineManager()
.getEngineFactories()
.iterator()
.next())
.getScriptEngine(new String[]{ //
"-strict"
});
engine.eval(""
+ "var yfunc = function () {\n"
+ "(function(){}).apply(null, arguments);\n"
+ "};\n"
+ "yfunc();\n");
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Any of the following:
1. Putting "arguments" in a variable first (but simply wrapping it in parenthesis doesn't work!)
2. Calling something other than apply
3. Passing "arguments" in a different argument slot when calling apply
4. Calling print() (with or without passing any arguments) as a preceding line of code inside the function body of yfunc
5. Defining more than 0 parameters for yfunc()
6. Binding yfunc first and then calling the bound method instead of calling yfunc directly
7. Calling yfunc via Function.apply (not so much with Function.call)
SUPPORT :
YES