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