License Header change: Removed the LICENSE_END before beta
[scilab.git] / scilab / modules / ast / src / cpp / analysis / ListExpAnalyzer.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 "gvn/SymbolicList.hxx"
18
19 namespace analysis
20 {
21     bool ListExpAnalyzer::analyze(ast::ListExp & e, SymbolicList & sl, TIType & type)
22     {
23         e.getStart().accept(*this);
24         Result Rstart = getResult();
25         e.getEnd().accept(*this);
26         Result Rend = getResult();
27         e.getStep().accept(*this);
28         Result & Rstep = getResult();
29
30         double start, step, end;
31         if (Rstart.getConstant().getDblValue(start) && Rstep.getConstant().getDblValue(step) && Rend.getConstant().getDblValue(end))
32         {
33             double out;
34             int type = ForList64::checkList(start, end, step, out);
35
36             switch (type)
37             {
38             case 0:
39                 type = TIType(dm.getGVN(), TIType::EMPTY);
40                 break;
41             case 1:
42                 type = TIType(dm.getGVN(), TIType::DOUBLE);
43                 break;
44             case 2:
45             {
46                 const uint64_t N = ForList64::size(start, end, step);
47                 type = TIType(getGVN(), TIType::DOUBLE, 1, N);
48                 sl = SymbolicList(start, step, end);
49                 break;
50             }
51             default:
52                 break;
53             }
54             e.setValues(start, step, end, out);
55             return true;
56         }
57
58         GVN::Value * gvnStart, * gvnStep, * gvnEnd;
59         if (Rstart.getConstant().getDblValue(start))
60         {
61             if (tools::getIntType(start) == tools::NOTANINT)
62             {
63                 gvnStart = getGVN().getValue((double)tools::cast<int>(start + step));
64             }
65             else
66             {
67                 gvnStart = getGVN().getValue((double)tools::cast<int>(start));
68             }
69         }
70         else
71         {
72             gvnStart = Rstart.getConstant().getGVNValue();
73             if (!gvnStart)
74             {
75                 Result & res = e.getDecorator().setResult(Result(TIType(dm.getGVN(), Rstart.getType().type, false, true), -1));
76                 setResult(res);
77                 return;
78             }
79         }
80
81         GVN & gvn = getGVN();
82         if (Rstart.getConstant().getGVNValue(gvn, gvnStart) && Rstep.getConstant().getGVNValue(gvn, gvnStep) && Rend.getConstant().getGVNValue(gvn, gvnEnd))
83         {
84             sl = SymbolicList(gvnStart, gvnStep, gvnEnd);
85             if (gvnStep->poly->isConstant())
86             {
87                 step = gvnStep->poly->constant;
88                 if (step == 1 || step == -1)
89                 {
90                     
91                 }
92             }
93         }
94     }
95 }