Skip to content

Commit 8d04644

Browse files
committed
ClojureScriptEngine: fix dynamic script execution
If we don't set a filename into the clojure.core.*file* variable, the clojure compiler complains thusly: java.lang.ClassCastException: clojure.lang.Var$Unbound cannot be cast to java.lang.String at clojure.lang.Compiler.analyze(Compiler.java:6688) at clojure.lang.Compiler.eval(Compiler.java:6924) at clojure.lang.Compiler.eval(Compiler.java:6890) at org.scijava.plugins.scripting.clojure.ClojureScriptEngine.eval(ClojureScriptEngine.java:80) ... 8 more
1 parent 342ea48 commit 8d04644

File tree

1 file changed

+9
-1
lines changed

1 file changed

+9
-1
lines changed

src/main/java/org/scijava/plugins/scripting/clojure/ClojureScriptEngine.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
import clojure.lang.Compiler;
3535
import clojure.lang.LispReader;
36+
import clojure.lang.Var;
3637

3738
import java.io.PushbackReader;
3839
import java.io.Reader;
@@ -71,7 +72,14 @@ public Object eval(final Reader reader) throws ScriptException {
7172
setup();
7273
try {
7374
final Object filename = get(ScriptEngine.FILENAME);
74-
if (filename != null) put("clojure.core.*file*", filename);
75+
if (filename == null || filename instanceof Var.Unbound) {
76+
// make up a fake filename, to make clojure happy
77+
put("clojure.core.*file*", "/clojure-dynamic-script");
78+
}
79+
else {
80+
// use the real filename
81+
put("clojure.core.*file*", filename);
82+
}
7583
final Thread thread = Thread.currentThread();
7684
Object finalResult = null;
7785
while (!thread.isInterrupted()) {

0 commit comments

Comments
 (0)