gpt4 book ai didi

java - Nashorn (es6) 损坏的函数范围

转载 作者:行者123 更新时间:2023-12-03 20:54:00 28 4
gpt4 key购买 nike

我目前正在调查 Nashorn js 脚本引擎中的以下问题,非常感谢您的意见。
以下代码片段执行失败(Kotlin 中的代码):

fun main() {
   val brokenScript = """
       function fn() {
           const object1 = { "name": "Pepa" };
           print(object1.name);
           const descriptor1 = Object.getOwnPropertyDescriptor(object1, 'name');
           print(descriptor1.configurable);
           print(eval("3+1"));
       }
       fn();
   """.trimIndent()
   NashornScriptEngineFactory()
           .getScriptEngine("--no-deprecation-warning", "--language=es6", "--log=compiler:finest,fields,recompile:fine")
           .let { (it as Compilable).compile(brokenScript) }
           .also { script -> script.eval() }
}

错误:
Exception in thread "main" javax.script.ScriptException: ReferenceError: "descriptor1" is not defined in <eval> at line number 8
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:477)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:461)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine$3.eval(NashornScriptEngine.java:517)
at java.scripting/javax.script.CompiledScript.eval(CompiledScript.java:103)
at MainKt.main(Main.kt:19)
at MainKt.main(Main.kt)
Caused by: <eval>:8 ReferenceError: "descriptor1" is not defined
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:57)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:319)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:291)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:278)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.AccessorProperty.checkUndeclared(AccessorProperty.java:571)
...

观察:
  • 问题受 影响评估 函数 - 从脚本中省略它有帮助 - 还需要嵌套在函数中 - 在顶层可以正常工作
  • 问题受 影响Object.getOwnPropertyDescriptor 函数 - 从脚本中省略它有助于
  • 问题受作用域影响 - 将变量声明从作用域( const/let )更改为未作用域 变量 帮助
  • 输出日志包含 caught RewriteException [pp=3, type=object, value='Pepa')]

  • 当前假设:

    Object.getOwnPropertyDescriptor 函数引发 UnwarrantedOptimismException 这会强制函数重新编译。
    重新编译脚本的范围已损坏。通常范围由 操作。评估 函数使用,因此它可以声明变量 - 这可能在运行时重新编译期间被错误地解决。
    访问作用域变量失败。

    我希望得到什么结果?(按优先顺序排列)
  • 它的工作原理与在节点中执行时一样 - 显然
  • 问题在编译时被识别,而没有关闭 es6 功能
  • 禁用 评估 函数防止了这个问题 - 我通过从 Bindings 对象中删除 eval 来尝试这个,但是脚本在编译阶段被破坏,修改后的 Bindings 稍后传递给 script.eval(bindings) - 所以脚本在到达 eval 行
  • 之前仍然失败
  • (这实际上是我试图避免的)通过关闭 es6 功能绕过问题(删除 --language=es6 - 由于使用范围变量(),这会强制脚本在编译时失败常量/让 )

  • (我知道 nashorn 已被弃用并将被删除。)

    最佳答案

    Nashorn 和 JDK 9+ 也有类似的问题。好像是 optimistic types导致这个问题。尝试禁用 Nashorn 的乐观类型

    .getScriptEngine("--no-deprecation-warning", "--language=es6", "--log=compiler:finest,fields,recompile:fine", "--optimistic-types=false")
    引用: https://openjdk.java.net/jeps/196

    关于java - Nashorn (es6) 损坏的函数范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61613216/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com