summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciej Piechotka <uzytkownik2@gmail.com>2010-08-03 00:23:52 +0200
committerMaciej Piechotka <uzytkownik2@gmail.com>2010-08-03 00:25:33 +0200
commitcd646f7e8f3a58c329c94fdb2ead574c8464eb45 (patch)
treeecd50e4a908fe1d707d0abb15ee1d675e4d71024
parentd8154f3c4c5f5a36bd43d0512145212e35c82099 (diff)
downloadlibgee-cd646f7e8f3a58c329c94fdb2ead574c8464eb45.tar.gz
Fix the unfreeing on clear in TreeMap/TreeSet
-rw-r--r--gee/treemap.vala14
-rw-r--r--gee/treeset.vala12
2 files changed, 24 insertions, 2 deletions
diff --git a/gee/treemap.vala b/gee/treemap.vala
index 4e4d438..5b9d5bf 100644
--- a/gee/treemap.vala
+++ b/gee/treemap.vala
@@ -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++;
}
diff --git a/gee/treeset.vala b/gee/treeset.vala
index bb5d868..2ebe1f7 100644
--- a/gee/treeset.vala
+++ b/gee/treeset.vala
@@ -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++;
}