• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2017 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8_OBJECTS_DEBUG_OBJECTS_H_
6 #define V8_OBJECTS_DEBUG_OBJECTS_H_
7 
8 #include <memory>
9 
10 #include "src/base/bit-field.h"
11 #include "src/objects/fixed-array.h"
12 #include "src/objects/objects.h"
13 #include "src/objects/struct.h"
14 #include "torque-generated/bit-fields.h"
15 
16 // Has to be the last include (doesn't have include guards):
17 #include "src/objects/object-macros.h"
18 
19 namespace v8 {
20 namespace internal {
21 
22 class BreakPoint;
23 class BytecodeArray;
24 class StructBodyDescriptor;
25 
26 #include "torque-generated/src/objects/debug-objects-tq.inc"
27 
28 // The DebugInfo class holds additional information for a function being
29 // debugged.
30 class DebugInfo : public TorqueGeneratedDebugInfo<DebugInfo, Struct> {
31  public:
32   NEVER_READ_ONLY_SPACE
33   DEFINE_TORQUE_GENERATED_DEBUG_INFO_FLAGS()
34 
35   // DebugInfo can be detached from the SharedFunctionInfo iff it is empty.
36   bool IsEmpty() const;
37 
38   // --- Debug execution ---
39   // -----------------------
40 
41   enum ExecutionMode : uint8_t {
42     kBreakpoints = 0,
43     kSideEffects = kDebugExecutionMode
44   };
45 
46   // Returns current debug execution mode. Debug execution mode defines by
47   // applied to bytecode patching. False for breakpoints, true for side effect
48   // checks.
49   ExecutionMode DebugExecutionMode() const;
50   void SetDebugExecutionMode(ExecutionMode value);
51 
52   // Specifies whether the associated function has an instrumented bytecode
53   // array. If so, OriginalBytecodeArray returns the non-instrumented bytecode,
54   // and DebugBytecodeArray returns the instrumented bytecode.
55   inline bool HasInstrumentedBytecodeArray();
56 
57   inline BytecodeArray OriginalBytecodeArray();
58   inline BytecodeArray DebugBytecodeArray();
59 
60   // --- Break points ---
61   // --------------------
62 
63   bool HasBreakInfo() const;
64 
65   // Clears all fields related to break points.
66   V8_EXPORT_PRIVATE void ClearBreakInfo(Isolate* isolate);
67 
68   // Accessors to flag whether to break before entering the function.
69   // This is used to break for functions with no source, e.g. builtins.
70   void SetBreakAtEntry();
71   void ClearBreakAtEntry();
72   bool BreakAtEntry() const;
73 
74   // Check if there is a break point at a source position.
75   bool HasBreakPoint(Isolate* isolate, int source_position);
76   // Attempt to clear a break point. Return true if successful.
77   static bool ClearBreakPoint(Isolate* isolate, Handle<DebugInfo> debug_info,
78                               Handle<BreakPoint> break_point);
79   // Set a break point.
80   static void SetBreakPoint(Isolate* isolate, Handle<DebugInfo> debug_info,
81                             int source_position,
82                             Handle<BreakPoint> break_point);
83   // Get the break point objects for a source position.
84   Handle<Object> GetBreakPoints(Isolate* isolate, int source_position);
85   // Find the break point info holding this break point object.
86   static Handle<Object> FindBreakPointInfo(Isolate* isolate,
87                                            Handle<DebugInfo> debug_info,
88                                            Handle<BreakPoint> break_point);
89   // Get the number of break points for this function.
90   int GetBreakPointCount(Isolate* isolate);
91 
92   // Returns whether we should be able to break before entering the function.
93   // This is true for functions with no source, e.g. builtins.
94   bool CanBreakAtEntry() const;
95 
96   // --- Debugger hint flags ---
97   // ---------------------------
98 
99   // Indicates that the function should be skipped during stepping.
100   DECL_BOOLEAN_ACCESSORS(debug_is_blackboxed)
101 
102   // Indicates that |debug_is_blackboxed| has been computed and set.
103   DECL_BOOLEAN_ACCESSORS(computed_debug_is_blackboxed)
104 
105   // Indicates the side effect state.
106   DECL_INT_ACCESSORS(side_effect_state)
107 
108   enum SideEffectState {
109     kNotComputed = 0,
110     kHasSideEffects = 1,
111     kRequiresRuntimeChecks = 2,
112     kHasNoSideEffect = 3,
113   };
114 
115   SideEffectState GetSideEffectState(Isolate* isolate);
116 
117   // Id assigned to the function for debugging.
118   // This could also be implemented as a weak hash table.
119   DECL_INT_ACCESSORS(debugging_id)
120 
121   // Bit positions in |debugger_hints|.
122   DEFINE_TORQUE_GENERATED_DEBUGGER_HINTS()
123 
124   static const int kNoDebuggingId = 0;
125 
126   // --- Block Coverage ---
127   // ----------------------
128 
129   bool HasCoverageInfo() const;
130 
131   // Clears all fields related to block coverage.
132   void ClearCoverageInfo(Isolate* isolate);
133 
134   static const int kEstimatedNofBreakPointsInFunction = 4;
135 
136   using BodyDescriptor = StructBodyDescriptor;
137 
138  private:
139   // Get the break point info object for a source position.
140   Object GetBreakPointInfo(Isolate* isolate, int source_position);
141 
142   TQ_OBJECT_CONSTRUCTORS(DebugInfo)
143 };
144 
145 // The BreakPointInfo class holds information for break points set in a
146 // function. The DebugInfo object holds a BreakPointInfo object for each code
147 // position with one or more break points.
148 class BreakPointInfo
149     : public TorqueGeneratedBreakPointInfo<BreakPointInfo, Struct> {
150  public:
151   // Removes a break point.
152   static void ClearBreakPoint(Isolate* isolate, Handle<BreakPointInfo> info,
153                               Handle<BreakPoint> break_point);
154   // Set a break point.
155   static void SetBreakPoint(Isolate* isolate, Handle<BreakPointInfo> info,
156                             Handle<BreakPoint> break_point);
157   // Check if break point info has this break point.
158   static bool HasBreakPoint(Isolate* isolate, Handle<BreakPointInfo> info,
159                             Handle<BreakPoint> break_point);
160   // Check if break point info has break point with this id.
161   static MaybeHandle<BreakPoint> GetBreakPointById(Isolate* isolate,
162                                                    Handle<BreakPointInfo> info,
163                                                    int breakpoint_id);
164   // Get the number of break points for this code offset.
165   int GetBreakPointCount(Isolate* isolate);
166 
167   int GetStatementPosition(Handle<DebugInfo> debug_info);
168 
169   using BodyDescriptor = StructBodyDescriptor;
170 
171   TQ_OBJECT_CONSTRUCTORS(BreakPointInfo)
172 };
173 
174 // Holds information related to block code coverage.
175 class CoverageInfo
176     : public TorqueGeneratedCoverageInfo<CoverageInfo, HeapObject> {
177  public:
178   void InitializeSlot(int slot_index, int start_pos, int end_pos);
179   void ResetBlockCount(int slot_index);
180 
181   // Computes the size for a CoverageInfo instance of a given length.
SizeFor(int slot_count)182   static int SizeFor(int slot_count) {
183     return OBJECT_POINTER_ALIGN(kHeaderSize + slot_count * Slot::kSize);
184   }
185 
186   // Print debug info.
187   void CoverageInfoPrint(std::ostream& os,
188                          std::unique_ptr<char[]> function_name = nullptr);
189 
190   class BodyDescriptor;  // GC visitor.
191 
192   // Description of layout within each slot.
193   using Slot = TorqueGeneratedCoverageInfoSlotOffsets;
194 
195   TQ_OBJECT_CONSTRUCTORS(CoverageInfo)
196 };
197 
198 // Holds breakpoint related information. This object is used by inspector.
199 class BreakPoint : public TorqueGeneratedBreakPoint<BreakPoint, Struct> {
200  public:
201   using BodyDescriptor = StructBodyDescriptor;
202 
203   TQ_OBJECT_CONSTRUCTORS(BreakPoint)
204 };
205 
206 class StackFrameInfo
207     : public TorqueGeneratedStackFrameInfo<StackFrameInfo, Struct> {
208  public:
209   NEVER_READ_ONLY_SPACE
210 
211   static int GetSourcePosition(Handle<StackFrameInfo> info);
212 
213   // The script for the stack frame.
214   inline Script script() const;
215 
216   // The bytecode offset or source position for the stack frame.
217   DECL_INT_ACCESSORS(bytecode_offset_or_source_position)
218 
219   // Indicates that the frame corresponds to a 'new' invocation.
220   DECL_BOOLEAN_ACCESSORS(is_constructor)
221 
222   // Dispatched behavior.
223   DECL_VERIFIER(StackFrameInfo)
224 
225   // Bit positions in |flags|.
226   DEFINE_TORQUE_GENERATED_STACK_FRAME_INFO_FLAGS()
227 
228   using BodyDescriptor = StructBodyDescriptor;
229 
230  private:
231   TQ_OBJECT_CONSTRUCTORS(StackFrameInfo)
232 };
233 
234 class ErrorStackData
235     : public TorqueGeneratedErrorStackData<ErrorStackData, Struct> {
236  public:
237   NEVER_READ_ONLY_SPACE
238 
239   inline bool HasFormattedStack() const;
240   DECL_ACCESSORS(formatted_stack, Object)
241   inline bool HasCallSiteInfos() const;
242   DECL_ACCESSORS(call_site_infos, FixedArray)
243 
244   static void EnsureStackFrameInfos(Isolate* isolate,
245                                     Handle<ErrorStackData> error_stack);
246 
247   DECL_VERIFIER(ErrorStackData)
248 
249   using BodyDescriptor = StructBodyDescriptor;
250 
251   TQ_OBJECT_CONSTRUCTORS(ErrorStackData)
252 };
253 
254 class PromiseOnStack
255     : public TorqueGeneratedPromiseOnStack<PromiseOnStack, Struct> {
256  public:
257   NEVER_READ_ONLY_SPACE
258 
259   static MaybeHandle<JSObject> GetPromise(
260       Handle<PromiseOnStack> promise_on_stack);
261 
262   class BodyDescriptor;
263 
264   TQ_OBJECT_CONSTRUCTORS(PromiseOnStack)
265 };
266 
267 }  // namespace internal
268 }  // namespace v8
269 
270 #include "src/objects/object-macros-undef.h"
271 
272 #endif  // V8_OBJECTS_DEBUG_OBJECTS_H_
273