Jvm 如何将InvokedDynamic与Jasmin一起使用?

Jvm 如何将InvokedDynamic与Jasmin一起使用?,jvm,jasmin,invokedynamic,Jvm,Jasmin,Invokedynamic,它说: Since 2.1 : [..] added the invokedynamic instruction 因此,我认为可以使用jasmin编写包含invokedynamics的指令代码。但是,我找不到任何关于jasmin语法的文档,我只知道如何使用invokedynamic来获取jasmin的VerifyErrors,而不是如何创建一个工作示例 Jasmin中如何正确使用此指令?每个invokedynamic字节码都应该引用相应的调用站点说明符,该说明符实际上是constant\u i

它说:

Since 2.1 :
[..]
added the invokedynamic instruction
因此,我认为可以使用jasmin编写包含invokedynamics的指令代码。但是,我找不到任何关于jasmin语法的文档,我只知道如何使用invokedynamic来获取jasmin的VerifyErrors,而不是如何创建一个工作示例


Jasmin中如何正确使用此指令?

每个
invokedynamic
字节码都应该引用相应的调用站点说明符,该说明符实际上是
constant\u invokedynamic
类型的常量池条目

Jasmin()不支持常量调用动态,但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
.class公共HelloWorld
.super java/lang/Object
.public()方法V
阿洛德0
调用特殊的java/lang/Object/()V
返回
.结束方法
.method public static main([Ljava/lang/String;)V
.限制堆栈2
.限制本地人1
invokedynamic“getPrintStream”()Ljava/io/PrintStream;HelloWorld/bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;()
土发公司“你好,世界”
invokeVirtualJava/io/PrintStream/println(Ljava/lang/String;)V
返回
.结束方法
.method私有静态引导(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
.限制堆栈6
.限制本地人3
新的java/lang/invoke/ConstantCallSite
重复
阿洛德0
ldc java/lang/System
最不发达国家“退出”
ldc java/io/PrintStream
InvokeVirtualJava/lang/invoke/MethodHandles$Lookup/findStaticGetter(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;
invokespecial java/lang/invoke/ConstantCallSite/(Ljava/lang/invoke/MethodHandle;)V
轮回
.结束方法

每个
invokedynamic
字节码都应该引用相应的调用站点说明符,该说明符实际上是
constant\u invokedynamic
类型的常量池条目

Jasmin()不支持
CONSTANT\u 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
.class公共HelloWorld
.super java/lang/Object
.public()方法V
阿洛德0
调用特殊的java/lang/Object/()V
返回
.结束方法
.method public static main([Ljava/lang/String;)V
.限制堆栈2
.限制本地人1
invokedynamic“getPrintStream”()Ljava/io/PrintStream;HelloWorld/bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;()
土发公司“你好,世界”
invokeVirtualJava/io/PrintStream/println(Ljava/lang/String;)V
返回
.结束方法
.method私有静态引导(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
.限制堆栈6
.限制本地人3
新的java/lang/invoke/ConstantCallSite
重复
阿洛德0
ldc java/lang/System
最不发达国家“退出”
ldc java/io/PrintStream
InvokeVirtualJava/lang/invoke/MethodHandles$Lookup/findStaticGetter(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;
invokespecial java/lang/invoke/ConstantCallSite/(Ljava/lang/invoke/MethodHandle;)V
轮回
.结束方法

你测试了代码吗?它对你有用吗?因为sable/jasmin似乎在我的机器上以无限循环结束,最终以OutOfMemoryError失败…调试…调试后,我想我需要在文件末尾附加一个换行符,事实上,这修复了OutOfMemoryError…facepalm。无论如何,感谢你的帮助put:-)。你测试了代码吗?它对你有用吗?因为sable/jasmin似乎在我的机器上以无限循环结束,最终以OutOfMemoryError…调试失败…调试后,我想我需要在文件末尾附加一个换行符,事实上,这修复了OutOfMemoryError…facepalm。无论如何,感谢你的帮助nput:-)。