00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _INTERACTIVEDEBUGGER_HPP
00021 #define _INTERACTIVEDEBUGGER_HPP
00022
00023 #include <string>
00024 #include <vector>
00025 #include <map>
00026
00027 #include <xqilla/debug/DebugListener.hpp>
00028 #include <xqilla/ast/LocationInfo.hpp>
00029
00030 #include <xqilla/debug/InputParser.hpp>
00031
00032 class XQQuery;
00033 class DynamicContext;
00034 class DebugCommand;
00035 class InteractiveDebugger;
00036
00037 class XQILLA_API BaseInteractiveDebugger
00038 {
00039 public:
00040 struct XQILLA_API Run {};
00041 struct XQILLA_API Continue {};
00042 struct XQILLA_API Quit {};
00043
00044 static void outputLocation(const XMLCh *file, unsigned int line, unsigned int column,
00045 unsigned int context = 0);
00046 static void outputLocationFromString(const XMLCh *query, unsigned int line, unsigned int column,
00047 unsigned int context = 0);
00048 static std::string regexFind(const char *regex, const std::string &str, int groupNo = 1);
00049
00050 virtual ~BaseInteractiveDebugger();
00051
00052 unsigned int setBreakPoint(const std::string &file, unsigned int line, unsigned int column, bool temporary);
00053 bool disableBreakPoint(unsigned int number);
00054 bool enableBreakPoint(unsigned int number);
00055 void listBreakPoints() const;
00056
00057 void setStep();
00058 void setNext();
00059 bool queryStarted() const { return queryStarted_; }
00060
00061 virtual void run() = 0;
00062
00063 virtual bool changeFrame(unsigned int number) = 0;
00064 virtual unsigned int getStackSize() const = 0;
00065 virtual void stackTrace() const = 0;
00066 virtual bool outputCurrentFrame(unsigned int context = 0) const = 0;
00067 virtual void outputCurrentFrameQueryPlan() const = 0;
00068 virtual bool queryCurrentFrame(const char *queryString) const = 0;
00069 virtual bool currentFrameLocation(std::string &file, unsigned int &line, unsigned int &column) const = 0;
00070
00071 virtual void setDoLazyEvaluation(bool lazy) = 0;
00072 virtual void setDoFocusOptimizationsn(bool opt) = 0;
00073 virtual void setDoProjection(bool opt) = 0;
00074
00075 protected:
00076 BaseInteractiveDebugger();
00077
00078 DebugCommand *findCommand(std::string &command) const;
00079 void checkBreak(bool entering);
00080 void breakForError(const char *message);
00081 void interrupted();
00082 void readCommand();
00083
00084 std::vector<DebugCommand*> commands_;
00085 DebugCommand *prevcmd_;
00086
00087 bool queryStarted_;
00088
00089 struct BreakPoint
00090 {
00091 BreakPoint(const std::string &f, unsigned int l, unsigned int c, bool t)
00092 : file(f), line(l), column(c), temporary(t), disabled(false) {}
00093
00094 std::string file;
00095 unsigned int line, column;
00096 bool temporary;
00097 bool disabled;
00098 };
00099
00100 std::vector<BreakPoint> breaks_;
00101 bool step_;
00102 unsigned int next_;
00103 };
00104
00105 class XQILLA_API DebugCommand
00106 {
00107 public:
00108 virtual ~DebugCommand() {};
00109
00110 virtual const char *getCommandName() const { return name_; }
00111 virtual const char *getCommandNameCompat() const { return compatName_; }
00112 virtual const char *getBriefHelp() const { return briefHelp_; }
00113 virtual const char *getMoreHelp() const { return moreHelp_; }
00114
00115 static bool matches(const std::string &command,
00116 const std::string &toMatch);
00117 virtual bool matches(const std::string &command) const;
00118
00119 virtual void execute(InputParser::Args &args, BaseInteractiveDebugger &env) = 0;
00120
00121 protected:
00122 DebugCommand(const char *name, const char *compatName,
00123 const char *briefHelp, const char *moreHelp)
00124 : name_(name), compatName_(compatName), briefHelp_(briefHelp), moreHelp_(moreHelp) {}
00125
00126 const char *name_;
00127 const char *compatName_;
00128 const char *briefHelp_;
00129 const char *moreHelp_;
00130 };
00131
00132 class XQILLA_API InteractiveDebugger : private BaseInteractiveDebugger,
00133 private DebugListener
00134 {
00135 public:
00136 static void debugQuery(const XQQuery *query, DynamicContext *context);
00137 static void outputLocation(const LocationInfo *info, unsigned int context = 0);
00138
00139 private:
00140 InteractiveDebugger(const XQQuery *query, DynamicContext *context);
00141
00142 virtual void enter(const StackFrame *stack, const DynamicContext *context);
00143 virtual void exit(const StackFrame *stack, const DynamicContext *context);
00144 virtual void error(const XQException &error, const StackFrame *stack, const DynamicContext *context);
00145 virtual bool doLazyEvaluation() const { return lazy_; }
00146 virtual bool doFocusOptimizations() const { return focusOptimzations_; }
00147
00148 virtual void run();
00149
00150 virtual bool changeFrame(unsigned int number);
00151 virtual unsigned int getStackSize() const;
00152 virtual void stackTrace() const;
00153 virtual bool outputCurrentFrame(unsigned int context) const;
00154 virtual void outputCurrentFrameQueryPlan() const;
00155 virtual bool queryCurrentFrame(const char *queryString) const;
00156 virtual bool currentFrameLocation(std::string &file, unsigned int &line, unsigned int &column) const;
00157
00158 virtual void setDoLazyEvaluation(bool lazy) { lazy_ = lazy; }
00159 virtual void setDoFocusOptimizationsn(bool opt) { focusOptimzations_ = opt; }
00160 virtual void setDoProjection(bool opt);
00161
00162 unsigned int getCurrentFrameNumber() const;
00163 void output(const StackFrame *frame) const;
00164 void report(const StackFrame *frame) const;
00165
00166 const StackFrame *stack_;
00167 const StackFrame *currentFrame_;
00168
00169 const XQQuery *query_;
00170 DynamicContext *context_;
00171 bool lazy_;
00172 bool focusOptimzations_;
00173 };
00174
00175 #endif