summaryrefslogtreecommitdiff
path: root/src/jvm/clojure
diff options
context:
space:
mode:
authorStuart Halloway <stu@thinkrelevance.com>2010-04-22 21:45:24 -0400
committerStuart Halloway <stu@thinkrelevance.com>2010-04-24 14:34:34 -0400
commitc73a4bad6297251ab5545affd6baf79d2390f8c6 (patch)
treecdd708a0a1bb4732236ed91fd52869bfb12fdc99 /src/jvm/clojure
parentc487e48a65ee7cef66ef017c87a754fc88ba57e0 (diff)
re-import changed deftype, see #303
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r--src/jvm/clojure/lang/Namespace.java26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/jvm/clojure/lang/Namespace.java b/src/jvm/clojure/lang/Namespace.java
index 09d87037..85505d91 100644
--- a/src/jvm/clojure/lang/Namespace.java
+++ b/src/jvm/clojure/lang/Namespace.java
@@ -86,6 +86,30 @@ Object reference(Symbol sym, Object val){
throw new IllegalStateException(sym + " already refers to: " + o + " in namespace: " + name);
}
+public static boolean areDifferentInstancesOfSameClassName(Class cls1, Class cls2) {
+ return (cls1 != cls2) && (cls1.getName().equals(cls2.getName()));
+}
+
+Class referenceClass(Symbol sym, Class val){
+ if(sym.ns != null)
+ {
+ throw new IllegalArgumentException("Can't intern namespace-qualified symbol");
+ }
+ IPersistentMap map = getMappings();
+ Class c = (Class) map.valAt(sym);
+ while((c == null) || (areDifferentInstancesOfSameClassName(c, val)))
+ {
+ IPersistentMap newMap = map.assoc(sym, val);
+ mappings.compareAndSet(map, newMap);
+ map = getMappings();
+ c = (Class) map.valAt(sym);
+ }
+ if(c == val)
+ return c;
+
+ throw new IllegalStateException(sym + " already refers to: " + c + " in namespace: " + name);
+}
+
public void unmap(Symbol sym) throws Exception{
if(sym.ns != null)
{
@@ -101,7 +125,7 @@ public void unmap(Symbol sym) throws Exception{
}
public Class importClass(Symbol sym, Class c){
- return (Class) reference(sym, c);
+ return referenceClass(sym, c);
}