631318479c161b0d58636dd63fef3b0d037cd303
[scilab.git] / scilab / modules / ast / src / cpp / analysis / MemInitAnalyzer.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2014 - 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 #include "AnalysisVisitor.hxx"
14 #include "calls/MemInitAnalyzer.hxx"
15 #include "tools.hxx"
16
17 namespace analysis
18 {
19 bool MemInitAnalyzer::analyze(AnalysisVisitor & visitor, const unsigned int lhs, ast::CallExp & e)
20 {
21     const ast::exps_t args = e.getArgs();
22     if (args.size() == 2)
23     {
24         ast::Exp * first = *args.begin();
25         ast::Exp * second = *std::next(args.begin());
26
27         first->accept(visitor);
28         Result R1 = visitor.getResult();
29         second->accept(visitor);
30         Result & R2 = visitor.getResult();
31         double val;
32         SymbolicDimension rows, cols;
33         bool empty = false;
34
35         if (R1.getValue(val))
36         {
37             const int nrows = tools::cast<int>(val);
38             if (nrows <= 0)
39             {
40                 empty = true;
41             }
42             else
43             {
44                 rows = SymbolicDimension(visitor.getGVN(), nrows);
45             }
46         }
47         else if (GVN::Value * gvnValue = R1.getGVNValue())
48         {
49             rows.setValue(gvnValue);
50             rows.setGVN(&visitor.getGVN());
51         }
52         else
53         {
54             return false;
55         }
56
57         if (!empty)
58         {
59             if (R2.getValue(val))
60             {
61                 const int ncols = tools::cast<int>(val);
62                 if (ncols <= 0)
63                 {
64                     empty = true;
65                 }
66                 else
67                 {
68                     cols = SymbolicDimension(visitor.getGVN(), ncols);
69                 }
70             }
71             else if (GVN::Value * gvnValue = R2.getGVNValue())
72             {
73                 cols.setValue(gvnValue);
74                 cols.setGVN(&visitor.getGVN());
75             }
76             else
77             {
78                 return false;
79             }
80         }
81
82         if (empty)
83         {
84             e.getDecorator().res = Result(TIType(visitor.getGVN(), TIType::EMPTY));
85         }
86         else
87         {
88             bool res = visitor.getCM().check(ConstraintManager::POSITIVE, rows.getValue());
89             if (res)
90             {
91                 res = visitor.getCM().check(ConstraintManager::POSITIVE, cols.getValue());
92                 if (!res)
93                 {
94                     return false;
95                 }
96             }
97             else
98             {
99                 return false;
100             }
101             TIType resT(visitor.getGVN(), TIType::DOUBLE, rows, cols);
102             e.getDecorator().res = Result(resT, visitor.getTemp().add(resT));
103         }
104         visitor.setResult(e.getDecorator().res);
105
106         return true;
107     }
108
109     return false;
110 }
111 }