diff options
author | Christophe Grand <christophe@cgrand.net> | 2009-08-09 10:30:09 +0200 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2009-08-26 12:02:56 -0400 |
commit | e832eb2fe0e8fe9778baa25b302e410d96367d6e (patch) | |
tree | f339a93ab26c411d5241632e8e9c9281f5364356 | |
parent | cf35b137bc41cf382ff990f218083a18f36815d9 (diff) |
fixed count update
Signed-off-by: Rich Hickey <richhickey@gmail.com>
-rw-r--r-- | src/jvm/clojure/lang/PersistentHashMap2.java | 9 |
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]; |