大家,你好 :)
今天早上我遇到了我觉得可能是编译器错误的问题,想知道这是否应该提交给 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 工单。
谢谢
詹姆斯