diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-04-18 13:40:31 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-04-18 13:40:31 +0000 |
commit | 7cd3b285328e7e7e71b23080303d66640e0f21e8 (patch) | |
tree | 298d26e3bb57395d6197fef044c6fd2061dd69a4 /src | |
parent | 9511034dda56770857cf596705b624c01e1fa127 (diff) |
cleanup for findbugs
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/AFn.java | 3 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 40 | ||||
-rw-r--r-- | src/jvm/clojure/lang/FnSeq.java | 33 | ||||
-rw-r--r-- | src/jvm/clojure/lang/LockingTransaction.java | 12 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentArrayMap.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentStructMap.java | 3 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 9 | ||||
-rw-r--r-- | src/jvm/clojure/lang/SeqIterator.java | 5 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Symbol.java | 10 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Var.java | 4 |
10 files changed, 70 insertions, 51 deletions
diff --git a/src/jvm/clojure/lang/AFn.java b/src/jvm/clojure/lang/AFn.java index 49dd5242..c629bae6 100644 --- a/src/jvm/clojure/lang/AFn.java +++ b/src/jvm/clojure/lang/AFn.java @@ -13,8 +13,9 @@ package clojure.lang; import java.util.Comparator; +import java.io.Serializable; -public abstract class AFn extends Obj implements IFn, Comparator{ +public abstract class AFn extends Obj implements IFn, Comparator, Serializable{ public AFn(IPersistentMap meta){ super(meta); diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index 2e9512ca..d07410ab 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -143,50 +143,50 @@ static //symbol->localbinding -static public Var LOCAL_ENV = Var.create(null); +static final public Var LOCAL_ENV = Var.create(null); //vector<localbinding> -static public Var LOOP_LOCALS = Var.create(); +static final public Var LOOP_LOCALS = Var.create(); //Label -static public Var LOOP_LABEL = Var.create(); +static final public Var LOOP_LABEL = Var.create(); //vector<object> -static public Var CONSTANTS = Var.create(); +static final public Var CONSTANTS = Var.create(); //keyword->constid -static public Var KEYWORDS = Var.create(); +static final public Var KEYWORDS = Var.create(); //var->constid -static public Var VARS = Var.create(); +static final public Var VARS = Var.create(); //FnFrame -static public Var METHOD = Var.create(null); +static final public Var METHOD = Var.create(null); //null or not -static public Var IN_CATCH_FINALLY = Var.create(null); +static final public Var IN_CATCH_FINALLY = Var.create(null); //String -static public Var SOURCE = Var.create("NO_SOURCE_FILE"); +static final public Var SOURCE = Var.create("NO_SOURCE_FILE"); //String -static public Var SOURCE_PATH = Var.create(null); +static final public Var SOURCE_PATH = Var.create(null); //Integer -static public Var LINE = Var.create(0); +static final public Var LINE = Var.create(0); //Integer -static public Var LINE_BEFORE = Var.create(0); -static public Var LINE_AFTER = Var.create(0); +static final public Var LINE_BEFORE = Var.create(0); +static final public Var LINE_AFTER = Var.create(0); //Integer -static public Var NEXT_LOCAL_NUM = Var.create(0); +static final public Var NEXT_LOCAL_NUM = Var.create(0); //Integer -static public Var RET_LOCAL_NUM = Var.create(); +static final public Var RET_LOCAL_NUM = Var.create(); //DynamicClassLoader -static public Var LOADER = Var.create(); +static final public Var LOADER = Var.create(); enum C{ STATEMENT, //value ignored @@ -2104,7 +2104,7 @@ static class IfExpr implements Expr{ } } -static public IPersistentMap CHAR_MAP = +static final public IPersistentMap CHAR_MAP = PersistentHashMap.create('-', "_", '.', "_DOT_", ':', "_COLON_", @@ -3445,7 +3445,7 @@ public static Object eval(Object form) throws Exception{ { if(!LOADER.isBound()) { - Var.pushThreadBindings(RT.map(LOADER, new DynamicClassLoader())); + Var.pushThreadBindings(RT.map(LOADER, RT.makeClassLoader())); createdLoader = true; } Expr expr = analyze(C.EVAL, form); @@ -3689,7 +3689,7 @@ public static Object load(Reader rdr, String sourcePath, String sourceName) thro try { Var.pushThreadBindings( - RT.map(LOADER, new DynamicClassLoader(), + RT.map(LOADER, RT.makeClassLoader(), SOURCE_PATH, sourcePath, SOURCE, sourceName, RT.CURRENT_NS, RT.CURRENT_NS.get(), @@ -3745,7 +3745,7 @@ SOURCE, "REPL" try { Var.pushThreadBindings( - RT.map(LOADER, new DynamicClassLoader())); + RT.map(LOADER, RT.makeClassLoader())); w.write(currentNS().name + "=> "); w.flush(); Object r = LispReader.read(rdr, false, EOF, false); diff --git a/src/jvm/clojure/lang/FnSeq.java b/src/jvm/clojure/lang/FnSeq.java index 2affab61..c4c386fb 100644 --- a/src/jvm/clojure/lang/FnSeq.java +++ b/src/jvm/clojure/lang/FnSeq.java @@ -34,29 +34,28 @@ public Object first(){ return _first;
}
-public ISeq rest(){
-// if(_restFn != null)
- synchronized(this)
+synchronized public ISeq rest(){
+ if(_restFn != null)
+ {
+ try
{
- if(_restFn != null)
- {
- try
- {
- _rest = (ISeq) _restFn.invoke();
- }
- catch(Exception ex)
- {
- throw new Error(ex);
- }
- _restFn = null;
- }
- return _rest;
+ _rest = (ISeq) _restFn.invoke();
}
+ catch(Exception ex)
+ {
+ throw new Error(ex);
+ }
+ _restFn = null;
+ }
+ return _rest;
}
-public FnSeq withMeta(IPersistentMap meta){
+
+synchronized public FnSeq withMeta(IPersistentMap meta){
if(meta == meta())
return this;
+ //force eval of restFn before copying
+ rest();
return new FnSeq(meta, _first, _restFn, _rest);
}
diff --git a/src/jvm/clojure/lang/LockingTransaction.java b/src/jvm/clojure/lang/LockingTransaction.java index 4df12d97..f42ada7a 100644 --- a/src/jvm/clojure/lang/LockingTransaction.java +++ b/src/jvm/clojure/lang/LockingTransaction.java @@ -18,9 +18,9 @@ import java.util.concurrent.atomic.AtomicInteger; @SuppressWarnings({"SynchronizeOnNonFinalField"}) public class LockingTransaction{ -public static int RETRY_LIMIT = 10000; -public static int LOCK_WAIT_MSECS = 100; -public static long BARGE_WAIT_NANOS = 10 * 1000000; +public static final int RETRY_LIMIT = 10000; +public static final int LOCK_WAIT_MSECS = 100; +public static final long BARGE_WAIT_NANOS = 10 * 1000000; //public static int COMMUTE_RETRY_LIMIT = 10; static final int RUNNING = 0; @@ -32,7 +32,7 @@ static final int COMMITTED = 4; final static ThreadLocal<LockingTransaction> transaction = new ThreadLocal<LockingTransaction>(); -static class RetryException extends Error{ +static class RetryEx extends Error{ } static class AbortException extends Exception{ @@ -96,7 +96,7 @@ Info info; long readPoint; long startPoint; long startTime; -final RetryException retryex = new RetryException(); +final RetryEx retryex = new RetryEx(); final ArrayList<Agent.Action> actions = new ArrayList<Agent.Action>(); final HashMap<Ref, Object> vals = new HashMap<Ref, Object>(); final HashSet<Ref> sets = new HashSet<Ref>(); @@ -278,7 +278,7 @@ Object run(IFn fn) throws Exception{ info.status.set(COMMITTED); } } - catch(RetryException retry) + catch(RetryEx retry) { //eat this so we retry rather than fall out } diff --git a/src/jvm/clojure/lang/PersistentArrayMap.java b/src/jvm/clojure/lang/PersistentArrayMap.java index a7672ca9..63516714 100644 --- a/src/jvm/clojure/lang/PersistentArrayMap.java +++ b/src/jvm/clojure/lang/PersistentArrayMap.java @@ -28,7 +28,7 @@ public class PersistentArrayMap extends APersistentMap{ final Object[] array;
static final int HASHTABLE_THRESHOLD = 8;
-public static PersistentArrayMap EMPTY = new PersistentArrayMap();
+public static final PersistentArrayMap EMPTY = new PersistentArrayMap();
protected PersistentArrayMap(){
this.array = new Object[]{};
diff --git a/src/jvm/clojure/lang/PersistentStructMap.java b/src/jvm/clojure/lang/PersistentStructMap.java index 28d46426..2b371ffc 100644 --- a/src/jvm/clojure/lang/PersistentStructMap.java +++ b/src/jvm/clojure/lang/PersistentStructMap.java @@ -14,10 +14,11 @@ package clojure.lang; import java.util.Iterator; import java.util.Map; +import java.io.Serializable; public class PersistentStructMap extends APersistentMap{ -public static class Def{ +public static class Def implements Serializable{ final ISeq keys; final IPersistentMap keyslots; diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 99df0982..9818914f 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -20,6 +20,8 @@ import java.io.*; import java.lang.reflect.Array; import java.math.BigDecimal; import java.math.BigInteger; +import java.security.AccessController; +import java.security.PrivilegedAction; public class RT{ @@ -1140,4 +1142,11 @@ static public Object[] setValues(Object... vals){ return null; } +static public ClassLoader makeClassLoader(){ + return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction(){ + public Object run(){ + return new DynamicClassLoader(); + } + }); +} } diff --git a/src/jvm/clojure/lang/SeqIterator.java b/src/jvm/clojure/lang/SeqIterator.java index 563e830c..683cc313 100644 --- a/src/jvm/clojure/lang/SeqIterator.java +++ b/src/jvm/clojure/lang/SeqIterator.java @@ -13,6 +13,7 @@ package clojure.lang; import java.util.Iterator; +import java.util.NoSuchElementException; public class SeqIterator implements Iterator{ @@ -26,7 +27,9 @@ public boolean hasNext(){ return seq != null; } -public Object next(){ +public Object next() throws NoSuchElementException { + if(seq == null) + throw new NoSuchElementException(); Object ret = RT.first(seq); seq = RT.rest(seq); return ret; diff --git a/src/jvm/clojure/lang/Symbol.java b/src/jvm/clojure/lang/Symbol.java index 6fb774b1..8f3be2c6 100644 --- a/src/jvm/clojure/lang/Symbol.java +++ b/src/jvm/clojure/lang/Symbol.java @@ -12,8 +12,11 @@ package clojure.lang; +import java.io.Serializable; +import java.io.ObjectStreamException; -public class Symbol extends Obj implements Comparable, Named{ + +public class Symbol extends Obj implements Comparable, Named, Serializable{ //these must be interned strings! final String ns; final String name; @@ -99,4 +102,9 @@ public int compareTo(Object o){ return nsc; return this.name.compareTo(s.name); } + +private Object readResolve() throws ObjectStreamException{ + return intern(ns, name); +} + } diff --git a/src/jvm/clojure/lang/Var.java b/src/jvm/clojure/lang/Var.java index a37f0ae8..c0e452cc 100644 --- a/src/jvm/clojure/lang/Var.java +++ b/src/jvm/clojure/lang/Var.java @@ -72,9 +72,7 @@ public static Var intern(Namespace ns, Symbol sym, Object root, boolean replaceR public String toString(){ if(ns != null) return "#'" + ns.name + "/" + sym; - return "#<Var: " + (ns != null ? (ns.name + "/") : "") + - (sym != null ? sym.toString() : "--unnamed--") + - ">"; + return "#<Var: " + (sym != null ? sym.toString() : "--unnamed--") + ">"; } public static Var find(Symbol nsQualifiedSym){ |