mem leak fixed about the default visitor 66/17266/6
Clément DAVID [Mon, 5 Oct 2015 09:39:53 +0000 (11:39 +0200)]
Change-Id: I9edf2122c54f3fe93892e20a1646d7ab82600667

scilab/modules/ast/includes/ast/debugmanager.hxx
scilab/modules/ast/includes/system_env/configvariable.hxx
scilab/modules/ast/src/cpp/ast/debugmanager.cpp
scilab/modules/ast/src/cpp/system_env/configvariable.cpp
scilab/modules/ast/src/cpp/types/macro.cpp
scilab/modules/core/includes/runner.hxx
scilab/modules/core/src/cpp/runner.cpp
scilab/modules/functions/sci_gateway/cpp/sci_exec.cpp
scilab/modules/functions/sci_gateway/cpp/sci_execstr.cpp

index bcbadae..b5700a1 100644 (file)
@@ -13,6 +13,8 @@
 #ifndef __DEBUGGER_MANAGER_HXX__
 #define __DEBUGGER_MANAGER_HXX__
 
+#include <memory>
+
 #include "abstractdebugger.hxx"
 #include "breakpoint.hxx"
 #include "dynlib_ast.h"
@@ -31,7 +33,7 @@ public :
     };
 
 private:
-    static DebuggerMagager* me;
+    static std::unique_ptr<DebuggerMagager> me;
     DebuggerMagager() :
         breakpoints(),
         debuggers(), pExp(nullptr), interrupted(false), currentBreakPoint(-1), action(Continue), level(0) {}
@@ -47,6 +49,17 @@ private:
 
     void internal_stop();
 public:
+    ~DebuggerMagager()
+    {
+        for (auto d : debuggers)
+        {
+            delete d;
+        }
+        for (auto b : breakpoints)
+        {
+            delete b;
+        }
+    }
 
     static DebuggerMagager* getInstance();
 
index ed807b1..567935d 100644 (file)
@@ -22,6 +22,8 @@
 #include <list>
 #include <map>
 #include <string>
+#include <memory>
+
 #include "visitor.hxx"
 
 extern "C"
@@ -467,7 +469,7 @@ public:
 
     //debugger information
     static bool m_bEnabledebug;
-    static ast::ConstVisitor* m_defaultvisitor;
+    static std::unique_ptr<ast::ConstVisitor> m_defaultvisitor;
 
     static bool getEnableDebug();
     static void setEnableDebug(bool _enable);
@@ -482,7 +484,7 @@ public :
     static bool isExecutionBreak();
     static void setExecutionBreak();
     static void resetExecutionBreak();
-    private:
+private:
     static int recursionLimit;
     static int recursionLevel;
 
index 8b9290d..9136a89 100644 (file)
@@ -10,6 +10,8 @@
  *
  */
 
+#include <memory>
+
 #include "debugmanager.hxx"
 #include "configvariable.hxx"
 #include "threadmanagement.hxx"
@@ -24,17 +26,17 @@ extern "C"
 
 namespace debugger
 {
-DebuggerMagager* DebuggerMagager::me = NULL;
+std::unique_ptr<DebuggerMagager> DebuggerMagager::me(nullptr);
 
 //singleton
 DebuggerMagager* DebuggerMagager::getInstance()
 {
-    if (me == NULL)
+    if (me.get() == nullptr)
     {
-        me = new DebuggerMagager();
+        me.reset(new DebuggerMagager());
     }
 
-    return me;
+    return me.get();
 }
 
 void DebuggerMagager::addDebugger(AbstractDebugger* _debug)
index 8387c62..f8f1cd5 100644 (file)
@@ -1450,7 +1450,7 @@ int ConfigVariable::isScilabCommand()
 
 //debugger information
 bool ConfigVariable::m_bEnabledebug = false;
-ast::ConstVisitor* ConfigVariable::m_defaultvisitor = NULL;
+std::unique_ptr<ast::ConstVisitor> ConfigVariable::m_defaultvisitor(nullptr);
 
 bool ConfigVariable::getEnableDebug()
 {
@@ -1464,19 +1464,14 @@ void ConfigVariable::setEnableDebug(bool _enable)
 
 void ConfigVariable::setDefaultVisitor(ast::ConstVisitor* _default)
 {
-    if (m_defaultvisitor)
-    {
-        delete m_defaultvisitor;
-    }
-
-    m_defaultvisitor = _default;
+    m_defaultvisitor.reset(_default);
 }
 
 ast::ConstVisitor* ConfigVariable::getDefaultVisitor()
 {
-    if (m_defaultvisitor == NULL)
+    if (m_defaultvisitor.get() == nullptr)
     {
-        m_defaultvisitor = new ast::ExecVisitor();
+        m_defaultvisitor.reset(new ast::ExecVisitor());
     }
     return m_defaultvisitor->clone();
 }
index 0dcedcf..27458ba 100644 (file)
@@ -10,6 +10,7 @@
 *
 */
 
+#include <memory>
 #include <sstream>
 #include <cstdio>
 
@@ -307,10 +308,11 @@ Callable::ReturnValue Macro::call(typed_list &in, optional_list &opt, int _iRetC
 
     //save current prompt mode
     int oldVal = ConfigVariable::getPromptMode();
+    std::unique_ptr<ast::ConstVisitor> exec (ConfigVariable::getDefaultVisitor());
     try
     {
         ConfigVariable::setPromptMode(-1);
-        m_body->accept(*ConfigVariable::getDefaultVisitor());
+        m_body->accept(*exec);
         //restore previous prompt mode
         ConfigVariable::setPromptMode(oldVal);
     }
index 5b2b646..f1b5cd6 100644 (file)
@@ -15,6 +15,7 @@
 #define __RUNNER_HXX__
 
 #include <atomic>
+#include <memory>
 
 #include "exp.hxx"
 #include "runvisitor.hxx"
@@ -27,31 +28,20 @@ extern "C"
 class CORE_IMPEXP Runner
 {
 public :
-    Runner(ast::Exp* _theProgram, ast::RunVisitor *_visitor)
-    {
-        m_theProgram = _theProgram;
-        m_visitor = _visitor;
-        m_isConsoleCommand = false;
-        m_isInterruptible = true;
-    }
+    Runner(ast::Exp* _theProgram, ast::RunVisitor *_visitor) : m_theProgram(_theProgram), m_visitor(_visitor), m_isConsoleCommand(false), m_isInterruptible(true)
+    { }
 
-    Runner(ast::Exp* _theProgram, ast::RunVisitor *_visitor, bool _isConsoleCommand, bool _isInterruptible)
-    {
-        m_theProgram = _theProgram;
-        m_visitor = _visitor;
-        m_isConsoleCommand = _isConsoleCommand;
-        m_isInterruptible = _isInterruptible;
-    }
+    Runner(ast::Exp* _theProgram, ast::RunVisitor *_visitor, bool _isConsoleCommand, bool _isInterruptible) : m_theProgram(_theProgram), m_visitor(_visitor), m_isConsoleCommand(_isConsoleCommand), m_isInterruptible(_isInterruptible)
+    { }
 
     ~Runner()
     {
         delete m_theProgram;
-        delete m_visitor;
     }
 
     ast::RunVisitor *getVisitor()
     {
-        return m_visitor;
+        return m_visitor.get();
     }
 
     ast::Exp* getProgram()
@@ -71,7 +61,7 @@ public :
 
 private :
     ast::Exp* m_theProgram;
-    ast::RunVisitor* m_visitor;
+    std::unique_ptr<ast::RunVisitor> m_visitor;
     bool m_isConsoleCommand;
     bool m_isInterruptible;
 
index b62a3b5..c0b623b 100644 (file)
@@ -30,7 +30,7 @@ std::atomic<bool> StaticRunner::m_bInterruptibleCommand(true);
 void StaticRunner::launch()
 {
     // get the runner to execute
-    Runner* runMe = getRunner();
+    std::unique_ptr<Runner> runMe(getRunner());
     // set if the current comment is interruptible
     setInterruptibleCommand(runMe->isInterruptible());
     debugger::DebuggerMagager* manager = debugger::DebuggerMagager::getInstance();
@@ -53,7 +53,6 @@ void StaticRunner::launch()
             if (ConfigVariable::getPauseLevel())
             {
                 ConfigVariable::DecreasePauseLevel();
-                delete runMe;
                 throw re;
             }
 
@@ -94,7 +93,6 @@ void StaticRunner::launch()
         if (ConfigVariable::getPauseLevel())
         {
             ConfigVariable::DecreasePauseLevel();
-            delete runMe;
             throw ia;
         }
 
@@ -112,7 +110,6 @@ void StaticRunner::launch()
 
         //clean debugger step flag if debugger is not interrupted ( end of debug )
         manager->resetStep();
-        delete runMe;
         throw ia;
     }
 
@@ -140,7 +137,6 @@ void StaticRunner::launch()
 
     //clean debugger step flag if debugger is not interrupted ( end of debug )
     manager->resetStep();
-    delete runMe;
 }
 
 void StaticRunner::setRunner(Runner* _RunMe)
index b6f5a3e..036db6f 100644 (file)
@@ -10,7 +10,6 @@
 *
 */
 
-#include <string.h>
 #include "functions_gw.hxx"
 
 #include "parser.hxx"
@@ -27,6 +26,7 @@
 #include "macrofile.hxx"
 #include "filemanager.hxx"
 
+#include <memory>
 #include <iostream>
 #include <fstream>
 #include <string>
@@ -286,7 +286,7 @@ types::Function::ReturnValue sci_exec(types::typed_list &in, int _iRetCount, typ
     if (file == NULL || promptMode == 0 || promptMode == 2)
     {
         ast::SeqExp* pSeqExp = pExp->getAs<ast::SeqExp>();
-        ast::ConstVisitor* exec = ConfigVariable::getDefaultVisitor();
+        std::unique_ptr<ast::ConstVisitor> exec(ConfigVariable::getDefaultVisitor());
 
         try
         {
@@ -296,7 +296,6 @@ types::Function::ReturnValue sci_exec(types::typed_list &in, int _iRetCount, typ
             try
             {
                 pSeqExp->accept(*exec);
-                delete exec;
             }
             catch (const ast::RecursionException& /* re */)
             {
@@ -398,7 +397,7 @@ types::Function::ReturnValue sci_exec(types::typed_list &in, int _iRetCount, typ
 
             j = k;
 
-            ast::ConstVisitor* exec = ConfigVariable::getDefaultVisitor();
+            std::unique_ptr<ast::ConstVisitor> exec(ConfigVariable::getDefaultVisitor());
 
             try
             {
@@ -409,7 +408,6 @@ types::Function::ReturnValue sci_exec(types::typed_list &in, int _iRetCount, typ
                 {
                     // execute printed exp
                     seqExp.accept(*exec);
-                    delete exec;
                 }
                 catch (const ast::RecursionException& /* re */)
                 {
index ce47ffa..7dfa47b 100644 (file)
@@ -10,7 +10,6 @@
 *
 */
 
-#include <string.h>
 //#include "AnalysisVisitor.hxx"
 #include "parser.hxx"
 #include "functions_gw.hxx"
@@ -19,6 +18,7 @@
 #include "configvariable.hxx"
 #include "threadmanagement.hxx"
 
+#include <memory>
 #include <iostream>
 #include <fstream>
 #include <string>
@@ -201,7 +201,7 @@ types::Function::ReturnValue sci_execstr(types::typed_list &in, int _iRetCount,
     // to manage line displayed when error occured.
     ConfigVariable::macroFirstLine_begin(1);
 
-    ast::ConstVisitor* run = ConfigVariable::getDefaultVisitor();
+    std::unique_ptr<ast::ConstVisitor> run(ConfigVariable::getDefaultVisitor());
 
     try
     {
@@ -211,7 +211,6 @@ types::Function::ReturnValue sci_execstr(types::typed_list &in, int _iRetCount,
         try
         {
             pSeqExp->accept(*run);
-            delete run;
         }
         catch (const ast::RecursionException& /* re */)
         {