首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何与Jasmin一起使用invokedynamic?

如何与Jasmin一起使用invokedynamic?
EN

Stack Overflow用户
提问于 2014-05-25 15:15:13
回答 1查看 477关注 0票数 1

这里说:

代码语言:javascript
复制
Since 2.1 :
[..]
added the invokedynamic instruction

因此,我认为可以用jasmin编写包含invokedynamics的指令代码。但是,我没有找到任何关于Jasmin语法的文档,我只是想出了如何使用invokedynamic来获得jasmin的VerifyErrors,而不是如何创建一个工作示例。

这条指令在Jasmin中是如何正确使用的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-10 23:57:04

每个invokedynamic字节码都应该引用相应的调用站点说明符(JVMS 6.5),它实际上是CONSTANT_InvokeDynamic类型(JVMS 4.4.10)的常量池条目。

Jasmin (http://jasmin.sourceforge.net)不支持CONSTANT_InvokeDynamic,而Sable/jasmin支持。尽管在手写汇编中使用invokedynamic是一项忘恩负义的工作。

下面是一个返回对System.out的引用的动态方法的示例

代码语言:javascript
复制
.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
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23856770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档