summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Grand <christophe@cgrand.net>2010-05-28 08:27:13 +0200
committerStuart Halloway <stu@thinkrelevance.com>2010-06-07 10:03:04 -0400
commit59ecee6a6f037612b3b1ed2d939f5e0017f2dd11 (patch)
tree86ac6cff6f55aa27d44853c7edeb0afafd928a91
parent2ac93197e356af3c826ca895b5a538ad08c5715a (diff)
fix pop! when the tree depth decreases
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
-rw-r--r--src/jvm/clojure/lang/PersistentVector.java2
-rw-r--r--test/clojure/test_clojure/transients.clj6
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!)))))