From a47aec0a06c2cf299dac23efa877bc1908fe88d7 Mon Sep 17 00:00:00 2001 From: Jerome St-Louis Date: Thu, 28 Jul 2016 17:31:01 -0400 Subject: [PATCH] ecere/com/containers/CustomAVLTree: Freeing Keys (e.g. for AVLTree) --- ecere/src/com/containers/CustomAVLTree.ec | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ecere/src/com/containers/CustomAVLTree.ec b/ecere/src/com/containers/CustomAVLTree.ec index e23265b..96fedd3 100644 --- a/ecere/src/com/containers/CustomAVLTree.ec +++ b/ecere/src/com/containers/CustomAVLTree.ec @@ -6,6 +6,7 @@ default: extern int __ecereVMethodID_class_OnCompare; extern int __ecereVMethodID_class_OnCopy; +extern int __ecereVMethodID_class_OnFree; private: enum AddSide : int { compare = 0, left = -1, right = 1}; @@ -573,9 +574,22 @@ public: BT item = (BT)_item; // THIS SHOULDN'T BE CALLING THE VIRTUAL FUNCTION CustomAVLTree::Remove(_item); + FreeKey((BT)item); delete item; } + void FreeKey(BT item) + { + if(class(BT).type == structClass) + { + // TODO: Make this easier... + Class Tclass = class(BT); + ((void (*)(void *, void *))(void *)Tclass._vTbl[__ecereVMethodID_class_OnFree])(Tclass, (((byte *)&item.key) + __ENDIAN_PAD(sizeof(void *)))); + } + else + delete item.key; + } + void Free() { BT item; @@ -597,6 +611,7 @@ public: else { BT parent = item.parent; + FreeKey((BT)item); delete item; item = parent; } -- 1.8.3.1