最小化案例
`
(fn foo [x]
(if true
(^:once fn* []
;; x is not cleared here
x)))
`
这是一个严重的错误,因为它意味着 Clojure 编译器在 FNONCE 中内部提升到循环或 try/catch 表达式中的每个局部变量,在条件分支中目前无法清除。
作为一个具体的例子,如下所示(在 Slack 中报告):
`
;; 这会导致 OOM
(defn test1 [x]
(if true
(do
(try (doseq [_ x] _))
1)
0))
(test1 (take 1000000 (range)))
;; 这不会导致 OOM
(defn test2 [x]
(do
(try (doseq [_ x] _))
1))
(test2 (take 1000000 (range)))
`
方法:如果不设置新的清除框架,则函数为 ^:once 并且存在现有清除框架
补丁: 0001-CLJ-2145-fix-clearing-of-locals-closed-over-by-a-FNO.patch