From: Jerome St-Louis Date: Sat, 20 Apr 2013 03:06:53 +0000 (-0400) Subject: compiler: Fixed missing struct declarator in MkDeclaration() X-Git-Tag: 0.44.07~21 X-Git-Url: https://ecere.com/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=89dcc67d27cac3820e50e9124e276ffcfc009ef3;p=sdk compiler: Fixed missing struct declarator in MkDeclaration() - 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 --- diff --git a/compiler/libec/locale/ec.pot b/compiler/libec/locale/ec.pot index 3426b87..4229d56 100644 --- a/compiler/libec/locale/ec.pot +++ b/compiler/libec/locale/ec.pot @@ -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" diff --git a/compiler/libec/src/ast.ec b/compiler/libec/src/ast.ec index 27e523a..6211bd1 100644 --- a/compiler/libec/src/ast.ec +++ b/compiler/libec/src/ast.ec @@ -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; diff --git a/compiler/libec/src/firstPass.ec b/compiler/libec/src/firstPass.ec index 0db58a0..f060187 100644 --- a/compiler/libec/src/firstPass.ec +++ b/compiler/libec/src/firstPass.ec @@ -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) { diff --git a/ecere/src/com/instance.ec b/ecere/src/com/instance.ec index 5dadab7..f9ef335 100644 --- a/ecere/src/com/instance.ec +++ b/ecere/src/com/instance.ec @@ -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; } diff --git a/ide/src/designer/CodeEditor.ec b/ide/src/designer/CodeEditor.ec index 824f8ee..57374c3 100644 --- a/ide/src/designer/CodeEditor.ec +++ b/ide/src/designer/CodeEditor.ec @@ -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();