Я столкнулся с проблемой, которая кажется, что это может быть какая-то ошибка в движке Nashorn, но я не могу найти хороший способ перегонять тестовый пример, который продемонстрирует его.
У меня есть блок кода (который работает!), Который выглядит примерно так:
'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
Если я изменил код следующим образом, он работает нормально:
'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));
Есть ли что-нибудь, что я могу сделать, чтобы попытаться измерить реальный код дальше или иначе отслеживать эту проблему? Странно, что ошибка происходит очень рано. Если я помещаю вызов print() в любом месте метода, печать никогда не будет достигнута. Последняя строка моего кода в callstack - это фактически строка, вызывающая метод.
Я просто взял новую версию Java через автообновление, но мне нужно проверить, работает ли этот код под ним или нет. Моя текущая версия с консоли:
➜ ~ java -version
java version "1.8.0_77"
Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)
Полное описание всего, что вы можете сделать для отслеживания Nashorn, содержится в этом документе:
jdk8u-DEV/Насхорн/файл/наконечник/документы/DEVELOPER_README
Он описывает системные свойства, которые используются для внутренней отладки и инструментальных целей, а также системные регистраторы, которые используются для одного и того же.
{"val":"I am fubar","aContainer":[{"some":"thing"},{"==":[{"var":"something_else"},"I am fubar"]}]}
. Как вы получаете двигатель с завода? Вот как я этоNashornScriptEngineFactory factory = new NashornScriptEngineFactory(); ScriptEngine engine = factory.getScriptEngine(new String[] { "--language=es6" });
:NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); ScriptEngine engine = factory.getScriptEngine(new String[] { "--language=es6" });