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