我正在尝试调用一个局部方法,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()是一个将第一个值提升到第二个值的幂的方法:
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
当你调用实例方法时,你必须把对象也放在堆栈上。
aload 0
ldc 1
ldc 2
invokevirtual helloworld/pow(II)I