summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-04-18 13:40:31 +0000
committerRich Hickey <richhickey@gmail.com>2008-04-18 13:40:31 +0000
commit7cd3b285328e7e7e71b23080303d66640e0f21e8 (patch)
tree298d26e3bb57395d6197fef044c6fd2061dd69a4
parent9511034dda56770857cf596705b624c01e1fa127 (diff)
cleanup for findbugs
-rw-r--r--src/jvm/clojure/lang/AFn.java3
-rw-r--r--src/jvm/clojure/lang/Compiler.java40
-rw-r--r--src/jvm/clojure/lang/FnSeq.java33
-rw-r--r--src/jvm/clojure/lang/LockingTransaction.java12
-rw-r--r--src/jvm/clojure/lang/PersistentArrayMap.java2
-rw-r--r--src/jvm/clojure/lang/PersistentStructMap.java3
-rw-r--r--src/jvm/clojure/lang/RT.java9
-rw-r--r--src/jvm/clojure/lang/SeqIterator.java5
-rw-r--r--src/jvm/clojure/lang/Symbol.java10
-rw-r--r--src/jvm/clojure/lang/Var.java4
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){