В настоящее время я пишу свой собственный компилятор и пытаюсь скомпилировать следующий код:
List[String] list = List("a", "b", "c", "d")
list stream map((String s) => s.toUpperCase())
System out println list
У компилятора нет проблем с синтаксическим анализом, компоновкой или компиляцией кода, но когда дело доходит до его выполнения, JVM выдает следующую ошибку:
java.lang.VerifyError: Illegal type at constant pool entry 40 in class dyvil.test.Main
Exception Details:
Location:
dyvil/test/Main.main([Ljava/lang/String;)V @29: invokevirtual
Reason:
Constant pool index 40 is invalid
Bytecode:
...
Я пробовал использовать javap
, чтобы найти проблему, и это инструкция @29
:
29: invokevirtual #40 // InterfaceMethod java/util/Collection.stream:()Ljava/util/stream/Stream;
И запись в постоянном пуле (также с использованием javap
):
#37 = Utf8 stream
#38 = Utf8 ()Ljava/util/stream/Stream;
#39 = NameAndType #37:#38 // stream:()Ljava/util/stream/Stream;
#40 = InterfaceMethodref #36.#39 // java/util/Collection.stream:()Ljava/util/stream/Stream;
При открытии класса с помощью средства просмотра файлов классов Eclipse строка, где должно быть указано @29
:
Class Format Exception
и все следующие инструкции больше не отображаются (кроме Locals, ...). Однако плагин байт-кода ASM пишет
INVOKEVIRTUAL java/util/Collection.stream ()Ljava/util/stream/Stream;
в этой строке, которая кажется действительной. Что я здесь делаю не так / не хватает?