0
我正在写茉莉生成代码的编译器,我想用一个参数来调用方法,如下所示:茉莉调用的方法使用的参数
val test(val x) {
return x;
}
val main (string[] args) {
test(1);
}
这编译为:
.class public helloworld
.super java/lang/Object
.method public <init>()V
aload_0
invokenonvirtual java/lang/Object/<init>()V
return
.end method
.method public test(I)I
.limit stack 4
.limit locals 3
iload 1
ireturn
.end method
.method public static main([Ljava/lang/String;)V
.limit stack 4
.limit locals 3
aload_0
ldc 1
invokevirtual helloworld/test(I)I
return
.end method
但是,这会导致以下错误。我在这里做错了什么?
java.lang.VerifyError: (class: helloworld, method: main signature: ([Ljava/lang/String;)V) Incompatible object argument for function call
谢谢,似乎使静态方法解决了我的问题。我为编译器编写的语言是我自己创建的语言。但是,我还有一个问题,因为我也得到了另一个错误。当我用Java重新创建相同的程序并使用javap命令反汇编它时,它会使用iload_1(而不是iload_0)加载函数的第一个参数。我认为0寄存器是对自身的引用(这就是为什么在调用函数时用aload_0加载它,正如你在我的另一个问题中所解释的那样) – appel
因为这是一个静态方法,所以0寄存器是第一个变量。当它是一个实例方法时,0是'this'。 – wvdz
我明白了,谢谢你解释! – appel