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

Side by Side Diff: src/debug/debug.h

Issue 2664793002: [debugger] account for inlined functions when stepping. (Closed)
Patch Set: comment addressed Created 3 years, 10 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 unified diff | Download patch
« no previous file with comments | « no previous file | src/debug/debug.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_DEBUG_DEBUG_H_ 5 #ifndef V8_DEBUG_DEBUG_H_
6 #define V8_DEBUG_DEBUG_H_ 6 #define V8_DEBUG_DEBUG_H_
7 7
8 #include "src/allocation.h" 8 #include "src/allocation.h"
9 #include "src/arguments.h" 9 #include "src/arguments.h"
10 #include "src/assembler.h" 10 #include "src/assembler.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 LastStepAction = StepIn 43 LastStepAction = StepIn
44 }; 44 };
45 45
46 // Type of exception break. NOTE: These values are in macros.py as well. 46 // Type of exception break. NOTE: These values are in macros.py as well.
47 enum ExceptionBreakType { 47 enum ExceptionBreakType {
48 BreakException = 0, 48 BreakException = 0,
49 BreakUncaughtException = 1 49 BreakUncaughtException = 1
50 }; 50 };
51 51
52 52
53 // Type of exception break.
54 enum BreakLocatorType { ALL_BREAK_LOCATIONS, CALLS_AND_RETURNS };
55
56
57 // The different types of breakpoint position alignments. 53 // The different types of breakpoint position alignments.
58 // Must match Debug.BreakPositionAlignment in debug.js 54 // Must match Debug.BreakPositionAlignment in debug.js
59 enum BreakPositionAlignment { 55 enum BreakPositionAlignment {
60 STATEMENT_ALIGNED = 0, 56 STATEMENT_ALIGNED = 0,
61 BREAK_POSITION_ALIGNED = 1 57 BREAK_POSITION_ALIGNED = 1
62 }; 58 };
63 59
64 enum DebugBreakType { 60 enum DebugBreakType {
65 NOT_DEBUG_BREAK, 61 NOT_DEBUG_BREAK,
66 DEBUGGER_STATEMENT, 62 DEBUGGER_STATEMENT,
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 DebugBreakType type_; 111 DebugBreakType type_;
116 int position_; 112 int position_;
117 113
118 friend class CodeBreakIterator; 114 friend class CodeBreakIterator;
119 friend class BytecodeArrayBreakIterator; 115 friend class BytecodeArrayBreakIterator;
120 }; 116 };
121 117
122 class BreakIterator { 118 class BreakIterator {
123 public: 119 public:
124 static std::unique_ptr<BreakIterator> GetIterator( 120 static std::unique_ptr<BreakIterator> GetIterator(
125 Handle<DebugInfo> debug_info, Handle<AbstractCode> abstract_code, 121 Handle<DebugInfo> debug_info, Handle<AbstractCode> abstract_code);
126 BreakLocatorType type = ALL_BREAK_LOCATIONS);
127 122
128 virtual ~BreakIterator() {} 123 virtual ~BreakIterator() {}
129 124
130 virtual BreakLocation GetBreakLocation() = 0; 125 virtual BreakLocation GetBreakLocation() = 0;
131 virtual bool Done() const = 0; 126 virtual bool Done() const = 0;
132 virtual void Next() = 0; 127 virtual void Next() = 0;
133 128
134 void SkipTo(int count) { 129 void SkipTo(int count) {
135 while (count-- > 0) Next(); 130 while (count-- > 0) Next();
136 } 131 }
137 132
138 virtual int code_offset() = 0; 133 virtual int code_offset() = 0;
139 int break_index() const { return break_index_; } 134 int break_index() const { return break_index_; }
140 inline int position() const { return position_; } 135 inline int position() const { return position_; }
141 inline int statement_position() const { return statement_position_; } 136 inline int statement_position() const { return statement_position_; }
142 137
143 virtual bool IsDebugBreak() = 0; 138 virtual bool IsDebugBreak() = 0;
144 virtual void ClearDebugBreak() = 0; 139 virtual void ClearDebugBreak() = 0;
145 virtual void SetDebugBreak() = 0; 140 virtual void SetDebugBreak() = 0;
146 141
147 protected: 142 protected:
148 explicit BreakIterator(Handle<DebugInfo> debug_info, 143 explicit BreakIterator(Handle<DebugInfo> debug_info);
149 BreakLocatorType break_locator_type);
150 144
151 int BreakIndexFromPosition(int position, BreakPositionAlignment alignment); 145 int BreakIndexFromPosition(int position, BreakPositionAlignment alignment);
152 146
153 Isolate* isolate() { return debug_info_->GetIsolate(); } 147 Isolate* isolate() { return debug_info_->GetIsolate(); }
154 148
155 Handle<DebugInfo> debug_info_; 149 Handle<DebugInfo> debug_info_;
156 int break_index_; 150 int break_index_;
157 int position_; 151 int position_;
158 int statement_position_; 152 int statement_position_;
159 BreakLocatorType break_locator_type_;
160 153
161 private: 154 private:
162 DisallowHeapAllocation no_gc_; 155 DisallowHeapAllocation no_gc_;
163 DISALLOW_COPY_AND_ASSIGN(BreakIterator); 156 DISALLOW_COPY_AND_ASSIGN(BreakIterator);
164 }; 157 };
165 158
166 class CodeBreakIterator : public BreakIterator { 159 class CodeBreakIterator : public BreakIterator {
167 public: 160 public:
168 CodeBreakIterator(Handle<DebugInfo> debug_info, BreakLocatorType type); 161 explicit CodeBreakIterator(Handle<DebugInfo> debug_info);
169 ~CodeBreakIterator() override {} 162 ~CodeBreakIterator() override {}
170 163
171 BreakLocation GetBreakLocation() override; 164 BreakLocation GetBreakLocation() override;
172 bool Done() const override { return reloc_iterator_.done(); } 165 bool Done() const override { return reloc_iterator_.done(); }
173 void Next() override; 166 void Next() override;
174 167
175 bool IsDebugBreak() override; 168 bool IsDebugBreak() override;
176 void ClearDebugBreak() override; 169 void ClearDebugBreak() override;
177 void SetDebugBreak() override; 170 void SetDebugBreak() override;
178 171
179 void SkipToPosition(int position, BreakPositionAlignment alignment); 172 void SkipToPosition(int position, BreakPositionAlignment alignment);
180 173
181 int code_offset() override { 174 int code_offset() override {
182 return static_cast<int>(rinfo()->pc() - 175 return static_cast<int>(rinfo()->pc() -
183 debug_info_->DebugCode()->instruction_start()); 176 debug_info_->DebugCode()->instruction_start());
184 } 177 }
185 178
186 private: 179 private:
187 int GetModeMask(BreakLocatorType type); 180 int GetModeMask();
188 DebugBreakType GetDebugBreakType(); 181 DebugBreakType GetDebugBreakType();
189 182
190 RelocInfo::Mode rmode() { return reloc_iterator_.rinfo()->rmode(); } 183 RelocInfo::Mode rmode() { return reloc_iterator_.rinfo()->rmode(); }
191 RelocInfo* rinfo() { return reloc_iterator_.rinfo(); } 184 RelocInfo* rinfo() { return reloc_iterator_.rinfo(); }
192 185
193 RelocIterator reloc_iterator_; 186 RelocIterator reloc_iterator_;
194 SourcePositionTableIterator source_position_iterator_; 187 SourcePositionTableIterator source_position_iterator_;
195 DISALLOW_COPY_AND_ASSIGN(CodeBreakIterator); 188 DISALLOW_COPY_AND_ASSIGN(CodeBreakIterator);
196 }; 189 };
197 190
198 class BytecodeArrayBreakIterator : public BreakIterator { 191 class BytecodeArrayBreakIterator : public BreakIterator {
199 public: 192 public:
200 BytecodeArrayBreakIterator(Handle<DebugInfo> debug_info, 193 explicit BytecodeArrayBreakIterator(Handle<DebugInfo> debug_info);
201 BreakLocatorType type);
202 ~BytecodeArrayBreakIterator() override {} 194 ~BytecodeArrayBreakIterator() override {}
203 195
204 BreakLocation GetBreakLocation() override; 196 BreakLocation GetBreakLocation() override;
205 bool Done() const override { return source_position_iterator_.done(); } 197 bool Done() const override { return source_position_iterator_.done(); }
206 void Next() override; 198 void Next() override;
207 199
208 bool IsDebugBreak() override; 200 bool IsDebugBreak() override;
209 void ClearDebugBreak() override; 201 void ClearDebugBreak() override;
210 void SetDebugBreak() override; 202 void SetDebugBreak() override;
211 203
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 342
351 void RunPromiseHook(PromiseHookType type, Handle<JSPromise> promise, 343 void RunPromiseHook(PromiseHookType type, Handle<JSPromise> promise,
352 Handle<Object> parent); 344 Handle<Object> parent);
353 345
354 int NextAsyncTaskId(Handle<JSObject> promise); 346 int NextAsyncTaskId(Handle<JSObject> promise);
355 347
356 bool IsBlackboxed(Handle<SharedFunctionInfo> shared); 348 bool IsBlackboxed(Handle<SharedFunctionInfo> shared);
357 349
358 void SetDebugDelegate(debug::DebugDelegate* delegate); 350 void SetDebugDelegate(debug::DebugDelegate* delegate);
359 351
360 // Returns whether the operation succeeded. Compilation can only be triggered 352 // Returns whether the operation succeeded.
361 // if a valid closure is passed as the second argument, otherwise the shared 353 bool EnsureDebugInfo(Handle<SharedFunctionInfo> shared);
362 // function needs to be compiled already.
363 bool EnsureDebugInfo(Handle<SharedFunctionInfo> shared,
364 Handle<JSFunction> function);
365 void CreateDebugInfo(Handle<SharedFunctionInfo> shared); 354 void CreateDebugInfo(Handle<SharedFunctionInfo> shared);
366 static Handle<DebugInfo> GetDebugInfo(Handle<SharedFunctionInfo> shared); 355 static Handle<DebugInfo> GetDebugInfo(Handle<SharedFunctionInfo> shared);
367 356
368 template <typename C> 357 template <typename C>
369 bool CompileToRevealInnerFunctions(C* compilable); 358 bool CompileToRevealInnerFunctions(C* compilable);
370 359
371 // This function is used in FunctionNameUsing* tests. 360 // This function is used in FunctionNameUsing* tests.
372 Handle<Object> FindSharedFunctionInfoInScript(Handle<Script> script, 361 Handle<Object> FindSharedFunctionInfoInScript(Handle<Script> script,
373 int position); 362 int position);
374 363
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
459 private: 448 private:
460 explicit Debug(Isolate* isolate); 449 explicit Debug(Isolate* isolate);
461 450
462 void UpdateState(); 451 void UpdateState();
463 void UpdateHookOnFunctionCall(); 452 void UpdateHookOnFunctionCall();
464 void Unload(); 453 void Unload();
465 void SetNextBreakId() { 454 void SetNextBreakId() {
466 thread_local_.break_id_ = ++thread_local_.break_count_; 455 thread_local_.break_id_ = ++thread_local_.break_count_;
467 } 456 }
468 457
458 // Return the number of virtual frames below debugger entry.
459 int CurrentFrameCount();
460
469 inline bool ignore_events() const { 461 inline bool ignore_events() const {
470 return is_suppressed_ || !is_active_ || isolate_->needs_side_effect_check(); 462 return is_suppressed_ || !is_active_ || isolate_->needs_side_effect_check();
471 } 463 }
472 inline bool break_disabled() const { 464 inline bool break_disabled() const {
473 return break_disabled_ || in_debug_event_listener_; 465 return break_disabled_ || in_debug_event_listener_;
474 } 466 }
475 467
476 void clear_suspended_generator() { 468 void clear_suspended_generator() {
477 thread_local_.suspended_generator_ = Smi::kZero; 469 thread_local_.suspended_generator_ = Smi::kZero;
478 } 470 }
479 471
480 bool has_suspended_generator() const { 472 bool has_suspended_generator() const {
481 return thread_local_.suspended_generator_ != Smi::kZero; 473 return thread_local_.suspended_generator_ != Smi::kZero;
482 } 474 }
483 475
484 // There are three types of event listeners: C++ message_handler, 476 // There are three types of event listeners: C++ message_handler,
485 // JavaScript event listener and C++ event listener. 477 // JavaScript event listener and C++ event listener.
486 // Currently inspector still uses C++ event listener and installs 478 // Currently inspector still uses C++ event listener and installs
487 // more specific event listeners for part of events. Calling of 479 // more specific event listeners for part of events. Calling of
488 // C++ event listener is redundant when more specific event listener 480 // C++ event listener is redundant when more specific event listener
489 // is presented. Other clients can install JavaScript event listener 481 // is presented. Other clients can install JavaScript event listener
490 // (e.g. some of NodeJS module). 482 // (e.g. some of NodeJS module).
491 bool non_inspector_listener_exists() const { 483 bool non_inspector_listener_exists() const {
492 return !event_listener_.is_null() && !event_listener_->IsForeign(); 484 return !event_listener_.is_null() && !event_listener_->IsForeign();
493 } 485 }
494 486
495 bool IsBlackboxed(SharedFunctionInfo* shared);
496 bool IsExceptionBlackboxed(bool uncaught); 487 bool IsExceptionBlackboxed(bool uncaught);
497 488
498 void OnException(Handle<Object> exception, Handle<Object> promise); 489 void OnException(Handle<Object> exception, Handle<Object> promise);
499 490
500 // Constructors for debug event objects. 491 // Constructors for debug event objects.
501 MUST_USE_RESULT MaybeHandle<Object> MakeExecutionState(); 492 MUST_USE_RESULT MaybeHandle<Object> MakeExecutionState();
502 MUST_USE_RESULT MaybeHandle<Object> MakeBreakEvent( 493 MUST_USE_RESULT MaybeHandle<Object> MakeBreakEvent(
503 Handle<Object> break_points_hit); 494 Handle<Object> break_points_hit);
504 MUST_USE_RESULT MaybeHandle<Object> MakeExceptionEvent( 495 MUST_USE_RESULT MaybeHandle<Object> MakeExceptionEvent(
505 Handle<Object> exception, 496 Handle<Object> exception,
(...skipping 13 matching lines...) Expand all
519 // Find the closest source position for a break point for a given position. 510 // Find the closest source position for a break point for a given position.
520 int FindBreakablePosition(Handle<DebugInfo> debug_info, int source_position, 511 int FindBreakablePosition(Handle<DebugInfo> debug_info, int source_position,
521 BreakPositionAlignment alignment); 512 BreakPositionAlignment alignment);
522 // Instrument code to break at break points. 513 // Instrument code to break at break points.
523 void ApplyBreakPoints(Handle<DebugInfo> debug_info); 514 void ApplyBreakPoints(Handle<DebugInfo> debug_info);
524 // Clear code from instrumentation. 515 // Clear code from instrumentation.
525 void ClearBreakPoints(Handle<DebugInfo> debug_info); 516 void ClearBreakPoints(Handle<DebugInfo> debug_info);
526 // Clear all code from instrumentation. 517 // Clear all code from instrumentation.
527 void ClearAllBreakPoints(); 518 void ClearAllBreakPoints();
528 // Instrument a function with one-shots. 519 // Instrument a function with one-shots.
529 void FloodWithOneShot(Handle<JSFunction> function, 520 void FloodWithOneShot(Handle<SharedFunctionInfo> function);
530 BreakLocatorType type = ALL_BREAK_LOCATIONS);
531 // Clear all one-shot instrumentations, but restore break points. 521 // Clear all one-shot instrumentations, but restore break points.
532 void ClearOneShot(); 522 void ClearOneShot();
533 523
534 void ActivateStepOut(StackFrame* frame); 524 void ActivateStepOut(StackFrame* frame);
535 void RemoveDebugInfoAndClearFromShared(Handle<DebugInfo> debug_info); 525 void RemoveDebugInfoAndClearFromShared(Handle<DebugInfo> debug_info);
536 MaybeHandle<FixedArray> CheckBreakPoints(Handle<DebugInfo> debug_info, 526 MaybeHandle<FixedArray> CheckBreakPoints(Handle<DebugInfo> debug_info,
537 BreakLocation* location, 527 BreakLocation* location,
538 bool* has_break_points = nullptr); 528 bool* has_break_points = nullptr);
539 bool IsMutedAtCurrentLocation(JavaScriptFrame* frame); 529 bool IsMutedAtCurrentLocation(JavaScriptFrame* frame);
540 bool CheckBreakPoint(Handle<Object> break_point_object); 530 bool CheckBreakPoint(Handle<Object> break_point_object);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
600 // Frame id for the frame of the current break. 590 // Frame id for the frame of the current break.
601 StackFrame::Id break_frame_id_; 591 StackFrame::Id break_frame_id_;
602 592
603 // Step action for last step performed. 593 // Step action for last step performed.
604 StepAction last_step_action_; 594 StepAction last_step_action_;
605 595
606 // Source statement position from last step next action. 596 // Source statement position from last step next action.
607 int last_statement_position_; 597 int last_statement_position_;
608 598
609 // Frame pointer from last step next or step frame action. 599 // Frame pointer from last step next or step frame action.
610 Address last_fp_; 600 int last_frame_count_;
611 601
612 // Frame pointer of the target frame we want to arrive at. 602 // Frame pointer of the target frame we want to arrive at.
613 Address target_fp_; 603 int target_frame_count_;
614 604
615 // Value of the accumulator at the point of entering the debugger. 605 // Value of the accumulator at the point of entering the debugger.
616 Object* return_value_; 606 Object* return_value_;
617 607
618 // The suspended generator object to track when stepping. 608 // The suspended generator object to track when stepping.
619 Object* suspended_generator_; 609 Object* suspended_generator_;
620 610
621 // The new frame pointer to drop to when restarting a frame. 611 // The new frame pointer to drop to when restarting a frame.
622 Address restart_fp_; 612 Address restart_fp_;
623 613
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
750 Handle<Code> code); 740 Handle<Code> code);
751 static bool DebugBreakSlotIsPatched(Address pc); 741 static bool DebugBreakSlotIsPatched(Address pc);
752 static void ClearDebugBreakSlot(Isolate* isolate, Address pc); 742 static void ClearDebugBreakSlot(Isolate* isolate, Address pc);
753 }; 743 };
754 744
755 745
756 } // namespace internal 746 } // namespace internal
757 } // namespace v8 747 } // namespace v8
758 748
759 #endif // V8_DEBUG_DEBUG_H_ 749 #endif // V8_DEBUG_DEBUG_H_
OLDNEW
« no previous file with comments | « no previous file | src/debug/debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698