Nashorn: выполнить скрипт с анонимной функцией уровня корня и подфункциямиJavascript

Форум по Javascript
Ответить Пред. темаСлед. тема
Anonymous
 Nashorn: выполнить скрипт с анонимной функцией уровня корня и подфункциями

Сообщение Anonymous »

Я пытаюсь собрать базовую тестовую структуру для ряда сценариев JS, которые мне предоставили. Все они бегут на Нэшорне (JDK 11) без проблем в их первоначальной среде обитания. Я сам пытаюсь загрузить и запустить сценарии и выполнять тесты, сравнивая вход и вывод. Хотя я знаю, что их можно запустить через Nashorn, у меня нет доступа к исходному коду, который делает это, и у меня возникает проблема с получением ссылок на все необходимые мне функции/методы. Исходные файлы следуют этому шаблону: < /p>
(function () {
"use strict";

print("Canary: Here I am inside the root level function");

function writeLogEntry(message) {
echo(message);
}

return function main(data) {
print("Canary: Here I am inside main");
writeLogEntry(data.someVitalStat());
return true;
};
})();
< /code>
У меня нет возможности изменить исходные файлы - я должен использовать их как есть. Проблема заключалась в том, чтобы получить ссылку на функции, отличные от Main. Я смог получить рефери для Main следующим образом, что потребовало двух проходов: < /p>
String scriptTextRaw = new String(Files.readAllBytes(Paths.get(location)), StandardCharsets.UTF_8);
var ee = new ScriptEngineManager().getEngineByName("Nashorn");
scriptTextRaw = "var mainfunc = " + scriptTextRaw;
ee.eval(scriptTextRaw);
Object mainRef = ee.get("mainfunc");
// Second eval pass
ee.eval(mainRef.toString());
var mainInvocable = (ScriptObjectMirror)ee.get("main");

// Invoke main function
Object mainResult = mainInvocable.call(myDataObject);
< /code>
Я открыт для лучших способов получить эту основную ссылку. Тем не менее, большая проблема заключается в том, что анонимные функции, инкапсулированные в сценарии, недоступны. Запуск приведенного выше кода, я получаю: < /p>
Exception in thread "main" :3 ReferenceError: "writeLogEntry" is not defined.
< /code>
Я пробовал несколько вещей, например ,::
Object writeLogEntryRef = (ScriptObjectMirror)ee.get("writeLogEntry");
< /code>
(как после первого, так и второго прохода Eval) < /p>
Но это безуспешно. Я также остановил программу в отладчике после каждого прохода Eval для изучения возвращенного объекта, но я не нахожу никаких ссылок на другие методы. Расположение и запуск сценария, отформатированный как этот? Весь вход ценится.

Подробнее здесь: https://stackoverflow.com/questions/794 ... bfunctions
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Javascript»