2014-07-13 9 views
0

을 사용하는 방법을 호출하고 다음과 같이 I는, 인수를 사용하여 메소드를 호출 할 :는 재스민 내가 재스민 코드를 생성하는 컴파일러를 쓰고 있어요 인수

.class public helloworld 
.super java/lang/Object 

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

.method public test(I)I 
.limit stack 4 
.limit locals 3 
iload 1 
ireturn 
.end method 

.method public static main([Ljava/lang/String;)V 
.limit stack 4 
.limit locals 3 
aload_0 
ldc 1 
invokevirtual helloworld/test(I)I 
return 
.end method 
:

val test(val x) { 
    return x; 
} 

val main (string[] args) { 
    test(1); 
} 

이로 컴파일

그러나 다음과 같은 오류가 발생합니다. 여기서 내가 뭘 잘못하고 있니?

java.lang.VerifyError: (class: helloworld, method: main signature: ([Ljava/lang/String;)V) Incompatible object argument for function call 

답변

1

먼저 '컴파일'하는 코드는 자바가 아니며 그게 무엇인지 (의사 코드?) 확실하지 않습니다.

자스민 코드의 문제점은 구체화하지 않은 helloworld이라는 인스턴스 메서드가 있기 때문에 test()을 배열의 인스턴스 메서드로 호출하려는 것 같습니다.

그래서 helloworld 클래스를 인스턴스화하거나 test()를 정적 메소드로 만들어 객체를 만들지 않고 호출 할 수 있도록해야합니다.

jasmin 코드를 수정했을 때 나는 또 다른 오류가 발생했습니다 : iload 1iload 0이어야합니다. (프로그래머는 0에서 세는 것을 좋아한다).

이 코드에서 나는 test()이 정적이라고 가정합니다.

.class public helloworld 
.super java/lang/Object 

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

.method public static test([Ljava/lang/String;)[Ljava/lang/String; 
.limit stack 4 
.limit locals 3 
aload 0 
areturn 
.end method 

.method public static main([Ljava/lang/String;)V 
.limit stack 4 
.limit locals 3 
ldc 1 
anewarray java/lang/String 
astore 2 
aload 2 
ldc 0 
ldc "bar" 
aastore 
aload_0 
aload 2 
invokestatic helloworld/test([Ljava/lang/String;)[Ljava/lang/String; 
return 
.end method 
+0

고마워, 그 방법은 내 문제를 해결 정적 만드는 것. 컴파일러를 작성하는 언어는 내가 직접 만든 언어입니다. 그러나, 나는 또 하나의 오류를 낳기 때문에 질문이 하나 더있다. Java에서 동일한 프로그램을 다시 작성하고 javap 명령으로 디스 어셈블하면 iload_1 (iload_0이 아닌) 함수의 첫 번째 인수가로드됩니다. 0 레지스터가 자체에 대한 참조라고 생각했기 때문에 (다른 질문에서 설명한 것처럼 함수를 호출 할 때 aload_0로로드하는 이유는 무엇입니까?) – appel

+1

이것은 정적 메서드이므로 0 레지스터가 첫 번째 변수입니다. 그것이 인스턴스 메소드 일 때, 0은'this'입니다. – wvdz

+0

설명해 주셔서 감사합니다. – appel