2014-05-25 29 views
0

Here它說:如何在Jasmin中使用invokedynamic?

Since 2.1 : 
[..] 
added the invokedynamic instruction 

因此我想,所以能夠寫出含有茉莉invokedynamics指令代碼。但是我找不到任何有關jasmin語法的文檔,我只是想出瞭如何使用invokedynamic來獲取Jasmin的VerifyErrors,但不知道如何創建一個工作示例。

這條指令在Jasmin中如何正確使用?

回答

3

每個invokedynamic字節碼應參照相應的調用點符(JVMS 6.5)這實際上是(JVMS 4.4.10)CONSTANT_InvokeDynamic類型的常量池項。

Jasmin(http://jasmin.sourceforge.net)不支持CONSTANT_InvokeDynamic,但是Sable/jasmin的確如此。雖然在手寫彙編中使用invokedynamic是忘恩負義的工作。

下面是返回System.out標準動態方法的一個例子:

.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

你測試的代碼?它對你有用嗎?因爲sable/jasmin似乎在我的機器上以無限循環結束,並最終失敗並出現OutOfMemoryError ... *調試* ... – yankee

+0

調試完成後,我想我需要在文件末尾附加一個換行符,確實,修復了OutOfMemoryError ... * facepalm *。無論如何,感謝您的輸入:-)。 – yankee

相關問題