Hi Khalid,

Reflections [1] are a big problem too for Graalvm. Here is a thread of
playing with Clojure and Graalvm [2]. If you follow the links, you will see
some issues I ran into.

Hth,
Jeroen

[1] Ones that are and aren't caught by *warn-on-reflections*
https://github.com/dundalek/closh/pull/105/files#diff-336b8a8dffae65260f854867fc8529b5R9
[2] https://github.com/dundalek/closh/issues/93



On Mon, Nov 26, 2018 at 6:22 PM Khalid Jebbari <khalid.jebb...@gmail.com>
wrote:

> Thanks a lot. So it means Clojure's `eval` is by design incompatible with
> SubstrateVM.
>
> Does anyone know of others hard incompatibilities ?
>
> On Monday, November 26, 2018 at 6:16:20 PM UTC+1, Gary Trakhman wrote:
>>
>> Yes, eval will generate classes in a dynamic classloader, load them, then
>> call methods on the newly formed class/object except for
>> too-simple-to-be-interesting cases.
>>
>> On Mon, Nov 26, 2018 at 11:43 AM Khalid Jebbari <khalid....@gmail.com>
>> wrote:
>>
>>> Hi,
>>>
>>> I was doing a small experiment with Clojure and GraalVM and ended with
>>> this minimal reproduction case of an incompatibility between Clojure's
>>> `eval` and GraalVM's native-image tool (the program that compiles a JVM
>>> program to a native executable, based on the GraalVM's SubstrateVM
>>> compiler).
>>>
>>> Here's the Clojure program:
>>>
>>> (ns test-cli.main
>>>   (:gen-class))
>>>
>>> (set! *warn-on-reflection* true)
>>>
>>> (defn -main
>>>   "I don't do a whole lot ... yet."
>>>   [& args]
>>>   (println (+ 1 1)) ;; trick to force loading clojure.lang.Numbers, not
>>> working
>>>   (eval (read-string "(+ 1 1)")))
>>>
>>> Using Clojure 1.9.0 and GraalVM version 1.0.0-rc9.
>>>
>>> When I compile it with the
>>> option "--report-unsupported-elements-at-runtime" (which gives a more
>>> precised error message), here's the output when I try executing the
>>> resulting executable:
>>>
>>> Exception in thread "main" java.lang.ClassNotFoundException:
>>> clojure.lang.Numbers, compiling:(NO_SOURCE_PATH:0:0)
>>>         at java.lang.Throwable.<init>(Throwable.java:287)
>>>         at java.lang.Exception.<init>(Exception.java:84)
>>>         at java.lang.RuntimeException.<init>(RuntimeException.java:80)
>>>         at
>>> clojure.lang.Compiler$CompilerException.<init>(Compiler.java:6804)
>>>         at clojure.lang.Compiler.analyzeSeq(Compiler.java:7010)
>>>         at clojure.lang.Compiler.analyze(Compiler.java:6773)
>>>         at clojure.lang.Compiler.analyze(Compiler.java:6729)
>>>         at clojure.lang.Compiler.analyzeSeq(Compiler.java:6998)
>>>         at clojure.lang.Compiler.analyze(Compiler.java:6773)
>>>         at clojure.lang.Compiler.analyze(Compiler.java:6729)
>>>         at
>>> clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:6100)
>>>         at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5460)
>>>         at clojure.lang.Compiler$FnExpr.parse(Compiler.java:4022)
>>>         at clojure.lang.Compiler.analyzeSeq(Compiler.java:7001)
>>>         at clojure.lang.Compiler.analyze(Compiler.java:6773)
>>>         at clojure.lang.Compiler.eval(Compiler.java:7059)
>>>         at clojure.lang.Compiler.eval(Compiler.java:7025)
>>>         at clojure.core$eval.invokeStatic(core.clj:3206)
>>>         at test_cli.main$_main.invokeStatic(main.clj:7)
>>>         at test_cli.main$_main.doInvoke(main.clj:7)
>>>         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 test_cli.main.main(Unknown Source)
>>>         at
>>> com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:164)
>>> Caused by: java.lang.ClassNotFoundException: clojure.lang.Numbers
>>>         at java.lang.Throwable.<init>(Throwable.java:287)
>>>         at java.lang.Exception.<init>(Exception.java:84)
>>>         at
>>> java.lang.ReflectiveOperationException.<init>(ReflectiveOperationException.java:75)
>>>         at
>>> java.lang.ClassNotFoundException.<init>(ClassNotFoundException.java:82)
>>>         at
>>> com.oracle.svm.core.hub.ClassForNameSupport.forName(ClassForNameSupport.java:51)
>>>         at
>>> com.oracle.svm.core.hub.DynamicHub.forName(DynamicHub.java:1036)
>>>         at clojure.lang.RT.classForName(RT.java:2204)
>>>         at clojure.lang.RT.classForNameNonLoading(RT.java:2217)
>>>         at clojure.lang.Compiler$HostExpr.maybeClass(Compiler.java:1041)
>>>         at clojure.lang.Compiler$HostExpr$Parser.parse(Compiler.java:982)
>>>         at clojure.lang.Compiler.analyzeSeq(Compiler.java:7003)
>>>         ... 20 more
>>>
>>> I'm no expert in Java/JVM and would like to understand the problem.
>>> According to the SubstrateVM documentation (
>>> https://github.com/oracle/graal/blob/master/substratevm/LIMITATIONS.md)
>>> it can't compile Dynamic Class Loading/Unloading. Is Clojure's `eval` doing
>>> such dynamic loading? Or doing something else not supported by SubstrateVM
>>> as said in the documentation?
>>>
>>> Thanks *a lot* in advance for you answers.
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Clojure" group.
>>> To post to this group, send email to clo...@googlegroups.com
>>> Note that posts from new members are moderated - please be patient with
>>> your first post.
>>> To unsubscribe from this group, send email to
>>> clojure+u...@googlegroups.com
>>> For more options, visit this group at
>>> http://groups.google.com/group/clojure?hl=en
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "Clojure" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to clojure+u...@googlegroups.com.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to