diff options
author | Stuart Halloway <stu@thinkrelevance.com> | 2010-05-21 10:23:17 -0400 |
---|---|---|
committer | Stuart Halloway <stu@thinkrelevance.com> | 2010-05-22 13:55:10 -0400 |
commit | 095734ac5064329c03eba65ade873993a890201e (patch) | |
tree | feb6f21c426b3d4ccbf4323e46d96931169f7ff0 /src/jvm/clojure | |
parent | 65ae4928119a50e892bc33e8cbb47a82ebef98ee (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.java | 14 |
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(); |