每個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
你測試的代碼?它對你有用嗎?因爲sable/jasmin似乎在我的機器上以無限循環結束,並最終失敗並出現OutOfMemoryError ... *調試* ... – yankee
調試完成後,我想我需要在文件末尾附加一個換行符,確實,修復了OutOfMemoryError ... * facepalm *。無論如何,感謝您的輸入:-)。 – yankee