ScriptEngineManager.getEngineByName("nashorn") завершается ошибкой из-за java.lang.invoke.WrongMethodTypeException
Я не могу создать ScriptEngine
за nashorn
в Java 8 (IBM J9JVM). В следующем коде двигатель null
,
private static void runOther(String[] args){
ScriptEngineManager engineManager = new ScriptEngineManager();
ScriptEngine engine = engineManager.getEngineByName("nashorn");
engine.eval("function sum(a, b) { return a + b; }");
}
Эта ошибка введена моей библиотекой, которая выполняет генерацию байт-кода для MethodHandle в java.lang.invoke
пакет. Изменения в моей библиотеке:
- изменение только для стандарта
java.lang.invoke
пакет. Ни один не изменен на нашорн. - Когда Nashorn собирается установить цель сайта вызова с
Methodhandle target
Моя библиотека преобразуетtarget
в дескриптор другого методаb
еслиtarget
создан изGuardWithTestHandle
и установите цель сайта вызова наb
, Обе целиand
b` имеет тот же тип метода.
Моя последняя версия библиотеки была закончена в октябре 2016 года, и это было хорошо для Nashorn. Но новая версия, которую я построил, имеет WrongMethodTypeException
при выполнении getEngineByName
, Это исключение было обработано внутри getEngineByName
и ноль возвращается.
Исходный код nashorn, который я получил, не состоит из nashorn.jar в JVM. Во время отладки я обнаружил, что исключение было из:
global = createNashornGlobal ();
Внутри NashornScriptEngine.<init>
, После глубокого перебора возникла исключительная ситуация при вызове MethodHandle в UserAccessorProperty
(Line318)
/* */ public Object getObjectValue(ScriptObject self, ScriptObject owner)
/* */ {
/* */ try {
/* 215 */ return invokeObjectGetter(getAccessors(owner != null ? owner : self), getObjectGetterInvoker(), self); //owner and self are the same instance.
/* */ } catch (Error|RuntimeException t) {
/* 217 */ throw t;
/* */ } catch (Throwable t) {
/* 219 */ throw new RuntimeException(t);
/* */ }
/* */ }
/* */ private static Object invokeObjectGetter(Accessors gs, MethodHandle invoker, Object self)
/* */ throws Throwable
/* */ {
/* 316 */ Object func = getter;
/* 317 */ if ((func instanceof ScriptFunction)) {
/* 318 */ return invoker.invokeExact(func, self);
/* */ }
/* */
/* 321 */ return ScriptRuntime.UNDEFINED;
/* */ }
В строке 318 invoker
является MutableCallSiteDynamicInvokerHandle
и его тип метода (Object,Object)Object
, И то и другое func
а также self
объявлены как Object
Объект здесь и типы параметров и возвращаемого значения полностью совпадают.
Я не могу понять это исключение, и не имею представления о следующих шагах по этому вопросу. Спасибо, если вы можете предоставить некоторые идеи и предложения по этому вопросу здесь? Или некоторые варианты / конфигурации..