Index: src/frames.h |
diff --git a/src/frames.h b/src/frames.h |
index f33eb167414af18081c82864dde237c3f5a46c2e..fe289b28206790d3e71f673c51a5584b21c22d0e 100644 |
--- a/src/frames.h |
+++ b/src/frames.h |
@@ -97,13 +97,13 @@ class StackHandler BASE_EMBEDDED { |
DISALLOW_IMPLICIT_CONSTRUCTORS(StackHandler); |
}; |
- |
#define STACK_FRAME_TYPE_LIST(V) \ |
V(ENTRY, EntryFrame) \ |
V(ENTRY_CONSTRUCT, EntryConstructFrame) \ |
V(EXIT, ExitFrame) \ |
V(JAVA_SCRIPT, JavaScriptFrame) \ |
V(OPTIMIZED, OptimizedFrame) \ |
+ V(WASM, WasmFrame) \ |
V(INTERPRETED, InterpretedFrame) \ |
V(STUB, StubFrame) \ |
V(STUB_FAILURE_TRAMPOLINE, StubFailureTrampolineFrame) \ |
@@ -310,6 +310,7 @@ class StackFrame BASE_EMBEDDED { |
bool is_exit() const { return type() == EXIT; } |
bool is_optimized() const { return type() == OPTIMIZED; } |
bool is_interpreted() const { return type() == INTERPRETED; } |
+ bool is_wasm() const { return type() == WASM; } |
bool is_arguments_adaptor() const { return type() == ARGUMENTS_ADAPTOR; } |
bool is_internal() const { return type() == INTERNAL; } |
bool is_stub_failure_trampoline() const { |
@@ -324,6 +325,11 @@ class StackFrame BASE_EMBEDDED { |
(type == INTERPRETED); |
} |
+ bool is_visible() const { |
+ Type type = this->type(); |
+ return is_java_script() || (type == WASM); |
+ } |
+ |
// Accessors. |
Address sp() const { return state_.sp; } |
Address fp() const { return state_.fp; } |
@@ -617,8 +623,24 @@ class FrameSummary BASE_EMBEDDED { |
bool is_constructor_; |
}; |
+class VisibleFrame : public StandardFrame { |
+ public: |
+ // Build a list with summaries for this frame including all inlined frames. |
+ virtual void Summarize(List<FrameSummary>* frames) = 0; |
-class JavaScriptFrame: public StandardFrame { |
+ static VisibleFrame* cast(StackFrame* frame) { |
+ DCHECK(frame->is_visible()); |
+ return static_cast<VisibleFrame*>(frame); |
+ } |
+ |
+ protected: |
+ inline explicit VisibleFrame(StackFrameIteratorBase* iterator); |
+ |
+ private: |
+ friend class StackFrameIteratorBase; |
+}; |
+ |
+class JavaScriptFrame : public VisibleFrame { |
public: |
Type type() const override { return JAVA_SCRIPT; } |
@@ -673,7 +695,7 @@ class JavaScriptFrame: public StandardFrame { |
virtual void GetFunctions(List<JSFunction*>* functions) const; |
// Build a list with summaries for this frame including all inlined frames. |
- virtual void Summarize(List<FrameSummary>* frames); |
+ void Summarize(List<FrameSummary>* frames) override; |
// Lookup exception handler for current {pc}, returns -1 if none found. Also |
// returns data associated with the handler site specific to the frame type: |
@@ -841,6 +863,30 @@ class ArgumentsAdaptorFrame: public JavaScriptFrame { |
friend class StackFrameIteratorBase; |
}; |
+class WasmFrame : public VisibleFrame { |
+ public: |
+ Type type() const override { return WASM; } |
+ |
+ // GC support. |
+ void Iterate(ObjectVisitor* v) const override; |
+ |
+ // Printing support. |
+ void Print(StringStream* accumulator, PrintMode mode, |
+ int index) const override; |
+ |
+ // Determine the code for the frame. |
+ Code* unchecked_code() const override; |
+ |
+ void Summarize(List<FrameSummary>* frames) override; |
+ |
+ protected: |
+ inline explicit WasmFrame(StackFrameIteratorBase* iterator); |
+ |
+ Address GetCallerStackPointer() const override; |
+ |
+ private: |
+ friend class StackFrameIteratorBase; |
+}; |
class InternalFrame: public StandardFrame { |
public: |
@@ -974,9 +1020,25 @@ class StackFrameIterator: public StackFrameIteratorBase { |
DISALLOW_COPY_AND_ASSIGN(StackFrameIterator); |
}; |
+// Iterator that supports iterating through all Visible frames. |
+class VisibleFrameIterator BASE_EMBEDDED { |
+ public: |
+ inline explicit VisibleFrameIterator(Isolate* isolate); |
+ |
+ inline VisibleFrame* frame() const; |
+ |
+ bool done() const { return iterator_.done(); } |
+ void Advance(); |
+ |
+ protected: |
+ struct NoAdvance {}; // Sentinel: construct iterator_, but don't advance it. |
+ inline VisibleFrameIterator(Isolate* isolate, NoAdvance); |
+ inline VisibleFrameIterator(Isolate* isolate, ThreadLocalTop* top, NoAdvance); |
+ StackFrameIterator iterator_; |
+}; |
// Iterator that supports iterating through all JavaScript frames. |
-class JavaScriptFrameIterator BASE_EMBEDDED { |
+class JavaScriptFrameIterator : public VisibleFrameIterator { |
public: |
inline explicit JavaScriptFrameIterator(Isolate* isolate); |
inline JavaScriptFrameIterator(Isolate* isolate, ThreadLocalTop* top); |
@@ -985,16 +1047,12 @@ class JavaScriptFrameIterator BASE_EMBEDDED { |
inline JavaScriptFrame* frame() const; |
- bool done() const { return iterator_.done(); } |
void Advance(); |
// Advance to the frame holding the arguments for the current |
// frame. This only affects the current frame if it has adapted |
// arguments. |
void AdvanceToArgumentsFrame(); |
- |
- private: |
- StackFrameIterator iterator_; |
}; |