ecere/com: (#1006) Fixed crash on freeing module importing "ecereCOM" in IDE
authorJerome St-Louis <jerome@ecere.com>
Mon, 30 Sep 2013 04:14:32 +0000 (00:14 -0400)
committerJerome St-Louis <jerome@ecere.com>
Mon, 30 Sep 2013 05:59:20 +0000 (01:59 -0400)
- The libecere module's class methods were being replaced by the ecereCOM meethods
- The already registered libecere class was being returned by RegisterClass, but methods were still being set
- Avoiding to do so now on COM redefinition
- Also not freeing templates derivatives upon COM redefinition of class
- Updated bootstrap

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

index a4bf350..5ceba55 100644 (file)
@@ -365,7 +365,7 @@ extern size_t strlen(const char * );
 unsigned int __ecereMethod___ecereNameSpace__ecere__sys__TempFile_Puts(struct __ecereNameSpace__ecere__com__Instance * this, char * string)
 {
 struct __ecereNameSpace__ecere__sys__TempFile * __ecerePointer___ecereNameSpace__ecere__sys__TempFile = (struct __ecereNameSpace__ecere__sys__TempFile *)(this ? (((char *)this) + __ecereClass___ecereNameSpace__ecere__sys__TempFile->offset) : 0);
-int len = strlen(string);
+int len = string ? strlen(string) : 0;
 int written = ((int (*)(struct __ecereNameSpace__ecere__com__Instance *, void *  buffer, unsigned int size, unsigned int count))this->_vTbl[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Write])(this, string, 1, len);
 
 return written == len;
index 9e3aa47..40c536f 100644 (file)
@@ -898,6 +898,8 @@ __ecereMethod___ecereNameSpace__ecere__com__BlockPool_Expand(&__ecereNameSpace__
 }
 }
 
+unsigned int __ecereNameSpace__ecere__com__poolingDisabled;
+
 static void * __ecereNameSpace__ecere__com___mymalloc(unsigned int size)
 {
 struct __ecereNameSpace__ecere__com__MemBlock * block = (((void *)0));
@@ -908,7 +910,7 @@ unsigned int p = __ecereNameSpace__ecere__com__log1_5i(size);
 
 if(!__ecereNameSpace__ecere__com__memoryInitialized)
 __ecereNameSpace__ecere__com__InitMemory();
-if(p < 31)
+if(!__ecereNameSpace__ecere__com__poolingDisabled && p < 31)
 {
 block = __ecereMethod___ecereNameSpace__ecere__com__BlockPool_Add(&__ecereNameSpace__ecere__com__pools[p]);
 if(block)
@@ -1435,10 +1437,10 @@ extern int strcmp(const char * , const char * );
 
 extern char *  strncpy(char * , const char * , size_t n);
 
-static void __ecereNameSpace__ecere__com__FreeTemplatesDerivatives(struct __ecereNameSpace__ecere__com__Class * base);
-
 extern int printf(char * , ...);
 
+static void __ecereNameSpace__ecere__com__FreeTemplatesDerivatives(struct __ecereNameSpace__ecere__com__Class * base);
+
 static void __ecereNameSpace__ecere__com__NameSpace_Free(struct __ecereNameSpace__ecere__com__NameSpace * parentNameSpace);
 
 static struct __ecereNameSpace__ecere__com__BTNamedLink * __ecereNameSpace__ecere__com__SearchNameSpace(struct __ecereNameSpace__ecere__com__NameSpace * nameSpace, char *  name, void *  listOffset);
@@ -1602,7 +1604,6 @@ offsetClass = base ? base->sizeClass : (type == 5 ? 0 : 0);
 totalSizeClass = offsetClass + sizeClass;
 if((_class = __ecereNameSpace__ecere__com__eSystem_FindClass(module, name)))
 {
-__ecereNameSpace__ecere__com__FreeTemplatesDerivatives(_class);
 if(!_class->internalDecl)
 {
 if(declMode != 4)
@@ -1614,6 +1615,7 @@ return _class;
 }
 return (((void *)0));
 }
+__ecereNameSpace__ecere__com__FreeTemplatesDerivatives(_class);
 classLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*_class->nameSpace).classes, name + start);
 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*_class->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)classLink);
 {
@@ -3232,7 +3234,7 @@ __ecereNameSpace__ecere__com__FixDerivativeVirtualMethod(template, name, vid, or
 
 struct __ecereNameSpace__ecere__com__Method * __ecereNameSpace__ecere__com__eClass_AddMethod(struct __ecereNameSpace__ecere__com__Class * _class, char * name, char * type, void * function, int declMode)
 {
-if(_class && name)
+if(_class && !_class->comRedefinition && name)
 {
 struct __ecereNameSpace__ecere__com__Class * base;
 
@@ -3300,7 +3302,7 @@ return (((void *)0));
 
 struct __ecereNameSpace__ecere__com__Method * __ecereNameSpace__ecere__com__eClass_AddVirtualMethod(struct __ecereNameSpace__ecere__com__Class * _class, char * name, char * type, void * function, int declMode)
 {
-if(_class && name)
+if(_class && !_class->comRedefinition && name)
 {
 struct __ecereNameSpace__ecere__com__Class * base;
 
@@ -5663,6 +5665,11 @@ struct __ecereNameSpace__ecere__com__Instance * __ecereNameSpace__ecere__com__Ge
 return __ecereNameSpace__ecere__com__activeDesigner;
 }
 
+void __ecereNameSpace__ecere__com__eSystem_SetPoolingDisabled(unsigned int disabled)
+{
+__ecereNameSpace__ecere__com__poolingDisabled = disabled;
+}
+
 
 
 unsigned int __ecereNameSpace__ecere__sys__UTF8Validate(char * source)
@@ -6655,6 +6662,7 @@ __ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "FixProperty", "voi
 __ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "CreateNew", "void ::CreateNew(EditBox editBox, Size clientSize, char * name, char * inherit)", 0, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::com::SetActiveDesigner", "void ecere::com::SetActiveDesigner(ecere::com::DesignerBase designer)", __ecereNameSpace__ecere__com__SetActiveDesigner, module, 4);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::com::GetActiveDesigner", "ecere::com::DesignerBase ecere::com::GetActiveDesigner(void)", __ecereNameSpace__ecere__com__GetActiveDesigner, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::com::eSystem_SetPoolingDisabled", "void ecere::com::eSystem_SetPoolingDisabled(bool disabled)", __ecereNameSpace__ecere__com__eSystem_SetPoolingDisabled, module, 4);
 __ecereNameSpace__ecere__com__eSystem_RegisterDefine("ecere::sys::LEAD_OFFSET", "0xD800 - (0x10000 >> 10)", module, 2);
 __ecereNameSpace__ecere__com__eSystem_RegisterDefine("ecere::sys::SURROGATE_OFFSET", "0x10000 - (0xD800 << 10) - 0xDC00", module, 2);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::sys::UTF8Validate", "bool ecere::sys::UTF8Validate(char * source)", __ecereNameSpace__ecere__sys__UTF8Validate, module, 4);
index 8e7ecaa..9ff96e4 100644 (file)
@@ -2383,8 +2383,6 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
    
       if((_class = eSystem_FindClass(module, name)))
       {
-         FreeTemplatesDerivatives(_class);
-
          if(!_class.internalDecl)
          {
             if(declMode != baseSystemAccess)
@@ -2398,6 +2396,8 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
             return null;
          }
 
+         FreeTemplatesDerivatives(_class);
+
          classLink = (BTNamedLink)_class.nameSpace->classes.FindString(name + start);
          _class.nameSpace->classes.Delete((BTNode)classLink);
          {
@@ -4018,7 +4018,7 @@ static void FixDerivativeVirtualMethod(Class base, char * name, int vid, void *
 
 public dllexport Method eClass_AddMethod(Class _class, char * name, char * type, void * function, AccessMode declMode)
 {
-   if(_class && name)
+   if(_class && !_class.comRedefinition && name)
    {
       Class base;
       for(base = _class; base; base = base.base)
@@ -4089,7 +4089,7 @@ public dllexport Method eClass_AddMethod(Class _class, char * name, char * type,
 
 public dllexport Method eClass_AddVirtualMethod(Class _class, char * name, char * type, void * function, AccessMode declMode)
 {
-   if(_class && name)
+   if(_class && !_class.comRedefinition && name)
    {
       Class base;
       for(base = _class; base; base = base.base)