0

我正在编写一个生成 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
4

1 回答 1

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
于 2014-07-13T13:34:21.503 回答