Jasmin Assembler: 'l2d' Инструкция, дающая "java.lang.VerifyError: ... Попытка разбить длинный или двойной на стеке" - PullRequest
2 голосов
/ 25 ноября 2011

Я пишу компилятор для компиляции подмножества байт-кода Java в Java с использованием Jasmin ассемблера

У меня проблемы с инструкцией 'l2d' (и связанными с ней -но я думаю, что они все будут работать, как только я выясню, почему этот не работает).

Справочник инструкций:

http://cs.au.dk/~mis/dOvs/jvmspec/ref-_l2d.html

Код, который я используюКомпиляция:

{
    double d = 10L;
}

По сути, я пытаюсь отразить способ, которым javac выполняет неявные преобразования типов между примитивными числовыми типами.

Выходной код сборки Jasmin:

.source test3.jml
.class Test3
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
    .limit stack 10
    .limit locals 100
    ldc2_w 10 ;Load constant numerical value 10
    l2d ;Convert left hand side to match the type of the right
    dstore 0 ;Store top of stack in 0 (d)
.end method

Важные строки, которые являются тремя перед .end method.

Текст после ';'Это комментарий.

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

Exception in thread "main" java.lang.VerifyError:(class: Test3, method: main signature: ([java/lang/String;)V) Attempt to split long or double on the stack
Could not find the main class: Test3. Program will exit.

Я считаю, что это должно быть связано с тем, что long и double занимаютдо 2-х слотов в стеке и 2-х локальных переменных (объяснено здесь ), но это все еще вызывает недоумение.

1 Ответ

1 голос
/ 25 ноября 2011

Виртуальная машина Java использует локальные переменные для передачи параметров, поэтому локальная переменная с индексом 0 будет иметь тип String[] в вашем коде.Я не достаточно знаком с Жасмином, чтобы знать, нужно ли объявлять другие локальные переменные перед использованием, но вы можете просто попытаться сохранить значение типа double в индексе 1?

...