summaryrefslogtreecommitdiff
path: root/src/jvm/clojure
diff options
context:
space:
mode:
authorStuart Halloway <stu@thinkrelevance.com>2010-05-21 10:23:17 -0400
committerStuart Halloway <stu@thinkrelevance.com>2010-05-22 13:55:10 -0400
commit095734ac5064329c03eba65ade873993a890201e (patch)
treefeb6f21c426b3d4ccbf4323e46d96931169f7ff0 /src/jvm/clojure
parent65ae4928119a50e892bc33e8cbb47a82ebef98ee (diff)
last var wins only for clojure.core, #332
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r--src/jvm/clojure/lang/Namespace.java14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/jvm/clojure/lang/Namespace.java b/src/jvm/clojure/lang/Namespace.java
index 383719f5..4c557a9a 100644
--- a/src/jvm/clojure/lang/Namespace.java
+++ b/src/jvm/clojure/lang/Namespace.java
@@ -66,12 +66,10 @@ public Var intern(Symbol sym){
if(o instanceof Var && ((Var) o).ns == this)
return (Var) o;
-// throw new IllegalStateException(sym + " already refers to: " + o + " in namespace: " + name);
-
if(v == null)
v = new Var(this, sym);
- warnOnReplace(sym, o, v);
+ warnOrFailOnReplace(sym, o, v);
while(!mappings.compareAndSet(map, map.assoc(sym, v)))
@@ -80,7 +78,12 @@ public Var intern(Symbol sym){
return v;
}
-private void warnOnReplace(Symbol sym, Object o, Object v){
+private void warnOrFailOnReplace(Symbol sym, Object o, Object v){
+ if (o instanceof Var) {
+ if (((Var)o).ns != RT.CLOJURE_NS) {
+ throw new IllegalStateException(sym + " already refers to: " + o + " in namespace: " + name);
+ }
+ }
RT.errPrintWriter().println("WARNING: " + sym + " already refers to: " + o + " in namespace: " + name
+ ", being replaced by: " + v);
}
@@ -101,8 +104,7 @@ Object reference(Symbol sym, Object val){
if(o == val)
return o;
-// throw new IllegalStateException(sym + " already refers to: " + o + " in namespace: " + name);
- warnOnReplace(sym, o, val);
+ warnOrFailOnReplace(sym, o, val);
while(!mappings.compareAndSet(map, map.assoc(sym, val)))
map = getMappings();