Analysis: infer when a refcount is required and add colors in DebugVisitor
[scilab.git] / scilab / modules / ast / src / cpp / analysis / XBlock.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 "data/XBlock.hxx"
14 #include "data/FunctionBlock.hxx"
15
16 namespace analysis
17 {
18 void XBlock::finalize() { }
19
20 Block * XBlockHead::addBlock(const unsigned int id, BlockKind kind, ast::Exp * exp)
21 {
22     if (kind == MACRO)
23     {
24         Block * b = new FunctionBlock(id, this, exp);
25         testBlocks.push_back(b);
26
27         return b;
28     }
29
30     Block * b = new XBlock(id, this, exp);
31     blocks.push_back(b);
32
33     return b;
34 }
35
36 void XBlockHead::finalize()
37 {
38     pullup(symMap);
39     std::vector<Block *>::iterator first;
40     std::vector<Block *>::iterator end = blocks.end();
41     for (first = blocks.begin(); first != end; ++first)
42     {
43         if (!(*first)->getReturn())
44         {
45             break;
46         }
47     }
48
49     if (first != end)
50     {
51         tools::SymbolMap<Info> & map = (*first)->getMap();
52         for (std::vector<Block *>::iterator i = std::next(first); i != end; ++i)
53         {
54             if (!(*i)->getReturn())
55             {
56                 merge(map, (*i)->getMap());
57             }
58         }
59         pullup((*first)->getMap());
60     }
61 }
62 }