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, |