Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(648)

Unified Diff: src/frames.h

Issue 2619353006: Refactor FrameSummary for JS and Wasm frames (Closed)
Patch Set: Address comment Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/debug/debug-frames.cc ('k') | src/frames.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/frames.h
diff --git a/src/frames.h b/src/frames.h
index a51afbb8e5e8fef9012cfc2d772e37d50f139474..572e90792e8783049eceec88aa0ee6801445aee0 100644
--- a/src/frames.h
+++ b/src/frames.h
@@ -748,26 +748,154 @@ class FrameSummary BASE_EMBEDDED {
// information, but it might miss frames.
enum Mode { kExactSummary, kApproximateSummary };
- FrameSummary(Object* receiver, JSFunction* function,
- AbstractCode* abstract_code, int code_offset,
- bool is_constructor, Mode mode = kExactSummary);
+// Subclasses for the different summary kinds:
+#define FRAME_SUMMARY_VARIANTS(F) \
+ F(JAVA_SCRIPT, JavaScriptFrameSummary, java_script_summary_, JavaScript) \
+ F(WASM_COMPILED, WasmCompiledFrameSummary, wasm_compiled_summary_, \
+ WasmCompiled) \
+ F(WASM_INTERPRETED, WasmInterpretedFrameSummary, wasm_interpreted_summary_, \
+ WasmInterpreted)
+
+#define FRAME_SUMMARY_KIND(kind, type, field, desc) kind,
+ enum Kind { FRAME_SUMMARY_VARIANTS(FRAME_SUMMARY_KIND) };
+#undef FRAME_SUMMARY_KIND
+
+ class FrameSummaryBase {
+ public:
+ FrameSummaryBase(Isolate* isolate, Kind kind)
+ : isolate_(isolate), kind_(kind) {}
+ Isolate* isolate() const { return isolate_; }
+ Kind kind() const { return kind_; }
+
+ private:
+ Isolate* isolate_;
+ Kind kind_;
+ };
+
+ class JavaScriptFrameSummary : public FrameSummaryBase {
+ public:
+ JavaScriptFrameSummary(Isolate* isolate, Object* receiver,
+ JSFunction* function, AbstractCode* abstract_code,
+ int code_offset, bool is_constructor,
+ Mode mode = kExactSummary);
+
+ Handle<Object> receiver() const { return receiver_; }
+ Handle<JSFunction> function() const { return function_; }
+ Handle<AbstractCode> abstract_code() const { return abstract_code_; }
+ int code_offset() const { return code_offset_; }
+ bool is_constructor() const { return is_constructor_; }
+ bool is_subject_to_debugging() const;
+ int SourcePosition() const;
+ int SourceStatementPosition() const;
+ Handle<Object> script() const;
+ Handle<String> FunctionName() const;
+ Handle<Context> native_context() const;
+
+ private:
+ Handle<Object> receiver_;
+ Handle<JSFunction> function_;
+ Handle<AbstractCode> abstract_code_;
+ int code_offset_;
+ bool is_constructor_;
+ };
+
+ class WasmFrameSummary : public FrameSummaryBase {
+ protected:
+ WasmFrameSummary(Isolate*, Kind, Handle<WasmInstanceObject>,
+ bool at_to_number_conversion);
+
+ public:
+ Handle<Object> receiver() const;
+ uint32_t function_index() const;
+ int byte_offset() const;
+ bool is_constructor() const { return false; }
+ bool is_subject_to_debugging() const { return true; }
+ int SourcePosition() const;
+ int SourceStatementPosition() const { return SourcePosition(); }
+ Handle<Script> script() const;
+ Handle<WasmInstanceObject> wasm_instance() const { return wasm_instance_; }
+ Handle<String> FunctionName() const;
+ Handle<Context> native_context() const;
+ bool at_to_number_conversion() const { return at_to_number_conversion_; }
+
+ private:
+ Handle<WasmInstanceObject> wasm_instance_;
+ bool at_to_number_conversion_;
+ };
+
+ class WasmCompiledFrameSummary : public WasmFrameSummary {
+ public:
+ WasmCompiledFrameSummary(Isolate*, Handle<WasmInstanceObject>, Handle<Code>,
+ int code_offset, bool at_to_number_conversion);
+ uint32_t function_index() const;
+ Handle<Code> code() const { return code_; }
+ int code_offset() const { return code_offset_; }
+ int byte_offset() const;
+
+ private:
+ Handle<Code> code_;
+ int code_offset_;
+ };
- static FrameSummary GetFirst(StandardFrame* frame);
+ class WasmInterpretedFrameSummary : public WasmFrameSummary {
+ public:
+ WasmInterpretedFrameSummary(Isolate*, Handle<WasmInstanceObject>,
+ uint32_t function_index, int byte_offset);
+ uint32_t function_index() const { return function_index_; }
+ int code_offset() const { return byte_offset_; }
+ int byte_offset() const { return byte_offset_; }
+
+ private:
+ uint32_t function_index_;
+ int byte_offset_;
+ };
+
+#undef FRAME_SUMMARY_FIELD
+#define FRAME_SUMMARY_CONS(kind, type, field, desc) \
+ FrameSummary(type summ) : field(summ) {} // NOLINT
+ FRAME_SUMMARY_VARIANTS(FRAME_SUMMARY_CONS)
+#undef FRAME_SUMMARY_CONS
- Handle<Object> receiver() const { return receiver_; }
- Handle<JSFunction> function() const { return function_; }
- Handle<AbstractCode> abstract_code() const { return abstract_code_; }
- int code_offset() const { return code_offset_; }
- bool is_constructor() const { return is_constructor_; }
+ ~FrameSummary();
- void Print();
+ static inline FrameSummary GetFirst(const StandardFrame* frame) {
+ return Get(frame, 0);
+ }
+ static FrameSummary Get(const StandardFrame* frame, int index);
+ static FrameSummary GetSingle(const StandardFrame* frame);
+
+ // Dispatched accessors.
+ Handle<Object> receiver() const;
+ int code_offset() const;
+ bool is_constructor() const;
+ bool is_subject_to_debugging() const;
+ Handle<Object> script() const;
+ int SourcePosition() const;
+ int SourceStatementPosition() const;
+ Handle<String> FunctionName() const;
+ Handle<Context> native_context() const;
+
+#define FRAME_SUMMARY_CAST(kind_, type, field, desc) \
+ bool Is##desc() const { return base_.kind() == kind_; } \
+ const type& As##desc() const { \
+ DCHECK_EQ(base_.kind(), kind_); \
+ return field; \
+ }
+ FRAME_SUMMARY_VARIANTS(FRAME_SUMMARY_CAST)
+#undef FRAME_SUMMARY_CAST
+
+ bool IsWasm() const { return IsWasmCompiled() || IsWasmInterpreted(); }
+ const WasmFrameSummary& AsWasm() const {
+ if (IsWasmCompiled()) return AsWasmCompiled();
+ return AsWasmInterpreted();
+ }
private:
- Handle<Object> receiver_;
- Handle<JSFunction> function_;
- Handle<AbstractCode> abstract_code_;
- int code_offset_;
- bool is_constructor_;
+#define FRAME_SUMMARY_FIELD(kind, type, field, desc) type field;
+ union {
+ FrameSummaryBase base_;
+ FRAME_SUMMARY_VARIANTS(FRAME_SUMMARY_FIELD)
+ };
};
class StandardFrame : public StackFrame {
@@ -1365,9 +1493,6 @@ class StackTraceFrameIterator BASE_EMBEDDED {
inline bool is_javascript() const;
inline bool is_wasm() const;
inline JavaScriptFrame* javascript_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
« no previous file with comments | « src/debug/debug-frames.cc ('k') | src/frames.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698