Jasmin调用本地方法会导致VerifyError



我正在尝试调用一个局部方法,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

相关内容

  • 没有找到相关文章

最新更新