Chromium Code Reviews| Index: src/inspector/v8-stack-trace-impl.cc | 
| diff --git a/src/inspector/v8-stack-trace-impl.cc b/src/inspector/v8-stack-trace-impl.cc | 
| index a2a4ce1b6eb8dfae18cacff6a556b0a66754c9d3..58522536738a40782685aeb3c609a830f6bbe182 100644 | 
| --- a/src/inspector/v8-stack-trace-impl.cc | 
| +++ b/src/inspector/v8-stack-trace-impl.cc | 
| @@ -126,6 +126,15 @@ std::unique_ptr<protocol::Runtime::CallFrame> StackFrame::buildInspectorObject() | 
| .build(); | 
| } | 
| +bool StackFrame::isEqual(StackFrame* frame) const { | 
| + if (functionName() != frame->functionName()) return false; | 
| + if (scriptId() != frame->scriptId()) return false; | 
| 
 
dgozman
2017/05/15 17:01:27
We always have scriptId, right? Then there is no n
 
kozy
2017/05/16 01:43:48
Done.
 
 | 
| + if (sourceURL() != frame->sourceURL()) return false; | 
| + if (lineNumber() != frame->lineNumber()) return false; | 
| + if (columnNumber() != frame->columnNumber()) return false; | 
| + return true; | 
| +} | 
| + | 
| // static | 
| void V8StackTraceImpl::setCaptureStackTraceForUncaughtExceptions( | 
| v8::Isolate* isolate, bool capture) { | 
| @@ -241,6 +250,51 @@ std::unique_ptr<StringBuffer> V8StackTraceImpl::toString() const { | 
| return StringBufferImpl::adopt(string); | 
| } | 
| +bool V8StackTraceImpl::isEqualIgnoringTopFrame( | 
| + V8StackTraceImpl* stackTrace) const { | 
| + StackFrameIterator current(this); | 
| + StackFrameIterator target(stackTrace); | 
| + | 
| + current.next(); | 
| + target.next(); | 
| + while (!current.done() && !target.done()) { | 
| + if (!current.frame()->isEqual(target.frame())) { | 
| + return false; | 
| + } | 
| + current.next(); | 
| + target.next(); | 
| + } | 
| + return current.done() == target.done(); | 
| +} | 
| + | 
| +V8StackTraceImpl::StackFrameIterator::StackFrameIterator( | 
| + const V8StackTraceImpl* stackTrace) | 
| + : m_currentIt(stackTrace->m_frames.begin()), | 
| + m_currentEnd(stackTrace->m_frames.end()), | 
| 
 
dgozman
2017/05/15 17:01:27
If top stack is empty, iterator will be immediatel
 
kozy
2017/05/16 01:43:48
currently it could not happen, removed DCHECK.
 
 | 
| + m_parent(stackTrace->m_asyncParent.lock().get()) { | 
| + DCHECK(m_currentIt != m_currentEnd); | 
| +} | 
| + | 
| +void V8StackTraceImpl::StackFrameIterator::next() { | 
| + if (m_currentIt == m_currentEnd) return; | 
| + ++m_currentIt; | 
| + while (m_currentIt == m_currentEnd && m_parent) { | 
| + const std::vector<std::shared_ptr<StackFrame>>& frames = m_parent->frames(); | 
| + m_currentIt = frames.begin(); | 
| + if (m_parent->description() == "async function") ++m_currentIt; | 
| + m_currentEnd = frames.end(); | 
| + m_parent = m_parent->parent().lock().get(); | 
| + } | 
| +} | 
| + | 
| +bool V8StackTraceImpl::StackFrameIterator::done() { | 
| + return m_currentIt == m_currentEnd; | 
| +} | 
| + | 
| +StackFrame* V8StackTraceImpl::StackFrameIterator::frame() { | 
| + return m_currentIt != m_currentEnd ? m_currentIt->get() : nullptr; | 
| 
 
dgozman
2017/05/15 17:01:27
Just m_currentIt->get(), since nobody should acces
 
kozy
2017/05/16 01:43:48
Done.
 
 | 
| +} | 
| + | 
| // static | 
| std::shared_ptr<AsyncStackTrace> AsyncStackTrace::capture( | 
| V8Debugger* debugger, int contextGroupId, const String16& description, |