2014-07-13 10 views
0

다음과 같이 로컬 메소드 pow()를 호출하려고합니다.Jasmin이 VerifyError에서 로컬 메소드 결과를 호출합니다.

내 수업은 다음과 같습니다.

.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 

은 내가 잘못 여기서 뭐하는 거지?

편집 : 내 전체 코드는 아래에 있습니다.

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 
+0

왜 전체 코드를 게시하지 않았습니까? 나는 당신이 생략 한 부분에 오류가 있다고 생각합니다. – wvdz

+0

그게 문제라고 생각하지는 않았지만 그것을 원래 게시물 아래에 붙여 넣었습니다. – appel

답변

1

, 당신은 가지고있는 넣어 펑()가 두 번째 값의 전원에 첫 번째 값을 제기하는 방법이라고 주 너무 스택에 개체.

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

물론 아, 고마워! – appel

+0

배열을 인수로 사용하여 메서드를 호출하는 방법을 알고 계십니까? 정수에서는 작동하지만 배열에서는 그렇지 않습니다. http://stackoverflow.com/questions/24722634/jasmin-invoke-a-method-using-an-array-as-argument – appel