diff options
-rw-r--r-- | src/jvm/clojure/lang/DynamicVar.java | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/jvm/clojure/lang/DynamicVar.java b/src/jvm/clojure/lang/DynamicVar.java index 8e04f589..e0635348 100644 --- a/src/jvm/clojure/lang/DynamicVar.java +++ b/src/jvm/clojure/lang/DynamicVar.java @@ -43,7 +43,7 @@ static InheritableThreadLocal<Frame> dvals = new InheritableThreadLocal<Frame>() }; Object root; -final AtomicInteger count; +transient final AtomicInteger count; final Symbol sym; static ConcurrentHashMap<Symbol, DynamicVar> table = new ConcurrentHashMap<Symbol, DynamicVar>(); @@ -62,7 +62,7 @@ public static DynamicVar intern(Symbol sym, Object root, boolean replaceRoot){ dvout = table.putIfAbsent(sym, dvin); present = dvout != dvin; //might have snuck in } - if(present && (dvout.root == dvout.count || replaceRoot)) + if(present && (!dvout.hasRoot() || replaceRoot)) dvout.bindRoot(root); return dvout; } @@ -94,7 +94,7 @@ public static DynamicVar create(Object root){ private DynamicVar(Symbol sym){ this.sym = sym; this.count = new AtomicInteger(); - this.root = count; //use count as magic not-bound value + this.root = dvals; //use dvals as magic not-bound value } private DynamicVar(Symbol sym, Object root){ @@ -103,14 +103,14 @@ private DynamicVar(Symbol sym, Object root){ } public boolean isBound(){ - return root != count || dvals.get().bmap.contains(this); + return hasRoot() || dvals.get().bmap.contains(this); } final public Object get(){ Box b = getThreadBinding(); if(b != null) return b.val; - if(root != count) + if(hasRoot()) return root; throw new IllegalStateException(String.format("Var %s is unbound.", sym)); } @@ -120,7 +120,7 @@ public Object set(Object val){ if(b != null) return (b.val = val); //can't establish root binding with set, but can change it - if(root != count) + if(hasRoot()) return root = val; throw new IllegalStateException(String.format("Var %s is unbound.", sym)); } @@ -129,6 +129,10 @@ public Object getRoot(){ return root; } +final public boolean hasRoot(){ + return root != dvals; +} + public DynamicVar bindRoot(Object root){ this.root = root; return this; |