为什么在严格模式下 Java 8 的 Nashorn 引擎在调用 apply() 并直接传递参数对象时会抛出 java.lang.ClassCastException?

Why does Java 8's Nashorn engine in strict mode throw a java.lang.ClassCastException when calling apply() and passing the arguments object directly?

当我使用以下脚本在 nashorn 引擎上调用 eval(在严格模式下)时出现异常:

var yfunc = function () {
  (null).apply(null, arguments);
};
yfunc();

我严重删减了我的个人情况。第 2 行的“(null)”可以替换为括号之间的任何内容或局部变量,无论哪种方式都不会引发编译错误,并且会产生相同的结果。

问题似乎很明确,"arguments" 直接作为调用名为 "apply" 的方法的第二个参数传递。以下任何更改都将撤消抛出的异常:

  1. 首先将 "arguments" 放入变量中(但简单地用括号括起来是行不通的!)
  2. 调用应用以外的东西
  3. 调用 apply
  4. 时在不同的参数槽中传递 "arguments"
  5. 调用 print()(传递或不传递任何参数)作为 yfunc() 中的前一行代码(奇怪吧?)
  6. 为 yfunc() 定义超过 0 个参数
  7. 先绑定yfunc再调用绑定的方法
  8. 通过 Function.apply 调用 yfunc(与 Function.call 不同!)

抛出的异常是这样的:

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)

当我用一个所有者调用这个方法时,抛出的异常发生了变化。示例代码:

var yfunc = {
    method: function () {
          (null).apply(null, arguments);
    }
};
var x = yfunc.method();

那么抛出的异常是这样的:

Exception in thread "main" java.lang.ClassCastException: Cannot cast jdk.nashorn.internal.scripts.JO4 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>:5)
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)

到目前为止,我已经在特定的这些环境中重现了这个问题:

我似乎无法在 Internet 上找到任何关于类似问题的信息。我需要向 Oracle/OpenJDK 报告吗?

次要更新

已将第 6 项和第 7 项添加到 "following changes will undo the thrown exception" 的列表中。

最后更新

错误提交:JDK-8184720

是的,这似乎是一个错误。请提交错误。