【问题标题】:Howto use invokedynamic with Jasmin?如何在 Jasmine 中使用 invokedynamic?
【发布时间】:2014-05-25 15:15:13
【问题描述】:

Here 它说:

Since 2.1 :
[..]
added the invokedynamic instruction

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

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

【问题讨论】:

    标签: jvm jasmin invokedynamic


    【解决方案1】:

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

    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 而失败... debugging...
    • 调试后,我认为我需要在文件末尾附加一个换行符,实际上,这修复了 OutOfMemoryError...facepalm。无论如何,感谢您的意见:-)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    相关资源
    最近更新 更多