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 ではなく、それが何であるかわかりません (疑似コード?)。

test()jasmin コードの問題は、インスタンス化しないのインスタンス メソッドであるため、そうではない配列のインスタンス メソッドとして呼び出したいように見えることですhelloworld

したがって、オブジェクトを作成せずに呼び出すことができるように、クラス helloworld をインスタンス化するか、test() を静的メソッドにする必要があります。

ジャスミンコードを修正するときに、別のエラーにも遭遇しました: iload 1should be 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 に答える