summaryrefslogtreecommitdiff
path: root/src/jvm
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2009-07-14 20:11:22 -0400
committerRich Hickey <richhickey@gmail.com>2009-07-14 20:11:22 -0400
commit1ac552bb74ce96df21fa870e57b0fbf5e336c9f0 (patch)
tree2a81916605700d8fe06eec47e054f38b2d44c3a7 /src/jvm
parent9b6b549df3d2d835f6c2305e6962e31b21b374af (diff)
parent12888faab8f5c7bc13da5a8f506c2a594c48500c (diff)
Merge branch 'master' into chunks
Diffstat (limited to 'src/jvm')
-rw-r--r--src/jvm/clojure/lang/Compiler.java2
-rw-r--r--src/jvm/clojure/lang/LispReader.java12
-rw-r--r--src/jvm/clojure/lang/LockingTransaction.java5
-rw-r--r--src/jvm/clojure/lang/RT.java7
-rw-r--r--src/jvm/clojure/lang/Ref.java44
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();