我正在编写一个编译器来使用Jasmin 汇编器将 Java 的子集编译为 Java 字节码
我在使用“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 个局部变量(在此处解释)这一事实有关,但它仍然让我感到困惑。