Chromium Code Reviews| Index: src/inspector/v8-debugger-agent-impl.cc |
| diff --git a/src/inspector/v8-debugger-agent-impl.cc b/src/inspector/v8-debugger-agent-impl.cc |
| index 664c2ed095a0545d2ee655c3b15178e21e056f3f..dec383db2b22d468526f50572a9245e67061a3ae 100644 |
| --- a/src/inspector/v8-debugger-agent-impl.cc |
| +++ b/src/inspector/v8-debugger-agent-impl.cc |
| @@ -131,7 +131,6 @@ V8DebuggerAgentImpl::V8DebuggerAgentImpl( |
| m_state(state), |
| m_frontend(frontendChannel), |
| m_isolate(m_inspector->isolate()), |
| - m_breakReason(protocol::Debugger::Paused::ReasonEnum::Other), |
| m_scheduledDebuggerStep(NoStep), |
| m_javaScriptPauseScheduled(false), |
| m_recursionLevelForStepOut(0) { |
| @@ -589,6 +588,26 @@ Response V8DebuggerAgentImpl::getScriptSource(const String16& scriptId, |
| return Response::OK(); |
| } |
| +void V8DebuggerAgentImpl::pushBreakDetails( |
| + const String16& breakReason, |
| + std::unique_ptr<protocol::DictionaryValue> breakAuxData) { |
| + m_breakReason.push_back(breakReason); |
| + m_breakAuxData.push_back(std::move(breakAuxData)); |
| +} |
| + |
| +void V8DebuggerAgentImpl::popBreakDetails() { |
| + if (m_breakReason.empty()) return; |
|
pfeldman
2017/02/07 19:01:05
Is it not strict enough to put DCHECK here? So we
kozy
2017/02/07 22:54:36
We cleanup break reasons on actual break and we do
|
| + m_breakReason.pop_back(); |
| + m_breakAuxData.pop_back(); |
| +} |
| + |
| +void V8DebuggerAgentImpl::clearBreakDetails() { |
| + std::vector<String16> emptyBreakReason; |
| + m_breakReason.swap(emptyBreakReason); |
| + std::vector<std::unique_ptr<protocol::DictionaryValue>> emptyBreakAuxData; |
| + m_breakAuxData.swap(emptyBreakAuxData); |
| +} |
| + |
| void V8DebuggerAgentImpl::schedulePauseOnNextStatement( |
| const String16& breakReason, |
| std::unique_ptr<protocol::DictionaryValue> data) { |
| @@ -596,9 +615,8 @@ void V8DebuggerAgentImpl::schedulePauseOnNextStatement( |
| m_javaScriptPauseScheduled || isPaused() || |
| !m_debugger->breakpointsActivated()) |
| return; |
| - m_breakReason = breakReason; |
| - m_breakAuxData = std::move(data); |
| - m_debugger->setPauseOnNextStatement(true); |
| + if (m_breakReason.empty()) m_debugger->setPauseOnNextStatement(true); |
| + pushBreakDetails(breakReason, std::move(data)); |
| } |
| void V8DebuggerAgentImpl::schedulePauseOnNextStatementIfSteppingInto() { |
| @@ -612,8 +630,8 @@ void V8DebuggerAgentImpl::schedulePauseOnNextStatementIfSteppingInto() { |
| void V8DebuggerAgentImpl::cancelPauseOnNextStatement() { |
| if (m_javaScriptPauseScheduled || isPaused()) return; |
| - clearBreakDetails(); |
| - m_debugger->setPauseOnNextStatement(false); |
| + popBreakDetails(); |
| + if (m_breakReason.empty()) m_debugger->setPauseOnNextStatement(false); |
| } |
| Response V8DebuggerAgentImpl::pause() { |
| @@ -1071,14 +1089,21 @@ void V8DebuggerAgentImpl::didPause(int contextId, |
| m_pausedCallFrames.swap(frames); |
| v8::HandleScope handles(m_isolate); |
| + String16 breakReason = m_breakReason.empty() |
| + ? protocol::Debugger::Paused::ReasonEnum::Other |
| + : m_breakReason.back(); |
| + std::unique_ptr<protocol::DictionaryValue> breakAuxData = |
| + m_breakAuxData.empty() ? nullptr : std::move(m_breakAuxData.back()); |
| + clearBreakDetails(); |
| + std::vector<std::unique_ptr<protocol::DictionaryValue>> emptyBreakAuxData; |
| if (isOOMBreak) { |
| - m_breakReason = protocol::Debugger::Paused::ReasonEnum::OOM; |
| - m_breakAuxData = nullptr; |
| + breakReason = protocol::Debugger::Paused::ReasonEnum::OOM; |
| + breakAuxData = nullptr; |
| } else if (!exception.IsEmpty()) { |
| InjectedScript* injectedScript = nullptr; |
| m_session->findInjectedScript(contextId, injectedScript); |
| if (injectedScript) { |
| - m_breakReason = |
| + breakReason = |
| isPromiseRejection |
| ? protocol::Debugger::Paused::ReasonEnum::PromiseRejection |
| : protocol::Debugger::Paused::ReasonEnum::Exception; |
| @@ -1086,12 +1111,12 @@ void V8DebuggerAgentImpl::didPause(int contextId, |
| injectedScript->wrapObject(exception, kBacktraceObjectGroup, false, false, |
| &obj); |
| if (obj) { |
| - m_breakAuxData = obj->toValue(); |
| - m_breakAuxData->setBoolean("uncaught", isUncaught); |
| + breakAuxData = obj->toValue(); |
| + breakAuxData->setBoolean("uncaught", isUncaught); |
| } else { |
| - m_breakAuxData = nullptr; |
| + breakAuxData = nullptr; |
| } |
| - // m_breakAuxData might be null after this. |
| + // breakAuxData might be null after this. |
| } |
| } |
| @@ -1105,17 +1130,17 @@ void V8DebuggerAgentImpl::didPause(int contextId, |
| hitBreakpointIds->addItem(localId); |
| BreakpointSource source = breakpointIterator->second.second; |
| - if (m_breakReason == protocol::Debugger::Paused::ReasonEnum::Other && |
| + if (breakReason == protocol::Debugger::Paused::ReasonEnum::Other && |
| source == DebugCommandBreakpointSource) |
| - m_breakReason = protocol::Debugger::Paused::ReasonEnum::DebugCommand; |
| + breakReason = protocol::Debugger::Paused::ReasonEnum::DebugCommand; |
| } |
| } |
| std::unique_ptr<Array<CallFrame>> protocolCallFrames; |
| Response response = currentCallFrames(&protocolCallFrames); |
| if (!response.isSuccess()) protocolCallFrames = Array<CallFrame>::create(); |
| - m_frontend.paused(std::move(protocolCallFrames), m_breakReason, |
| - std::move(m_breakAuxData), std::move(hitBreakpointIds), |
| + m_frontend.paused(std::move(protocolCallFrames), breakReason, |
| + std::move(breakAuxData), std::move(hitBreakpointIds), |
| currentAsyncStackTrace()); |
| m_scheduledDebuggerStep = NoStep; |
| m_javaScriptPauseScheduled = false; |
| @@ -1137,8 +1162,7 @@ void V8DebuggerAgentImpl::breakProgram( |
| const String16& breakReason, |
| std::unique_ptr<protocol::DictionaryValue> data) { |
| if (!enabled() || !m_debugger->canBreakProgram() || m_skipAllPauses) return; |
| - m_breakReason = breakReason; |
| - m_breakAuxData = std::move(data); |
| + pushBreakDetails(breakReason, std::move(data)); |
| m_scheduledDebuggerStep = NoStep; |
| m_debugger->breakProgram(); |
| } |
| @@ -1152,11 +1176,6 @@ void V8DebuggerAgentImpl::breakProgramOnException( |
| breakProgram(breakReason, std::move(data)); |
| } |
| -void V8DebuggerAgentImpl::clearBreakDetails() { |
| - m_breakReason = protocol::Debugger::Paused::ReasonEnum::Other; |
| - m_breakAuxData = nullptr; |
| -} |
| - |
| void V8DebuggerAgentImpl::setBreakpointAt(const String16& scriptId, |
| int lineNumber, int columnNumber, |
| BreakpointSource source, |