Я пишу компилятор для компиляции подмножества байт-кода 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-х локальных переменных (объяснено здесь ), но это все еще вызывает недоумение.