Jasmin调用VerifyError中的本地方法结果

时间:2014-07-13 09:44:08

标签: jvm jasmin

我试图调用本地方法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

1 个答案:

答案 0 :(得分:1)

调用实例方法时,必须将对象放在堆栈上。

aload 0
ldc 1
ldc 2
invokevirtual helloworld/pow(II)I