diff options
Diffstat (limited to 'src/uscxml/debug/Debugger.cpp')
-rw-r--r-- | src/uscxml/debug/Debugger.cpp | 114 |
1 files changed, 61 insertions, 53 deletions
diff --git a/src/uscxml/debug/Debugger.cpp b/src/uscxml/debug/Debugger.cpp index aa97a22..3a19228 100644 --- a/src/uscxml/debug/Debugger.cpp +++ b/src/uscxml/debug/Debugger.cpp @@ -23,9 +23,13 @@ namespace uscxml { void Debugger::afterCompletion(Interpreter interpreter) { + boost::shared_ptr<DebugSession> session = getSession(interpreter); + if (!session) + return; + Data msg; msg.compound["replyType"] = Data("finished", Data::VERBATIM); - pushData(msg); + pushData(session, msg); } std::list<Breakpoint> getQualifiedStateBreakpoints(Interpreter interpreter, const Arabica::DOM::Element<std::string>& state, Breakpoint breakpointTemplate) { @@ -33,6 +37,7 @@ std::list<Breakpoint> getQualifiedStateBreakpoints(Interpreter interpreter, cons Breakpoint bp = breakpointTemplate; // copy base as template bp.stateId = ATTR(state, "id"); + bp.element = state; bp.subject = Breakpoint::STATE; breakpoints.push_back(bp); @@ -44,6 +49,7 @@ std::list<Breakpoint> getQualifiedInvokeBreakpoints(Interpreter interpreter, con Breakpoint bp = breakpointTemplate; // copy base as template bp.subject = Breakpoint::INVOKER; + bp.element = invokeElem; bp.invokeId = invokeId; if (HAS_ATTR(invokeElem, "type")) { @@ -67,6 +73,7 @@ std::list<Breakpoint> getQualifiedTransBreakpoints(Interpreter interpreter, cons Arabica::DOM::Element<std::string> target(targets[j]); Breakpoint bp = breakpointTemplate; // copy base as template + bp.element = transition; bp.transSource = ATTR(source, "id"); bp.transTarget = ATTR(target, "id"); bp.subject = Breakpoint::TRANSITION; @@ -83,6 +90,12 @@ void Debugger::beforeTakingTransition(Interpreter interpreter, const Arabica::DO void Debugger::afterTakingTransition(Interpreter interpreter, const Arabica::DOM::Element<std::string>& transition) { handleTransition(interpreter, transition, Breakpoint::AFTER); } +void Debugger::beforeExecutingContent(Interpreter interpreter, const Arabica::DOM::Node<std::string>& content) { + handleExecutable(interpreter, Arabica::DOM::Element<std::string>(content), Breakpoint::BEFORE); +} +void Debugger::afterExecutingContent(Interpreter interpreter, const Arabica::DOM::Node<std::string>& content) { + handleExecutable(interpreter, Arabica::DOM::Element<std::string>(content), Breakpoint::AFTER); +} void Debugger::beforeExitingState(Interpreter interpreter, const Arabica::DOM::Element<std::string>& state) { handleState(interpreter, state, Breakpoint::BEFORE, Breakpoint::EXIT); } @@ -120,9 +133,34 @@ void Debugger::beforeProcessingEvent(Interpreter interpreter, const Event& event handleEvent(interpreter, event, Breakpoint::BEFORE); } +void Debugger::handleExecutable(Interpreter interpreter, + const Arabica::DOM::Element<std::string>& execContentElem, + Breakpoint::When when) { + if (!interpreter.isRunning()) + return; + boost::shared_ptr<DebugSession> session = getSession(interpreter); + if (!session) + return; + + std::list<Breakpoint> breakpoints; + + Breakpoint breakpoint; + breakpoint.when = when; + breakpoint.element = execContentElem; + breakpoint.executableName = execContentElem.getLocalName(); + breakpoint.subject = Breakpoint::EXECUTABLE; + breakpoints.push_back(breakpoint); + + session->checkBreakpoints(breakpoints); + +} + void Debugger::handleEvent(Interpreter interpreter, const Event& event, Breakpoint::When when) { if (!interpreter.isRunning()) return; + boost::shared_ptr<DebugSession> session = getSession(interpreter); + if (!session) + return; std::list<Breakpoint> breakpoints; @@ -132,13 +170,16 @@ void Debugger::handleEvent(Interpreter interpreter, const Event& event, Breakpoi breakpoint.subject = Breakpoint::EVENT; breakpoints.push_back(breakpoint); - checkBreakpoints(interpreter, breakpoints); + session->checkBreakpoints(breakpoints); } void Debugger::handleStable(Interpreter interpreter, Breakpoint::When when) { if (!interpreter.isRunning()) return; + boost::shared_ptr<DebugSession> session = getSession(interpreter); + if (!session) + return; std::list<Breakpoint> breakpoints; @@ -147,13 +188,16 @@ void Debugger::handleStable(Interpreter interpreter, Breakpoint::When when) { breakpoint.subject = Breakpoint::STABLE; breakpoints.push_back(breakpoint); - checkBreakpoints(interpreter, breakpoints); + session->checkBreakpoints(breakpoints); } void Debugger::handleMicrostep(Interpreter interpreter, Breakpoint::When when) { if (!interpreter.isRunning()) return; - + boost::shared_ptr<DebugSession> session = getSession(interpreter); + if (!session) + return; + std::list<Breakpoint> breakpoints; Breakpoint breakpoint; @@ -161,86 +205,50 @@ void Debugger::handleMicrostep(Interpreter interpreter, Breakpoint::When when) { breakpoint.subject = Breakpoint::MICROSTEP; breakpoints.push_back(breakpoint); - checkBreakpoints(interpreter, breakpoints); + session->checkBreakpoints(breakpoints); } void Debugger::handleTransition(Interpreter interpreter, const Arabica::DOM::Element<std::string>& transition, Breakpoint::When when) { if (!interpreter.isRunning()) return; + boost::shared_ptr<DebugSession> session = getSession(interpreter); + if (!session) + return; Breakpoint breakpointTemplate; breakpointTemplate.when = when; std::list<Breakpoint> qualifiedBreakpoints = getQualifiedTransBreakpoints(interpreter, transition, breakpointTemplate); - checkBreakpoints(interpreter, qualifiedBreakpoints); + session->checkBreakpoints(qualifiedBreakpoints); } void Debugger::handleState(Interpreter interpreter, const Arabica::DOM::Element<std::string>& state, Breakpoint::When when, Breakpoint::Action action) { if (!interpreter.isRunning()) return; + boost::shared_ptr<DebugSession> session = getSession(interpreter); + if (!session) + return; Breakpoint breakpointTemplate; breakpointTemplate.when = when; breakpointTemplate.action = action; std::list<Breakpoint> qualifiedBreakpoints = getQualifiedStateBreakpoints(interpreter, state, breakpointTemplate); - checkBreakpoints(interpreter, qualifiedBreakpoints); + session->checkBreakpoints(qualifiedBreakpoints); } void Debugger::handleInvoke(Interpreter interpreter, const Arabica::DOM::Element<std::string>& invokeElem, const std::string& invokeId, Breakpoint::When when, Breakpoint::Action action) { if (!interpreter.isRunning()) return; + boost::shared_ptr<DebugSession> session = getSession(interpreter); + if (!session) + return; Breakpoint breakpointTemplate; breakpointTemplate.when = when; breakpointTemplate.action = action; std::list<Breakpoint> qualifiedBreakpoints = getQualifiedInvokeBreakpoints(interpreter, invokeElem, invokeId, breakpointTemplate); - checkBreakpoints(interpreter, qualifiedBreakpoints); - -} - -void Debugger::checkBreakpoints(Interpreter interpreter, const std::list<Breakpoint> qualifiedBreakpoints) { - std::list<Breakpoint>::const_iterator qualifiedBreakpointIter = qualifiedBreakpoints.begin(); - while(qualifiedBreakpointIter != qualifiedBreakpoints.end()) { - const Breakpoint& qualifiedBreakpoint = *qualifiedBreakpointIter++; - - // check if one of the user-supplied breakpoints match - bool userBreakpointMatched = false; - std::set<Breakpoint>::const_iterator breakpointIter = _breakPoints.begin(); - while(breakpointIter != _breakPoints.end()) { - const Breakpoint& breakpoint = *breakpointIter++; - if (breakpoint.matches(qualifiedBreakpoint)) { - Data replyData; - replyData.compound["breakpoint"] = breakpoint.toData(); - replyData.compound["qualified"] = qualifiedBreakpoint.toData(); - - userBreakpointMatched = true; - hitBreakpoint(interpreter, replyData); - } - } - if (_isStepping && !userBreakpointMatched) { - Data replyData; - replyData.compound["qualified"] = qualifiedBreakpoint.toData(); - hitBreakpoint(interpreter, replyData); - } - } -} + session->checkBreakpoints(qualifiedBreakpoints); -void Debugger::send(google::LogSeverity severity, const char* full_filename, - const char* base_filename, int line, - const struct ::tm* tm_time, - const char* message, size_t message_len) { - - // _sendQueue is thread-safe, not sure about ToString though - - LogMessage msg(severity, - full_filename, - base_filename, - line, - tm_time, - std::string(message, message_len), - ToString(severity, base_filename, line, tm_time, message, message_len)); - msg.compound["replyType"] = Data("log", Data::VERBATIM); - pushData(msg); } |