Clojure 1.2.1 / 1.3 / 1.4 'Grails 2.0.0ランタイムで生成されたプロキシが失敗します。1.2.0で結構です


103

私はGrails 2.0.0(および2.1.0-SNAPSHOT)でGrails Clojureプラグインの拡張に取り組んでおり、それをClojure 1.3.0に更新してclojure.tools.loggingを追加したいと考えていました

Clojure は、in のログストリーム関数のプロキシのコンパイル中に例外をスローし ます。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-メソッド関数にスタックトレースポイントのletのフォームgenerate-proxyの中でcore_proxy.clj

println何が起こっているのかを把握できるかどうかを確認するために、の周りに小さなを散りばめました。多分この次のステートメントは私の側の読者の大きな誤解を裏切るでしょうが、それらを単に追加するだけprintlnで、私が完全に予期していなかった方法でコンパイル時の動作を変更しました。のすべてのClojureテストにmvn package引き続き合格したにもかかわらず、例外の場所と例外の種類が完全に変更されました。

たとえば、printlnバイトコードの生成を開始する直前にgenメソッドに単一を追加すると、Clojureがスローされました

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

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

println(s)を配置した場所に応じて他のさまざまなエラーが発生しましたが、これが最も一般的です。

明らかに、GrailsとClojureの一部の側面がここで正しくメッシュ化していませんが、接続が表示されません。最初はASMの非互換性を疑っていましたが、Clojureには独自のASM名前空間があるため、それが問題であることはわかりません。しかし、私は間違っているかもしれません。私は何clojure.lang.Compiler日もproxygenerate-proxyを凝視してこれを機能させようとしており、スチームがなくなったので、前進をほとんど停止しました:(

リンクの欠如をお詫び申し上げます。以下からコピーして貼り付けることができます。

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

Clojureツールのロギング-github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj 133行目は「プロキシ


4
私はもう少しテストを行いましたが、Crojure 1.3が依存しているものを破壊しているのはGrails 2.0の何かだと確信しています。私は、Grails 1.3.7、Groovy 1.8.4(Grails 2.0が使用するもの)、Groovy 1.8.5(最新)で考えられる最も単純なコードサンプルをテストし、すべて動作しました。
ジョンコートランド

3
これはClassLoaderの問題ですか?
ジェレミー

回答:


4

私はと呼ばれる問題発見CLJ-944clojure.orgを。そこでClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class問題の修正を見つけることができます

問題は:

コンパイラが誤ったキャストをclojure.lang.PersistentHashMapに挿入すること。この場合、おそらく.containsKeyメソッドを持つ最も一般的なインターフェースであるclojure.lang.Associativeにキャストする必要があります。

パッチ1-0001-Fix-for-CLJ-944.patch

パッチ2-0002-Fix-for-CLJ-944.patch

お役に立てば幸いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.