Почему этот байт-код не проверяется - PullRequest
1 голос
/ 29 апреля 2011

РЕДАКТИРОВАТЬ: Решение заключается в том, что я использовал aastore, когда я должен был использовать iastore, потому что я хотел сохранить элемент в массиве ints , тогда как aastore предназначен только для массивов Объекты .

У меня есть следующий метод, который я генерирую как конструктор в байт-коде

aload_0
invokespecial java/lang/Object/<init>()V
aload_0
new java/lang/StringBuilder
dup
invokespecial java/lang/StringBuilder/<init>()V
putfield com/js/interpreter/custom_types/1e9ebd0/s Ljava/lang/StringBuilder;
aload_0
iconst_0
putfield com/js/interpreter/custom_types/1e9ebd0/l I
aload_0
iconst_0
multianewarray [I 1
astore_1
iconst_0
istore_2
goto 23
18:aload_1
iload_2
iconst_0
aastore
iinc 2 1
23:iload_2
iconst_0
if_icmplt 18
aload_1
putfield com/js/interpreter/custom_types/1e9ebd0/a [I
return

Однако, это не в состоянии проверить, давая метод: signature: () V) Ожидается найти объект / массив в стеке

Тем не менее, я могу пройти и точно знать количество предметов в стеке:

    aload_0
1
    invokespecial java/lang/Object/<init>()V
0
    aload_0
1
    new java/lang/StringBuilder
2
    dup
3
    invokespecial java/lang/StringBuilder/<init>()V
2
    putfield com/js/interpreter/custom_types/1e9ebd0/s Ljava/lang/StringBuilder;
0
    aload_0
1
    iconst_0
2
    putfield com/js/interpreter/custom_types/1e9ebd0/l I
0
    aload_0
1
    iconst_0
2
    multianewarray [I 1
2
    astore_1
1
    iconst_0
2
    istore_2
1
    goto 23
    18:aload_1
2
    iload_2
3
    iconst_0
4
    aastore
1
    iinc 2 1
1
    23:iload_2
2
    iconst_0
3
    if_icmplt 18
1
    aload_1
2
    putfield com/js/interpreter/custom_types/1e9ebd0/a [I
0
    return

Когда я запускаю его через верификатор правосудия, он не дает мне никаких полезных сообщений (и даже не может проверить классы, сгенерированные javac).

Что здесь может происходить? В чем проблема?

Ответы [ 2 ]

1 голос
/ 29 апреля 2011

Я не вижу проблемы, но вот что я делаю, когда попадаю в ад отладки байт-кода:

  • Опустить ненужный код. в настоящее время кажется, что цикл не nop (вы никогда не входите в цикл body, потому что вы инициализируете локальную переменную 2 нулем, верно?). Так что я бы просто сделал тело цикла пустым и посмотрел бы, сохраняется ли ошибка проверки.
  • Затем я начну удалять другие части (инициализацию различных полей), пока ошибка не исчезнет.
1 голос
/ 29 апреля 2011

Возможно, я в замешательстве, но вы делаете

1
jsr 23

...

23: iload_2
2

, но после 23 я думаю, что в стеке будет 3

A0
<return address>
I2
...