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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.