diff options
author | Christophe Grand <christophe@cgrand.net> | 2010-05-28 08:27:13 +0200 |
---|---|---|
committer | Stuart Halloway <stu@thinkrelevance.com> | 2010-06-07 10:03:04 -0400 |
commit | 59ecee6a6f037612b3b1ed2d939f5e0017f2dd11 (patch) | |
tree | 86ac6cff6f55aa27d44853c7edeb0afafd928a91 | |
parent | 2ac93197e356af3c826ca895b5a538ad08c5715a (diff) |
fix pop! when the tree depth decreases
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
-rw-r--r-- | src/jvm/clojure/lang/PersistentVector.java | 2 | ||||
-rw-r--r-- | test/clojure/test_clojure/transients.clj | 6 |
2 files changed, 5 insertions, 3 deletions
diff --git a/src/jvm/clojure/lang/PersistentVector.java b/src/jvm/clojure/lang/PersistentVector.java index b842fc43..460a4069 100644 --- a/src/jvm/clojure/lang/PersistentVector.java +++ b/src/jvm/clojure/lang/PersistentVector.java @@ -625,7 +625,7 @@ static final class TransientVector extends AFn implements ITransientVector, Coun } if(shift > 5 && newroot.array[1] == null) { - newroot = (Node) newroot.array[0]; + newroot = ensureEditable((Node) newroot.array[0]); newshift -= 5; } root = newroot; diff --git a/test/clojure/test_clojure/transients.clj b/test/clojure/test_clojure/transients.clj index 8444e2a3..97dfed0f 100644 --- a/test/clojure/test_clojure/transients.clj +++ b/test/clojure/test_clojure/transients.clj @@ -3,8 +3,10 @@ (deftest popping-off (testing "across a node boundary" - (let [v (-> (range 33) vec)] - (is (= (subvec v 0 31) (-> v transient pop! pop! persistent!))))) + (are [n] + (let [v (-> (range n) vec)] + (= (subvec v 0 (- n 2)) (-> v transient pop! pop! persistent!))) + 33 (+ 32 (inc (* 32 32))) (+ 32 (inc (* 32 32 32))))) (testing "off the end" (is (thrown-with-msg? IllegalStateException #"Can't pop empty vector" (-> [] transient pop!))))) |