大家好 :)
今天早上遇到了我认为是编译器错误的bug,想知道我是否应该将其提交给JIRA?
以下是我认为是最小重复实例
(defprotocol P
(^double p1 [p a])
(^double p2 [p a]))
(let [p (reify P)]
(min 0.0
(case :p1
:p1 (p1 p :foo)
:p2 (p2 p :foo))))
错误
1. Caused by java.lang.ArrayIndexOutOfBoundsException
Index -1 out of bounds for length 0
Frame.java: 1262 clojure.asm.Frame/merge
Frame.java: 1238 clojure.asm.Frame/merge
MethodWriter.java: 1604 clojure.asm.MethodWriter/computeAllFrames
MethodWriter.java: 1540 clojure.asm.MethodWriter/visitMaxs
...(我有更完整的跟踪信息可以发送,或者上面的代码片段应该在REPL中运行)
以下任何一项都可以消除此错误
- 移除类型提示
- 为case添加nil默认值
- 将协议函数更改为正常的类型提示
defn
- 将
case
移出min
(移除min
)
我已经成功重构了原始代码来解决这个问题,但请告诉我是否应该提交一个JIRA工单。
谢谢!
Weijun