summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2009-12-23 09:12:16 -0500
committerRich Hickey <richhickey@gmail.com>2009-12-23 09:12:16 -0500
commit16e042af56334d00838cbfbb1d4467a99f7f5910 (patch)
tree7ee5f612678dd4dcfa8ba1f8a7af314e7e7dfbfe
parentd3fe37cfd73592082ab37c62744d1baf5560a98b (diff)
parent855f394d6895cebfcee307dbccea9bdeffe792f5 (diff)
Merge branch 'master' into new
-rw-r--r--readme.txt2
-rw-r--r--src/jvm/clojure/lang/PersistentArrayMap.java8
-rw-r--r--src/jvm/clojure/lang/PersistentHashMap.java4
-rw-r--r--src/jvm/clojure/lang/PersistentTreeMap.java2
-rw-r--r--src/jvm/clojure/lang/PersistentTreeSet.java2
-rw-r--r--src/jvm/clojure/lang/PersistentVector.java4
-rw-r--r--test/clojure/test_clojure/sequences.clj18
7 files changed, 30 insertions, 10 deletions
diff --git a/readme.txt b/readme.txt
index db9363e3..b12890be 100644
--- a/readme.txt
+++ b/readme.txt
@@ -10,7 +10,7 @@
Docs: http://clojure.org
Feedback: http://groups.google.com/group/clojure
-To Run java -cp clojure.jar clojure.lang.Repl
+To Run: java -cp clojure.jar clojure.main
To Build: ant
--------------------------------------------------------------------------
diff --git a/src/jvm/clojure/lang/PersistentArrayMap.java b/src/jvm/clojure/lang/PersistentArrayMap.java
index 7b7eda58..75ebe964 100644
--- a/src/jvm/clojure/lang/PersistentArrayMap.java
+++ b/src/jvm/clojure/lang/PersistentArrayMap.java
@@ -269,7 +269,7 @@ public ITransientMap asTransient(){
static final class TransientArrayMap extends ATransientMap {
int len;
final Object[] array;
- final Thread owner;
+ Thread owner;
public TransientArrayMap(Object[] array){
this.owner = Thread.currentThread();
@@ -330,6 +330,8 @@ static final class TransientArrayMap extends ATransientMap {
}
IPersistentMap doPersistent(){
+ ensureEditable();
+ owner = null;
Object[] a = new Object[len];
System.arraycopy(array,0,a,0,len);
return new PersistentArrayMap(a);
@@ -339,8 +341,8 @@ static final class TransientArrayMap extends ATransientMap {
if(owner == Thread.currentThread())
return;
if(owner != null)
- throw new IllegalAccessError("Mutable used by non-owner thread");
- throw new IllegalAccessError("Mutable used after immutable call");
+ throw new IllegalAccessError("Transient used by non-owner thread");
+ throw new IllegalAccessError("Transient used after persistent! call");
}
}
}
diff --git a/src/jvm/clojure/lang/PersistentHashMap.java b/src/jvm/clojure/lang/PersistentHashMap.java
index 5f5f5404..1f223e61 100644
--- a/src/jvm/clojure/lang/PersistentHashMap.java
+++ b/src/jvm/clojure/lang/PersistentHashMap.java
@@ -270,8 +270,8 @@ static final class TransientHashMap extends ATransientMap {
if(owner == Thread.currentThread())
return;
if(owner != null)
- throw new IllegalAccessError("Mutable used by non-owner thread");
- throw new IllegalAccessError("Mutable used after immutable call");
+ throw new IllegalAccessError("Transient used by non-owner thread");
+ throw new IllegalAccessError("Transient used after persistent! call");
}
}
diff --git a/src/jvm/clojure/lang/PersistentTreeMap.java b/src/jvm/clojure/lang/PersistentTreeMap.java
index 5a5a9bee..d69952b9 100644
--- a/src/jvm/clojure/lang/PersistentTreeMap.java
+++ b/src/jvm/clojure/lang/PersistentTreeMap.java
@@ -137,7 +137,7 @@ public ISeq seq(){
}
public IPersistentCollection empty(){
- return EMPTY.withMeta(meta());
+ return new PersistentTreeMap(meta(), comp);
}
public ISeq rseq() throws Exception{
diff --git a/src/jvm/clojure/lang/PersistentTreeSet.java b/src/jvm/clojure/lang/PersistentTreeSet.java
index d0f15d57..22979f11 100644
--- a/src/jvm/clojure/lang/PersistentTreeSet.java
+++ b/src/jvm/clojure/lang/PersistentTreeSet.java
@@ -53,7 +53,7 @@ public IPersistentSet cons(Object o){
}
public IPersistentCollection empty(){
- return EMPTY.withMeta(meta());
+ return new PersistentTreeSet(meta(),(PersistentTreeMap)impl.empty());
}
public ISeq rseq() throws Exception{
diff --git a/src/jvm/clojure/lang/PersistentVector.java b/src/jvm/clojure/lang/PersistentVector.java
index 2d55e2e8..392599c9 100644
--- a/src/jvm/clojure/lang/PersistentVector.java
+++ b/src/jvm/clojure/lang/PersistentVector.java
@@ -402,8 +402,8 @@ static final class TransientVector extends AFn implements ITransientVector, Coun
if(owner == Thread.currentThread())
return;
if(owner != null)
- throw new IllegalAccessError("Mutable used by non-owner thread");
- throw new IllegalAccessError("Mutable used after immutable call");
+ throw new IllegalAccessError("Transient used by non-owner thread");
+ throw new IllegalAccessError("Transient used after persistent! call");
// root = editableRoot(root);
// tail = editableTail(tail);
diff --git a/test/clojure/test_clojure/sequences.clj b/test/clojure/test_clojure/sequences.clj
index d735507f..6aa3c695 100644
--- a/test/clojure/test_clojure/sequences.clj
+++ b/test/clojure/test_clojure/sequences.clj
@@ -117,9 +117,15 @@
{} {}
{:a 1 :b 2} {}
+ (sorted-map) (sorted-map)
+ (sorted-map :a 1 :b 2) (sorted-map)
+
#{} #{}
#{1 2} #{}
+ (sorted-set) (sorted-set)
+ (sorted-set 1 2) (sorted-set)
+
(seq ()) nil ; (seq ()) => nil
(seq '(1 2)) ()
@@ -140,6 +146,18 @@
1.2 nil
"abc" nil ))
+;Tests that the comparator is preservered
+;The first element should be the same in each set if preserved.
+(deftest test-empty-sorted
+ (let [inv-compare (comp - compare)]
+ (are [x y] (= (first (into (empty x) x))
+ (first y))
+ (sorted-set 1 2 3) (sorted-set 1 2 3)
+ (sorted-set-by inv-compare 1 2 3) (sorted-set-by inv-compare 1 2 3)
+
+ (sorted-map 1 :a 2 :b 3 :c) (sorted-map 1 :a 2 :b 3 :c)
+ (sorted-map-by inv-compare 1 :a 2 :b 3 :c) (sorted-map-by inv-compare 1 :a 2 :b 3 :c))))
+
(deftest test-not-empty
; empty coll/seq => nil