ide;debugger; (#897) added options (leak check, redzone size and track origins) to...
authorRejean Loyer <rejean.loyer@gmail.com>
Wed, 28 Aug 2013 21:37:57 +0000 (17:37 -0400)
committerJerome St-Louis <jerome@ecere.com>
Thu, 29 Aug 2013 09:15:59 +0000 (05:15 -0400)
ide/src/debugger/Debugger.ec
ide/src/designer/CodeEditor.ec
ide/src/ide.ec
ide/src/project/Workspace.ec

index 1f495a3..fd00ff5 100644 (file)
@@ -2132,7 +2132,6 @@ class Debugger
       char oldDirectory[MAX_LOCATION];
       char tempPath[MAX_LOCATION];
       char command[MAX_F_STRING*4];
-      bool vgFullLeakCheck = ide.workspace.vgFullLeakCheck;
       Project project = ide.project;
       DirExpression targetDirExp = project.GetTargetDir(compiler, config, bitDepth);
       PathBackup pathBackup { };
@@ -2199,6 +2198,9 @@ class Debugger
       {
          char * clArgs = ide.workspace.commandLineArgs;
          const char *valgrindCommand = "valgrind"; // TODO: valgrind command config option //TODO: valgrind options
+         ValgrindLeakCheck vgLeakCheck = ide.workspace.vgLeakCheck;
+         int vgRedzoneSize = ide.workspace.vgRedzoneSize;
+         bool vgTrackOrigins = ide.workspace.vgTrackOrigins;
          vgLogFile = CreateTemporaryFile(vgLogPath, "ecereidevglog");
          if(vgLogFile)
          {
@@ -2217,8 +2219,8 @@ class Debugger
          }
          if(result)
          {
-            sprintf(command, "%s --vgdb=yes --vgdb-error=0 --log-file=%s%s %s%s%s",
-                  valgrindCommand, vgLogPath, vgFullLeakCheck ? " --leak-check=full" : "", targetFile, clArgs ? " " : "", clArgs ? clArgs : "");
+            sprintf(command, "%s --vgdb=yes --vgdb-error=0 --log-file=%s --leak-check=%s --redzone-size=%d --track-origins=%s %s%s%s",
+                  valgrindCommand, vgLogPath, (char*)vgLeakCheck, vgRedzoneSize, vgTrackOrigins ? "yes" : "no", targetFile, clArgs ? " " : "", clArgs ? clArgs : "");
             vgTargetHandle = DualPipeOpen(PipeOpenMode { output = 1, error = 2, input = 1 }, command);
             if(!vgTargetHandle)
             {
index e4ff770..e0d2509 100644 (file)
@@ -1961,7 +1961,7 @@ class CodeEditor : Window
    };
    MenuItem debugSkipRunToCursorAtSameLevel
    {
-      debugMenu, $"Run To Cursor At Same Level Skipping Breakpoints", u, Key { f10, alt = true };
+      debugMenu, $"Run To Cursor At Same Level Skipping Breakpoints", l, Key { f10, alt = true };
       bool NotifySelect(MenuItem selection, Modifiers mods)
       {
          ProjectView projectView = ide.projectView;
index 0b78bcf..65911eb 100644 (file)
@@ -1106,6 +1106,7 @@ class IDEWorkSpace : Window
             return true;
          }
       }
+#ifndef __WIN32__
       MenuDivider { debugMenu };
       MenuItem debugUseValgrindItem
       {
@@ -1117,23 +1118,82 @@ class IDEWorkSpace : Window
                ide.workspace.useValgrind = selection.checked;
                ide.workspace.Save();
             }
-            ide.AdjustValgrindChecks();
+            ide.AdjustValgrindMenus();
             return true;
          }
       }
-      MenuItem debugValgrindFullLeakCheckItem
+      Menu debugValgrindLeakCheckItem { debugMenu, $"Valgrind Leak Check", h };
+         MenuItem debugValgrindNoLeakCheckItem      { debugValgrindLeakCheckItem, $"No"     , f, id = ValgrindLeakCheck::no     , checkable = true, disabled = true; NotifySelect = ValgrindLCSelect; }
+         MenuItem debugValgrindSummaryLeakCheckItem { debugValgrindLeakCheckItem, $"Summary", f, id = ValgrindLeakCheck::summary, checkable = true, disabled = true; NotifySelect = ValgrindLCSelect, checked = true; }
+         MenuItem debugValgrindYesLeakCheckItem     { debugValgrindLeakCheckItem, $"Yes"    , f, id = ValgrindLeakCheck::yes    , checkable = true, disabled = true; NotifySelect = ValgrindLCSelect; }
+         MenuItem debugValgrindFullLeakCheckItem    { debugValgrindLeakCheckItem, $"Full"   , f, id = ValgrindLeakCheck::full   , checkable = true, disabled = true; NotifySelect = ValgrindLCSelect; }
+         bool ValgrindLCSelect(MenuItem selection, Modifiers mods)
+         {
+            if(ide.workspace)
+            {
+               if(selection.checked)
+               {
+                  ValgrindLeakCheck vgLeakCheck = (ValgrindLeakCheck)selection.id;
+
+                  debugValgrindNoLeakCheckItem.checked      = debugValgrindNoLeakCheckItem.id      == vgLeakCheck;
+                  debugValgrindSummaryLeakCheckItem.checked = debugValgrindSummaryLeakCheckItem.id == vgLeakCheck;
+                  debugValgrindYesLeakCheckItem.checked     = debugValgrindYesLeakCheckItem.id     == vgLeakCheck;
+                  debugValgrindFullLeakCheckItem.checked    = debugValgrindFullLeakCheckItem.id    == vgLeakCheck;
+
+                  ide.workspace.vgLeakCheck = vgLeakCheck;
+                  ide.workspace.Save();
+               }
+               else
+                  selection.checked = true;
+            }
+            return true;
+         }
+      Menu debugValgrindRedzoneSizeItem { debugMenu, $"Valgrind Redzone Size", z };
+         MenuItem debugValgrindRS0Item   { debugValgrindRedzoneSizeItem, $"0"  , f, id =   0, checkable = true, disabled = true; NotifySelect = ValgrindRSSelect, checked = true; }
+         MenuItem debugValgrindRS16Item  { debugValgrindRedzoneSizeItem, $"16" , f, id =  16, checkable = true, disabled = true; NotifySelect = ValgrindRSSelect; }
+         MenuItem debugValgrindRS32Item  { debugValgrindRedzoneSizeItem, $"32" , f, id =  32, checkable = true, disabled = true; NotifySelect = ValgrindRSSelect; }
+         MenuItem debugValgrindRS64Item  { debugValgrindRedzoneSizeItem, $"64" , f, id =  64, checkable = true, disabled = true; NotifySelect = ValgrindRSSelect; }
+         MenuItem debugValgrindRS128Item { debugValgrindRedzoneSizeItem, $"128", f, id = 128, checkable = true, disabled = true; NotifySelect = ValgrindRSSelect; }
+         MenuItem debugValgrindRS256Item { debugValgrindRedzoneSizeItem, $"256", f, id = 256, checkable = true, disabled = true; NotifySelect = ValgrindRSSelect; }
+         MenuItem debugValgrindRS512Item { debugValgrindRedzoneSizeItem, $"512", f, id = 512, checkable = true, disabled = true; NotifySelect = ValgrindRSSelect; }
+         bool ValgrindRSSelect(MenuItem selection, Modifiers mods)
+         {
+            if(ide.workspace)
+            {
+               if(selection.checked)
+               {
+                  int vgRedzoneSize = (int)selection.id;
+
+                  debugValgrindRS0Item.checked   = debugValgrindRS0Item.id   == vgRedzoneSize;
+                  debugValgrindRS16Item.checked  = debugValgrindRS16Item.id  == vgRedzoneSize;
+                  debugValgrindRS32Item.checked  = debugValgrindRS32Item.id  == vgRedzoneSize;
+                  debugValgrindRS64Item.checked  = debugValgrindRS64Item.id  == vgRedzoneSize;
+                  debugValgrindRS128Item.checked = debugValgrindRS128Item.id == vgRedzoneSize;
+                  debugValgrindRS256Item.checked = debugValgrindRS256Item.id == vgRedzoneSize;
+                  debugValgrindRS512Item.checked = debugValgrindRS512Item.id == vgRedzoneSize;
+
+                  ide.workspace.vgRedzoneSize = vgRedzoneSize;
+                  ide.workspace.Save();
+               }
+               else
+                  selection.checked = true;
+            }
+            return true;
+         }
+      MenuItem debugValgrindTrackOriginsItem
       {
-         debugMenu, $"Valgrind: Full Leak Check", d, disabled = true, checkable = true;
+         debugMenu, $"Valgrind Track Origins", k, checkable = true, disabled = true;
          bool NotifySelect(MenuItem selection, Modifiers mods)
          {
             if(ide.workspace)
             {
-               ide.workspace.vgFullLeakCheck = selection.checked;
+               ide.workspace.vgTrackOrigins = selection.checked;
                ide.workspace.Save();
             }
             return true;
          }
-      }
+      };
+#endif
       MenuDivider { debugMenu };
       MenuItem debugStepIntoItem
       {
@@ -1838,19 +1898,37 @@ class IDEWorkSpace : Window
       toolBar.activeConfig.disabled       = unavailable;
       toolBar.activeCompiler.disabled     = unavailable;
       toolBar.activeBitDepth.disabled     = unavailable;
+
+#ifndef __WIN32__
       debugUseValgrindItem.disabled       = unavailable;
+      AdjustValgrindMenus();
+#endif
 
-      AdjustValgrindChecks();
       AdjustFileMenus();
       AdjustBuildMenus();
       AdjustDebugMenus();
    }
 
-   void AdjustValgrindChecks()
+#ifndef __WIN32__
+   void AdjustValgrindMenus()
    {
       bool unavailable = !project || !debugUseValgrindItem.checked;
-      debugValgrindFullLeakCheckItem.disabled    = unavailable;
+      debugValgrindNoLeakCheckItem.disabled        = unavailable;
+      debugValgrindSummaryLeakCheckItem.disabled   = unavailable;
+      debugValgrindYesLeakCheckItem.disabled       = unavailable;
+      debugValgrindFullLeakCheckItem.disabled      = unavailable;
+
+      debugValgrindTrackOriginsItem.disabled       = unavailable;
+
+      debugValgrindRS0Item.disabled   = unavailable;
+      debugValgrindRS16Item.disabled  = unavailable;
+      debugValgrindRS32Item.disabled  = unavailable;
+      debugValgrindRS64Item.disabled  = unavailable;
+      debugValgrindRS128Item.disabled = unavailable;
+      debugValgrindRS256Item.disabled = unavailable;
+      debugValgrindRS512Item.disabled = unavailable;
    }
+#endif
 
    property bool hasOpenedCodeEditors
    {
index c0ff9ff..c5e5160 100644 (file)
@@ -22,6 +22,29 @@ import "ide"
 }*/
 
 enum OpenedFileState { unknown, opened, closed };
+enum ValgrindLeakCheck
+{
+   no, summary, yes, full;
+
+   property char *
+   {
+      get { return OnGetString(null, null, null); }
+   }
+
+   char * OnGetString(char * tempString, void * fieldData, bool * needClass)
+   {
+      if(this >= no && this <= full)
+      {
+         if(tempString)
+            strcpy(tempString, valgrindLeakCheckNames[this]);
+         return valgrindLeakCheckNames[this];
+      }
+      if(tempString && tempString[0])
+         tempString[0] = '\0';
+      return null;
+   }
+};
+static const char * valgrindLeakCheckNames[ValgrindLeakCheck] = { "no", "summary", "yes", "full" };
 
 class OpenedFileInfo
 {
@@ -178,8 +201,11 @@ public:
 private:
    String compiler;
    int bitDepth;
+   // TODO: save these new settings when json format is ready
    bool useValgrind;
-   bool vgFullLeakCheck;
+   ValgrindLeakCheck vgLeakCheck;
+   bool vgTrackOrigins;
+   int vgRedzoneSize;
 
 public:
    void Save()