| OLD | NEW |
| 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_H_ | 5 #ifndef V8_DEBUG_H_ |
| 6 #define V8_DEBUG_H_ | 6 #define V8_DEBUG_H_ |
| 7 | 7 |
| 8 #include "allocation.h" | 8 #include "allocation.h" |
| 9 #include "arguments.h" | 9 #include "arguments.h" |
| 10 #include "assembler.h" | 10 #include "assembler.h" |
| 11 #include "execution.h" | 11 #include "execution.h" |
| 12 #include "factory.h" | 12 #include "factory.h" |
| 13 #include "flags.h" | 13 #include "flags.h" |
| 14 #include "frames-inl.h" | 14 #include "frames-inl.h" |
| 15 #include "hashmap.h" | 15 #include "hashmap.h" |
| 16 #include "liveedit.h" | 16 #include "liveedit.h" |
| 17 #include "platform.h" | 17 #include "platform.h" |
| 18 #include "string-stream.h" | 18 #include "string-stream.h" |
| 19 #include "v8threads.h" | 19 #include "v8threads.h" |
| 20 | 20 |
| 21 #include "../include/v8-debug.h" | 21 #include "../include/v8-debug.h" |
| 22 | 22 |
| 23 namespace v8 { | 23 namespace v8 { |
| 24 namespace internal { | 24 namespace internal { |
| 25 | 25 |
| 26 | 26 |
| 27 // Forward declarations. | 27 // Forward declarations. |
| 28 class EnterDebugger; | 28 class DebugScope; |
| 29 | 29 |
| 30 | 30 |
| 31 // Step actions. NOTE: These values are in macros.py as well. | 31 // Step actions. NOTE: These values are in macros.py as well. |
| 32 enum StepAction { | 32 enum StepAction { |
| 33 StepNone = -1, // Stepping not prepared. | 33 StepNone = -1, // Stepping not prepared. |
| 34 StepOut = 0, // Step out of the current function. | 34 StepOut = 0, // Step out of the current function. |
| 35 StepNext = 1, // Step to the next statement in the current function. | 35 StepNext = 1, // Step to the next statement in the current function. |
| 36 StepIn = 2, // Step into new functions invoked or the next statement | 36 StepIn = 2, // Step into new functions invoked or the next statement |
| 37 // in the current function. | 37 // in the current function. |
| 38 StepMin = 3, // Perform a minimum step in the current function. | 38 StepMin = 3, // Perform a minimum step in the current function. |
| (...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 479 static int ArchiveSpacePerThread(); | 479 static int ArchiveSpacePerThread(); |
| 480 void FreeThreadResources() { } | 480 void FreeThreadResources() { } |
| 481 | 481 |
| 482 // Record function from which eval was called. | 482 // Record function from which eval was called. |
| 483 static void RecordEvalCaller(Handle<Script> script); | 483 static void RecordEvalCaller(Handle<Script> script); |
| 484 | 484 |
| 485 // Garbage collection notifications. | 485 // Garbage collection notifications. |
| 486 void AfterGarbageCollection(); | 486 void AfterGarbageCollection(); |
| 487 | 487 |
| 488 // Flags and states. | 488 // Flags and states. |
| 489 EnterDebugger* debugger_entry() { return thread_local_.debugger_entry_; } | 489 DebugScope* debugger_entry() { return thread_local_.current_debug_scope_; } |
| 490 inline Handle<Context> debug_context() { return debug_context_; } | 490 inline Handle<Context> debug_context() { return debug_context_; } |
| 491 void set_live_edit_enabled(bool v) { live_edit_enabled_ = v; } | 491 void set_live_edit_enabled(bool v) { live_edit_enabled_ = v; } |
| 492 bool live_edit_enabled() const { | 492 bool live_edit_enabled() const { |
| 493 return FLAG_enable_liveedit && live_edit_enabled_ ; | 493 return FLAG_enable_liveedit && live_edit_enabled_ ; |
| 494 } | 494 } |
| 495 | 495 |
| 496 inline bool is_active() const { return is_active_; } | 496 inline bool is_active() const { return is_active_; } |
| 497 inline bool is_loaded() const { return !debug_context_.is_null(); } | 497 inline bool is_loaded() const { return !debug_context_.is_null(); } |
| 498 inline bool has_break_points() const { return has_break_points_; } | 498 inline bool has_break_points() const { return has_break_points_; } |
| 499 inline bool is_entered() const { | 499 inline bool in_debug_scope() const { |
| 500 return thread_local_.debugger_entry_ != NULL; | 500 return thread_local_.current_debug_scope_ != NULL; |
| 501 } | 501 } |
| 502 void set_disable_break(bool v) { break_disabled_ = v; } | 502 void set_disable_break(bool v) { break_disabled_ = v; } |
| 503 | 503 |
| 504 StackFrame::Id break_frame_id() { return thread_local_.break_frame_id_; } | 504 StackFrame::Id break_frame_id() { return thread_local_.break_frame_id_; } |
| 505 int break_id() { return thread_local_.break_id_; } | 505 int break_id() { return thread_local_.break_id_; } |
| 506 | 506 |
| 507 // Support for embedding into generated code. | 507 // Support for embedding into generated code. |
| 508 Address after_break_target_address() { | 508 Address after_break_target_address() { |
| 509 return reinterpret_cast<Address>(&after_break_target_); | 509 return reinterpret_cast<Address>(&after_break_target_); |
| 510 } | 510 } |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 570 void ClearOneShot(); | 570 void ClearOneShot(); |
| 571 void ActivateStepIn(StackFrame* frame); | 571 void ActivateStepIn(StackFrame* frame); |
| 572 void ClearStepIn(); | 572 void ClearStepIn(); |
| 573 void ActivateStepOut(StackFrame* frame); | 573 void ActivateStepOut(StackFrame* frame); |
| 574 void ClearStepNext(); | 574 void ClearStepNext(); |
| 575 // Returns whether the compile succeeded. | 575 // Returns whether the compile succeeded. |
| 576 void RemoveDebugInfo(Handle<DebugInfo> debug_info); | 576 void RemoveDebugInfo(Handle<DebugInfo> debug_info); |
| 577 Handle<Object> CheckBreakPoints(Handle<Object> break_point); | 577 Handle<Object> CheckBreakPoints(Handle<Object> break_point); |
| 578 bool CheckBreakPoint(Handle<Object> break_point_object); | 578 bool CheckBreakPoint(Handle<Object> break_point_object); |
| 579 | 579 |
| 580 inline void AssertDebugContext() { |
| 581 ASSERT(isolate_->context() == *debug_context()); |
| 582 ASSERT(in_debug_scope()); |
| 583 } |
| 584 |
| 580 void ThreadInit(); | 585 void ThreadInit(); |
| 581 | 586 |
| 582 // Global handles. | 587 // Global handles. |
| 583 Handle<Context> debug_context_; | 588 Handle<Context> debug_context_; |
| 584 Handle<Object> event_listener_; | 589 Handle<Object> event_listener_; |
| 585 Handle<Object> event_listener_data_; | 590 Handle<Object> event_listener_data_; |
| 586 | 591 |
| 587 v8::Debug::MessageHandler message_handler_; | 592 v8::Debug::MessageHandler message_handler_; |
| 588 | 593 |
| 589 static const int kQueueInitialSize = 4; | 594 static const int kQueueInitialSize = 4; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 604 | 609 |
| 605 // Storage location for jump when exiting debug break calls. | 610 // Storage location for jump when exiting debug break calls. |
| 606 // Note that this address is not GC safe. It should be computed immediately | 611 // Note that this address is not GC safe. It should be computed immediately |
| 607 // before returning to the DebugBreakCallHelper. | 612 // before returning to the DebugBreakCallHelper. |
| 608 Address after_break_target_; | 613 Address after_break_target_; |
| 609 | 614 |
| 610 // Per-thread data. | 615 // Per-thread data. |
| 611 class ThreadLocal { | 616 class ThreadLocal { |
| 612 public: | 617 public: |
| 613 // Top debugger entry. | 618 // Top debugger entry. |
| 614 EnterDebugger* debugger_entry_; | 619 DebugScope* current_debug_scope_; |
| 615 | 620 |
| 616 // Counter for generating next break id. | 621 // Counter for generating next break id. |
| 617 int break_count_; | 622 int break_count_; |
| 618 | 623 |
| 619 // Current break id. | 624 // Current break id. |
| 620 int break_id_; | 625 int break_id_; |
| 621 | 626 |
| 622 // Frame id for the frame of the current break. | 627 // Frame id for the frame of the current break. |
| 623 StackFrame::Id break_frame_id_; | 628 StackFrame::Id break_frame_id_; |
| 624 | 629 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 660 // Due to the possibility of reentry we use a linked list. | 665 // Due to the possibility of reentry we use a linked list. |
| 661 PromiseOnStack* promise_on_stack_; | 666 PromiseOnStack* promise_on_stack_; |
| 662 }; | 667 }; |
| 663 | 668 |
| 664 // Storage location for registers when handling debug break calls | 669 // Storage location for registers when handling debug break calls |
| 665 ThreadLocal thread_local_; | 670 ThreadLocal thread_local_; |
| 666 | 671 |
| 667 Isolate* isolate_; | 672 Isolate* isolate_; |
| 668 | 673 |
| 669 friend class Isolate; | 674 friend class Isolate; |
| 670 friend class EnterDebugger; | 675 friend class DebugScope; |
| 671 friend class FrameDropper; | |
| 672 friend class DisableBreak; | 676 friend class DisableBreak; |
| 673 friend class SuppressDebug; | 677 friend class SuppressDebug; |
| 674 | 678 |
| 675 friend Handle<FixedArray> GetDebuggedFunctions(); // In test-debug.cc | 679 friend Handle<FixedArray> GetDebuggedFunctions(); // In test-debug.cc |
| 676 friend void CheckDebuggerUnloaded(bool check_functions); // In test-debug.cc | 680 friend void CheckDebuggerUnloaded(bool check_functions); // In test-debug.cc |
| 677 | 681 |
| 678 DISALLOW_COPY_AND_ASSIGN(Debug); | 682 DISALLOW_COPY_AND_ASSIGN(Debug); |
| 679 }; | 683 }; |
| 680 | 684 |
| 681 | 685 |
| 682 DECLARE_RUNTIME_FUNCTION(Debug_Break); | 686 DECLARE_RUNTIME_FUNCTION(Debug_Break); |
| 683 | 687 |
| 684 | 688 |
| 685 // This class is used for entering the debugger. Create an instance in the stack | 689 // This scope is used to load and enter the debug context and create a new |
| 686 // to enter the debugger. This will set the current break state, make sure the | 690 // break state. Leaving the scope will restore the previous state. |
| 687 // debugger is loaded and switch to the debugger context. If the debugger for | 691 // On failure to load, FailedToEnter returns true. |
| 688 // some reason could not be entered FailedToEnter will return true. | 692 class DebugScope BASE_EMBEDDED { |
| 689 class EnterDebugger BASE_EMBEDDED { | |
| 690 public: | 693 public: |
| 691 explicit EnterDebugger(Isolate* isolate); | 694 explicit DebugScope(Debug* debug); |
| 692 ~EnterDebugger(); | 695 ~DebugScope(); |
| 693 | 696 |
| 694 // Check whether the debugger could be entered. | 697 // Check whether loading was successful. |
| 695 inline bool FailedToEnter() { return load_failed_; } | 698 inline bool failed() { return failed_; } |
| 696 | 699 |
| 697 // Get the active context from before entering the debugger. | 700 // Get the active context from before entering the debugger. |
| 698 inline Handle<Context> GetContext() { return save_.context(); } | 701 inline Handle<Context> GetContext() { return save_.context(); } |
| 699 | 702 |
| 700 private: | 703 private: |
| 701 Isolate* isolate_; | 704 Isolate* isolate() { return debug_->isolate_; } |
| 702 EnterDebugger* prev_; // Previous debugger entry if entered recursively. | 705 |
| 706 Debug* debug_; |
| 707 DebugScope* prev_; // Previous scope if entered recursively. |
| 703 StackFrame::Id break_frame_id_; // Previous break frame id. | 708 StackFrame::Id break_frame_id_; // Previous break frame id. |
| 704 int break_id_; // Previous break id. | 709 int break_id_; // Previous break id. |
| 705 bool load_failed_; // Did the debugger fail to load? | 710 bool failed_; // Did the debug context fail to load? |
| 706 SaveContext save_; // Saves previous context. | 711 SaveContext save_; // Saves previous context. |
| 707 }; | 712 }; |
| 708 | 713 |
| 709 | 714 |
| 710 // Stack allocated class for disabling break. | 715 // Stack allocated class for disabling break. |
| 711 class DisableBreak BASE_EMBEDDED { | 716 class DisableBreak BASE_EMBEDDED { |
| 712 public: | 717 public: |
| 713 explicit DisableBreak(Debug* debug, bool disable_break) | 718 explicit DisableBreak(Debug* debug, bool disable_break) |
| 714 : debug_(debug), old_state_(debug->break_disabled_) { | 719 : debug_(debug), old_state_(debug->break_disabled_) { |
| 715 debug_->break_disabled_ = disable_break; | 720 debug_->break_disabled_ = disable_break; |
| 716 } | 721 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 759 // several frames above. | 764 // several frames above. |
| 760 // There is no calling conventions here, because it never actually gets | 765 // There is no calling conventions here, because it never actually gets |
| 761 // called, it only gets returned to. | 766 // called, it only gets returned to. |
| 762 static void GenerateFrameDropperLiveEdit(MacroAssembler* masm); | 767 static void GenerateFrameDropperLiveEdit(MacroAssembler* masm); |
| 763 }; | 768 }; |
| 764 | 769 |
| 765 | 770 |
| 766 } } // namespace v8::internal | 771 } } // namespace v8::internal |
| 767 | 772 |
| 768 #endif // V8_DEBUG_H_ | 773 #endif // V8_DEBUG_H_ |
| OLD | NEW |