summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/jvm/clojure/lang/Compiler.java120
-rw-r--r--src/jvm/clojure/lang/Var.java39
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);