[CLJ-1028] (compile) crashes with NullPointerException if public function 'load' is defined Created: 20/Jul/12 Updated: 20/Jul/12 Resolved: 20/Jul/12
|Affects Version/s:||Release 1.4|
Linux, OpenJDK 1.6.0 64bit
When performing AOT compilation, if the namespace being compiled or one of the namespaces :required by it defines a public function named 'load', the compiler will crash with a NullPointerException.
The following code demonstrates this:
(ns ca.ancilla.kessler.core (:gen-class)) (defn load [x] x) (defn -main [& args] 0)
When run directly, with 'clojure -m ca.ancilla.kessler.core' or 'clojure ca/ancilla/kessler/core.clj', it runs as expected. When loaded with 'clojure -i' and (compile)d, however, or when automatically compiled by 'lein run', it results in a NullPointerException (the complete stack trace is attached).
This occurs whether or not 'load' or actually called. It does not, however, occur if 'load' is private.
|Comment by Ben Kelly [ 20/Jul/12 12:43 PM ]|
If you add (:refer-clojure :exclude [load]) to the (ns), it works fine:
(ns ca.ancilla.kessler.core (:refer-clojure :exclude [load]) (:gen-class))
Thanks to llasram on IRC for discovering this.
|Comment by Stuart Halloway [ 20/Jul/12 4:35 PM ]|
You should not replace functions in clojure.core. This is left legal (with a loud CONSOLE warning) for compatibility, but programs that do it are in error.
|Comment by Ben Kelly [ 20/Jul/12 10:06 PM ]|
So, just to make sure that I have this right, then...
If I want to create a namespace with a public function that shares a name with a function in clojure.core, the only supported way of doing this is to (:refer-clojure :exclude [list of all such functions])?
If so, it would be nice if the warning were replaced with an error, rather than having the compiler emit an error and then crash.