From: Jerome St-Louis Date: Tue, 16 Jun 2015 06:54:09 +0000 (-0400) Subject: ecere/com/instance: Fixed crashes on Ecere classes templatized in other modules X-Git-Tag: 0.44.12~42 X-Git-Url: https://ecere.com/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e8a60d3c484b162ad30b003a3820f50b973b2b41;hp=06ea2151f28b5f094e950b3675f90b68d71b51c4;p=sdk ecere/com/instance: Fixed crashes on Ecere classes templatized in other modules --- diff --git a/compiler/bootstrap/ecere/bootstrap/instance.c b/compiler/bootstrap/ecere/bootstrap/instance.c index ece3544..18cd855 100644 --- a/compiler/bootstrap/ecere/bootstrap/instance.c +++ b/compiler/bootstrap/ecere/bootstrap/instance.c @@ -3664,6 +3664,7 @@ void __ecereNameSpace__ecere__com__eInstance_Evolve(struct __ecereNameSpace__ece if(_class && instancePtr && *instancePtr) { unsigned int wasApp = 0, wasGuiApp = 0; +struct __ecereNameSpace__ecere__com__Instance * oldInstance = *instancePtr; struct __ecereNameSpace__ecere__com__Instance * instance = (struct __ecereNameSpace__ecere__com__Instance *)__ecereNameSpace__ecere__com__eSystem_Renew(*instancePtr, sizeof(unsigned char) * (_class->structSize)); struct __ecereNameSpace__ecere__com__Class * fromClass = ((struct __ecereNameSpace__ecere__com__Instance *)(char *)instance)->_class; @@ -3744,6 +3745,7 @@ for(templateLink = _class->templatized.first; templateLink; templateLink = templ { struct __ecereNameSpace__ecere__com__Class * template = templateLink->data; +if(template->module == oldInstance) template->module = _class->module; } } @@ -3752,12 +3754,14 @@ for(module = ((struct __ecereNameSpace__ecere__com__Application *)(((char *)app for(_class = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes.first; _class; _class = _class->next) { struct __ecereNameSpace__ecere__sys__OldLink * templateLink; +struct __ecereNameSpace__ecere__com__Instance * oldModule = _class->module; _class->module = module; for(templateLink = _class->templatized.first; templateLink; templateLink = templateLink->next) { struct __ecereNameSpace__ecere__com__Class * template = templateLink->data; +if(template->module == oldModule) template->module = _class->module; } } diff --git a/compiler/libec/src/freeAst.ec b/compiler/libec/src/freeAst.ec index 5545707..a9fc0cc 100644 --- a/compiler/libec/src/freeAst.ec +++ b/compiler/libec/src/freeAst.ec @@ -1243,6 +1243,8 @@ void FreeModuleData(Module module) Method method; ClassTemplateParameter param; + if(_class.templateClass) continue; + if(_class.dataType) { FreeType(_class.dataType); diff --git a/ecere/src/com/instance.ec b/ecere/src/com/instance.ec index 67aa56e..83ea752 100644 --- a/ecere/src/com/instance.ec +++ b/ecere/src/com/instance.ec @@ -2959,7 +2959,10 @@ static void FreeTemplate(Class template) template.derivatives.Delete(deriv); } - _free(template); + if(template.module) + template.module.classes.Delete(template); + else + _free(template); } static void FreeTemplates(Class _class) @@ -3374,6 +3377,12 @@ public dllexport Class eSystem_FindClass(Module module, const char * name) templatedClass.numParams = 0; templatedClass.derivatives = { }; templatedClass.templatized = { }; + templatedClass.module = module; + templatedClass.count = 0; // TOCHECK: Keeping track of individual templatized classes? + templatedClass.prev = null; + templatedClass.next = null; + + module.classes.Add(templatedClass); ComputeClassParameters(templatedClass, templateParams, module); @@ -4591,6 +4600,7 @@ public dllexport void eInstance_Evolve(Instance * instancePtr, Class _class) if(_class && instancePtr && *instancePtr) { bool wasApp = false, wasGuiApp = false; + Instance oldInstance = *instancePtr; Instance instance = (Instance)renew *instancePtr byte[_class.structSize]; Class fromClass = instance._class; *instancePtr = instance; @@ -4659,7 +4669,8 @@ public dllexport void eInstance_Evolve(Instance * instancePtr, Class _class) for(templateLink = _class.templatized.first; templateLink; templateLink = templateLink.next) { Class template = templateLink.data; - template.module = _class.module; + if(template.module == oldInstance) + template.module = _class.module; } } @@ -4668,11 +4679,13 @@ public dllexport void eInstance_Evolve(Instance * instancePtr, Class _class) for(_class = module.classes.first; _class; _class = _class.next) { OldLink templateLink; + Module oldModule = _class.module; _class.module = module; for(templateLink = _class.templatized.first; templateLink; templateLink = templateLink.next) { Class template = templateLink.data; - template.module = _class.module; + if(template.module == oldModule) + template.module = _class.module; } } }