Clojure

Details

Type:
Defect

Status:
In Progress

Priority:
Major

Resolution:
Unresolved

Affects Version/s:
None

Fix Version/s:
None

Component/s:
None

Labels:

None

Description

Reported by scgilardi, Apr 24, 2009
What (small set of) steps will reproduce the problem?
"require" and "use" support a ":reload-all" flag that is intended to
cause the specified libs to be reloaded along with all libs on which
they directly or indirectly depend. This is implemented by temporarily
binding a "loaded-libs"var to the empty set and then loading the
specified libs.
AOT compilation added another "already loaded" mechanism to
clojure.lang.RT.load() which is currently not sensitive to a "reload-
all" being in progress and breaks its operation in the following case:
A, B, and C are libs
A depends on B. (via :require in its ns form)
B depends on C. (via :require in its ns form)
B has been compiled (B.class is on classpath)
At the repl I "require" A which loads A, B, and C (either from
class files or clj files)
I modify C.clj
At the repl I "require" A with the :reload-all flag, intending to
pick up the changes to C
C is not reloaded because RT.load() skips loading B: B.class
exists, is already loaded, and B.clj hasn't changed since it was compiled.
What is the expected output? What do you see instead?
I expect :reload-all to be effective. It isn't.
What version are you using?
svn 1354, 1.0.0RC1
Was this discussed on the group? If so, please provide a link to the
discussion:
http://groups.google.com/group/clojure/browse_frm/thread/9bbc290321fd895f/e6a967250021462a#e6a967250021462a
Please provide any additional information below.
I'll upload a patch soon that creates a "*reload-all*"var with a
root binding of nil and code to bind it to true when the current
thread has a :reload-all call pending. When *reload-all* is true,
RT.load() will (re)load all libs from their ".clj" files even if
they're already loaded.
The fix forthis may need to be coordinated with a fix for issue #3.

seems like the code that is emitted in the static init for namespace classes could be emitted into a init_ns() static method and the static init could call init_ns(). then RT.load could call init_ns() to get the behavior of reloading an AOT compiled namespace.

Kevin Downey
added a comment - 08/Aug/11 7:40 PM seems like the code that is emitted in the static init for namespace classes could be emitted into a init_ns() static method and the static init could call init_ns(). then RT.load could call init_ns() to get the behavior of reloading an AOT compiled namespace.

Kevin Downey
added a comment - 09/Aug/11 8:31 PM looking at the compiler it looks like most of what I mentioned above is already implemented, just need RT to reflectively call load() on the namespace class in the right place