ecere/com/Map;gui/TabControl; extras: Fixed memory leaks
[sdk] / ecere / src / com / containers / Map.ec
index 2a186ee..a510961 100644 (file)
@@ -1,6 +1,8 @@
 namespace com;
 
+#if !defined(_DEBUG) || defined(MEMINFO)
 import "instance"  // TOFIX: This is required to build Debug on Ubuntu 10.04, GCC 4.4.3
+#endif
 import "CustomAVLTree"
 
 default:
@@ -123,9 +125,8 @@ public class Map<class MT, class V> : CustomAVLTree<MapNode<MT, V>, I = MT, D =
       }
    }
 
-   void Remove(MapNode<MT, V> node)
+   void FreeKey(MapNode<MT, V> node)
    {
-      CustomAVLTree::Remove(node);
       if(class(MT).type == structClass)
       {
          // TODO: Make this easier...
@@ -134,13 +135,18 @@ public class Map<class MT, class V> : CustomAVLTree<MapNode<MT, V>, I = MT, D =
       }
       else
          delete node.key;
+   }
+
+   void Remove(MapNode<MT, V> node)
+   {
+      CustomAVLTree::Remove(node);
+      FreeKey(node);
       delete node;
    }
 
    void Free()
    {
       MapNode<MT, V> node = root;
-      uintsize offset = class(MT).type == structClass ? class(MT).structSize - sizeof(node.AVLNode::key) : 0;
       while(node)
       {
          if(node.left)
@@ -158,8 +164,9 @@ public class Map<class MT, class V> : CustomAVLTree<MapNode<MT, V>, I = MT, D =
          else
          {
             MapNode<MT, V> parent = node.parent;
-            MapNode<MT, V> n = (MapNode<MT, V>)((byte *)node + offset);
-            delete n.value;
+            V value = GetData(node);
+            delete value;
+            FreeKey(node);
             delete node;
 
             node = parent;
@@ -171,14 +178,9 @@ public class Map<class MT, class V> : CustomAVLTree<MapNode<MT, V>, I = MT, D =
 
    void Delete(MapNode<MT, V> node)
    {
-      MapNode<MT, V> n = node;
-
-      // Adjust node pointer for non-standard AVLNode
-      if(class(MT).type == structClass)
-         n = (MapNode<MT, V>)(((byte *) node) + class(MT).structSize - sizeof(node.AVLNode::key));
-
-      delete n.value;
-
+      V value = GetData(node);
+      delete value;
+      FreeKey(node);
       Remove(node);
    }
 
@@ -210,10 +212,11 @@ public class Map<class MT, class V> : CustomAVLTree<MapNode<MT, V>, I = MT, D =
             node = MapNode<MT, V> { key = pos };
          }
          if((Tclass.type == systemClass && !Tclass.byValueSystemClass) || Tclass.type == bitClass || Tclass.type == enumClass || Tclass.type == unitClass)
-            onCopy(Tclass, (byte *)&node.key + __ENDIAN_PAD(Tclass.typeSize), (byte *)&pos + __ENDIAN_PAD(Tclass.typeSize));
+            // onCopy(Tclass, (byte *)&node.key + __ENDIAN_PAD(Tclass.typeSize), (byte *)&pos + __ENDIAN_PAD(Tclass.typeSize));
+            memcpy((byte *)&node.key + __ENDIAN_PAD(Tclass.typeSize), (byte *)&pos + __ENDIAN_PAD(Tclass.typeSize), Tclass.typeSize);
          else
             onCopy(Tclass, (byte *)&node.key + __ENDIAN_PAD(sizeof(void *)), (void *)pos);
-         CustomAVLTree::AddEx((T)node, (T)addNode, addSide);
+         CustomAVLTree::AddEx((T)(uintptr)node, (T)(uintptr)addNode, addSide);
          if(justAdded) *justAdded = true;
       }
       return node;