Merge remote-tracking branch 'origin/master' into windows
[scilab.git] / scilab / modules / ast / src / cpp / analysis / TypeofAnalyzer.cpp
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 #include "AnalysisVisitor.hxx"
17 #include "analyzers/TypeofAnalyzer.hxx"
18 #include "tools.hxx"
19 #include "string.hxx"
20
21 namespace analysis
22 {
23 bool TypeofAnalyzer::analyze(AnalysisVisitor & visitor, const unsigned int lhs, ast::CallExp & e)
24 {
25     if (lhs != 1)
26     {
27         return false;
28     }
29
30     const ast::exps_t args = e.getArgs();
31     if (args.size() != 1)
32     {
33         return false;
34     }
35
36     ast::Exp * arg = args.back();
37     arg->accept(visitor);
38     const std::string & str = visitor.getResult().getType().getScilabString();
39
40     if (!str.empty())
41     {
42         TIType type(visitor.getGVN(), TIType::STRING);
43         Result & res = e.getDecorator().setResult(type);
44         res.getConstant() = new types::String(str.c_str());
45         e.getDecorator().setCall("typeof");
46         visitor.setResult(res);
47         return true;
48     }
49     else
50     {
51         visitor.getDM().releaseTmp(visitor.getResult().getTempId(), arg);
52         return false;
53     }
54 }
55 }