ide: Memory leaks fixes
authorJerome St-Louis <jerome@ecere.com>
Mon, 17 Oct 2011 06:39:36 +0000 (02:39 -0400)
committerJerome St-Louis <jerome@ecere.com>
Mon, 17 Oct 2011 06:39:36 +0000 (02:39 -0400)
See note in ProjectConfig.ec regarding the JSON parser deleting string values set to properties

ide/src/IDESettings.ec
ide/src/ProjectSettings.ec
ide/src/debugger/Debugger.ec
ide/src/dialogs/NewProjectDialog.ec
ide/src/ide.ec
ide/src/project/Project.ec
ide/src/project/ProjectConfig.ec
ide/src/project/Workspace.ec

index 1aaf4d9..389c099 100644 (file)
@@ -216,8 +216,10 @@ private:
          if(result == fileNotFound || !data)
          {
             CompilerConfig defaultCompiler = MakeDefaultCompiler(defaultCompilerName, true);
+            // We incref the compilers below, so reset refCount to 0
+            defaultCompiler._refCount = 0;
             data = (IDESettings)this.data;
-            data.compilerConfigs = { };
+
             data.compilerConfigs.Add(defaultCompiler);
             data.useFreeCaret = true;
             data.showLineNumbers = true;
@@ -746,9 +748,10 @@ private:
       delete makeCommand;
       delete execPrefixCommand;
       delete distccHosts;
-      if(includeDirs) { includeDirs.Free(); delete includeDirs; }
-      if(libraryDirs) { libraryDirs.Free(); delete libraryDirs; }
-      if(executableDirs) { executableDirs.Free(); delete executableDirs; }
+      if(environmentVars) environmentVars.Free();
+      if(includeDirs) { includeDirs.Free(); }
+      if(libraryDirs) { libraryDirs.Free(); }
+      if(executableDirs) { executableDirs.Free(); }
    }
    CompilerConfig Copy()
    {
@@ -774,7 +777,7 @@ private:
       for(s : includeDirs) copy.includeDirs.Add(CopyString(s));
       for(s : libraryDirs) copy.libraryDirs.Add(CopyString(s));
       for(s : executableDirs) copy.executableDirs.Add(CopyString(s));
-      for(ns : environmentVars) copy.environmentVars.Add(NamedString { name = CopyString(ns.name), string = CopyString(ns.string) });
+      for(ns : environmentVars) copy.environmentVars.Add(NamedString { name = ns.name, string = ns.string });
 
       incref copy;
       return copy;
index e426c21..ec49dcd 100644 (file)
@@ -1233,7 +1233,7 @@ class BuildTab : Tab
             name = CopyString(tmp);
             options =
             {
-               // objectsDirectory = CopyString(defaultObjDirExpression);
+               // objectsDirectory = /*CopyString(*/defaultObjDirExpression/*)*/;
             };
          };
          if(!project.topNode.configurations) project.topNode.configurations = { };
@@ -1241,9 +1241,9 @@ class BuildTab : Tab
          /*
          targetType = project.config.options.targetType;
          config.options.
-         config.options.targetFileName = CopyString(project.moduleName);
-         config.targetDir.dir = "";
-         config.objectsDirectory = CopyString(defaultObjDirExpression);
+         config.options.targetFileName = project.moduleName;
+         config.options.targetDir.dir = "";
+         config.options.objectsDirectory = defaultObjDirExpression);
          config.options.debug = true;
          config.options.optimization = none;
          config.options.warnings = all;
index c49b738..b0c5483 100644 (file)
@@ -619,6 +619,7 @@ class Debugger
 
    ~Debugger()
    {
+      sysBPs.Free();
       Stop();
       CleanUp();
    }
index 945bfa5..5b566f1 100644 (file)
@@ -145,7 +145,7 @@ class NewProjectDialog : Window
             warnings = all;
             // TOFIX: Precomp problems withou the extra ( )
             targetType = ((TargetTypes)targetType.GetTag());
-            targetFileName = CopyString(name);
+            targetFileName = /*CopyString(*/name/*)*/;
          };
          if(project.targetType != staticLibrary)
          {
@@ -413,7 +413,7 @@ class QuickProjectDialog : Window
             warnings = all;
             // TOFIX: Precomp problems withou the extra ( )
             targetType = ((TargetTypes)targetType.GetTag());
-            targetFileName = CopyString(prjName);
+            targetFileName = /*CopyString(*/prjName/*)*/;
          };
 
          if(project.targetType != staticLibrary)
index e91297a..c587309 100644 (file)
@@ -2446,6 +2446,7 @@ class IDE : Window
    {
       delete driverItems;
       delete skinItems;
+      delete ideSettings;
    }
 }
 
index b321b98..89a1b98 100644 (file)
@@ -2471,6 +2471,7 @@ Project LegacyBinaryLoadProject(File f, char * filePath)
       {
          int temp;
          int len,c, count;
+         String targetFileName, targetDirectory, objectsDirectory;
 
          // { executable = 0, sharedLibrary = 1, staticLibrary = 2 };
          f.Read(&temp, sizeof(int),1);
@@ -2482,18 +2483,22 @@ Project LegacyBinaryLoadProject(File f, char * filePath)
          }
 
          f.Read(&len, sizeof(int),1);
-         project.options.targetFileName = new char[len+1];
-         f.Read(project.options.targetFileName, sizeof(char), len+1);
+         targetFileName = new char[len+1];
+         f.Read(targetFileName, sizeof(char), len+1);
+         project.options.targetFileName = targetFileName;
+         delete targetFileName;
 
          f.Read(&len, sizeof(int),1);
-         delete project.options.targetDirectory;
-         project.options.targetDirectory = new char[len+1];
-         f.Read(project.options.targetDirectory, sizeof(char), len+1);
+         targetDirectory = new char[len+1];
+         f.Read(targetDirectory, sizeof(char), len+1);
+         project.options.targetDirectory = targetDirectory;
+         delete targetDirectory;
 
          f.Read(&len, sizeof(int),1);
-         delete project.options.objectsDirectory;
-         project.options.objectsDirectory = new byte[len+1];
-         f.Read(project.options.objectsDirectory, sizeof(char), len+1);
+         objectsDirectory = new byte[len+1];
+         f.Read(objectsDirectory, sizeof(char), len+1);
+         project.options.objectsDirectory = objectsDirectory;
+         delete objectsDirectory;
 
          f.Read(&temp, sizeof(int),1);
          project./*config.*/options.debug = temp ? true : false;
@@ -2655,7 +2660,7 @@ void ProjectConfig::LegacyProjectConfigLoad(File f)
                equal++;
                TrimLSpaces(equal, equal);
                if(!strcmpi(buffer, "Target Name"))
-                  options.targetFileName = CopyString(equal);
+                  options.targetFileName = /*CopyString(*/equal/*)*/;
                else if(!strcmpi(buffer, "Target Type"))
                {
                   if(!strcmpi(equal, "Executable"))
@@ -2668,7 +2673,7 @@ void ProjectConfig::LegacyProjectConfigLoad(File f)
                      options.targetType = executable;
                }
                else if(!strcmpi(buffer, "Target Directory"))
-                  options.targetDirectory = CopyString(equal);
+                  options.targetDirectory = /*CopyString(*/equal/*)*/;
                else if(!strcmpi(buffer, "Console"))
                   options.console = ParseTrueFalseValue(equal);
                else if(!strcmpi(buffer, "Libraries"))
@@ -2677,7 +2682,7 @@ void ProjectConfig::LegacyProjectConfigLoad(File f)
                   ParseArrayValue(options.libraries, equal);
                }
                else if(!strcmpi(buffer, "Intermediate Directory"))
-                  options.objectsDirectory = CopyString(equal); //objDir.expression = equal;
+                  options.objectsDirectory = /*CopyString(*/equal/*)*/; //objDir.expression = equal;
                else if(!strcmpi(buffer, "Debug"))
                   options.debug = ParseTrueFalseValue(equal);
                else if(!strcmpi(buffer, "Optimize"))
@@ -2713,7 +2718,7 @@ void ProjectConfig::LegacyProjectConfigLoad(File f)
       }
    }
    if(!options.targetDirectory && options.objectsDirectory)
-      options.targetDirectory = CopyString(options.objectsDirectory);
+      options.targetDirectory = /*CopyString(*/options.objectsDirectory/*)*/;
    //if(!objDir.dir) objDir.dir = "obj";
    //if(!targetDir.dir) targetDir.dir = "";
    // if(!targetName) property::targetName = "";   // How can a targetFileName be nothing???
@@ -2935,7 +2940,7 @@ Project LegacyAsciiLoadProject(File f, char * filePath)
 
                   // Config Settings
                   else if(!strcmpi(buffer, "Intermediate Directory"))
-                     project.config.options.objectsDirectory = CopyString(equal); //objDir.expression = equal;
+                     project.config.options.objectsDirectory = /*CopyString(*/equal/*)*/; //objDir.expression = equal;
                   else if(!strcmpi(buffer, "Debug"))
                      project.config.options.debug = ParseTrueFalseValue(equal);
                   else if(!strcmpi(buffer, "Optimize"))
@@ -2959,7 +2964,7 @@ Project LegacyAsciiLoadProject(File f, char * filePath)
 
                      // Project Wide Settings (All configs)
                      if(!strcmpi(buffer, "Target Name"))
-                        project.options.targetFileName = CopyString(equal);
+                        project.options.targetFileName = /*CopyString(*/equal/*)*/;
                      else if(!strcmpi(buffer, "Target Type"))
                      {
                         if(!strcmpi(equal, "Executable"))
@@ -2972,7 +2977,7 @@ Project LegacyAsciiLoadProject(File f, char * filePath)
                            project.options.targetType = executable;
                      }
                      else if(!strcmpi(buffer, "Target Directory"))
-                        project.options.targetDirectory = CopyString(equal);
+                        project.options.targetDirectory = /*CopyString(*/equal/*)*/;
                      else if(!strcmpi(buffer, "Console"))
                         project.options.console = ParseTrueFalseValue(equal);
                      else if(!strcmpi(buffer, "Libraries"))
@@ -3295,9 +3300,9 @@ Project LoadProject(char * filePath)
             (!project.options || !project.options.targetFileName || !project.options.targetFileName[0]) &&
             (!project.config.options.targetFileName || !project.config.options.targetFileName[0]))
          {
-            delete project.config.options.targetFileName;
+            //delete project.config.options.targetFileName;
             
-            project.options.targetFileName = CopyString(project.moduleName);
+            project.options.targetFileName = /*CopyString(*/project.moduleName/*)*/;
             project.config.options.optimization = none;
             project.config.options.debug = true;
             //project.config.options.warnings = unset;
index 0a1e462..923e4fd 100644 (file)
@@ -217,6 +217,9 @@ public:
 
    // Linker Options
    TargetTypes targetType;
+   // NOTE: The JSON Parser deletes strings after setting a String property, so we do a copy here.
+   //       (This behavior is different from Objects (class instances) values which are not deleted)
+   //       Code calling these properties should *NOT* use CopyString().
    property char * targetFileName
    {
       set { delete targetFileName; if(value && value[0]) targetFileName = CopyValidateMakefilePath(value); }
@@ -320,9 +323,9 @@ public:
          defaultNameSpace = CopyString(defaultNameSpace),
          strictNameSpaces = strictNameSpaces,
          targetType = targetType,
-         targetFileName = CopyString(targetFileName),
-         targetDirectory = CopyString(targetDirectory),
-         objectsDirectory = CopyString(objectsDirectory),
+         targetFileName = /*CopyString(*/targetFileName/*)*/,
+         targetDirectory = /*CopyString(*/targetDirectory/*)*/,
+         objectsDirectory = /*CopyString(*/objectsDirectory/*)*/,
          console = console,
          compress = compress,
          excludeFromBuild = excludeFromBuild,
index d5a0612..3f9fd32 100644 (file)
@@ -74,6 +74,10 @@ class OpenedFileInfo
          } 
       }
    }
+   ~OpenedFileInfo()
+   {
+      delete path;
+   }
 };
 
 class Workspace