diff options
Diffstat (limited to 'Source/JavaScriptCore/interpreter/StackVisitor.h')
-rw-r--r-- | Source/JavaScriptCore/interpreter/StackVisitor.h | 108 |
1 files changed, 73 insertions, 35 deletions
diff --git a/Source/JavaScriptCore/interpreter/StackVisitor.h b/Source/JavaScriptCore/interpreter/StackVisitor.h index 990a226b3..81a9c7b74 100644 --- a/Source/JavaScriptCore/interpreter/StackVisitor.h +++ b/Source/JavaScriptCore/interpreter/StackVisitor.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 Apple Inc. All rights reserved. + * Copyright (C) 2013, 2015-2016 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -23,9 +23,11 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef StackVisitor_h -#define StackVisitor_h +#pragma once +#include "VMEntryRecord.h" +#include <functional> +#include <wtf/Indenter.h> #include <wtf/text/WTFString.h> namespace JSC { @@ -33,13 +35,13 @@ namespace JSC { struct CodeOrigin; struct InlineCallFrame; -class Arguments; class CodeBlock; class ExecState; +class JSCell; class JSFunction; -class JSObject; -class JSScope; +class ClonedArguments; class Register; +class RegisterAtOffsetList; typedef ExecState CallFrame; @@ -51,58 +53,70 @@ public: Global, Eval, Function, - Native + Module, + Native, + Wasm }; size_t index() const { return m_index; } size_t argumentCountIncludingThis() const { return m_argumentCountIncludingThis; } + bool callerIsVMEntryFrame() const { return m_callerIsVMEntryFrame; } CallFrame* callerFrame() const { return m_callerFrame; } - JSObject* callee() const { return m_callee; } - JSScope* scope() const { return m_scope; } + JSCell* callee() const { return m_callee; } CodeBlock* codeBlock() const { return m_codeBlock; } unsigned bytecodeOffset() const { return m_bytecodeOffset; } + InlineCallFrame* inlineCallFrame() const { #if ENABLE(DFG_JIT) - InlineCallFrame* inlineCallFrame() const { return m_inlineCallFrame; } + return m_inlineCallFrame; +#else + return nullptr; #endif + } - bool isJSFrame() const { return !!codeBlock(); } -#if ENABLE(DFG_JIT) - bool isInlinedFrame() const { return !!m_inlineCallFrame; } -#endif + bool isNativeFrame() const { return !codeBlock() && !isWasmFrame(); } + bool isInlinedFrame() const { return !!inlineCallFrame(); } + bool isWasmFrame() const; + + JS_EXPORT_PRIVATE String functionName() const; + JS_EXPORT_PRIVATE String sourceURL() const; + JS_EXPORT_PRIVATE String toString() const; - JS_EXPORT_PRIVATE String functionName(); - JS_EXPORT_PRIVATE String sourceURL(); - JS_EXPORT_PRIVATE String toString(); + intptr_t sourceID(); CodeType codeType() const; - JS_EXPORT_PRIVATE void computeLineAndColumn(unsigned& line, unsigned& column); + bool hasLineAndColumnInfo() const; + JS_EXPORT_PRIVATE void computeLineAndColumn(unsigned& line, unsigned& column) const; - Arguments* createArguments(); - Arguments* existingArguments(); + RegisterAtOffsetList* calleeSaveRegisters(); + + ClonedArguments* createArguments(); + VMEntryFrame* vmEntryFrame() const { return m_VMEntryFrame; } CallFrame* callFrame() const { return m_callFrame; } -#ifndef NDEBUG - JS_EXPORT_PRIVATE void print(int indentLevel); -#endif + void dump(PrintStream&, Indenter = Indenter()) const; + void dump(PrintStream&, Indenter, std::function<void(PrintStream&)> prefix) const; private: Frame() { } ~Frame() { } - void retrieveExpressionInfo(int& divot, int& startOffset, int& endOffset, unsigned& line, unsigned& column); + void retrieveExpressionInfo(int& divot, int& startOffset, int& endOffset, unsigned& line, unsigned& column) const; void setToEnd(); - size_t m_index; - size_t m_argumentCountIncludingThis; - CallFrame* m_callerFrame; - JSObject* m_callee; - JSScope* m_scope; - CodeBlock* m_codeBlock; - unsigned m_bytecodeOffset; #if ENABLE(DFG_JIT) InlineCallFrame* m_inlineCallFrame; #endif CallFrame* m_callFrame; + VMEntryFrame* m_VMEntryFrame; + VMEntryFrame* m_CallerVMEntryFrame; + CallFrame* m_callerFrame; + JSCell* m_callee; + CodeBlock* m_codeBlock; + size_t m_index; + size_t m_argumentCountIncludingThis; + unsigned m_bytecodeOffset; + bool m_callerIsVMEntryFrame : 1; + bool m_isWasmFrame : 1; friend class StackVisitor; }; @@ -113,10 +127,10 @@ public: }; // StackVisitor::visit() expects a Functor that implements the following method: - // Status operator()(StackVisitor&); + // Status operator()(StackVisitor&) const; template <typename Functor> - static void visit(CallFrame* startFrame, Functor& functor) + static void visit(CallFrame* startFrame, const Functor& functor) { StackVisitor visitor(startFrame); while (visitor->callFrame()) { @@ -129,6 +143,7 @@ public: Frame& operator*() { return m_frame; } ALWAYS_INLINE Frame* operator->() { return &m_frame; } + void unwindToMachineCodeBlockFrame(); private: JS_EXPORT_PRIVATE StackVisitor(CallFrame* startFrame); @@ -144,7 +159,30 @@ private: Frame m_frame; }; -} // namespace JSC +class CallerFunctor { +public: + CallerFunctor() + : m_hasSkippedFirstFrame(false) + , m_callerFrame(0) + { + } + + CallFrame* callerFrame() const { return m_callerFrame; } -#endif // StackVisitor_h + StackVisitor::Status operator()(StackVisitor& visitor) const + { + if (!m_hasSkippedFirstFrame) { + m_hasSkippedFirstFrame = true; + return StackVisitor::Continue; + } + m_callerFrame = visitor->callFrame(); + return StackVisitor::Done; + } + +private: + mutable bool m_hasSkippedFirstFrame; + mutable CallFrame* m_callerFrame; +}; + +} // namespace JSC |