// Copyright 2016 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_INSPECTOR_V8STACKTRACEIMPL_H_ #define V8_INSPECTOR_V8STACKTRACEIMPL_H_ #include <vector> #include "src/base/macros.h" #include "src/inspector/protocol/Forward.h" #include "src/inspector/protocol/Runtime.h" #include "include/v8-inspector.h" namespace v8_inspector { class TracedValue; class V8Debugger; // Note: async stack trace may have empty top stack with non-empty tail to // indicate // that current native-only state had some async story. // On the other hand, any non-top async stack is guaranteed to be non-empty. class V8StackTraceImpl final : public V8StackTrace { public: static const size_t maxCallStackSizeToCapture = 200; class Frame { public: Frame(); Frame(const String16& functionName, const String16& scriptId, const String16& scriptName, int lineNumber, int column = 0); ~Frame(); const String16& functionName() const { return m_functionName; } const String16& scriptId() const { return m_scriptId; } const String16& sourceURL() const { return m_scriptName; } int lineNumber() const { return m_lineNumber; } int columnNumber() const { return m_columnNumber; } Frame clone() const; private: friend class V8StackTraceImpl; std::unique_ptr<protocol::Runtime::CallFrame> buildInspectorObject() const; void toTracedValue(TracedValue*) const; String16 m_functionName; String16 m_scriptId; String16 m_scriptName; int m_lineNumber; int m_columnNumber; }; static void setCaptureStackTraceForUncaughtExceptions(v8::Isolate*, bool capture); static std::unique_ptr<V8StackTraceImpl> create( V8Debugger*, int contextGroupId, v8::Local<v8::StackTrace>, size_t maxStackSize, const String16& description = String16()); static std::unique_ptr<V8StackTraceImpl> capture( V8Debugger*, int contextGroupId, size_t maxStackSize, const String16& description = String16()); // This method drops the async chain. Use cloneImpl() instead. std::unique_ptr<V8StackTrace> clone() override; std::unique_ptr<V8StackTraceImpl> cloneImpl(); std::unique_ptr<protocol::Runtime::StackTrace> buildInspectorObjectForTail( V8Debugger*) const; std::unique_ptr<protocol::Runtime::StackTrace> buildInspectorObjectImpl() const; ~V8StackTraceImpl() override; // V8StackTrace implementation. bool isEmpty() const override { return !m_frames.size(); }; StringView topSourceURL() const override; int topLineNumber() const override; int topColumnNumber() const override; StringView topScriptId() const override; StringView topFunctionName() const override; std::unique_ptr<protocol::Runtime::API::StackTrace> buildInspectorObject() const override; std::unique_ptr<StringBuffer> toString() const override; private: V8StackTraceImpl(int contextGroupId, const String16& description, std::vector<Frame>& frames, std::unique_ptr<V8StackTraceImpl> parent); int m_contextGroupId; String16 m_description; std::vector<Frame> m_frames; std::unique_ptr<V8StackTraceImpl> m_parent; DISALLOW_COPY_AND_ASSIGN(V8StackTraceImpl); }; } // namespace v8_inspector #endif // V8_INSPECTOR_V8STACKTRACEIMPL_H_