0

次のように、ローカル メソッド pow() を呼び出そうとしています。

私のクラスはこんな感じです。

.class public helloworld
.super java/lang/Object

.method public pow(II)I
    ...
.end method

.method public foo()V
    ...
    ldc 1
    ldc 2
    invokevirtual helloworld/pow(II)I
    return
.end method

ただし、これにより次のエラーが発生します。

java.lang.VerifyError: (class: helloworld, method: foo signature: ()V) Unable to pop operand off an empty stack

ここで何が間違っていますか?

編集:私の完全なコードは以下のとおりです。pow() は、最初の値を 2 番目の値で累乗するメソッドであることに注意してください。

val pow (val v, val pow) {

    val result = v;

    for (val i = 1; i < pow; i++ ) {
        result = result * v;
    }

    return result;
}

完全なクラス:

.class public helloworld
.super java/lang/Object

.method public <init>()V
aload_0
invokenonvirtual java/lang/Object/<init>()V
return
.end method

.method public pow(II)I
.limit stack 9
.limit locals 5
iload 1
istore 3
ldc 1
istore 4
label16:
iload 4
iload 2
if_icmplt label22
iconst_0
goto label24
label22:
iconst_1
label24:
ifeq label36
goto label30
label27:
iinc 4 1
goto label16
label30:
iload 3
iload 1
imul
istore 3
goto label27
label36:
ireturn
.end method

.method public foo()V
.limit stack 3
.limit locals 3
ldc 1
ldc 2
invokevirtual helloworld/pow(II)I
return
.end method

.method public static main([Ljava/lang/String;)V
.limit stack 3
.limit locals 2
return
.end method
4

1 に答える 1

2

インスタンス メソッドを呼び出すときは、オブジェクトもスタックに置く必要があります。

aload 0
ldc 1
ldc 2
invokevirtual helloworld/pow(II)I
于 2014-07-13T10:11:11.597 に答える