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