Index: src/frames.h |
diff --git a/src/frames.h b/src/frames.h |
index ef52ec86160b3f3e678a1f45ae176747da23b61b..a51afbb8e5e8fef9012cfc2d772e37d50f139474 100644 |
--- a/src/frames.h |
+++ b/src/frames.h |
@@ -97,9 +97,10 @@ class StackHandler BASE_EMBEDDED { |
V(EXIT, ExitFrame) \ |
V(JAVA_SCRIPT, JavaScriptFrame) \ |
V(OPTIMIZED, OptimizedFrame) \ |
- V(WASM, WasmFrame) \ |
+ V(WASM_COMPILED, WasmCompiledFrame) \ |
V(WASM_TO_JS, WasmToJsFrame) \ |
V(JS_TO_WASM, JsToWasmFrame) \ |
+ V(WASM_INTERPRETER_ENTRY, WasmInterpreterEntryFrame) \ |
V(INTERPRETED, InterpretedFrame) \ |
V(STUB, StubFrame) \ |
V(STUB_FAILURE_TRAMPOLINE, StubFailureTrampolineFrame) \ |
@@ -463,9 +464,12 @@ 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_wasm_compiled() const { return type() == WASM_COMPILED; } |
bool is_wasm_to_js() const { return type() == WASM_TO_JS; } |
bool is_js_to_wasm() const { return type() == JS_TO_WASM; } |
+ bool is_wasm_interpreter_entry() const { |
+ return type() == WASM_INTERPRETER_ENTRY; |
+ } |
bool is_arguments_adaptor() const { return type() == ARGUMENTS_ADAPTOR; } |
bool is_builtin() const { return type() == BUILTIN; } |
bool is_internal() const { return type() == INTERNAL; } |
@@ -481,6 +485,10 @@ class StackFrame BASE_EMBEDDED { |
return (type == JAVA_SCRIPT) || (type == OPTIMIZED) || |
(type == INTERPRETED) || (type == BUILTIN); |
} |
+ bool is_wasm() const { |
+ Type type = this->type(); |
+ return type == WASM_COMPILED || type == WASM_INTERPRETER_ENTRY; |
+ } |
// Accessors. |
Address sp() const { return state_.sp; } |
@@ -729,7 +737,7 @@ class BuiltinExitFrame : public ExitFrame { |
friend class StackFrameIteratorBase; |
}; |
-class JavaScriptFrame; |
+class StandardFrame; |
class FrameSummary BASE_EMBEDDED { |
public: |
@@ -744,7 +752,7 @@ class FrameSummary BASE_EMBEDDED { |
AbstractCode* abstract_code, int code_offset, |
bool is_constructor, Mode mode = kExactSummary); |
- static FrameSummary GetFirst(JavaScriptFrame* frame); |
+ static FrameSummary GetFirst(StandardFrame* frame); |
Handle<Object> receiver() const { return receiver_; } |
Handle<JSFunction> function() const { return function_; } |
@@ -787,6 +795,11 @@ class StandardFrame : public StackFrame { |
// Check if this frame is a constructor frame invoked through 'new'. |
virtual bool IsConstructor() const; |
+ // Build a list with summaries for this frame including all inlined frames. |
+ virtual void Summarize( |
+ List<FrameSummary>* frames, |
+ FrameSummary::Mode mode = FrameSummary::kExactSummary) const; |
+ |
static StandardFrame* cast(StackFrame* frame) { |
DCHECK(frame->is_standard()); |
return static_cast<StandardFrame*>(frame); |
@@ -836,10 +849,9 @@ class JavaScriptFrame : public StandardFrame { |
public: |
Type type() const override { return JAVA_SCRIPT; } |
- // Build a list with summaries for this frame including all inlined frames. |
- virtual void Summarize( |
+ void Summarize( |
List<FrameSummary>* frames, |
- FrameSummary::Mode mode = FrameSummary::kExactSummary) const; |
+ FrameSummary::Mode mode = FrameSummary::kExactSummary) const override; |
// Accessors. |
virtual JSFunction* function() const; |
@@ -1091,9 +1103,9 @@ class BuiltinFrame final : public JavaScriptFrame { |
friend class StackFrameIteratorBase; |
}; |
-class WasmFrame : public StandardFrame { |
+class WasmCompiledFrame : public StandardFrame { |
public: |
- Type type() const override { return WASM; } |
+ Type type() const override { return WASM_COMPILED; } |
// GC support. |
void Iterate(ObjectVisitor* v) const override; |
@@ -1116,13 +1128,53 @@ class WasmFrame : public StandardFrame { |
int position() const override; |
bool at_to_number_conversion() const; |
- static WasmFrame* cast(StackFrame* frame) { |
- DCHECK(frame->is_wasm()); |
- return static_cast<WasmFrame*>(frame); |
+ void Summarize(List<FrameSummary>* frames, |
+ FrameSummary::Mode mode) const override; |
+ |
+ static WasmCompiledFrame* cast(StackFrame* frame) { |
+ DCHECK(frame->is_wasm_compiled()); |
+ return static_cast<WasmCompiledFrame*>(frame); |
+ } |
+ |
+ protected: |
+ inline explicit WasmCompiledFrame(StackFrameIteratorBase* iterator); |
+ |
+ Address GetCallerStackPointer() const override; |
+ |
+ private: |
+ friend class StackFrameIteratorBase; |
+}; |
+ |
+class WasmInterpreterEntryFrame : public StandardFrame { |
+ public: |
+ Type type() const override { return WASM_INTERPRETER_ENTRY; } |
+ |
+ // GC support. |
+ void Iterate(ObjectVisitor* v) const override; |
+ |
+ // Printing support. |
+ void Print(StringStream* accumulator, PrintMode mode, |
+ int index) const override; |
+ |
+ void Summarize( |
+ List<FrameSummary>* frames, |
+ FrameSummary::Mode mode = FrameSummary::kExactSummary) const override; |
+ |
+ // Determine the code for the frame. |
+ Code* unchecked_code() const override; |
+ |
+ // Accessors. |
+ WasmInstanceObject* wasm_instance() const; |
+ Script* script() const override; |
+ int position() const override; |
+ |
+ static WasmInterpreterEntryFrame* cast(StackFrame* frame) { |
+ DCHECK(frame->is_wasm_interpreter_entry()); |
+ return static_cast<WasmInterpreterEntryFrame*>(frame); |
} |
protected: |
- inline explicit WasmFrame(StackFrameIteratorBase* iterator); |
+ inline explicit WasmInterpreterEntryFrame(StackFrameIteratorBase* iterator); |
Address GetCallerStackPointer() const override; |
@@ -1313,7 +1365,9 @@ class StackTraceFrameIterator BASE_EMBEDDED { |
inline bool is_javascript() const; |
inline bool is_wasm() const; |
inline JavaScriptFrame* javascript_frame() const; |
- inline WasmFrame* wasm_frame() const; |
+ // TODO(clemensh): Remove / refactor this for general wasm frames |
+ // (compiled/interpreted). |
+ inline WasmCompiledFrame* wasm_compiled_frame() const; |
// Advance to the frame holding the arguments for the current |
// frame. This only affects the current frame if it is a javascript frame and |