Как отследить ReferenceError в Nashorn

1

Я столкнулся с проблемой, которая кажется, что это может быть какая-то ошибка в движке 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)
  • 0
    Я запустил ваш первый код с Java-версии "1.8.0_121" без каких-либо проблем. Это вывод: {"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" });
  • 0
    Да, спасибо, что попробовали это. К сожалению, мне не удалось создать простой пример, демонстрирующий проблему. Это заставляет меня поверить, что что-то в отношении использования памяти в моем приложении приводит к тому, что эта переменная собирается или поднимается неправильно при выполнении определенного вызова метода или набора свойств. Копирование переменной в новый экземпляр, похоже, предотвращает неправильную обработку, но я застрял, пытаясь найти способ, которым я мог бы поделиться соответствующей информацией с командой Nashorn, чтобы помочь им отследить ее.
Показать ещё 4 комментария
Теги:
nashorn
java-8

1 ответ

1
Лучший ответ

Полное описание всего, что вы можете сделать для отслеживания Nashorn, содержится в этом документе:

jdk8u-DEV/Насхорн/файл/наконечник/документы/DEVELOPER_README

Он описывает системные свойства, которые используются для внутренней отладки и инструментальных целей, а также системные регистраторы, которые используются для одного и того же.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню