diff options
author | Rich Hickey <richhickey@gmail.com> | 2009-09-29 20:00:52 -0400 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2009-09-29 20:00:52 -0400 |
commit | b4095306ddc59c1a992c39369f06f1315b97d377 (patch) | |
tree | 88f4f297bafbbdc2c868fd1eb472f50ccbc7d011 /src | |
parent | b044959a42f5f58a37c4151f4d7b6652e17348ab (diff) |
fixes for count in HashCollisionNode
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/PersistentHashMap.java | 4 |
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 |