В настоящее время я пишу свой собственный компилятор и я пытаюсь скомпилировать следующий код:JVM Проверка ошибок «Illegal типа при постоянном пуле»
List[String] list = List("a", "b", "c", "d")
list stream map((String s) => s.toUpperCase())
System out println list
компилятор не имеет никаких проблем при разборе, связывающую или компиляции кода, но когда дело доходит до его выполнения, виртуальная машина выдает следующее сообщение об ошибке:
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;
И запись в Constant Бассейн (также с использованием 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, класса File Viewer, строку, где @29
должен быть гласит:
Class Format Exception
и все последующие инструкции больше не отображаются (кроме местных, ...). Тем не менее, плагин Bytecode ASM пишет
INVOKEVIRTUAL java/util/Collection.stream()Ljava/util/stream/Stream;
на этой линии, которая представляется действительной. Что я делаю неправильно/отсутствует здесь?
Возможно, это стоит представить как ошибку компилятора. –
О, я вижу, что это ваш компилятор, а не * javac *. В этом случае отправьте отчет об ошибке самому себе. –