compiler: Fixed missing struct declarator in MkDeclaration()
authorJerome St-Louis <jerome@ecere.com>
Sat, 20 Apr 2013 03:06:53 +0000 (23:06 -0400)
committerJerome St-Louis <jerome@ecere.com>
Sat, 20 Apr 2013 03:06:53 +0000 (23:06 -0400)
- This solves the crash reported by Redj on Git markers in FindInFilesDialog.ec
- Also fixed the problems in 2 other ways:
   * Detecting a bit class becoming a non-bit class
   * Struct declarator check in firstPass.ec
- Fixed memory leak in debug mode by freeing ModuleImports after freeing AST in CodeEditor

compiler/libec/locale/ec.pot
compiler/libec/src/ast.ec
compiler/libec/src/firstPass.ec
ecere/src/com/instance.ec
ide/src/designer/CodeEditor.ec

index 3426b87..4229d56 100644 (file)
@@ -134,7 +134,7 @@ msgstr "Redefinition of %s (defining as %s, already defined as %s)\n"
 msgid "Redefinition of %s ignored\n"
 msgstr "Redefinition of %s ignored\n"
 
-#: ./src/firstPass.ec:444
+#: ./src/firstPass.ec:446
 msgid "Redefinition of method %s in class %s\n"
 msgstr "Redefinition of method %s in class %s\n"
 
index 27e523a..6211bd1 100644 (file)
@@ -1015,7 +1015,7 @@ Declaration MkStructDeclaration(OldList specifiers, OldList declarators, Specifi
             }
             if(s)
             {
-               decl.declarators = declarators = MkListOne(MkDeclaratorIdentifier(MkIdentifier(s)));
+               decl.declarators = declarators = MkListOne(MkStructDeclarator(MkDeclaratorIdentifier(MkIdentifier(s)), null));
                specifiers.Remove(spec);
                FreeSpecifier(spec);
                spec = null;
index 0db58a0..f060187 100644 (file)
@@ -376,6 +376,8 @@ static void ProcessClass(ClassType classType, OldList definitions, Symbol symbol
 
                         for(d = decl.declarators->first; d; d = d.next)
                         {
+                           if(d.type != structDeclarator)
+                              continue; // This should always be a structDeclarator (There's a bug somewhere else if it's not)
                            if(d.structDecl.exp)
                            {
                               classType = bitClass;
@@ -427,7 +429,7 @@ static void ProcessClass(ClassType classType, OldList definitions, Symbol symbol
             {
                Declarator funcDecl = GetFuncDecl(func.declarator);
                Identifier id = GetDeclId(funcDecl);
-               Method method;               
+               Method method;
                         
                if(func.isVirtual)
                {
index 5dadab7..f9ef335 100644 (file)
@@ -1920,6 +1920,7 @@ static void FixDerivativesBase(Class base, Class mod)
    {
       Class _class = derivative.data;
       ClassType type = _class.type;
+      ClassType oldType = type;
       int size = _class.structSize - _class.offset;
       int oldSizeClass = _class.sizeClass;
       int sizeClass = _class.sizeClass - _class.offsetClass;
@@ -2129,13 +2130,27 @@ static void FixDerivativesBase(Class base, Class mod)
          }
          // if(mod.base.memberID)
          {
-            for(member = _class.membersAndProperties.first; member; member = member.next)
+            DataMember next;
+            for(member = _class.membersAndProperties.first; member; member = next)
             {
                int offsetDiff = _class.offset - offsetBefore;
-               if(!member.isProperty && offsetDiff > 0)
+               next = member.next;
+               if(!member.isProperty)
                {
-                  member.offset += offsetDiff;
-                  member.memberOffset += offsetDiff;
+                  if(oldType == bitClass && type != bitClass)
+                  {
+                     DataMember prev = member.prev;
+                     // Correcting a bitClass to be a non-bit class (This should really never be required)
+                     _class.membersAndProperties.Remove(member);
+                     member = (DataMember)renew0 member byte[sizeof (class DataMember)];
+                     _class.membersAndProperties.Insert(prev, member);
+                  }
+
+                  if(offsetDiff > 0)
+                  {
+                     member.offset += offsetDiff;
+                     member.memberOffset += offsetDiff;
+                  }
                }
                member.id += mod.base.memberID;
             }
index 824f8ee..57374c3 100644 (file)
@@ -2469,14 +2469,14 @@ class CodeEditor : Window
    ****************************************************************************/
    void FreeParser()
    {
-      this.defines.Free(FreeModuleDefine);
-      this.imports.Free(FreeModuleImport);
-      
       if(ast != null)
       {
          FreeASTTree(ast);
          ast = null;
       }
+      this.defines.Free(FreeModuleDefine);
+      this.imports.Free(FreeModuleImport);   // Moved this after FreeAST because Debug printing causes ModuleImports to be created
+
       FreeExcludedSymbols(this.excludedSymbols);
       FreeContext(this.globalContext);
       FreeIncludeFiles();