Analysis: fix few memleaks found with Valgrind 99/17199/1
Calixte DENIZET [Fri, 11 Sep 2015 17:53:17 +0000 (19:53 +0200)]
Change-Id: Ie218c929ef2ebfc9bbff2ea094ccdb6575e93f1c

scilab/modules/ast/includes/analysis/data/GlobalsCollector.hxx
scilab/modules/ast/includes/analysis/data/MacroDef.hxx
scilab/modules/ast/src/cpp/analysis/GlobalsCollector.cpp
scilab/modules/ast/src/cpp/analysis/MacroDef.cpp
scilab/modules/ast/src/cpp/analysis/VisitSelectExp.cpp

index 6e237d5..df4908d 100644 (file)
@@ -29,7 +29,7 @@
 namespace analysis
 {
 
-class GlobalsCollector : public ast::Visitor, public Chrono
+class GlobalsCollector : public ast::ConstVisitor, public Chrono
 {
 
     MacroDef & macrodef;
@@ -51,46 +51,46 @@ public:
 private:
 
     void collect();
-    void visit(ast::SimpleVar & e);
-    void visit(ast::DollarVar & e);
-    void visit(ast::ColonVar & e);
-    void visit(ast::ArrayListVar & e);
-    void visit(ast::DoubleExp & e);
-    void visit(ast::BoolExp & e);
-    void visit(ast::StringExp & e);
-    void visit(ast::CommentExp & e);
-    void visit(ast::NilExp & e);
-    void visit(ast::CallExp & e);
-    void visit(ast::CellCallExp & e);
-    void visit(ast::OpExp & e);
-    void visit(ast::LogicalOpExp & e);
-    void visit(ast::AssignExp & e);
-    void visit(ast::IfExp & e);
-    void visit(ast::WhileExp & e);
-    void visit(ast::ForExp & e);
-    void visit(ast::BreakExp & e);
-    void visit(ast::ContinueExp & e);
-    void visit(ast::TryCatchExp & e);
-    void visit(ast::SelectExp & e);
-    void visit(ast::CaseExp & e);
-    void visit(ast::ReturnExp & e);
-    void visit(ast::FieldExp & e);
-    void visit(ast::NotExp & e);
-    void visit(ast::TransposeExp & e);
-    void visit(ast::MatrixExp & e);
-    void visit(ast::MatrixLineExp & e);
-    void visit(ast::CellExp & e);
-    void visit(ast::SeqExp & e);
-    void visit(ast::ArrayListExp & e);
-    void visit(ast::AssignListExp & e);
-    void visit(ast::VarDec & e);
-    void visit(ast::FunctionDec & e);
-    void visit(ast::ListExp & e);
-    void visit(ast::OptimizedExp & e);
-    void visit(ast::MemfillExp & e);
-    void visit(ast::DAXPYExp & e);
-    void visit(ast::IntSelectExp & e);
-    void visit(ast::StringSelectExp & e);
+    void visit(const ast::SimpleVar & e);
+    void visit(const ast::DollarVar & e);
+    void visit(const ast::ColonVar & e);
+    void visit(const ast::ArrayListVar & e);
+    void visit(const ast::DoubleExp & e);
+    void visit(const ast::BoolExp & e);
+    void visit(const ast::StringExp & e);
+    void visit(const ast::CommentExp & e);
+    void visit(const ast::NilExp & e);
+    void visit(const ast::CallExp & e);
+    void visit(const ast::CellCallExp & e);
+    void visit(const ast::OpExp & e);
+    void visit(const ast::LogicalOpExp & e);
+    void visit(const ast::AssignExp & e);
+    void visit(const ast::IfExp & e);
+    void visit(const ast::WhileExp & e);
+    void visit(const ast::ForExp & e);
+    void visit(const ast::BreakExp & e);
+    void visit(const ast::ContinueExp & e);
+    void visit(const ast::TryCatchExp & e);
+    void visit(const ast::SelectExp & e);
+    void visit(const ast::CaseExp & e);
+    void visit(const ast::ReturnExp & e);
+    void visit(const ast::FieldExp & e);
+    void visit(const ast::NotExp & e);
+    void visit(const ast::TransposeExp & e);
+    void visit(const ast::MatrixExp & e);
+    void visit(const ast::MatrixLineExp & e);
+    void visit(const ast::CellExp & e);
+    void visit(const ast::SeqExp & e);
+    void visit(const ast::ArrayListExp & e);
+    void visit(const ast::AssignListExp & e);
+    void visit(const ast::VarDec & e);
+    void visit(const ast::FunctionDec & e);
+    void visit(const ast::ListExp & e);
+    void visit(const ast::OptimizedExp & e);
+    void visit(const ast::MemfillExp & e);
+    void visit(const ast::DAXPYExp & e);
+    void visit(const ast::IntSelectExp & e);
+    void visit(const ast::StringSelectExp & e);
 };
 
 } // namespace analysis
index ef3e64c..84267fe 100644 (file)
@@ -45,6 +45,7 @@ public:
     virtual ~MacroDef() { }
 
     virtual ast::SeqExp & getBody() = 0;
+    virtual const ast::SeqExp & getOriginalBody() = 0;
     virtual const std::wstring & getName() = 0;
     virtual std::vector<symbol::Symbol> getIn() = 0;
     virtual std::vector<symbol::Symbol> getOut() = 0;
@@ -116,6 +117,7 @@ public:
     }
 
     ast::SeqExp & getBody();
+    const ast::SeqExp & getOriginalBody();
     const std::wstring & getName();
     std::vector<symbol::Symbol> getIn();
     std::vector<symbol::Symbol> getOut();
@@ -136,6 +138,7 @@ public:
     }
 
     ast::SeqExp & getBody();
+    const ast::SeqExp & getOriginalBody();
     const std::wstring & getName();
     std::vector<symbol::Symbol> getIn();
     std::vector<symbol::Symbol> getOut();
index affcc20..7eb7d05 100644 (file)
@@ -59,7 +59,7 @@ void GlobalsCollector::collect()
         locals.emplace(arg);
     }
 
-    macrodef.getBody().accept(*this);
+    macrodef.getOriginalBody().accept(*this);
 
     for (const auto & out : macrodef.getOut())
     {
@@ -72,7 +72,7 @@ void GlobalsCollector::collect()
     stop_chrono();
 }
 
-void GlobalsCollector::visit(ast::SimpleVar & e)
+void GlobalsCollector::visit(const ast::SimpleVar & e)
 {
     if (!e.getParent()->isFieldExp() || static_cast<ast::FieldExp *>(e.getParent())->getTail() != &e)
     {
@@ -84,17 +84,17 @@ void GlobalsCollector::visit(ast::SimpleVar & e)
     }
 }
 
-void GlobalsCollector::visit(ast::DollarVar & e)
+void GlobalsCollector::visit(const ast::DollarVar & e)
 {
     // nothing to do
 }
 
-void GlobalsCollector::visit(ast::ColonVar & e)
+void GlobalsCollector::visit(const ast::ColonVar & e)
 {
     // nothing to do
 }
 
-void GlobalsCollector::visit(ast::ArrayListVar & e)
+void GlobalsCollector::visit(const ast::ArrayListVar & e)
 {
     for (auto arg : e.getVars())
     {
@@ -102,29 +102,29 @@ void GlobalsCollector::visit(ast::ArrayListVar & e)
     }
 }
 
-void GlobalsCollector::visit(ast::DoubleExp & e)
+void GlobalsCollector::visit(const ast::DoubleExp & e)
 {
 }
 
-void GlobalsCollector::visit(ast::BoolExp & e)
+void GlobalsCollector::visit(const ast::BoolExp & e)
 {
 }
 
-void GlobalsCollector::visit(ast::StringExp & e)
+void GlobalsCollector::visit(const ast::StringExp & e)
 {
 }
 
-void GlobalsCollector::visit(ast::CommentExp & e)
+void GlobalsCollector::visit(const ast::CommentExp & e)
 {
     // ignored
 }
 
-void GlobalsCollector::visit(ast::NilExp & e)
+void GlobalsCollector::visit(const ast::NilExp & e)
 {
     // nothing to do
 }
 
-void GlobalsCollector::visit(ast::CallExp & e)
+void GlobalsCollector::visit(const ast::CallExp & e)
 {
     for (auto arg : e.getArgs())
     {
@@ -133,7 +133,7 @@ void GlobalsCollector::visit(ast::CallExp & e)
     e.getName().accept(*this);
 }
 
-void GlobalsCollector::visit(ast::CellCallExp & e)
+void GlobalsCollector::visit(const ast::CellCallExp & e)
 {
     for (auto arg : e.getArgs())
     {
@@ -142,19 +142,19 @@ void GlobalsCollector::visit(ast::CellCallExp & e)
     e.getName().accept(*this);
 }
 
-void GlobalsCollector::visit(ast::OpExp & e)
+void GlobalsCollector::visit(const ast::OpExp & e)
 {
     e.getLeft().accept(*this);
     e.getRight().accept(*this);
 }
 
-void GlobalsCollector::visit(ast::LogicalOpExp & e)
+void GlobalsCollector::visit(const ast::LogicalOpExp & e)
 {
     e.getLeft().accept(*this);
     e.getRight().accept(*this);
 }
 
-void GlobalsCollector::visit(ast::AssignExp & e)
+void GlobalsCollector::visit(const ast::AssignExp & e)
 {
     if (e.getLeftExp().isSimpleVar())
     {
@@ -168,7 +168,7 @@ void GlobalsCollector::visit(ast::AssignExp & e)
         ast::CallExp & ce = static_cast<ast::CallExp &>(e.getLeftExp());
         if (ce.getName().isSimpleVar())
         {
-            const symbol::Symbol & Lsym = static_cast<ast::SimpleVar &>(ce.getName()).getSymbol();
+            const symbol::Symbol & Lsym = static_cast<const ast::SimpleVar &>(ce.getName()).getSymbol();
             locals.emplace(Lsym);
         }
         for (auto arg : ce.getArgs())
@@ -196,7 +196,7 @@ void GlobalsCollector::visit(ast::AssignExp & e)
     e.getRightExp().accept(*this);
 }
 
-void GlobalsCollector::visit(ast::IfExp & e)
+void GlobalsCollector::visit(const ast::IfExp & e)
 {
     e.getTest().accept(*this);
     e.getThen().accept(*this);
@@ -206,35 +206,35 @@ void GlobalsCollector::visit(ast::IfExp & e)
     }
 }
 
-void GlobalsCollector::visit(ast::WhileExp & e)
+void GlobalsCollector::visit(const ast::WhileExp & e)
 {
     e.getTest().accept(*this);
     e.getBody().accept(*this);
 }
 
-void GlobalsCollector::visit(ast::ForExp & e)
+void GlobalsCollector::visit(const ast::ForExp & e)
 {
     e.getVardec().accept(*this);
     e.getBody().accept(*this);
 }
 
-void GlobalsCollector::visit(ast::BreakExp & e)
+void GlobalsCollector::visit(const ast::BreakExp & e)
 {
     // nothing to do
 }
 
-void GlobalsCollector::visit(ast::ContinueExp & e)
+void GlobalsCollector::visit(const ast::ContinueExp & e)
 {
     // nothing to do
 }
 
-void GlobalsCollector::visit(ast::TryCatchExp & e)
+void GlobalsCollector::visit(const ast::TryCatchExp & e)
 {
     e.getTry().accept(*this);
     e.getCatch().accept(*this);
 }
 
-void GlobalsCollector::visit(ast::SelectExp & e)
+void GlobalsCollector::visit(const ast::SelectExp & e)
 {
     e.getSelect()->accept(*this);
     for (auto _e : e.getCases())
@@ -247,35 +247,35 @@ void GlobalsCollector::visit(ast::SelectExp & e)
     }
 }
 
-void GlobalsCollector::visit(ast::CaseExp & e)
+void GlobalsCollector::visit(const ast::CaseExp & e)
 {
     e.getTest()->accept(*this);
     e.getBody()->accept(*this);
 }
 
-void GlobalsCollector::visit(ast::ReturnExp & e)
+void GlobalsCollector::visit(const ast::ReturnExp & e)
 {
     // Bug with return;
     //e.exp_get().accept(*this);
 }
 
-void GlobalsCollector::visit(ast::FieldExp & e)
+void GlobalsCollector::visit(const ast::FieldExp & e)
 {
     e.getHead()->accept(*this);
     e.getTail()->accept(*this);
 }
 
-void GlobalsCollector::visit(ast::NotExp & e)
+void GlobalsCollector::visit(const ast::NotExp & e)
 {
     e.getExp().accept(*this);
 }
 
-void GlobalsCollector::visit(ast::TransposeExp & e)
+void GlobalsCollector::visit(const ast::TransposeExp & e)
 {
     e.getExp().accept(*this);
 }
 
-void GlobalsCollector::visit(ast::MatrixExp & e)
+void GlobalsCollector::visit(const ast::MatrixExp & e)
 {
     for (auto mle : e.getLines())
     {
@@ -283,7 +283,7 @@ void GlobalsCollector::visit(ast::MatrixExp & e)
     }
 }
 
-void GlobalsCollector::visit(ast::MatrixLineExp & e)
+void GlobalsCollector::visit(const ast::MatrixLineExp & e)
 {
     for (auto _e : e.getColumns())
     {
@@ -291,7 +291,7 @@ void GlobalsCollector::visit(ast::MatrixLineExp & e)
     }
 }
 
-void GlobalsCollector::visit(ast::CellExp & e)
+void GlobalsCollector::visit(const ast::CellExp & e)
 {
     for (auto mle : e.getLines())
     {
@@ -299,7 +299,7 @@ void GlobalsCollector::visit(ast::CellExp & e)
     }
 }
 
-void GlobalsCollector::visit(ast::SeqExp & e)
+void GlobalsCollector::visit(const ast::SeqExp & e)
 {
     for (auto _e : e.getExps())
     {
@@ -307,7 +307,7 @@ void GlobalsCollector::visit(ast::SeqExp & e)
     }
 }
 
-void GlobalsCollector::visit(ast::ArrayListExp & e)
+void GlobalsCollector::visit(const ast::ArrayListExp & e)
 {
     for (auto _e : e.getExps())
     {
@@ -315,20 +315,20 @@ void GlobalsCollector::visit(ast::ArrayListExp & e)
     }
 }
 
-void GlobalsCollector::visit(ast::AssignListExp & e)
+void GlobalsCollector::visit(const ast::AssignListExp & e)
 {
 }
 
-void GlobalsCollector::visit(ast::VarDec & e)
+void GlobalsCollector::visit(const ast::VarDec & e)
 {
     locals.emplace(e.getSymbol());
     e.getInit().accept(*this);
 }
 
-void GlobalsCollector::visit(ast::FunctionDec & e)
+void GlobalsCollector::visit(const ast::FunctionDec & e)
 {
     locals.emplace(e.getSymbol());
-    DeclaredMacroDef dmd(&e);
+    DeclaredMacroDef dmd(const_cast<ast::FunctionDec *>(&e));
     GlobalsCollector gc(dmd);
 
     for (const auto global : gc.globals)
@@ -340,33 +340,33 @@ void GlobalsCollector::visit(ast::FunctionDec & e)
     }
 }
 
-void GlobalsCollector::visit(ast::ListExp & e)
+void GlobalsCollector::visit(const ast::ListExp & e)
 {
     e.getStart().accept(*this);
     e.getStep().accept(*this);
     e.getEnd().accept(*this);
 }
 
-void GlobalsCollector::visit(ast::OptimizedExp & e)
+void GlobalsCollector::visit(const ast::OptimizedExp & e)
 {
 }
 
-void GlobalsCollector::visit(ast::MemfillExp & e)
+void GlobalsCollector::visit(const ast::MemfillExp & e)
 {
 }
 
-void GlobalsCollector::visit(ast::DAXPYExp & e)
+void GlobalsCollector::visit(const ast::DAXPYExp & e)
 {
 }
 
-void GlobalsCollector::visit(ast::IntSelectExp & e)
+void GlobalsCollector::visit(const ast::IntSelectExp & e)
 {
-    visit(static_cast<ast::SelectExp &>(e));
+    visit(static_cast<const ast::SelectExp &>(e));
 }
 
-void GlobalsCollector::visit(ast::StringSelectExp & e)
+void GlobalsCollector::visit(const ast::StringSelectExp & e)
 {
-    visit(static_cast<ast::SelectExp &>(e));
+    visit(static_cast<const ast::SelectExp &>(e));
 }
 
 } // namespace analysis
index 9264641..29a5c4d 100644 (file)
@@ -27,10 +27,18 @@ ExistingMacroDef::ExistingMacroDef(const ExistingMacroDef & emd) : MacroDef(emd.
 
 ast::SeqExp & ExistingMacroDef::getBody()
 {
-    se = static_cast<ast::SeqExp *>(original)->clone();
+    if (!se)
+    {
+        se = static_cast<ast::SeqExp *>(original)->clone();
+    }
     return *se;
 }
 
+const ast::SeqExp & ExistingMacroDef::getOriginalBody()
+{
+    return *static_cast<ast::SeqExp *>(original);
+}
+
 const std::wstring & ExistingMacroDef::getName()
 {
     return name;
@@ -58,10 +66,18 @@ DeclaredMacroDef::DeclaredMacroDef(ast::FunctionDec * const _dec) : MacroDef(_de
 
 ast::SeqExp & DeclaredMacroDef::getBody()
 {
-    dec = static_cast<ast::FunctionDec *>(original)->clone();
+    if (!dec)
+    {
+        dec = static_cast<ast::FunctionDec *>(original)->clone();
+    }
     return static_cast<ast::SeqExp &>(dec->getBody());
 }
 
+const ast::SeqExp & DeclaredMacroDef::getOriginalBody()
+{
+    return static_cast<ast::SeqExp &>(static_cast<ast::FunctionDec *>(original)->getBody());
+}
+
 const std::wstring & DeclaredMacroDef::getName()
 {
     return static_cast<ast::FunctionDec *>(original)->getSymbol().getName();
index d175d7e..7303a03 100644 (file)
@@ -54,14 +54,19 @@ void AnalysisVisitor::visit(ast::SelectExp & e)
                     if (pIT2)
                     {
                         types::InternalType * pIT3 = GenericComparisonEqual(pIT, pIT2);
-                        if (pIT3 && pIT3->isTrue())
+                        if (pIT3)
                         {
-                            // We found the good case
-                            e.replace(casee.getBody());
-                            *i = nullptr;
-                            casee.getBody()->accept(*this);
-                            found = true;
-                            break;
+                            if (pIT3->isTrue())
+                            {
+                                pIT3->killMe();
+                                // We found the good case
+                                e.replace(casee.getBody());
+                                *i = nullptr;
+                                casee.getBody()->accept(*this);
+                                found = true;
+                                break;
+                            }
+                            pIT3->killMe();
                         }
                     }
                 }