103 votes

Clojure 1.2.1/1.3/1.4 ' proxy généré dans Grails 2.0.0 exécution échoue. 1.2.0 est très bien

J'ai donc une situation bizarre ici.

Je suis en train de travailler sur l'extension du Graal Clojure plugin dans Graal 2.0.0 (et 2.1.0-INSTANTANÉ) et je voulais mettre à jour à Clojure 1.3.0 et ajouter clojure.outils.la journalisation.

Clojure déclenche une exception lors de la compilation d'un proxy de un ByteArrayOutputStream en clojure.tools.logging's journal-flux de fonction:

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

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

Je suis allé retiré clojure.tools.logging et a écrit une dépouillé de proxy d' Object:

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

et il a également lancé le même ClassCastException et le message.

J'ai essayé d'imprimer un macroexpand-1 du proxy et a obtenu la même chose.

Je revenue à Clojure 1.2.0 et proxy a bien fonctionné de nouveau.

J'ai essayé un certain nombre d'incarnations de 1.4.0 et ils présentent le même comportement que 1.3.0. 1.2.1 met également en quelque sorte d'exception, mais je vais essayer de frapper 1.3.0 donc je n'ai pas passer beaucoup de temps avec cela.

La trace de la pile des points de la " génération de la méthode de la fonction définie dans l'une des laissez - formes d' generate-proxy en core_proxy.clj.

J'ai ajouté une petite poignée d' printlns'y est pour voir si je pouvais voir ce qui se passait. Peut-être cette déclaration suivante trahira un énorme malentendu du lecteur de ma part mais simplement en ajoutant ceux - printlns a changé le moment de la compilation comportement dans un sens je suis totalement ne s'attendait pas. L'exception de l'emplacement et du type d'exception a complètement changé, même si tous les Clojure tests en mvn package continuent à passer.

Par exemple, l'ajout d'un seul println de gen-méthode juste avant qu'il ne commence à générer du bytecode causé Clojure à jeter

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

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

J'ai vu plusieurs autres erreurs en fonction de l'endroit où j'ai mis l' println(s), mais c'est la plus répandue.

De toute évidence certains aspects du Graal et Clojure ne sont pas de maillage correctement ici, mais je ne vois pas le lien. Au début, je soupçonne ASM incompatibilité mais depuis Clojure a son propre ASM espace de noms, je ne peux pas voir que la question. Mais peut-être que je me trompe, j'ai été regarder en clojure.lang.Compiler, de proxy et de générer de serveur proxy pour les jours maintenant essayer d'obtenir que cela fonctionne et j'ai à peu près cessé de faire des progrès, parce que j'ai manqué de vapeur :(

Merci d'avance pour toute aide. Je vais vous donner tout ce que je peux, je voudrais vraiment obtenir de ce travail.

Je m'excuse pour le manque de liens, apparemment, DONC ne me permet pas de poster plus de 2 parce que je suis nouveau. Vous pouvez copier et coller à partir de ci-dessous:

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

Clojure Outils de Journalisation - github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj ligne 133 est le " proxy

4voto

Sentencio Points 170

J'ai trouvé un Problème appelé CLJ-944 sur clojure.org. De là, vous pouvez trouver une solution pour ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class question

Le problème, c'est:

que le compilateur injecte un mauvais casting de clojure.lang.PersistentHashMap. Dans ce cas, il devrait probablement être casting pour un clojure.lang.Associatif, la plus haute commune d'interface avoir l' .containsKey méthode.

Patch 1 - 0001-Fix-pour-CLJ-944.patch

Patch 2 - 0002-Fix-pour-CLJ-944.patch

J'espère que cela aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X