[libgee] Fix the unfreeing on clear in TreeMap/TreeSet



commit 1225ccba10e91c1384e27bf4989c732caceee5d8
Author: Maciej Piechotka <uzytkownik2 gmail com>
Date:   Tue Aug 3 00:23:52 2010 +0200

    Fix the unfreeing on clear in TreeMap/TreeSet

 gee/treemap.vala |   14 +++++++++++++-
 gee/treeset.vala |   12 +++++++++++-
 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++;
 	}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]