summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/interpreter/StackVisitor.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/interpreter/StackVisitor.h
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/JavaScriptCore/interpreter/StackVisitor.h')
-rw-r--r--Source/JavaScriptCore/interpreter/StackVisitor.h108
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