summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2009-09-29 20:00:52 -0400
committerRich Hickey <richhickey@gmail.com>2009-09-29 20:00:52 -0400
commitb4095306ddc59c1a992c39369f06f1315b97d377 (patch)
tree88f4f297bafbbdc2c868fd1eb472f50ccbc7d011 /src
parentb044959a42f5f58a37c4151f4d7b6652e17348ab (diff)
fixes for count in HashCollisionNode
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/PersistentHashMap.java4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/jvm/clojure/lang/PersistentHashMap.java b/src/jvm/clojure/lang/PersistentHashMap.java
index e790d0d1..5f5f5404 100644
--- a/src/jvm/clojure/lang/PersistentHashMap.java
+++ b/src/jvm/clojure/lang/PersistentHashMap.java
@@ -724,6 +724,7 @@ final static class HashCollisionNode implements INode{
System.arraycopy(array, 0, newArray, 0, array.length);
newArray[array.length] = key;
newArray[array.length + 1] = val;
+ addedLeaf.val = addedLeaf;
return new HashCollisionNode(edit, hash, count + 1, newArray);
}
// nest it in a bitmap node
@@ -780,6 +781,7 @@ final static class HashCollisionNode implements INode{
private HashCollisionNode ensureEditable(AtomicReference<Thread> edit, int count, Object[] array){
if(this.edit == edit) {
this.array = array;
+ this.count = count;
return this;
}
return new HashCollisionNode(edit, hash, count, array);
@@ -808,6 +810,7 @@ final static class HashCollisionNode implements INode{
return editAndSet(edit, idx+1, val);
}
if (array.length > 2*count) {
+ addedLeaf.val = addedLeaf;
HashCollisionNode editable = editAndSet(edit, 2*count, key, 2*count+1, val);
editable.count++;
return editable;
@@ -816,6 +819,7 @@ final static class HashCollisionNode implements INode{
System.arraycopy(array, 0, newArray, 0, array.length);
newArray[array.length] = key;
newArray[array.length + 1] = val;
+ addedLeaf.val = addedLeaf;
return ensureEditable(edit, count + 1, newArray);
}
// nest it in a bitmap node