summaryrefslogtreecommitdiffstats
path: root/src/uscxml/debug/Debugger.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/uscxml/debug/Debugger.cpp')
-rw-r--r--src/uscxml/debug/Debugger.cpp114
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);
}