summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Grand <christophe@cgrand.net>2009-08-09 10:30:09 +0200
committerRich Hickey <richhickey@gmail.com>2009-08-26 12:02:56 -0400
commite832eb2fe0e8fe9778baa25b302e410d96367d6e (patch)
treef339a93ab26c411d5241632e8e9c9281f5364356
parentcf35b137bc41cf382ff990f218083a18f36815d9 (diff)
fixed count update
Signed-off-by: Rich Hickey <richhickey@gmail.com>
-rw-r--r--src/jvm/clojure/lang/PersistentHashMap2.java9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/jvm/clojure/lang/PersistentHashMap2.java b/src/jvm/clojure/lang/PersistentHashMap2.java
index 0471c56e..e14d048d 100644
--- a/src/jvm/clojure/lang/PersistentHashMap2.java
+++ b/src/jvm/clojure/lang/PersistentHashMap2.java
@@ -327,8 +327,10 @@ final static class ArrayNode implements INode{
int idx = mask(hash, shift);
Object keyOrNode = array[2*idx];
- if(keyOrNode == null)
- return new ArrayNode(null, cloneAndSet(array, 2*idx, key, 2*idx+1, val));
+ if(keyOrNode == null) {
+ addedLeaf.val = val;
+ return new ArrayNode(null, cloneAndSet(array, 2*idx, key, 2*idx+1, val));
+ }
if(keyOrNode instanceof INode) {
INode n = ((INode) keyOrNode).assoc(shift + 5, hash, key, val, addedLeaf);
if(n == keyOrNode)
@@ -340,6 +342,7 @@ final static class ArrayNode implements INode{
return this;
return new ArrayNode(null, cloneAndSet(array, 2*idx+1, val));
}
+ addedLeaf.val = val;
return new ArrayNode(null, cloneAndSet(array,
2*idx, createNode(shift + 5, keyOrNode, array[2*idx+1], hash, key, val),
2*idx+1, null));
@@ -460,11 +463,13 @@ final static class BitmapIndexedNode implements INode{
return this;
return new BitmapIndexedNode(null, bitmap, cloneAndSet(array, 2*idx+1, val));
}
+ addedLeaf.val = val;
return new BitmapIndexedNode(null, bitmap,
cloneAndSet(array,
2*idx, createNode(shift + 5, keyOrNode, array[2*idx+1], hash, key, val),
2*idx+1, null));
} else {
+ addedLeaf.val = val;
int n = Integer.bitCount(bitmap);
if(n >= 16) {
Object[] newArray = new Object[64];