2014-05-25 9 views
0

Here는 말한다 : 어떻게 invokedynamic을 Jasmin과 함께 사용합니까?

Since 2.1 : 
[..] 
added the invokedynamic instruction 

은 따라서 나는 스민과 invokedynamics를 포함하는 명령 코드를 작성하는 것이 가능하다는 것을 가정한다. 그러나 jasmin 구문에 대한 설명서를 찾을 수 없으며 invokedynamic을 사용하여 Jasmin과 함께 VerifyErrors를 얻는 방법을 알아 냈지만 실제로 예제를 작성하는 방법은 알지 못했습니다.

이 명령어는 재스민에서 어떻게 올바르게 사용됩니까?

답변

3

invokedynamic 바이트 코드는 실제로 CONSTANT_InvokeDynamic 유형 (JVMS 4.4.10)의 정수 풀 항목입니다 해당 호출 사이트 지정 (JVMS 6.5)를 참조해야합니다.

자스민 (http://jasmin.sourceforge.net)은 CONSTANT_InvokeDynamic을 지원하지 않지만 Sable/jasmin은 지원하지 않습니다. 손으로 쓴 어셈블리에 invokedynamic을 사용하는 것은 배은망덕 한 일입니다.

.class public HelloWorld 
.super java/lang/Object 

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

.method public static main([Ljava/lang/String;)V 
    .limit stack 2 
    .limit locals 1 

    invokedynamic "getPrintStream"()Ljava/io/PrintStream; HelloWorld/bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;() 
    ldc "Hello, world" 
    invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V 

    return 
.end method 

.method private static bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; 
    .limit stack 6 
    .limit locals 3 

    new java/lang/invoke/ConstantCallSite 
    dup 

    aload_0 
    ldc java/lang/System 
    ldc "out" 
    ldc java/io/PrintStream 
    invokevirtual java/lang/invoke/MethodHandles$Lookup/findStaticGetter(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle; 

    invokespecial java/lang/invoke/ConstantCallSite/<init>(Ljava/lang/invoke/MethodHandle;)V 

    areturn 
.end method 
+0

당신이 코드를 테스트나요 : 여기

System.out에 대한 참조를 반환 동적 방법의 예입니다? 너에게 효과가 있었 니? sable/jasmin이 내 컴퓨터의 무한 루프를 끝내고 결국 OutOfMemoryError ... * 디버깅으로 실패하기 때문에 ... – yankee

+0

디버깅 후 파일 끝 부분에 줄 바꿈을 추가해야한다고 생각했습니다. 실제로 OutOfMemoryError ... * facepalm *이 수정되었습니다. 여하튼, 당신의 입력을위한 감사 :-). – yankee