我正在编写一个生成Jasmin代码的编译器,我想使用参数调用一个方法,如下所示:
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
答案 0 :(得分:1)
首先,你'编译'的代码不是Java,我不确定它是什么(伪代码?)。
你的jasmin代码的问题是你似乎想要调用test()
作为数组的实例方法,它不是,因为它是helloworld
的实例方法,你不要实例化。
因此,您应该实例化类helloworld,或者使test()成为静态方法,以便可以在不创建对象的情况下调用它。
修复jasmin代码时,我还遇到了另一个错误:iload 1
应为iload 0
。 (程序员喜欢从0开始计数)。
在此代码中,我假设您认为test()
是静态的。
.class public helloworld
.super java/lang/Object
.method public <init>()V
aload_0
invokenonvirtual java/lang/Object/<init>()V
return
.end method
.method public static test([Ljava/lang/String;)[Ljava/lang/String;
.limit stack 4
.limit locals 3
aload 0
areturn
.end method
.method public static main([Ljava/lang/String;)V
.limit stack 4
.limit locals 3
ldc 1
anewarray java/lang/String
astore 2
aload 2
ldc 0
ldc "bar"
aastore
aload_0
aload 2
invokestatic helloworld/test([Ljava/lang/String;)[Ljava/lang/String;
return
.end method