Merge remote-tracking branch 'origin/master' into windows
[scilab.git] / scilab / modules / ast / src / cpp / analysis / VisitWhileExp.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
18 namespace analysis
19 {
20
21 void AnalysisVisitor::visit(ast::WhileExp & e)
22 {
23     logger.log("WhileExp", e.getLocation());
24     loops.push(&e);
25
26     dm.addBlock(Block::LOOP, &e);
27     e.getTest().accept(*this);
28     dm.releaseTmp(getResult().getTempId(), &e.getTest());
29     dm.addBlock(Block::NORMAL, &e.getBody());
30     e.getBody().accept(*this);
31
32     if (dm.requiresAnotherTrip())
33     {
34         dm.finalizeBlock();
35         dm.addBlock(Block::NORMAL, &e.getBody());
36
37         // Since the variables in the test have maybe changed (e.g. a double-int became a double)
38         // we need to re-analyze it to take into account these changes
39         e.getTest().accept(*this);
40         dm.releaseTmp(getResult().getTempId(), &e.getTest());
41
42         e.getBody().accept(*this);
43
44         if (dm.requiresAnotherTrip())
45         {
46             std::wcerr << "Invalid forexp: types or refcount are not the same before and after the loop" << std::endl;
47         }
48     }
49
50     dm.finalizeBlock();
51     dm.finalizeBlock();
52
53     loops.pop();
54 }
55
56 } // namespace analysis