我遇到了一个问题,好像它可能是Nashorn引擎中的某种错误,但我无法找到一个很好的方法来提炼一个可以证明它的测试用例。
我有一段代码(曾经工作过!),看起来大致如下:
12.34.56.78 (ab1-2-3-4-5.test-1.example.com)
Jersey City
New Jersey
US, United States
ASN: Example.com/12345
不幸的是,使用'use strict';
function Dummy() {
this.val = 'I am fubar';
this.aContainer = [];
}
Dummy.prototype.toString = function() { return JSON.stringify(this);};
let obj = {};
obj.aMethod = function(arg) {
let fubar = new Dummy();
print('Okay so far');
fubar.aContainer.push({"some":"thing"});
print('Still okay');
fubar.aContainer.push({"==": [{"var": "something_else"}, fubar.val]});
return fubar;
};
print(obj.aMethod(null));
运行此示例并不会崩溃。在我的真实代码中,我得到以下内容:
jss --language=es6 -strict
如果我按如下方式更改代码,它运行正常:
jdk.nashorn.internal.runtime.ECMAException: ReferenceError: "fubar" is not defined
我可以做些什么来尝试进一步检测真实代码或以其他方式跟踪此问题?奇怪的是错误发生在执行的早期。如果我在方法中的任何位置放置print()调用,则永远不会打印。我在callstack中的代码的最后一行实际上是调用该方法的行。
我刚刚通过自动更新获取了新版本的Java,但我需要查看此代码是否在其下运行。我在控制台上的当前版本是:
'use strict';
function Dummy() {
this.val = 'I am fubar';
this.aContainer = [];
}
Dummy.prototype.toString = function() { return JSON.stringify(this);};
let obj = {};
obj.aMethod = function(arg) {
let fubar = new Dummy();
print('Okay so far');
fubar.aContainer.push({"some":"thing"});
print('Still okay');
let x = fubar.val;
fubar.aContainer.push({"==": [{"var": "something_else"}, x]});
return fubar;
};
print(obj.aMethod(null));
答案 0 :(得分:1)
本文档中包含了跟踪Nashorn所能做的所有事情的完整摘要:
jdk8u-dev/nashorn/file/tip/docs/DEVELOPER_README
它描述了用于内部调试和检测目的的系统属性,以及用于同一事物的系统记录器。