Как избежать «Недопустимого типа в пуле констант», используя «ldc_w <classname>» в Jasmin? - PullRequest
3 голосов
/ 07 мая 2010

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

public class CTest
{
    public static void main(String[] args)
        throws Exception
    {
        java.lang.reflect.Array.newInstance(CTest.class, 0);
    }
}

Так что в Жасмин я думаю, что должно быть:

.class public CTest2
.super java/lang/Object

.method public static main([Ljava/lang/String;)V
    .limit stack 2
    .limit locals 1
    ldc_w CTest2
    iconst_0
    invokestatic java/lang/reflect/Array/newInstance(Ljava/lang/Class;I)Ljava/lang/Object;
    pop
    return
.end method

Когда я собираю и запускаю его, я получаю:

Исключение в потоке "main" java.lang.VerifyError: (класс: CTest2, метод: основная подпись: ([Ljava / lang / String;) V) Недопустимый тип в постоянном пуле

Просмотр дизассемблированного кода для обоих CTest.class (версия Java) и CTest2.class (версия Jasmin) с "javap -c -verbose" они оба, кажется, устанавливают постоянный пул одинаково:

const #2 = class        #16;    //  CTest
const #16 = Asciz       CTest;

  0:   ldc_w   #2; //class CTest

const #14 = Asciz       CTest2;
const #17 = class       #14;    //  CTest2

  0:   ldc_w   #17; //class CTest2

Я уже исправил две ошибки в Жасмин, но не вижу, что это делает неправильно при помещении класса в пул констант для "ldc_w" он помещает классы в пул констант для других инструкций, таких как "new" и "anewarray" правильно.

Я попытался просмотреть файлы .class с помощью TraceClassVisitor в ASM, но он не сбрасывает постоянный пул.

Есть идеи, что я могу попробовать дальше?

1 Ответ

4 голосов
/ 20 мая 2010

Вы должны убедиться, что номер версии класса не менее 49 (см. VisitLdcInsn на этой странице ASM Javadoc ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...