License Header change: Removed the LICENSE_END before beta
[scilab.git] / scilab / modules / ast / includes / ast / debugmanager.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
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 #ifndef __DEBUGGER_MANAGER_HXX__
17 #define __DEBUGGER_MANAGER_HXX__
18
19 #include <memory>
20
21 #include "abstractdebugger.hxx"
22 #include "breakpoint.hxx"
23 #include "dynlib_ast.h"
24
25 namespace debugger
26 {
27 class EXTERN_AST DebuggerMagager
28 {
29 public :
30     enum DebugAction
31     {
32         Continue,
33         StepNext,
34         StepIn,
35         StepOut
36     };
37
38 private:
39     static std::unique_ptr<DebuggerMagager> me;
40     DebuggerMagager() :
41         breakpoints(),
42         debuggers(), pExp(nullptr), interrupted(false), currentBreakPoint(-1), action(Continue), level(0) {}
43
44     Debuggers debuggers;
45     Breakpoints breakpoints;
46
47     ast::Exp* pExp;
48     bool interrupted;
49     int currentBreakPoint;
50     DebugAction action;
51     int level;
52
53     void internal_stop();
54 public:
55     ~DebuggerMagager()
56     {
57         for (auto d : debuggers)
58         {
59             delete d;
60         }
61         for (auto b : breakpoints)
62         {
63             delete b;
64         }
65     }
66
67     static DebuggerMagager* getInstance();
68
69     //debuggers functions
70     void addDebugger(AbstractDebugger* _debug);
71     void removeDebugger(int _iDebugger);
72     AbstractDebugger* getDebugger(int _iDebugger);
73     int getDebuggerCount();
74     Debuggers& getAllDebugger();
75
76     void setExp(const ast::Exp* _pExp)
77     {
78         pExp = const_cast<ast::Exp*>(_pExp);
79     }
80     void clearExp()
81     {
82         pExp = NULL;
83     }
84     ast::Exp* getExp()
85     {
86         return pExp;
87     }
88
89     bool isInterrupted()
90     {
91         return interrupted;
92     }
93
94     Breakpoint* getCurrentBreakPoint()
95     {
96         if (currentBreakPoint != -1)
97         {
98             return getBreakPoint(currentBreakPoint);
99         }
100
101         return nullptr;
102     }
103     //send information to debuggers
104     void sendStop(int index);
105     void sendResume();
106     void sendAbort();
107     void sendErrorInFile(const std::wstring& filename) const;
108     void sendErrorInScript(const std::wstring& funcname) const;
109     void sendQuit();
110     void sendUpdate() const;
111
112     void stop(const ast::Exp* pExp, int index);
113     void errorInFile(const std::wstring filename, const ast::Exp* pExp);
114     void errorInScript(const std::wstring funcname, const ast::Exp* pExp);
115     //breakpoints functions
116     void addBreakPoint(Breakpoint* bp);
117     void removeBreakPoint(int _iBreakPoint);
118     void removeAllBreakPoints();
119     void disableAllBreakPoints();
120     void disableBreakPoint(int _iBreakPoint);
121     void enableAllBreakPoints();
122     void enableBreakPoint(int _iBreakPoint);
123     bool isEnableBreakPoint(int _iBreakPoint);
124     Breakpoint* getBreakPoint(int _iBreakPoint);
125     int getBreakPointCount();
126     Breakpoints& getAllBreakPoint();
127
128
129     //actions called by debuggers
130     inline void setStepIn() //enter macro
131     {
132         action = StepIn;
133         level = symbol::Context::getInstance()->getScopeLevel();
134     }
135     inline bool isStepIn()
136     {
137         int l = symbol::Context::getInstance()->getScopeLevel();
138         //if stepIn failed ( not a macro ), stepIn become a stepNext
139         return action == StepIn && l >= level;
140     }
141     inline void resetStepIn()
142     {
143         if (isStepIn())
144         {
145             action = Continue;
146         }
147     }
148
149     inline void setStepOut() //exit macro
150     {
151         action = StepOut;
152         level = symbol::Context::getInstance()->getScopeLevel();
153     }
154     inline bool isStepOut()
155     {
156         int l = symbol::Context::getInstance()->getScopeLevel();
157         return action == StepOut && l < level;
158     }
159     inline void resetStepOut()
160     {
161         if (isStepOut())
162         {
163             action = Continue;
164         }
165     }
166
167     inline void setStepNext() //next statement
168     {
169         action = StepNext;
170         level = symbol::Context::getInstance()->getScopeLevel();
171     }
172     inline bool isStepNext()
173     {
174         int l = symbol::Context::getInstance()->getScopeLevel();
175         //if stepNext failed ( end of macro ), stepNext become a stepOut
176         return action == StepNext && l <= level;
177     }
178     inline void resetStepNext()
179     {
180         if (isStepNext())
181         {
182             action = Continue;
183         }
184     }
185
186     inline void resetStep()
187     {
188         if (isInterrupted() == false)
189         {
190             action = Continue;
191         }
192     }
193     void resume(); //resume execution
194     void abort(); //abort execution
195 };
196
197 }
198 #endif /* !__DEBUGGER_MANAGER_HXX__ */