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 пакет. Изменения в моей библиотеке:

  1. изменение только для стандарта java.lang.invoke пакет. Ни один не изменен на нашорн.
  2. Когда Nashorn собирается установить цель сайта вызова с Methodhandle targetМоя библиотека преобразует target в дескриптор другого метода bесли target создан из GuardWithTestHandle и установите цель сайта вызова на b, Обе целиandb` имеет тот же тип метода.

Моя последняя версия библиотеки была закончена в октябре 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 Объект здесь и типы параметров и возвращаемого значения полностью совпадают.

Я не могу понять это исключение, и не имею представления о следующих шагах по этому вопросу. Спасибо, если вы можете предоставить некоторые идеи и предложения по этому вопросу здесь? Или некоторые варианты / конфигурации..

Посмотреть стеки Отладка снимка экрана для стека,

0 ответов

Другие вопросы по тегам