2024 年 Clojure 状态调查!中分享您的想法。

欢迎!有关该操作方式的更多信息,请参见关于页面。

0
ClojureScript

以下代码在 Java 8 下运行正常,但在 9 下不工作

$ java -version java version "9.0.4" Java(TM) SE Runtime Environment (build 9.0.4+11) Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode) $ script/nashornrepljs 要退出,请键入::cljs/quit cljs.user=> (require 'cljs.js) 函数有超过 262143 个程序点 cljs.user=> cljs.js nil

很可能与 CLJS-2530 有关。

3 个答案

0

由 mfikes 发表的评论:

对于 {{(dump-core)}} 生成的 JavaScript 代码,明显足够大,以至于我们达到了在 JDK 8 中存在的限制,但现在更容易达到 JDK 9 中的限制。

具体请见

http://hg.openjdk.java.net/jdk9/jdk9/nashorn/file/17cc754c8936/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ProgramPoints.java#l57

http://hg.openjdk.java.net/jdk9/jdk9/nashorn/file/17cc754c8936/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornCallSiteDescriptor.java#l156

该限制已在以下更改集中修改 http://hg.openjdk.java.net/jdk9/jdk9/nashorn/rev/7cb19fa78763#l48.108

其中 {{CALLSITE_PROGRAM_POINT_SHIFT}} 从 11 增加到 14,将 {{MAX_PROGRAM_POINT_VALUE}} 从 21 位减少到 18 位。(2^18 - 1 = 262143)

这与此票据相关 https://bugs.java.com/view_bug.do?bug_id=8139931

请注意,如果您阅读了 JDK 代码中的注释,您会看到有一个假设,即 JavaScript 方法拆分器会将大型函数分解成足够小的块,使其适合在限制内。也许 ClojureScript 生成的函数不适合拆分。

0

由 mfikes 发表的评论:

使用Java 10,可能用掉了另一个位

$ java -version java version "10" 2018-03-20 Java(TM) SE 运行时环境 18.3 (构建 10+46) Java HotSpot(TM) 64位服务器虚拟机 18.3 (构建 10+46, 混合模式) $ clj -A:cljs/rel -re nashorn cljs.user=> (require 'cljs.js) 函数有超过131071个程序点

0
参考:[https://clojure.atlassian.net/browse/CLJS-2531](https://clojure.atlassian.net/browse/CLJS-2531)(由mfikes报告)
...