Fix the unfreeing on clear in TreeMap/TreeSet
authorMaciej Piechotka <uzytkownik2@gmail.com>
Mon, 2 Aug 2010 22:23:52 +0000 (00:23 +0200)
committerMaciej Piechotka <uzytkownik2@gmail.com>
Mon, 2 Aug 2010 22:31:59 +0000 (00:31 +0200)
gee/treemap.vala
gee/treeset.vala

index 4e4d438..5b9d5bf 100644 (file)
@@ -257,6 +257,8 @@ public class Gee.TreeMap<K,V> : Gee.AbstractMap<K,V> {
                } else {
                        last = n.next;
                }
+               node.key = null;
+               node.value = null;
                node = null;
                _size--;
        }
@@ -354,11 +356,21 @@ public class Gee.TreeMap<K,V> : Gee.AbstractMap<K,V> {
                return b;
        }
 
+       private inline void clear_subtree (owned Node<G> node) {
+               node.key = null;
+               node.value = null;
+               clear_subtree ((owned) node.left);
+               clear_subtree ((owned) node.right);
+       }
+
        /**
         * {@inheritDoc}
         */
        public override void clear () {
-               first = last = root = null;
+               if (root != null) {
+                       clear_subtree ((owned) root);
+                       first = last = null;
+               }
                _size = 0;
                stamp++;
        }
index bb5d868..2ebe1f7 100644 (file)
@@ -224,6 +224,7 @@ public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
                } else {
                        _last = n.prev;
                }
+               node.key = null;
                node = null;
                _size--;
        }
@@ -311,11 +312,20 @@ public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
                return b;
        }
 
+       private inline void clear_subtree (owned Node<G> node) {
+               node.key = null;
+               clear_subtree ((owned) node.left);
+               clear_subtree ((owned) node.right);
+       }
+
        /**
         * {@inheritDoc}
         */
        public override void clear () {
-               _first = _last = root = null;
+               if (root != null) {
+                       clear_subtree ((owned) root);
+                       first = last = null;
+               }
                _size = 0;
                stamp++;
        }