diff options
-rw-r--r-- | readme.txt | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentArrayMap.java | 8 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentHashMap.java | 4 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentTreeMap.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentTreeSet.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentVector.java | 4 | ||||
-rw-r--r-- | test/clojure/test_clojure/sequences.clj | 18 |
7 files changed, 30 insertions, 10 deletions
@@ -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 |