| Index: src/frames.h
|
| diff --git a/src/frames.h b/src/frames.h
|
| index 0e48a4ac7a594ff3aecd2b442314608898df56d3..860868b2c75fb8cc5be3266925e7dd27ec748947 100644
|
| --- a/src/frames.h
|
| +++ b/src/frames.h
|
| @@ -103,9 +103,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_INTERPRETED, WasmInterpretedFrame) \
|
| V(INTERPRETED, InterpretedFrame) \
|
| V(STUB, StubFrame) \
|
| V(STUB_FAILURE_TRAMPOLINE, StubFailureTrampolineFrame) \
|
| @@ -416,7 +417,8 @@ 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_interpreted() const { return type() == WASM_INTERPRETED; }
|
| bool is_wasm_to_js() const { return type() == WASM_TO_JS; }
|
| bool is_js_to_wasm() const { return type() == JS_TO_WASM; }
|
| bool is_arguments_adaptor() const { return type() == ARGUMENTS_ADAPTOR; }
|
| @@ -433,6 +435,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_INTERPRETED;
|
| + }
|
|
|
| // Accessors.
|
| Address sp() const { return state_.sp; }
|
| @@ -643,37 +649,51 @@ class ExitFrame: public StackFrame {
|
| friend class StackFrameIteratorBase;
|
| };
|
|
|
| -class JavaScriptFrame;
|
| +class StandardFrame;
|
|
|
| class FrameSummary BASE_EMBEDDED {
|
| public:
|
| - // Mode for JavaScriptFrame::Summarize. Exact summary is required to produce
|
| + // Mode for StandardFrame::Summarize. Exact summary is required to produce
|
| // an exact stack trace. It will trigger an assertion failure if that is not
|
| // possible, e.g., because of missing deoptimization information. The
|
| // approximate mode should produce a summary even without deoptimization
|
| // information, but it might miss frames.
|
| enum Mode { kExactSummary, kApproximateSummary };
|
| + enum Flags { kNone = 0, kIsConstructor = 1 << 0, kIsWasm = 1 << 1 };
|
|
|
| + // Constructor for JavaScript frame summaries.
|
| FrameSummary(Object* receiver, JSFunction* function,
|
| AbstractCode* abstract_code, int code_offset,
|
| bool is_constructor, Mode mode = kExactSummary);
|
| + // Constructor for Wasm frame summaries.
|
| + FrameSummary(Object* wasm_object, int function_index,
|
| + AbstractCode* abstract_code, int code_offset,
|
| + Mode mode = kExactSummary);
|
|
|
| - static FrameSummary GetFirst(JavaScriptFrame* frame);
|
| + static FrameSummary GetFirst(StandardFrame* frame);
|
| + static FrameSummary GetLast(StandardFrame* frame);
|
|
|
| - Handle<Object> receiver() { return receiver_; }
|
| - Handle<JSFunction> function() { return function_; }
|
| + inline Handle<Object> receiver();
|
| + inline Handle<Object> wasm_object();
|
| + inline Handle<JSFunction> function();
|
| + Script* script();
|
| + inline int wasm_function_index();
|
| Handle<AbstractCode> abstract_code() { return abstract_code_; }
|
| int code_offset() { return code_offset_; }
|
| - bool is_constructor() { return is_constructor_; }
|
| + bool is_constructor() { return flags & kIsConstructor; }
|
| + inline bool is_subject_to_debugging();
|
| +
|
| + bool is_wasm() { return flags & kIsWasm; }
|
| + bool is_javascript() { return !(flags & kIsWasm); }
|
|
|
| void Print();
|
|
|
| private:
|
| Handle<Object> receiver_;
|
| - Handle<JSFunction> function_;
|
| + Handle<Object> function_;
|
| Handle<AbstractCode> abstract_code_;
|
| int code_offset_;
|
| - bool is_constructor_;
|
| + Flags flags;
|
| };
|
|
|
| class StandardFrame : public StackFrame {
|
| @@ -685,6 +705,7 @@ class StandardFrame : public StackFrame {
|
| virtual Object* receiver() const;
|
| virtual Script* script() const;
|
| virtual Object* context() const;
|
| + virtual Object* debug_info(bool create) const;
|
|
|
| // Access the expressions in the stack frame including locals.
|
| inline Object* GetExpression(int index) const;
|
| @@ -700,6 +721,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);
|
| @@ -749,16 +775,16 @@ 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;
|
| Object* receiver() const override;
|
| Object* context() const override;
|
| Script* script() const override;
|
| + Object* debug_info(bool create) const override;
|
|
|
| inline void set_receiver(Object* value);
|
|
|
| @@ -998,8 +1024,6 @@ class BuiltinFrame final : public JavaScriptFrame {
|
|
|
| class WasmFrame : public StandardFrame {
|
| public:
|
| - Type type() const override { return WASM; }
|
| -
|
| // GC support.
|
| void Iterate(ObjectVisitor* v) const override;
|
|
|
| @@ -1011,12 +1035,10 @@ class WasmFrame : public StandardFrame {
|
| Code* unchecked_code() const override;
|
|
|
| // Accessors.
|
| - Object* wasm_obj() const;
|
| - uint32_t function_index() const;
|
| - Script* script() const override;
|
| + virtual Object* wasm_obj() const = 0;
|
|
|
| static WasmFrame* cast(StackFrame* frame) {
|
| - DCHECK(frame->is_wasm());
|
| + DCHECK(frame->is_wasm_compiled() || frame->is_wasm_interpreted());
|
| return static_cast<WasmFrame*>(frame);
|
| }
|
|
|
| @@ -1029,6 +1051,57 @@ class WasmFrame : public StandardFrame {
|
| friend class StackFrameIteratorBase;
|
| };
|
|
|
| +class WasmCompiledFrame : public WasmFrame {
|
| + public:
|
| + Type type() const override { return WASM_COMPILED; }
|
| +
|
| + // Accessors.
|
| + Object* wasm_obj() const override;
|
| + uint32_t function_index() const;
|
| + Script* script() const override;
|
| + Object* debug_info(bool create) const override;
|
| +
|
| + void Summarize(
|
| + List<FrameSummary>* frames,
|
| + FrameSummary::Mode mode = FrameSummary::kExactSummary) const override;
|
| +
|
| + static WasmCompiledFrame* cast(StackFrame* frame) {
|
| + DCHECK(frame->is_wasm_compiled());
|
| + return static_cast<WasmCompiledFrame*>(frame);
|
| + }
|
| +
|
| + protected:
|
| + inline explicit WasmCompiledFrame(StackFrameIteratorBase* iterator);
|
| +
|
| + private:
|
| + friend class StackFrameIteratorBase;
|
| +};
|
| +
|
| +class WasmInterpretedFrame : public WasmFrame {
|
| + public:
|
| + Type type() const override { return WASM_INTERPRETED; }
|
| +
|
| + // Accessors.
|
| + Object* wasm_obj() const override;
|
| + // Return the debug info for the top-most interpreted function.
|
| + Object* debug_info(bool create) const override;
|
| +
|
| + static WasmInterpretedFrame* cast(StackFrame* frame) {
|
| + DCHECK(frame->is_wasm_interpreted());
|
| + return static_cast<WasmInterpretedFrame*>(frame);
|
| + }
|
| +
|
| + void Summarize(
|
| + List<FrameSummary>* frames,
|
| + FrameSummary::Mode mode = FrameSummary::kExactSummary) const override;
|
| +
|
| + protected:
|
| + inline explicit WasmInterpretedFrame(StackFrameIteratorBase* iterator);
|
| +
|
| + private:
|
| + friend class StackFrameIteratorBase;
|
| +};
|
| +
|
| class WasmToJsFrame : public StubFrame {
|
| public:
|
| Type type() const override { return WASM_TO_JS; }
|
|
|