ecere/com/instance.ec: Fixed long standing leaks in templates
authorJerome St-Louis <jerome@ecere.com>
Thu, 21 Apr 2016 07:13:46 +0000 (03:13 -0400)
committerJerome St-Louis <jerome@ecere.com>
Sat, 16 Jul 2016 22:17:54 +0000 (18:17 -0400)
- The one significant change is adding FreeTemplatesDerivatives(template) in FreeTemplate()
- Updated bootstrap

compiler/bootstrap/ecere/bootstrap/instance.c
ecere/src/com/instance.ec

index bba5923..060897b 100644 (file)
@@ -3370,13 +3370,17 @@ else
 size *= 3;
 }
 instance = __ecereNameSpace__ecere__com___calloc(1, size);
+if(!instance && size)
+printf("Failed to allocate memory instantiating %s object!\n", _class->name);
+else if(!size)
+printf("Warning: 0 size instantiating %s object!\n", _class->name);
 }
-if(_class->type == 0)
+if(instance && _class->type == 0)
 {
 ((struct __ecereNameSpace__ecere__com__Instance *)(char *)instance)->_class = _class;
 ((struct __ecereNameSpace__ecere__com__Instance *)(char *)instance)->_vTbl = _class->_vTbl;
 }
-if(!__ecereNameSpace__ecere__com__ConstructInstance(instance, _class, (((void *)0))))
+if(instance && !__ecereNameSpace__ecere__com__ConstructInstance(instance, _class, (((void *)0))))
 {
 __ecereNameSpace__ecere__com___free(instance);
 instance = (((void *)0));
@@ -3885,6 +3889,7 @@ switch(param->type)
 {
 case 0:
 (__ecereNameSpace__ecere__com__eSystem_Delete((void *)template->templateArgs[id].__anon1.__anon1.dataTypeString), template->templateArgs[id].__anon1.__anon1.dataTypeString = 0);
+template->templateArgs[id].__anon1.__anon1.dataTypeClass = (((void *)0));
 break;
 case 1:
 (__ecereNameSpace__ecere__com__eSystem_Delete((void *)template->templateArgs[id].__anon1.__anon2.memberString), template->templateArgs[id].__anon1.__anon2.memberString = 0);
@@ -3922,6 +3927,7 @@ switch(param->type)
 {
 case 0:
 (__ecereNameSpace__ecere__com__eSystem_Delete((void *)template->templateArgs[id].__anon1.__anon1.dataTypeString), template->templateArgs[id].__anon1.__anon1.dataTypeString = 0);
+template->templateArgs[id].__anon1.__anon1.dataTypeClass = (((void *)0));
 break;
 case 1:
 (__ecereNameSpace__ecere__com__eSystem_Delete((void *)template->templateArgs[id].__anon1.__anon2.memberString), template->templateArgs[id].__anon1.__anon2.memberString = 0);
@@ -4017,33 +4023,6 @@ return 1;
 return 0;
 }
 
-static void __ecereNameSpace__ecere__com__FreeTemplate(struct __ecereNameSpace__ecere__com__Class * template)
-{
-struct __ecereNameSpace__ecere__sys__OldLink * deriv;
-
-if(template->nameSpace)
-{
-struct __ecereNameSpace__ecere__com__BTNamedLink * link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*template->nameSpace).classes, template->name);
-
-if(link)
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*template->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)link);
-}
-__ecereNameSpace__ecere__com__FreeTemplateArgs(template);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)template->fullName), template->fullName = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)template->name), template->name = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)template->templateArgs), template->templateArgs = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)template->dataTypeString), template->dataTypeString = 0);
-while((deriv = template->derivatives.first))
-{
-((struct __ecereNameSpace__ecere__com__Class *)deriv->data)->base = (((void *)0));
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&template->derivatives, deriv);
-}
-if(template->module)
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)template->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes, template);
-else
-__ecereNameSpace__ecere__com___free(template);
-}
-
 static void __ecereNameSpace__ecere__com__FreeTemplatesDerivatives(struct __ecereNameSpace__ecere__com__Class * base)
 {
 struct __ecereNameSpace__ecere__sys__OldLink * derivative, * templateLink;
@@ -4423,8 +4402,7 @@ for(cParam = _class->templateParams.first; cParam; cParam = cParam->next, p++)
 {
 if(cParam->type == 0 && arg.__anon1.__anon1.dataTypeString && !strcmp(cParam->name, arg.__anon1.__anon1.dataTypeString))
 {
-arg.__anon1.__anon1.dataTypeString = templatedClass->templateArgs[p].__anon1.__anon1.dataTypeString;
-arg.__anon1.__anon1.dataTypeClass = templatedClass->templateArgs[p].__anon1.__anon1.dataTypeClass;
+arg = templatedClass->templateArgs[p];
 break;
 }
 }
@@ -4697,23 +4675,32 @@ return param;
 return (((void *)0));
 }
 
-static void __ecereNameSpace__ecere__com__FreeTemplates(struct __ecereNameSpace__ecere__com__Class * _class)
+static void __ecereNameSpace__ecere__com__FreeTemplate(struct __ecereNameSpace__ecere__com__Class * template)
 {
-struct __ecereNameSpace__ecere__sys__OldLink * deriv, * template;
+struct __ecereNameSpace__ecere__sys__OldLink * deriv;
 
-for(deriv = _class->derivatives.first; deriv; deriv = deriv->next)
+if(template->nameSpace)
 {
-__ecereNameSpace__ecere__com__FreeTemplates(deriv->data);
+struct __ecereNameSpace__ecere__com__BTNamedLink * link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*template->nameSpace).classes, template->name);
+
+if(link)
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*template->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)link);
 }
-__ecereNameSpace__ecere__com__FreeTemplateArgs(_class);
-(__ecereNameSpace__ecere__com__eSystem_Delete(_class->templateArgs), _class->templateArgs = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->dataTypeString), _class->dataTypeString = 0);
-while((template = _class->templatized.first))
+__ecereNameSpace__ecere__com__FreeTemplatesDerivatives(template);
+__ecereNameSpace__ecere__com__FreeTemplateArgs(template);
+while((deriv = template->derivatives.first))
 {
-__ecereNameSpace__ecere__com__FreeTemplates(template->data);
-__ecereNameSpace__ecere__com__FreeTemplate(template->data);
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->templatized, template);
+((struct __ecereNameSpace__ecere__com__Class *)deriv->data)->base = (((void *)0));
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&template->derivatives, deriv);
 }
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)template->fullName), template->fullName = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)template->name), template->name = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete(template->templateArgs), template->templateArgs = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)template->dataTypeString), template->dataTypeString = 0);
+if(template->module)
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)template->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes, template);
+else
+__ecereNameSpace__ecere__com___free(template);
 }
 
 static void __ecereNameSpace__ecere__com__FixDerivativesBase(struct __ecereNameSpace__ecere__com__Class * base, struct __ecereNameSpace__ecere__com__Class * mod)
@@ -5044,127 +5031,23 @@ return templatedClass;
 return (((void *)0));
 }
 
-void __ecereNameSpace__ecere__com__eClass_Unregister(struct __ecereNameSpace__ecere__com__Class * _class)
+static void __ecereNameSpace__ecere__com__FreeTemplates(struct __ecereNameSpace__ecere__com__Class * _class)
 {
-struct __ecereNameSpace__ecere__com__BTNamedLink * namedLink;
-struct __ecereNameSpace__ecere__com__DataMember * member;
-struct __ecereNameSpace__ecere__com__Method * method;
 struct __ecereNameSpace__ecere__sys__OldLink * deriv, * template;
-struct __ecereNameSpace__ecere__com__ClassProperty * classProp;
-struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
-
-if(_class->templateClass)
-{
-struct __ecereNameSpace__ecere__sys__OldLink * templateLink;
 
-for(templateLink = _class->templateClass->templatized.first; templateLink; templateLink = templateLink->next)
-{
-if(templateLink->data == _class)
+for(deriv = _class->derivatives.first; deriv; deriv = deriv->next)
 {
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->templateClass->templatized, templateLink);
-break;
-}
-}
-__ecereNameSpace__ecere__com__FreeTemplate(_class);
-return ;
+__ecereNameSpace__ecere__com__FreeTemplates(deriv->data);
 }
-(__ecereNameSpace__ecere__com__eSystem_Delete(_class->_vTbl), _class->_vTbl = 0);
-__ecereNameSpace__ecere__com__FreeTemplates(_class);
 __ecereNameSpace__ecere__com__FreeTemplateArgs(_class);
 (__ecereNameSpace__ecere__com__eSystem_Delete(_class->templateArgs), _class->templateArgs = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->dataTypeString), _class->dataTypeString = 0);
 while((template = _class->templatized.first))
 {
+__ecereNameSpace__ecere__com__FreeTemplates(template->data);
 __ecereNameSpace__ecere__com__FreeTemplate(template->data);
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->templatized, template);
 }
-while((member = _class->membersAndProperties.first))
-{
-if(!member->isProperty && (member->type == 1 || member->type == 2))
-__ecereNameSpace__ecere__com__DataMember_Free(member);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)member->name), member->name = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)member->dataTypeString), member->dataTypeString = 0);
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->membersAndProperties, member);
-}
-while((member = _class->conversions.first))
-{
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)member->name), member->name = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)member->dataTypeString), member->dataTypeString = 0);
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->conversions, member);
-}
-while((namedLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&_class->prop)))
-{
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->prop, (struct __ecereNameSpace__ecere__sys__BTNode *)namedLink);
-}
-while((namedLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&_class->members)))
-{
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->members, (struct __ecereNameSpace__ecere__sys__BTNode *)namedLink);
-}
-while((classProp = (struct __ecereNameSpace__ecere__com__ClassProperty *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&_class->classProperties)))
-{
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)classProp->name), classProp->name = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)classProp->dataTypeString), classProp->dataTypeString = 0);
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->classProperties, (struct __ecereNameSpace__ecere__sys__BTNode *)classProp);
-}
-while((method = (struct __ecereNameSpace__ecere__com__Method *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&_class->methods)))
-{
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)method->name), method->name = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)method->dataTypeString), method->dataTypeString = 0);
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->methods, (struct __ecereNameSpace__ecere__sys__BTNode *)method);
-}
-if(_class->type == 4)
-{
-struct __ecereNameSpace__ecere__com__EnumClassData * data = (struct __ecereNameSpace__ecere__com__EnumClassData *)_class->data;
-
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&data->values, (void *)__ecereNameSpace__ecere__com__FreeEnumValue);
-}
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&_class->delayedCPValues, (((void *)0)));
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&_class->selfWatchers, (((void *)0)));
-if(_class->base)
-{
-struct __ecereNameSpace__ecere__com__Class * base = _class->base;
-
-for(deriv = base->derivatives.first; deriv; deriv = deriv->next)
-{
-if(deriv->data == _class)
-break;
-}
-if(deriv)
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&base->derivatives, deriv);
-}
-while((deriv = _class->derivatives.first))
-{
-((struct __ecereNameSpace__ecere__com__Class *)deriv->data)->base = (((void *)0));
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->derivatives, deriv);
-}
-if(_class->nameSpace)
-{
-struct __ecereNameSpace__ecere__com__BTNamedLink * link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*_class->nameSpace).classes, _class->name);
-
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*_class->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)link);
-}
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->name), _class->name = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->fullName), _class->fullName = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->dataTypeString), _class->dataTypeString = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete(_class->data), _class->data = 0);
-while((param = _class->templateParams.first))
-{
-switch(param->type)
-{
-case 0:
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)param->defaultArg.__anon1.__anon1.dataTypeString), param->defaultArg.__anon1.__anon1.dataTypeString = 0);
-break;
-case 1:
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)param->defaultArg.__anon1.__anon2.memberString), param->defaultArg.__anon1.__anon2.memberString = 0);
-break;
-case 2:
-break;
-}
-if(param->type != 1)
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)param->__anon1.dataTypeString), param->__anon1.dataTypeString = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)param->name), param->name = 0);
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->templateParams, param);
-}
-__ecereNameSpace__ecere__com___free(_class);
 }
 
 struct __ecereNameSpace__ecere__com__Class * __ecereNameSpace__ecere__com__eSystem_RegisterClass(int type, const char * name, const char * baseName, int size, int sizeClass, unsigned int (* Constructor)(void *), void (* Destructor)(void *), struct __ecereNameSpace__ecere__com__Instance * module, int declMode, int inheritanceAccess)
@@ -5782,6 +5665,127 @@ __ecereNameSpace__ecere__com__FixDerivativesBase(base, base);
 }
 }
 
+void __ecereNameSpace__ecere__com__eClass_Unregister(struct __ecereNameSpace__ecere__com__Class * _class)
+{
+struct __ecereNameSpace__ecere__com__BTNamedLink * namedLink;
+struct __ecereNameSpace__ecere__com__DataMember * member;
+struct __ecereNameSpace__ecere__com__Method * method;
+struct __ecereNameSpace__ecere__sys__OldLink * deriv, * template;
+struct __ecereNameSpace__ecere__com__ClassProperty * classProp;
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
+
+if(_class->templateClass)
+{
+struct __ecereNameSpace__ecere__sys__OldLink * templateLink;
+
+for(templateLink = _class->templateClass->templatized.first; templateLink; templateLink = templateLink->next)
+{
+if(templateLink->data == _class)
+{
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->templateClass->templatized, templateLink);
+break;
+}
+}
+__ecereNameSpace__ecere__com__FreeTemplate(_class);
+return ;
+}
+(__ecereNameSpace__ecere__com__eSystem_Delete(_class->_vTbl), _class->_vTbl = 0);
+__ecereNameSpace__ecere__com__FreeTemplates(_class);
+while((template = _class->templatized.first))
+{
+__ecereNameSpace__ecere__com__FreeTemplate(template->data);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->templatized, template);
+}
+while((member = _class->membersAndProperties.first))
+{
+if(!member->isProperty && (member->type == 1 || member->type == 2))
+__ecereNameSpace__ecere__com__DataMember_Free(member);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)member->name), member->name = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)member->dataTypeString), member->dataTypeString = 0);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->membersAndProperties, member);
+}
+while((member = _class->conversions.first))
+{
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)member->name), member->name = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)member->dataTypeString), member->dataTypeString = 0);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->conversions, member);
+}
+while((namedLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&_class->prop)))
+{
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->prop, (struct __ecereNameSpace__ecere__sys__BTNode *)namedLink);
+}
+while((namedLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&_class->members)))
+{
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->members, (struct __ecereNameSpace__ecere__sys__BTNode *)namedLink);
+}
+while((classProp = (struct __ecereNameSpace__ecere__com__ClassProperty *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&_class->classProperties)))
+{
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)classProp->name), classProp->name = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)classProp->dataTypeString), classProp->dataTypeString = 0);
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->classProperties, (struct __ecereNameSpace__ecere__sys__BTNode *)classProp);
+}
+while((method = (struct __ecereNameSpace__ecere__com__Method *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&_class->methods)))
+{
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)method->name), method->name = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)method->dataTypeString), method->dataTypeString = 0);
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->methods, (struct __ecereNameSpace__ecere__sys__BTNode *)method);
+}
+if(_class->type == 4)
+{
+struct __ecereNameSpace__ecere__com__EnumClassData * data = (struct __ecereNameSpace__ecere__com__EnumClassData *)_class->data;
+
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&data->values, (void *)__ecereNameSpace__ecere__com__FreeEnumValue);
+}
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&_class->delayedCPValues, (((void *)0)));
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&_class->selfWatchers, (((void *)0)));
+if(_class->base)
+{
+struct __ecereNameSpace__ecere__com__Class * base = _class->base;
+
+for(deriv = base->derivatives.first; deriv; deriv = deriv->next)
+{
+if(deriv->data == _class)
+break;
+}
+if(deriv)
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&base->derivatives, deriv);
+}
+while((deriv = _class->derivatives.first))
+{
+((struct __ecereNameSpace__ecere__com__Class *)deriv->data)->base = (((void *)0));
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->derivatives, deriv);
+}
+if(_class->nameSpace)
+{
+struct __ecereNameSpace__ecere__com__BTNamedLink * link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*_class->nameSpace).classes, _class->name);
+
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*_class->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)link);
+}
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->name), _class->name = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->fullName), _class->fullName = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->dataTypeString), _class->dataTypeString = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete(_class->data), _class->data = 0);
+while((param = _class->templateParams.first))
+{
+switch(param->type)
+{
+case 0:
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)param->defaultArg.__anon1.__anon1.dataTypeString), param->defaultArg.__anon1.__anon1.dataTypeString = 0);
+break;
+case 1:
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)param->defaultArg.__anon1.__anon2.memberString), param->defaultArg.__anon1.__anon2.memberString = 0);
+break;
+case 2:
+break;
+}
+if(param->type != 1)
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)param->__anon1.dataTypeString), param->__anon1.dataTypeString = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)param->name), param->name = 0);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->templateParams, param);
+}
+__ecereNameSpace__ecere__com___free(_class);
+}
+
 void __ecereNameSpace__ecere__com__eInstance_Delete(struct __ecereNameSpace__ecere__com__Instance * instance)
 {
 if(instance)
index 65a15d3..3e38499 100644 (file)
@@ -355,7 +355,7 @@ public:
    ClassTemplateArgument * templateArgs;
    Class templateClass;
    OldList templatized;
-   int numParams;
+   int numParams;       // TOTAL number of params including all base classes; use templateParams.count for this level
    bool isInstanceClass;
    bool byValueSystemClass;
 
@@ -2936,6 +2936,7 @@ static void FreeTemplateArg(Class template, ClassTemplateParameter param, int id
    {
       case type:
          delete (void *)template.templateArgs[id].dataTypeString;
+         template.templateArgs[id].dataTypeClass = null;
          break;
       case identifier:
          delete (void *)template.templateArgs[id].memberString;
@@ -2970,6 +2971,7 @@ static void FreeTemplateArgs(Class template)
                {
                   case type:
                      delete (void *)template.templateArgs[id].dataTypeString;
+                     template.templateArgs[id].dataTypeClass = null;
                      break;
                   case identifier:
                      delete (void *)template.templateArgs[id].memberString;
@@ -2995,12 +2997,9 @@ static void FreeTemplate(Class template)
       if(link)
          template.nameSpace->classes.Delete((BTNode)link);
    }
-   FreeTemplateArgs(template);
 
-   delete (void *)template.fullName;
-   delete (void *)template.name;
-   delete (void *)template.templateArgs;
-   delete (void *)template.dataTypeString;
+   FreeTemplatesDerivatives(template);
+   FreeTemplateArgs(template);
 
    while((deriv = template.derivatives.first))
    {
@@ -3008,6 +3007,11 @@ static void FreeTemplate(Class template)
       template.derivatives.Delete(deriv);
    }
 
+   delete (void *)template.fullName;
+   delete (void *)template.name;
+   delete template.templateArgs;
+   delete (void *)template.dataTypeString;
+
    if(template.module)
       template.module.classes.Delete(template);
    else
@@ -3024,8 +3028,6 @@ static void FreeTemplates(Class _class)
    }
 
    FreeTemplateArgs(_class);
-   //if(_class.templateArgs)
-      //printf("Deleting  Template args for %s\n", _class.name);
    delete _class.templateArgs;
    delete (void *)_class.dataTypeString;
 
@@ -3066,9 +3068,6 @@ public dllexport void eClass_Unregister(Class _class)
 
    FreeTemplates(_class);
 
-   FreeTemplateArgs(_class);
-   delete _class.templateArgs;
-
    while((template = _class.templatized.first))
    {
       FreeTemplate(template.data);
@@ -3814,6 +3813,7 @@ static void ComputeClassParameters(Class templatedClass, const char * templatePa
                         {
                            int id = p;
                            Class sClass;
+                           // NOTE: This struct 'arg' here is only to build up templateString
                            ClassTemplateArgument arg;
                            for(sClass = expClass.base; sClass; sClass = sClass.base) id += sClass.templateParams.count;
                            arg = expClass.templateArgs[id];
@@ -3825,8 +3825,7 @@ static void ComputeClassParameters(Class templatedClass, const char * templatePa
                               {
                                  if(cParam.type == type && arg.dataTypeString && !strcmp(cParam.name, arg.dataTypeString))
                                  {
-                                    arg.dataTypeString = templatedClass.templateArgs[p].dataTypeString;
-                                    arg.dataTypeClass = templatedClass.templateArgs[p].dataTypeClass;
+                                    arg = templatedClass.templateArgs[p];
                                     break;
                                  }
                               }
@@ -3913,6 +3912,7 @@ static void ComputeClassParameters(Class templatedClass, const char * templatePa
                         {
                            FreeTemplateArg(templatedClass, param, c);
 
+                           // TRICKY: This copies from equivalent parameters
                            arg->dataTypeString = templatedClass.templateArgs[p].dataTypeString;
                            arg->dataTypeClass = templatedClass.templateArgs[p].dataTypeClass;
                            CopyTemplateArg(cParam, arg);
@@ -4626,6 +4626,10 @@ public dllexport void * eInstance_New(Class _class)
                size *= 3;
          }
          instance = _calloc(1, size);
+         if(!instance && size)
+            printf("Failed to allocate memory instantiating %s object!\n", _class.name);
+         else if(!size)
+            printf("Warning: 0 size instantiating %s object!\n", _class.name);
       }
 #ifdef MEMINFO
       allocateClass = null;
@@ -4639,13 +4643,13 @@ public dllexport void * eInstance_New(Class _class)
       }
 #endif
 
-      if(_class.type == normalClass)
+      if(instance && _class.type == normalClass)
       {
          instance._class = _class;
          // Copy the virtual table initially
          instance._vTbl = _class._vTbl;
       }
-      if(!ConstructInstance(instance, _class, null))
+      if(instance && !ConstructInstance(instance, _class, null))
       {
          _free(instance);
          instance = null;