clojure.java-time icon indicating copy to clipboard operation
clojure.java-time copied to clipboard

Comparable exception thrown when `(zoned-date-time)` is invoked in a project built in graal native-image

Open livtanong opened this issue 4 years ago • 3 comments

Exception in thread "main" java.lang.ClassCastException: java_time.graph.Types cannot be cast to java.lang.Comparable
	at clojure.lang.Util.compare(Util.java:153)
	at clojure.lang.APersistentVector.compareTo(APersistentVector.java:439)
	at java.util.concurrent.ConcurrentHashMap.compareComparables(ConcurrentHashMap.java:732)
	at java.util.concurrent.ConcurrentHashMap$TreeBin.<init>(ConcurrentHashMap.java:2773)
	at java.util.concurrent.ConcurrentHashMap.treeifyBin(ConcurrentHashMap.java:2630)
	at java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1063)
	at java.util.concurrent.ConcurrentHashMap.putIfAbsent(ConcurrentHashMap.java:1535)
	at java_time.potemkin.util$fast_memoize$fn__11705.invoke(util.clj:50)
	at java_time.graph$has_source_type_QMARK_$contains_src_types_QMARK___12015$fn__12016.invoke(graph.clj:279)
	at clojure.core$some.invokeStatic(core.clj:2701)
	at java_time.graph$has_source_type_QMARK_$contains_src_types_QMARK___12015.invoke(graph.clj:279)
	at clojure.core$some.invokeStatic(core.clj:2701)
	at java_time.graph$has_source_type_QMARK_.invokeStatic(graph.clj:282)
	at java_time.graph$fn__12042.invokeStatic(graph.clj:301)
	at java_time.graph$fn__12042.invoke(graph.clj:300)
	at java_time.potemkin.util$fast_memoize$fn__11705.invoke(util.clj:52)
	at java_time.graph$conversion_fn.invokeStatic(graph.clj:316)
	at java_time.zone$zoned_date_time.invokeStatic(zone.clj:152)

assignable? might be the problematic line since there is a > in line 72.

livtanong avatar May 14 '20 19:05 livtanong

Line 72 is comparing two numbers, why is that a problem? I'm not sure what's going on after looking at the code for 10 minutes. Seems like Types must implement Comparable in order to get inserted into the cache ConcurrentHashMap. Not sure why this is happening under Graal.

Do you have any more ideas?

dm3 avatar May 15 '20 07:05 dm3

Re: Line 72, it's just what immediately stood out to me as an obvious comparator operation. i didn't put additional thought into understanding that code further.

As for ideas, I don't have much, but I did replace it with an invocation to the actual java.time constructor, ZonedDateTime. That succeeded in compilation.

Sorry I'm not much help on the matter >.< I don't have intimate knowledge of how graal works.

livtanong avatar May 15 '20 08:05 livtanong

It seems that I've got the same problem when using local-date to construct date from string of given format, e.g. with only this code: (t/local-date "dd-MM-yyyy" "01-01-2000") in the -main function.

stack trace
Exception in thread "main" java.lang.ClassCastException: java_time.graph.Types cannot be cast to java.lang.Comparable
        at clojure.lang.Util.compare(Util.java:153)
        at clojure.lang.APersistentVector.compareTo(APersistentVector.java:439)
        at java.util.concurrent.ConcurrentHashMap.compareComparables(ConcurrentHashMap.java:739)
        at java.util.concurrent.ConcurrentHashMap$TreeBin.<init>(ConcurrentHashMap.java:2819)
        at java.util.concurrent.ConcurrentHashMap.treeifyBin(ConcurrentHashMap.java:2676)
        at java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1068)
        at java.util.concurrent.ConcurrentHashMap.putIfAbsent(ConcurrentHashMap.java:1541)
        at java_time.potemkin.util$fast_memoize$fn__1361.invoke(util.clj:50)
        at java_time.graph.ConversionGraph$fn__1577.invoke(graph.clj:153)
        at clojure.core$filter$fn__5911.invoke(core.clj:2821)
        at clojure.lang.LazySeq.sval(LazySeq.java:42)
        at clojure.lang.LazySeq.seq(LazySeq.java:58)
        at clojure.lang.RT.seq(RT.java:535)
        at clojure.core$seq__5419.invokeStatic(core.clj:139)
        at clojure.core$reduce1.invokeStatic(core.clj:932)
        at clojure.core$set.invokeStatic(core.clj:4101)
        at clojure.core$set.invoke(core.clj:4093)
        at java_time.graph.ConversionGraph.equivalent_targets(graph.clj:154)
        at java_time.graph$graph_conversion_path.invokeStatic(graph.clj:193)
        at java_time.graph$graph_conversion_path.invoke(graph.clj:188)
        at java_time.graph$fn__1698.invokeStatic(graph.clj:303)
        at java_time.graph$fn__1698.invoke(graph.clj:300)
        at java_time.potemkin.util$fast_memoize$fn__1361.invoke(util.clj:52)
        at java_time.graph$conversion_fn.invokeStatic(graph.clj:316)
        at java_time.graph$conversion_fn.invoke(graph.clj:312)
        at java_time.local$local_date.invokeStatic(local.clj:12)
        at java_time.local$local_date.invoke(local.clj:12)
        at myapp.core$_main.invokeStatic(core.clj:223)
        at myapp.core$_main.doInvoke(core.clj:221)
        at clojure.lang.RestFn.invoke(RestFn.java:397)
        at clojure.lang.AFn.applyToHelper(AFn.java:152)
        at clojure.lang.RestFn.applyTo(RestFn.java:132)
        at myapp.core.main(Unknown Source)

andreyorst avatar Mar 31 '21 19:03 andreyorst