ecere/com/instance: Fixed crashes on Ecere classes templatized in other modules
authorJerome St-Louis <jerome@ecere.com>
Tue, 16 Jun 2015 06:54:09 +0000 (02:54 -0400)
committerJerome St-Louis <jerome@ecere.com>
Wed, 9 Dec 2015 22:54:52 +0000 (17:54 -0500)
compiler/bootstrap/ecere/bootstrap/instance.c
compiler/libec/src/freeAst.ec
ecere/src/com/instance.ec

index ece3544..18cd855 100644 (file)
@@ -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;
 }
 }
index 5545707..a9fc0cc 100644 (file)
@@ -1243,6 +1243,8 @@ void FreeModuleData(Module module)
       Method method;
       ClassTemplateParameter param;
 
+      if(_class.templateClass) continue;
+
       if(_class.dataType)
       {
          FreeType(_class.dataType);
index 67aa56e..83ea752 100644 (file)
@@ -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;
                }
             }
          }