convert AnalysisVisitor into a Singleton 73/19373/4
Cedric Delamarre [Mon, 14 Aug 2017 16:28:25 +0000 (18:28 +0200)]
Change-Id: Ifc4cbc0e80796e12eadac9f7cac2d07eca7ec1d1

scilab/modules/ast/includes/analysis/AnalysisVisitor.hxx
scilab/modules/ast/includes/analysis/logging/Logger.hxx
scilab/modules/ast/src/cpp/analysis/AnalysisVisitor.cpp
scilab/modules/ast/src/cpp/types/macro.cpp
scilab/modules/core/src/cpp/tasks.cpp
scilab/modules/functions/sci_gateway/cpp/sci_testAnalysis.cpp

index 954b5bb..cbcc05a 100644 (file)
@@ -73,17 +73,21 @@ private:
     static MapSymCall symscall;
     static MapSymCall initCalls();
 
+    static AnalysisVisitor* m_instance;
+    AnalysisVisitor();
+    ~AnalysisVisitor();
+
 public:
 
+    static AnalysisVisitor& getInstance();
+    static void deleteInstance();
+
     static bool asDouble(ast::Exp & e, double & out);
     static bool asDouble(types::InternalType * pIT, double & out);
     static bool isDoubleConstant(const ast::Exp & e);
     static bool asDoubleMatrix(ast::Exp & e, types::Double *& data);
     static void analyze(ast::SelectExp & e);
 
-    AnalysisVisitor();
-    virtual ~AnalysisVisitor();
-
     virtual AnalysisVisitor* clone()
     {
         return new AnalysisVisitor();
@@ -356,18 +360,18 @@ private:
     void visit(ast::DollarVar & e);
     void visit(ast::VarDec & e);
 
-    void visit(ast::MatrixLineExp & e)
+    void visit(ast::MatrixLineExp & /*e*/)
     {
         /* treated in MatrixExp */
     }
-    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(ast::CommentExp & e) { }
-    void visit(ast::NilExp & e) { }
-    void visit(ast::ColonVar & 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(ast::CommentExp & /*e*/) { }
+    void visit(ast::NilExp & /*e*/) { }
+    void visit(ast::ColonVar & /*e*/) { }
     void visit(ast::WhileExp & e);
 
     void visit(ast::ArrayListVar & e)
index 6c90b5f..b4b54ce 100644 (file)
@@ -36,19 +36,19 @@ public:
     Logger(const std::string & file) : out(new std::wofstream(file, std::ofstream::out | std::ofstream::trunc)) { }
 
     template<typename T>
-    inline void log(const T & x)
+    inline void log(const T & /*x*/)
     {
         //*out << x << std::endl;
     }
 
     template<typename T>
-    inline void log(const unsigned int line, const char * file, const T & x)
+    inline void log(const unsigned int /*line*/, const char * /*file*/, const T & /*x*/)
     {
         //*out << file << L"@" << line << L": " << x << std::endl;
     }
 
     template<typename T, typename... Args>
-    inline void log(const T & x, Args... args)
+    inline void log(const T & /*x*/, Args... args)
     {
         //*out << x << L" ";
         log(args...);
index 2446375..dfd048e 100644 (file)
 
 namespace analysis
 {
+AnalysisVisitor* AnalysisVisitor::m_instance = nullptr;
 AnalysisVisitor::MapSymCall AnalysisVisitor::symscall = AnalysisVisitor::initCalls();//a=1:3;b=2;c=3;testAnalysis("repmat","a","b","c")
 
+AnalysisVisitor& AnalysisVisitor::getInstance()
+{
+    if (m_instance == nullptr)
+    {
+        m_instance = new AnalysisVisitor();
+    }
+
+    return *m_instance;
+}
+
+void AnalysisVisitor::deleteInstance()
+{
+    if (m_instance) 
+    {
+        delete m_instance;
+        m_instance = nullptr;
+    }
+}
+
 AnalysisVisitor::MapSymCall AnalysisVisitor::initCalls()
 {
     MapSymCall msc;
@@ -87,6 +107,8 @@ void AnalysisVisitor::reset()
     {
         loops.pop();
     }
+
+    fblockListeners.clear();
     start_chrono();
 }
 
index dcefbba..0b2b4aa 100644 (file)
@@ -321,9 +321,14 @@ Callable::ReturnValue Macro::call(typed_list &in, optional_list &opt, int _iRetC
         //use version from analyze
         if (m_functionId != -1) 
         {
+            std::wcerr << "macro functionId: " << m_functionId << std::endl;
             ast::Exp* exp = FBlockListener::getExp(m_functionId);
             if (exp)
             {
+                ast::PrettyPrintVisitor dv(std::wcerr, true, true);
+                //m_body->accept(dv);
+                exp->accept(dv);
+
                 //std::wcerr << "exec new exp" << std::endl;
                 exp->accept(*exec);
             }
index 5d86f33..a673b2b 100644 (file)
@@ -186,9 +186,10 @@ void execAstTask(ast::Exp* tree, bool serialize, bool timed, bool ASTtimed, bool
         //call analyzer visitor before exec visitor
         if (ConfigVariable::getAnalyzerOptions() == 1)
         {
-            FBlockListener fb;
-            analysis::AnalysisVisitor analysis;
-            analysis.registerFBlockEmittedListener(&fb);
+            FBlockListener listener;
+            analysis::AnalysisVisitor& analysis = analysis::AnalysisVisitor::getInstance();
+            analysis.reset();
+            analysis.registerFBlockEmittedListener(&listener);
             newTree->accept(analysis);
         }
 
@@ -274,6 +275,9 @@ int execScilabQuitTask(bool _bSerialize)
     std::wstring stSCI = ConfigVariable::getSCIPath();
     stSCI += SCILAB_QUIT;
 
+    //delete analysisVisitor
+    analysis::AnalysisVisitor::deleteInstance();
+
     ThreadManagement::LockParser();
     try
     {
index 6a0152b..e695a89 100644 (file)
@@ -68,7 +68,7 @@ types::Function::ReturnValue sci_testAnalysis(types::typed_list &in, int _iRetCo
     ast::SimpleVar * var = new ast::SimpleVar(loc, sym);
     ast::CallExp ce(loc, *var, *args);
 
-    analysis::AnalysisVisitor analysis;
+    analysis::AnalysisVisitor& analysis = analysis::AnalysisVisitor::getInstance();
     ce.accept(analysis);
 
     //analysis.print_info();