问题标签 [invokedynamic]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
218 浏览

java - 指定 -jvm-target / jvmTarget 版本不是 1.8 的好处

从 Kotlin 1.6.0 开始,对于 Kotlin/JVM 项目,可以指定-jvm-target version最高为 Java 的选项17,请参阅通用Gradle 插件文档。

这样做有什么好处?除了指定默认值之外,我找不到太多关于指定其他内容的好处1.8

我能找到的唯一的东西是:

两者在我看来都微不足道。

特别是因为当指定一个更高的目标时,人们失去了在使用 Java 1.8 的项目中使用生成的工件的能力,这对于库来说似乎是不受欢迎的。

我在这里错过了什么吗?

0 投票
1 回答
69 浏览

groovy - 应该如何使用 LambdaMetafactory 生成调用动态调用站点

我正在尝试研究如何使用 LambdaMetafactory 生成可用的 callSite。

这是我最新的 Groovy 脚本尝试。我尝试了多种参数排列,但无法使第二个基于 getter 的示例正常工作。

我做的第一个例子最终开始工作,从一个闭包中生成一个供应商,经过大量的摆弄和阅读 Java 文档和 Stack Overflow。

当您运行此程序时,第一个示例有效,我可以获得有效的 callSite 以从 Closure 获取动态供应商引用。第二个示例采用相同的方法,但使用带有 getter 方法的标准类。

我尝试了许多类型的排列,methodTypes 的参数数量都没有效果。

鉴于我想生成有效的 invokeDynamic 引用,我必须做什么才能生成可行的代码?

0 投票
0 回答
30 浏览

java - 为什么invokedynamic比invokestatic快

最近,我一直在使用低级 Java,修改 JVM 字节码并生成类文件,而无需编译 .java 文件。我刚刚了解了invokedynamic,并且能够使用我自己的专有 JVM 字节码工具生成我自己的InvokeDynamic常量和BootstrapMethod属性,以便我能够invokedynamic正确使用。

在此之后,我在 java 中制作了简单的计时脚本,invokestaticinvokedynamic同一方法上进行测试。但是,我的脚本显示这invokedynamic比 快 8% invokestatic,我认为这是不可能的。

这是我用来计时每种方法的代码:

这是输出:

至于编译后修改后的字节码,这里是转储的新常量javap

这是该run方法的新代码:

这是BootstrapMethods表格:

我错过了什么吗?我看不出怎么invokedynamic能比invokestatic

0 投票
2 回答
163 浏览

java - Lambda 表达式和匿名类在作为隐藏类加载时不起作用

我正在尝试在运行时编译和加载动态生成的 Java 代码。由于 ClassLoader::defineClass 和 Unsafe::defineAnonymousClass 在这种情况下都有严重的缺陷,我尝试通过Lookup::defineHiddenClass使用隐藏类。这适用于我尝试加载的所有类,除了那些调用 lambda 表达式或包含匿名类的类。

调用 lambda 表达式会引发以下异常:

执行实例化匿名类的代码会引发以下错误:

这是一个重现问题的简短示例:

我已经尝试使用不同的 JDK 编译和运行代码,使用不同的方式创建隐藏类的新实例,在https://bugs.openjdk.java.net/上搜索错误,弄乱字节码本身和几个其他事情。我不是 Java 内部的专家,所以我不确定我是否没有理解正确引入隐藏类的 JEP。

我做错了什么,这是不可能的还是这是一个错误?

编辑:JEP状态

迁移应考虑以下因素: 要从隐藏类中的代码调用私有的 nestmate 实例方法,请使用 invokevirtual 或 invokeinterface 而不是 invokespecial。使用invokespecial 调用私有nestmate 实例方法的生成字节码将无法验证。invokespecial 应该只用于调用私有的 nestmate 构造函数。

这可能是匿名类的问题。有没有办法编译代码,以便在字节码中避免调用特殊?