ecere/com/instance: Fixed crashes on intermediate classes declared later
authorJerome St-Louis <jerome@ecere.com>
Tue, 16 Jun 2015 06:55:15 +0000 (02:55 -0400)
committerJerome St-Louis <jerome@ecere.com>
Wed, 9 Dec 2015 23:08:07 +0000 (18:08 -0500)
- Part of virtual methods tables were left uninitializeds
- Updated bootstrap

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

index 18cd855..3380ae5 100644 (file)
@@ -4016,6 +4016,9 @@ 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);
 }
 
@@ -4780,6 +4783,7 @@ if(mod->base && mod->base->base && mod->base->vTblSize > baseClass->vTblSize &&
 _class->vTblSize += mod->base->vTblSize - baseClass->vTblSize;
 _class->_vTbl = __ecereNameSpace__ecere__com__eSystem_Renew(_class->_vTbl, sizeof(void *) * (_class->vTblSize));
 memmove(_class->_vTbl + mod->base->vTblSize, _class->_vTbl + baseClass->vTblSize, (_class->vTblSize - mod->vTblSize) * sizeof(void *));
+memcpy(_class->_vTbl + baseClass->vTblSize, mod->_vTbl + baseClass->vTblSize, (mod->base->vTblSize - baseClass->vTblSize) * sizeof(void *));
 updateStart = baseClass->vTblSize;
 updateEnd = updateStart + mod->base->vTblSize - baseClass->vTblSize;
 for(method = (struct __ecereNameSpace__ecere__com__Method *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&_class->methods); method; method = next)
@@ -4993,6 +4997,11 @@ templatedClass->templateArgs = (((void *)0));
 templatedClass->numParams = 0;
 templatedClass->derivatives = __simpleStruct0;
 templatedClass->templatized = __simpleStruct1;
+templatedClass->module = module;
+templatedClass->count = 0;
+templatedClass->prev = (((void *)0));
+templatedClass->next = (((void *)0));
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes, templatedClass);
 __ecereNameSpace__ecere__com__ComputeClassParameters(templatedClass, templateParams, module);
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&_class->templatized, __extension__ ({
 struct __ecereNameSpace__ecere__sys__OldLink * __ecereInstance1 = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__sys__OldLink));
index f3be115..6c57380 100644 (file)
@@ -2086,6 +2086,8 @@ struct __ecereNameSpace__ecere__com__DataMember * dataMember;
 struct __ecereNameSpace__ecere__com__Method * method;
 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
 
+if(_class->templateClass)
+continue;
 if(_class->dataType)
 {
 FreeType(_class->dataType);
index 83ea752..e057737 100644 (file)
@@ -2113,6 +2113,7 @@ static void FixDerivativesBase(Class base, Class mod)
             _class._vTbl = renew _class._vTbl void *[_class.vTblSize];
             // memmove(_class._vTbl + mod.base.vTblSize, _class._vTbl + baseClass.vTblSize, (mod.base.vTblSize - baseClass.vTblSize) * sizeof(void *));
             memmove(_class._vTbl + mod.base.vTblSize, _class._vTbl + baseClass.vTblSize, (_class.vTblSize - mod.vTblSize) * sizeof(void *));
+            memcpy(_class._vTbl + baseClass.vTblSize, mod._vTbl + baseClass.vTblSize, (mod.base.vTblSize - baseClass.vTblSize) * sizeof(void *));
 
             updateStart = baseClass.vTblSize;
             updateEnd = updateStart + mod.base.vTblSize - baseClass.vTblSize;