diff options
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 120 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Var.java | 39 |
2 files changed, 19 insertions, 140 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index d87bab91..d38d25e8 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -532,8 +532,6 @@ public static class VarExpr implements Expr, AssignableExpr{ } public void emit(C context, ObjExpr objx, GeneratorAdapter gen){ -// objx.emitVar(gen, var); -// gen.invokeVirtual(VAR_TYPE, getMethod); objx.emitVarValue(gen,var); if(context == C.STATEMENT) { @@ -3170,18 +3168,6 @@ static class InvokeExpr implements Expr{ this.onMethod = (java.lang.reflect.Method) methods.get(0); } } - else if(pvar == null && VAR_CALLSITES.isBound() - // && fvar.ns.name.name.startsWith("clojure") - && !RT.booleanCast(RT.get(RT.meta(fvar),dynamicKey)) -// && !fvar.sym.name.equals("report") -// && fvar.isBound() && fvar.get() instanceof IFn - ) - { - //todo - more specific criteria for binding these - this.isDirect = true; -// this.siteIndex = - registerVarCallsite(((VarExpr) fexpr).var); - } } this.tag = tag != null ? tag : (fexpr instanceof VarExpr ? ((VarExpr) fexpr).tag : null); } @@ -3210,25 +3196,7 @@ static class InvokeExpr implements Expr{ { emitProto(context,objx,gen); } - else if(isDirect) - { - fexpr.emit(C.EXPRESSION, objx, gen); - emitArgsAndCall(0, context,objx,gen); -// Label callLabel = gen.newLabel(); -// -// gen.getStatic(objx.objtype, objx.varCallsiteName(siteIndex), IFN_TYPE); -// gen.dup(); -// gen.ifNonNull(callLabel); -// -// gen.pop(); -// fexpr.emit(C.EXPRESSION, objx, gen); -// gen.checkCast(IFN_TYPE); -//// gen.dup(); -//// gen.putStatic(objx.objtype, objx.varCallsiteName(siteIndex), IFN_TYPE); -// -// gen.mark(callLabel); -// emitArgsAndCall(0, context,objx,gen); - } + else { fexpr.emit(C.EXPRESSION, objx, gen); @@ -3855,66 +3823,8 @@ static public class ObjExpr implements Expr{ cv.visitField(ACC_PRIVATE, cachedProtoFnName(i), AFUNCTION_TYPE.getDescriptor(), null, null); cv.visitField(ACC_PRIVATE, cachedProtoImplName(i), IFN_TYPE.getDescriptor(), null, null); } - //* - //static fields for cached vars - for(ISeq es = RT.seq(vars);es != null;es = es.next()) - { - Map.Entry e = (Map.Entry)es.first(); - Var v = (Var)e.getKey(); - Integer i = (Integer) e.getValue(); - if(!v.isDynamic()) - cv.visitField(ACC_PRIVATE + ACC_STATIC, cachedVarName(i), - varCallsites.contains(v)?IFN_TYPE.getDescriptor():OBJECT_TYPE.getDescriptor(), null, null); - } - - //track var rev if we use any vars - if(vars.count() > 0) - { - cv.visitField(ACC_PRIVATE + ACC_STATIC, "__varrev__", Type.INT_TYPE.getDescriptor(), null, null); - - final Method getMethod = Method.getMethod("Object getRawRootOrUnbound()"); - Method meth = new Method("__reloadVars__",Type.VOID_TYPE, new Type[]{}); - - GeneratorAdapter gen = new GeneratorAdapter(ACC_PRIVATE + ACC_STATIC, - meth, - null, - null, - cv); - gen.visitCode(); - Label repeat = new Label(); - - - gen.visitLabel(repeat); - //gen.loadThis(); - gen.getStatic(VAR_TYPE,"rev",Type.INT_TYPE); - gen.putStatic(objtype, "__varrev__", Type.INT_TYPE); - - for(ISeq es = RT.seq(vars);es != null;es = es.next()) - { - Map.Entry e = (Map.Entry)es.first(); - Var v = (Var)e.getKey(); - Integer i = (Integer) e.getValue(); - if(!v.isDynamic()) - { - //gen.loadThis(); - emitConstant(gen,i); - gen.invokeVirtual(VAR_TYPE, getMethod); - Type ft = varCallsites.contains(v)?IFN_TYPE:OBJECT_TYPE; - gen.checkCast(ft); - gen.putStatic(objtype(), cachedVarName(i), ft); - } - } - gen.getStatic(VAR_TYPE,"rev",Type.INT_TYPE); - //gen.loadThis(); - gen.getStatic(objtype, "__varrev__", Type.INT_TYPE); - gen.ifICmp(GeneratorAdapter.NE,repeat); - - gen.returnValue(); - gen.endMethod(); - } - //*/ - //ctor that takes closed-overs and inits base + fields + //ctor that takes closed-overs and inits base + fields Method m = new Method("<init>", Type.VOID_TYPE, ctorTypes()); GeneratorAdapter ctorgen = new GeneratorAdapter(ACC_PUBLIC, m, @@ -4549,14 +4459,14 @@ static public class ObjExpr implements Expr{ } final static Method varGetMethod = Method.getMethod("Object get()"); + final static Method varGetRawMethod = Method.getMethod("Object getRawRoot()"); public void emitVarValue(GeneratorAdapter gen, Var v){ Integer i = (Integer) vars.valAt(v); - if(varCallsites != null && !v.isDynamic()) + if(!v.isDynamic()) { - Type ft = varCallsites.contains(v)?IFN_TYPE:OBJECT_TYPE; - //gen.loadThis(); - gen.getStatic(objtype(), cachedVarName(i), ft); + emitConstant(gen, i); + gen.invokeVirtual(VAR_TYPE, varGetRawMethod); } else { @@ -4915,8 +4825,6 @@ public static class FnMethod extends ObjMethod{ cv); gen.visitCode(); - emitVarReloadPreamble(fn, gen); - Label loopLabel = gen.mark(); gen.visitLineNumber(line, loopLabel); try @@ -4980,7 +4888,6 @@ public static class FnMethod extends ObjMethod{ EXCEPTION_TYPES, cv); gen.visitCode(); - emitVarReloadPreamble(fn, gen); Label loopLabel = gen.mark(); gen.visitLineNumber(line, loopLabel); @@ -5168,19 +5075,6 @@ abstract public static class ObjMethod{ abstract Type getReturnType(); abstract Type[] getArgTypes(); - void emitVarReloadPreamble(ObjExpr fn, GeneratorAdapter gen){ - if(fn.vars().count() > 0) - { - Label bodyLabel = new Label(); - //gen.loadThis(); - gen.getStatic(fn.objtype, "__varrev__", Type.INT_TYPE); - gen.getStatic(VAR_TYPE,"rev",Type.INT_TYPE); - gen.ifICmp(GeneratorAdapter.EQ,bodyLabel); - //gen.loadThis(); - gen.invokeStatic(fn.objtype(), new Method("__reloadVars__",Type.VOID_TYPE, new Type[]{})); - gen.visitLabel(bodyLabel); - } - } public void emit(ObjExpr fn, ClassVisitor cv){ Method m = new Method(getMethodName(), getReturnType(), getArgTypes()); @@ -5191,7 +5085,6 @@ abstract public static class ObjMethod{ EXCEPTION_TYPES, cv); gen.visitCode(); - emitVarReloadPreamble(fn,gen); Label loopLabel = gen.mark(); gen.visitLineNumber(line, loopLabel); @@ -7520,7 +7413,6 @@ public static class NewInstanceMethod extends ObjMethod{ addParameterAnnotation(gen, meta, i); } gen.visitCode(); - emitVarReloadPreamble(obj,gen); Label loopLabel = gen.mark(); diff --git a/src/jvm/clojure/lang/Var.java b/src/jvm/clojure/lang/Var.java index fd7b664d..aa7e8bfd 100644 --- a/src/jvm/clojure/lang/Var.java +++ b/src/jvm/clojure/lang/Var.java @@ -79,7 +79,8 @@ static Keyword nameKey = Keyword.intern(null, "name"); static Keyword nsKey = Keyword.intern(null, "ns"); //static Keyword tagKey = Keyword.intern(null, "tag"); -volatile Object root; +private volatile Object root; + volatile boolean dynamic = false; transient final AtomicBoolean threadBound; public final Symbol sym; @@ -168,7 +169,7 @@ Var(Namespace ns, Symbol sym){ this.ns = ns; this.sym = sym; this.threadBound = new AtomicBoolean(false); - this.root = dvals; //use dvals as magic not-bound value + this.root = new Unbound(this); setMeta(PersistentHashMap.EMPTY); } @@ -183,7 +184,7 @@ public boolean isBound(){ } final public Object get(){ - if(!threadBound.get() && root != dvals) + if(!threadBound.get()) return root; return deref(); } @@ -192,14 +193,12 @@ final public Object deref(){ TBox b = getThreadBinding(); if(b != null) return b.val; - if(hasRoot()) - return root; - throw new IllegalStateException(String.format("Var %s/%s is unbound.", ns, sym)); + return root; } public void setValidator(IFn vf){ if(hasRoot()) - validate(vf, getRoot()); + validate(vf, root); validator = vf; } @@ -257,20 +256,8 @@ public boolean isPublic(){ return !RT.booleanCast(meta().valAt(privateKey)); } -public Object getRoot(){ - if(hasRoot()) - return root; - throw new IllegalStateException(String.format("Var %s/%s is unbound.", ns, sym)); -} - -public Object getRawRoot(){ - return root; -} - -public Object getRawRootOrUnbound(){ - if(hasRoot()) +final public Object getRawRoot(){ return root; - return new Unbound(this); } public Object getTag(){ @@ -289,13 +276,13 @@ public void setTag(Symbol tag) { } final public boolean hasRoot(){ - return root != dvals; + return !(root instanceof Unbound); } //binding root always clears macro flag synchronized public void bindRoot(Object root){ validate(getValidator(), root); - Object oldroot = hasRoot()?this.root:null; + Object oldroot = this.root; this.root = root; ++rev; try @@ -311,21 +298,21 @@ synchronized public void bindRoot(Object root){ synchronized void swapRoot(Object root){ validate(getValidator(), root); - Object oldroot = hasRoot()?this.root:null; + Object oldroot = this.root; this.root = root; ++rev; notifyWatches(oldroot,root); } synchronized public void unbindRoot(){ - this.root = dvals; + this.root = new Unbound(this); ++rev; } synchronized public void commuteRoot(IFn fn) throws Exception{ Object newRoot = fn.invoke(root); validate(getValidator(), newRoot); - Object oldroot = getRoot(); + Object oldroot = root; this.root = newRoot; ++rev; notifyWatches(oldroot,newRoot); @@ -334,7 +321,7 @@ synchronized public void commuteRoot(IFn fn) throws Exception{ synchronized public Object alterRoot(IFn fn, ISeq args) throws Exception{ Object newRoot = fn.applyTo(RT.cons(root, args)); validate(getValidator(), newRoot); - Object oldroot = getRoot(); + Object oldroot = root; this.root = newRoot; ++rev; notifyWatches(oldroot,newRoot); |