在Grails 2.0.0运行时生成的Clojure 1.2.1/1.3/1.4'代理失败.1.2.0很好

Joh*_*and 103 proxy grails groovy clojure

我正在努力在Grails 2.0.0(和2.1.0-SNAPSHOT)中扩展Grails Clojure插件,我想将它更新为Clojure 1.3.0并添加clojure.tools.logging.

Clojure的一个编译过程中抛出一个异常 代理一的ByteArrayOutputStreamclojure.tools.logging的日志流功能:

ClassCastException: clojure.asm.Type cannot be cast to clojure.lang.IFn

(https://gist.github.com/a6ae681c37091a3d2379)

我去和删除clojure.tools.logging,并写了一个剥离下来的代理Object:

(proxy [java.lang.Object] [] (toString [] "proxy's toString"))

它也扔了同样的ClassCastException信息.

我试图打印macroexpand-1的的代理,得到了同样的事情.

我恢复到Clojure 1.2.0并且代理工作再次正常.

我尝试了1.4.0的许多版本,它们表现出与1.3.0相同的行为.1.2.1也引发了某种异常,但我试图达到1.3.0,所以我没有花太多时间.

堆栈跟踪指向"GEN-方法功能的一项所定义的的形式generate-proxycore_proxy.clj.

println在那附近添加了一小部分,看看我能不能发现正在发生的事情.也许下一个陈述会背叛读者对我的巨大误解,但只是添加那些println改变了编译时行为的方式我完全没想到.异常位置和异常类型完全改变,即使所有Clojure测试mvn package继续通过.

例如,println在开始生成字节码之前,只需在gen-method中添加一个单元,就会导致Clojure抛出

ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class

(https://gist.github.com/5a7a40929a6c4a104bd5)

我已经看到了各种其他错误,取决于我放置的位置,println但这是最普遍的.

显然,Grails和Clojure的某些方面在这里没有正确啮合,但我没有看到连接.起初我怀疑ASM不兼容,但由于Clojure有自己的ASM命名空间,我不明白这是问题所在.但也许我错了,我一直在盯着clojure.lang.Compiler,代理生成代理几天,现在试图让这个工作,我几乎停止前进,因为我已经用完了蒸汽:(

我为缺乏链接而道歉.您可以从下面复制和粘贴:

Grails Clojure - github.com/grails-plugins/grails-clojure

Clojure工具记录 - github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj第133行是'代理

Sen*_*cio 4

CLJ-944我在clojure.org上发现了一个问题。ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class在那里您可以找到问题的解决方案

问题是:

编译器向 clojure.lang.PersistentHashMap 注入了错误的转换。在这种情况下,它可能应该转换为 clojure.lang.Associative,这是具有 .containsKey 方法的最高通用接口。

补丁 1 - 0001-Fix-for-CLJ-944.patch

补丁 2 - 0002-Fix-for-CLJ-944.patch

我希望它有帮助。