diff options
Diffstat (limited to 'src')
-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]; |