diff options
author | Rich Hickey <richhickey@gmail.com> | 2009-07-14 20:11:22 -0400 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2009-07-14 20:11:22 -0400 |
commit | 1ac552bb74ce96df21fa870e57b0fbf5e336c9f0 (patch) | |
tree | 2a81916605700d8fe06eec47e054f38b2d44c3a7 /src/jvm | |
parent | 9b6b549df3d2d835f6c2305e6962e31b21b374af (diff) | |
parent | 12888faab8f5c7bc13da5a8f506c2a594c48500c (diff) |
Merge branch 'master' into chunks
Diffstat (limited to 'src/jvm')
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/LispReader.java | 12 | ||||
-rw-r--r-- | src/jvm/clojure/lang/LockingTransaction.java | 5 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 7 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Ref.java | 44 |
5 files changed, 58 insertions, 12 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index cb14d96f..9d744d70 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -971,7 +971,7 @@ static class InstanceFieldExpr extends FieldExpr implements AssignableExpr{ public void emitAssign(C context, FnExpr fn, GeneratorAdapter gen, Expr val){ gen.visitLineNumber(line, gen.mark()); - if(targetClass != null) + if(targetClass != null && field != null) { target.emit(C.EXPRESSION, fn, gen); gen.checkCast(Type.getType(targetClass)); diff --git a/src/jvm/clojure/lang/LispReader.java b/src/jvm/clojure/lang/LispReader.java index 14c39399..5bf22e66 100644 --- a/src/jvm/clojure/lang/LispReader.java +++ b/src/jvm/clojure/lang/LispReader.java @@ -47,9 +47,9 @@ static Pattern symbolPat = Pattern.compile("[:]?([\\D&&[^/]].*/)?([\\D&&[^/]][^/ //static Pattern intPat = Pattern.compile("[-+]?[0-9]+\\.?"); static Pattern intPat = Pattern.compile( - "([-+]?)(?:(0)|([1-9][0-9]*)|0[xX]([0-9A-Fa-f]+)|0([0-7]+)|([1-9][0-9]?)[rR]([0-9A-Za-z]+)|0[0-9]+)\\.?"); + "([-+]?)(?:(0)|([1-9][0-9]*)|0[xX]([0-9A-Fa-f]+)|0([0-7]+)|([1-9][0-9]?)[rR]([0-9A-Za-z]+)|0[0-9]+)"); static Pattern ratioPat = Pattern.compile("([-+]?[0-9]+)/([0-9]+)"); -static Pattern floatPat = Pattern.compile("[-+]?[0-9]+(\\.[0-9]+)?([eE][-+]?[0-9]+)?[M]?"); +static Pattern floatPat = Pattern.compile("([-+]?[0-9]+(\\.[0-9]*)?([eE][-+]?[0-9]+)?)(M)?"); static final Symbol SLASH = Symbol.create("/"); static final Symbol CLOJURE_SLASH = Symbol.create("clojure.core","/"); //static Pattern accessorPat = Pattern.compile("\\.[a-zA-Z_]\\w*"); @@ -344,8 +344,8 @@ private static Object matchNumber(String s){ m = floatPat.matcher(s); if(m.matches()) { - if(s.charAt(s.length() - 1) == 'M') - return new BigDecimal(s.substring(0, s.length() - 1)); + if(m.group(4) != null) + return new BigDecimal(m.group(1)); return Double.parseDouble(s); } m = ratioPat.matcher(s); @@ -607,6 +607,10 @@ static Symbol registerArg(int n){ static class ArgReader extends AFn{ public Object invoke(Object reader, Object pct) throws Exception{ PushbackReader r = (PushbackReader) reader; + if(ARG_ENV.deref() == null) + { + return interpretToken(readToken(r, '%')); + } int ch = r.read(); unread(r, ch); //% alone is first arg diff --git a/src/jvm/clojure/lang/LockingTransaction.java b/src/jvm/clojure/lang/LockingTransaction.java index 66a262e7..4976d169 100644 --- a/src/jvm/clojure/lang/LockingTransaction.java +++ b/src/jvm/clojure/lang/LockingTransaction.java @@ -281,11 +281,14 @@ Object run(Callable fn) throws Exception{ Ref ref = e.getKey(); Object oldval = ref.tvals == null ? null : ref.tvals.val; Object newval = e.getValue(); + int hcount = ref.histCount(); + if(ref.tvals == null) { ref.tvals = new Ref.TVal(newval, commitPoint, msecs); } - else if(ref.faults.get() > 0) + else if((ref.faults.get() > 0 && hcount < ref.maxHistory) + || hcount < ref.minHistory) { ref.tvals = new Ref.TVal(newval, commitPoint, msecs, ref.tvals); ref.faults.set(0); diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 728a2a76..263ec551 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -179,6 +179,7 @@ final static public Var ERR = final static Keyword TAG_KEY = Keyword.intern(null, "tag"); final static public Var AGENT = Var.intern(CLOJURE_NS, Symbol.create("*agent*"), null); final static public Var READEVAL = Var.intern(CLOJURE_NS, Symbol.create("*read-eval*"), T); +final static public Var ASSERT = Var.intern(CLOJURE_NS, Symbol.create("*assert*"), T); final static public Var MACRO_META = Var.intern(CLOJURE_NS, Symbol.create("*macro-meta*"), null); final static public Var MATH_CONTEXT = Var.intern(CLOJURE_NS, Symbol.create("*math-context*"), null); static Keyword LINE_KEY = Keyword.intern(null, "line"); @@ -720,12 +721,6 @@ static public Object dissoc(Object coll, Object key) throws Exception{ static public Object nth(Object coll, int n){ if(coll instanceof Indexed) return ((Indexed) coll).nth(n); - return do_nth(coll,n); -} - -static public Object do_nth(Object coll, int n){ - if(coll instanceof Indexed) - return ((Indexed) coll).nth(n); if(coll == null) return null; else if(coll instanceof String) diff --git a/src/jvm/clojure/lang/Ref.java b/src/jvm/clojure/lang/Ref.java index 90faedcc..fef7c439 100644 --- a/src/jvm/clojure/lang/Ref.java +++ b/src/jvm/clojure/lang/Ref.java @@ -26,6 +26,24 @@ public class Ref extends ARef implements IFn, Comparable<Ref>, IRef{ return 1; } +public int getMinHistory(){ + return minHistory; +} + +public Ref setMinHistory(int minHistory){ + this.minHistory = minHistory; + return this; +} + +public int getMaxHistory(){ + return maxHistory; +} + +public Ref setMaxHistory(int maxHistory){ + this.maxHistory = maxHistory; + return this; +} + public static class TVal{ Object val; long point; @@ -60,6 +78,9 @@ LockingTransaction.Info tinfo; //IFn validator; final long id; +volatile int minHistory = 0; +volatile int maxHistory = 10; + static final AtomicLong ids = new AtomicLong(); public Ref(Object initVal) throws Exception{ @@ -187,6 +208,29 @@ public void trimHistory(){ } } +public int getHistoryCount(){ + try + { + lock.writeLock().lock(); + return histCount(); + } + finally + { + lock.writeLock().unlock(); + } +} + +int histCount(){ + if(tvals == null) + return 0; + else + { + int count = 0; + for(TVal tv = tvals.next;tv != tvals;tv = tv.next) + count++; + return count; + } +} final public IFn fn(){ return (IFn) deref(); |