Coverity: ast module uninitialized members fixed
[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  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 #ifndef __CONSTANT_VISITOR_HXX__
17 #define __CONSTANT_VISITOR_HXX__
18
19 #include <iostream>
20 #include <string>
21 #include <unordered_set>
22
23 #include "visitor.hxx"
24 #include "execvisitor.hxx"
25 #include "allexp.hxx"
26 #include "allvar.hxx"
27 #include "Chrono.hxx"
28
29 namespace analysis
30 {
31
32 class AnalysisVisitor;
33
34 class EXTERN_AST ConstantVisitor : public ast::Visitor, public Chrono
35 {
36
37     bool _result;
38
39     AnalysisVisitor * parent;
40     ast::ExecVisitor exec;
41     unsigned int lhs;
42     const bool evalSymbols;
43
44     static std::unordered_set<std::wstring> constants;
45
46 public:
47
48     ConstantVisitor(AnalysisVisitor & _parent) : _result(false), parent(&_parent), exec(), lhs(1), evalSymbols(true)
49     {
50         start_chrono();
51     }
52
53     ConstantVisitor(const bool _evalSymbols = true) : _result(false), parent(nullptr), exec(), lhs(1), evalSymbols(_evalSymbols)
54     {
55         start_chrono();
56     }
57
58     virtual ~ConstantVisitor()
59     {
60     }
61
62
63     virtual ConstantVisitor* clone()
64     {
65         if (parent)
66         {
67             return new ConstantVisitor(parent);
68         }
69         else
70         {
71             return new ConstantVisitor(evalSymbols);
72         }
73     }
74
75     inline void print_info()
76     {
77         stop_chrono();
78     }
79
80     inline ast::ExecVisitor & getExec()
81     {
82         return exec;
83     }
84
85     inline void setLHS(const unsigned int _lhs)
86     {
87         lhs = _lhs;
88     }
89
90 private:
91
92     static std::unordered_set<std::wstring> init();
93
94     inline void setResult(const bool val)
95     {
96         _result = val;
97     }
98
99 public:
100
101     inline bool getResult()
102     {
103         return _result;
104     }
105
106     void visit(ast::SimpleVar & e);
107     void visit(ast::NotExp & e);
108     void visit(ast::TransposeExp & e);
109     void visit(ast::MatrixExp & e);
110     void visit(ast::CellExp & e);
111     void visit(ast::CallExp & e);
112     void visit(ast::OpExp & e);
113     void visit(ast::LogicalOpExp & e);
114     void visit(ast::ListExp & e);
115     void visit(ast::IfExp & e);
116     void visit(ast::DollarVar & e);
117     void visit(ast::ColonVar & e);
118     void visit(ast::ArrayListVar & e);
119     void visit(ast::DoubleExp & e);
120     void visit(ast::BoolExp & e);
121     void visit(ast::StringExp & e);
122     void visit(ast::CommentExp & e);
123     void visit(ast::NilExp & e);
124     void visit(ast::CellCallExp & e);
125     void visit(ast::AssignExp & e);
126     void visit(ast::WhileExp & e);
127     void visit(ast::ForExp & e);
128     void visit(ast::BreakExp & e);
129     void visit(ast::ContinueExp & e);
130     void visit(ast::TryCatchExp & e);
131     void visit(ast::SelectExp & e);
132     void visit(ast::CaseExp & e);
133     void visit(ast::ReturnExp & e);
134     void visit(ast::FieldExp & e);
135     void visit(ast::MatrixLineExp & e);
136     void visit(ast::SeqExp & e);
137     void visit(ast::ArrayListExp & e);
138     void visit(ast::AssignListExp & e);
139     void visit(ast::VarDec & e);
140     void visit(ast::FunctionDec & e);
141     void visit(ast::OptimizedExp & e);
142     void visit(ast::MemfillExp & e);
143     void visit(ast::DAXPYExp & e);
144     void visit(ast::IntSelectExp & e);
145     void visit(ast::StringSelectExp & e);
146
147 private:
148
149     inline bool execAndReplace(ast::Exp & e)
150     {
151         try
152         {
153             e.accept(exec);
154             types::InternalType * pIT = exec.getResult();
155             exec.setResult(nullptr);
156             ast::Exp * exp = pIT->getExp(e.getLocation());
157             if (exp)
158             {
159                 exp->setVerbose(e.isVerbose());
160                 e.replace(exp);
161                 return true;
162             }
163         }
164         catch (const ast::ScilabException & /*se*/) { }
165
166         return false;
167     }
168 };
169
170 } // namespace analysis
171
172 #endif // __CONSTANT_VISITOR_HXX__