Analysis: fix bugs found with Coverity
[scilab.git] / scilab / modules / ast / includes / analysis / ConstantVisitor.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2015 - Scilab Enterprises - Calixte DENIZET
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #ifndef __CONSTANT_VISITOR_HXX__
14 #define __CONSTANT_VISITOR_HXX__
15
16 #include <iostream>
17 #include <string>
18 #include <unordered_set>
19
20 #include "visitor.hxx"
21 #include "execvisitor.hxx"
22 #include "allexp.hxx"
23 #include "allvar.hxx"
24 #include "Chrono.hxx"
25
26 namespace analysis
27 {
28
29 class AnalysisVisitor;
30
31 class EXTERN_AST ConstantVisitor : public ast::Visitor, public Chrono
32 {
33
34     bool _result;
35
36     AnalysisVisitor * parent;
37     ast::ExecVisitor exec;
38     unsigned int lhs;
39     const bool evalSymbols;
40
41     static std::unordered_set<std::wstring> constants;
42
43 public:
44
45     ConstantVisitor(AnalysisVisitor & _parent) : _result(false), parent(&_parent), lhs(1), evalSymbols(true)
46     {
47         start_chrono();
48     }
49
50     ConstantVisitor(const bool _evalSymbols = true) : _result(false), parent(nullptr), evalSymbols(_evalSymbols)
51     {
52         start_chrono();
53     }
54
55     virtual ~ConstantVisitor()
56     {
57     }
58
59     inline void print_info()
60     {
61         stop_chrono();
62     }
63
64     inline ast::ExecVisitor & getExec()
65     {
66         return exec;
67     }
68
69     inline void setLHS(const unsigned int _lhs)
70     {
71         lhs = _lhs;
72     }
73
74 private:
75
76     static std::unordered_set<std::wstring> init();
77
78     inline void setResult(const bool val)
79     {
80         _result = val;
81     }
82
83 public:
84
85     inline bool getResult()
86     {
87         return _result;
88     }
89
90     void visit(ast::SimpleVar & e);
91     void visit(ast::NotExp & e);
92     void visit(ast::TransposeExp & e);
93     void visit(ast::MatrixExp & e);
94     void visit(ast::CellExp & e);
95     void visit(ast::CallExp & e);
96     void visit(ast::OpExp & e);
97     void visit(ast::LogicalOpExp & e);
98     void visit(ast::ListExp & e);
99     void visit(ast::IfExp & e);
100     void visit(ast::DollarVar & e);
101     void visit(ast::ColonVar & e);
102     void visit(ast::ArrayListVar & e);
103     void visit(ast::DoubleExp & e);
104     void visit(ast::BoolExp & e);
105     void visit(ast::StringExp & e);
106     void visit(ast::CommentExp & e);
107     void visit(ast::NilExp & e);
108     void visit(ast::CellCallExp & e);
109     void visit(ast::AssignExp & e);
110     void visit(ast::WhileExp & e);
111     void visit(ast::ForExp & e);
112     void visit(ast::BreakExp & e);
113     void visit(ast::ContinueExp & e);
114     void visit(ast::TryCatchExp & e);
115     void visit(ast::SelectExp & e);
116     void visit(ast::CaseExp & e);
117     void visit(ast::ReturnExp & e);
118     void visit(ast::FieldExp & e);
119     void visit(ast::MatrixLineExp & e);
120     void visit(ast::SeqExp & e);
121     void visit(ast::ArrayListExp & e);
122     void visit(ast::AssignListExp & e);
123     void visit(ast::VarDec & e);
124     void visit(ast::FunctionDec & e);
125     void visit(ast::OptimizedExp & e);
126     void visit(ast::MemfillExp & e);
127     void visit(ast::DAXPYExp & e);
128     void visit(ast::IntSelectExp & e);
129     void visit(ast::StringSelectExp & e);
130
131 private:
132
133     inline bool execAndReplace(ast::Exp & e)
134     {
135         try
136         {
137             e.accept(exec);
138             types::InternalType * pIT = exec.getResult();
139             exec.setResult(nullptr);
140             ast::Exp * exp = pIT->getExp(e.getLocation());
141             if (exp)
142             {
143                 exp->setVerbose(e.isVerbose());
144                 e.replace(exp);
145                 return true;
146             }
147         }
148         catch (const ast::ScilabException & /*se*/) { }
149
150         return false;
151     }
152 };
153
154 } // namespace analysis
155
156 #endif // __CONSTANT_VISITOR_HXX__