2015-02-23 1 views
1

В настоящее время я пишу свой собственный компилятор и я пытаюсь скомпилировать следующий код: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; 

на этой линии, которая представляется действительной. Что я делаю неправильно/отсутствует здесь?

ответ

5

Я понял свою ошибку. Ошибка заключается здесь:

invokevirtual #40 // InterfaceMethod 
     ^^^^^^^  ^^^^^^^^^ 

Я использую вызвать виртуального на интерфейс метода, который, как правило, не является хорошей идеей. Тем не менее, я думаю, что ошибка, вызванная верификатором, должна быть более понятной в отношении того, что на самом деле неправильно.

+0

Возможно, это стоит представить как ошибку компилятора. –

+5

О, я вижу, что это ваш компилятор, а не * javac *. В этом случае отправьте отчет об ошибке самому себе. –

Смежные вопросы