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" |
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 // A number of words that should be reserved on stack for the LiveEdit use. | 483 // A number of words that should be reserved on stack for the LiveEdit use. |
484 // Normally equals 1. Stored on stack in form of Smi. | 484 // Normally equals 1. Stored on stack in form of Smi. |
485 static const int kInitialSize; | 485 static const int kInitialSize; |
486 // A value that padding words are filled with (in form of Smi). Going | 486 // A value that padding words are filled with (in form of Smi). Going |
487 // bottom-top, the first word not having this value is a counter word. | 487 // bottom-top, the first word not having this value is a counter word. |
488 static const int kPaddingValue; | 488 static const int kPaddingValue; |
489 }; | 489 }; |
490 | 490 |
491 private: | 491 private: |
492 explicit Debug(Isolate* isolate); | 492 explicit Debug(Isolate* isolate); |
| 493 ~Debug(); |
493 | 494 |
494 static bool CompileDebuggerScript(Isolate* isolate, int index); | 495 static bool CompileDebuggerScript(Isolate* isolate, int index); |
495 void ClearOneShot(); | 496 void ClearOneShot(); |
496 void ActivateStepIn(StackFrame* frame); | 497 void ActivateStepIn(StackFrame* frame); |
497 void ClearStepIn(); | 498 void ClearStepIn(); |
498 void ActivateStepOut(StackFrame* frame); | 499 void ActivateStepOut(StackFrame* frame); |
499 void ClearStepNext(); | 500 void ClearStepNext(); |
500 // Returns whether the compile succeeded. | 501 // Returns whether the compile succeeded. |
501 void RemoveDebugInfo(Handle<DebugInfo> debug_info); | 502 void RemoveDebugInfo(Handle<DebugInfo> debug_info); |
502 void SetAfterBreakTarget(JavaScriptFrame* frame); | 503 void SetAfterBreakTarget(JavaScriptFrame* frame); |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
735 private: | 736 private: |
736 Logger* logger_; | 737 Logger* logger_; |
737 CommandMessageQueue queue_; | 738 CommandMessageQueue queue_; |
738 mutable Mutex mutex_; | 739 mutable Mutex mutex_; |
739 DISALLOW_COPY_AND_ASSIGN(LockingCommandMessageQueue); | 740 DISALLOW_COPY_AND_ASSIGN(LockingCommandMessageQueue); |
740 }; | 741 }; |
741 | 742 |
742 | 743 |
743 class Debugger { | 744 class Debugger { |
744 public: | 745 public: |
| 746 ~Debugger(); |
| 747 |
| 748 void DebugRequest(const uint16_t* json_request, int length); |
| 749 |
| 750 MUST_USE_RESULT MaybeHandle<Object> MakeJSObject( |
| 751 Vector<const char> constructor_name, |
| 752 int argc, |
| 753 Handle<Object> argv[]); |
| 754 MUST_USE_RESULT MaybeHandle<Object> MakeExecutionState(); |
| 755 MUST_USE_RESULT MaybeHandle<Object> MakeBreakEvent( |
| 756 Handle<Object> break_points_hit); |
| 757 MUST_USE_RESULT MaybeHandle<Object> MakeExceptionEvent( |
| 758 Handle<Object> exception, |
| 759 bool uncaught, |
| 760 Handle<Object> promise); |
| 761 MUST_USE_RESULT MaybeHandle<Object> MakeCompileEvent( |
| 762 Handle<Script> script, bool before); |
| 763 MUST_USE_RESULT MaybeHandle<Object> MakeScriptCollectedEvent(int id); |
| 764 |
745 void OnDebugBreak(Handle<Object> break_points_hit, bool auto_continue); | 765 void OnDebugBreak(Handle<Object> break_points_hit, bool auto_continue); |
746 void OnException(Handle<Object> exception, bool uncaught); | 766 void OnException(Handle<Object> exception, bool uncaught); |
747 void OnBeforeCompile(Handle<Script> script); | 767 void OnBeforeCompile(Handle<Script> script); |
748 | 768 |
749 enum AfterCompileFlags { | 769 enum AfterCompileFlags { |
750 NO_AFTER_COMPILE_FLAGS, | 770 NO_AFTER_COMPILE_FLAGS, |
751 SEND_WHEN_DEBUGGING | 771 SEND_WHEN_DEBUGGING |
752 }; | 772 }; |
753 void OnAfterCompile(Handle<Script> script, | 773 void OnAfterCompile(Handle<Script> script, |
754 AfterCompileFlags after_compile_flags); | 774 AfterCompileFlags after_compile_flags); |
755 void OnScriptCollected(int id); | 775 void OnScriptCollected(int id); |
756 | 776 void ProcessDebugEvent(v8::DebugEvent event, |
| 777 Handle<JSObject> event_data, |
| 778 bool auto_continue); |
| 779 void NotifyMessageHandler(v8::DebugEvent event, |
| 780 Handle<JSObject> exec_state, |
| 781 Handle<JSObject> event_data, |
| 782 bool auto_continue); |
757 void SetEventListener(Handle<Object> callback, Handle<Object> data); | 783 void SetEventListener(Handle<Object> callback, Handle<Object> data); |
758 void SetMessageHandler(v8::Debug::MessageHandler handler); | 784 void SetMessageHandler(v8::Debug::MessageHandler handler); |
759 | 785 |
760 // Add a debugger command to the command queue. | 786 // Add a debugger command to the command queue. |
761 void EnqueueCommandMessage(Vector<const uint16_t> command, | 787 void EnqueueCommandMessage(Vector<const uint16_t> command, |
762 v8::Debug::ClientData* client_data = NULL); | 788 v8::Debug::ClientData* client_data = NULL); |
763 | 789 |
764 // Check whether there are commands in the command queue. | 790 // Check whether there are commands in the command queue. |
765 bool HasCommands(); | 791 bool HasCommands(); |
766 | 792 |
767 // Enqueue a debugger command to the command queue for event listeners. | 793 // Enqueue a debugger command to the command queue for event listeners. |
768 void EnqueueDebugCommand(v8::Debug::ClientData* client_data = NULL); | 794 void EnqueueDebugCommand(v8::Debug::ClientData* client_data = NULL); |
769 | 795 |
770 MUST_USE_RESULT MaybeHandle<Object> Call(Handle<JSFunction> fun, | 796 MUST_USE_RESULT MaybeHandle<Object> Call(Handle<JSFunction> fun, |
771 Handle<Object> data); | 797 Handle<Object> data); |
772 | 798 |
773 Handle<Context> GetDebugContext(); | 799 Handle<Context> GetDebugContext(); |
774 | 800 |
| 801 // Unload the debugger if possible. Only called when no debugger is currently |
| 802 // active. |
| 803 void UnloadDebugger(); |
| 804 friend void ForceUnloadDebugger(); // In test-debug.cc |
| 805 |
| 806 inline bool EventActive() { |
| 807 LockGuard<RecursiveMutex> lock_guard(&debugger_access_); |
| 808 |
| 809 // Check whether the message handler was been cleared. |
| 810 // TODO(yangguo): handle loading and unloading of the debugger differently. |
| 811 if (debugger_unload_pending_) { |
| 812 if (isolate_->debug()->debugger_entry() == NULL) { |
| 813 UnloadDebugger(); |
| 814 } |
| 815 } |
| 816 |
| 817 // Currently argument event is not used. |
| 818 return !ignore_debugger_ && is_active_; |
| 819 } |
| 820 |
775 bool ignore_debugger() const { return ignore_debugger_; } | 821 bool ignore_debugger() const { return ignore_debugger_; } |
776 void set_live_edit_enabled(bool v) { live_edit_enabled_ = v; } | 822 void set_live_edit_enabled(bool v) { live_edit_enabled_ = v; } |
777 bool live_edit_enabled() const { | 823 bool live_edit_enabled() const { |
778 return FLAG_enable_liveedit && live_edit_enabled_ ; | 824 return FLAG_enable_liveedit && live_edit_enabled_ ; |
779 } | 825 } |
780 | 826 |
781 bool is_active() { return is_active_; } | 827 bool is_active() { |
| 828 LockGuard<RecursiveMutex> lock_guard(&debugger_access_); |
| 829 return is_active_; |
| 830 } |
782 | 831 |
783 class IgnoreScope { | 832 class IgnoreScope { |
784 public: | 833 public: |
785 explicit IgnoreScope(Debugger* debugger) | 834 explicit IgnoreScope(Debugger* debugger) |
786 : debugger_(debugger), | 835 : debugger_(debugger), |
787 old_state_(debugger_->ignore_debugger_) { | 836 old_state_(debugger_->ignore_debugger_) { |
788 debugger_->ignore_debugger_ = true; | 837 debugger_->ignore_debugger_ = true; |
789 } | 838 } |
790 | 839 |
791 ~IgnoreScope() { | 840 ~IgnoreScope() { |
792 debugger_->ignore_debugger_ = old_state_; | 841 debugger_->ignore_debugger_ = old_state_; |
793 } | 842 } |
794 | 843 |
795 private: | 844 private: |
796 Debugger* debugger_; | 845 Debugger* debugger_; |
797 bool old_state_; | 846 bool old_state_; |
798 DISALLOW_COPY_AND_ASSIGN(IgnoreScope); | 847 DISALLOW_COPY_AND_ASSIGN(IgnoreScope); |
799 }; | 848 }; |
800 | 849 |
801 private: | 850 private: |
802 explicit Debugger(Isolate* isolate); | 851 explicit Debugger(Isolate* isolate); |
803 ~Debugger(); | |
804 | |
805 MUST_USE_RESULT MaybeHandle<Object> MakeJSObject( | |
806 Vector<const char> constructor_name, | |
807 int argc, | |
808 Handle<Object> argv[]); | |
809 MUST_USE_RESULT MaybeHandle<Object> MakeExecutionState(); | |
810 MUST_USE_RESULT MaybeHandle<Object> MakeBreakEvent( | |
811 Handle<Object> break_points_hit); | |
812 MUST_USE_RESULT MaybeHandle<Object> MakeExceptionEvent( | |
813 Handle<Object> exception, | |
814 bool uncaught, | |
815 Handle<Object> promise); | |
816 MUST_USE_RESULT MaybeHandle<Object> MakeCompileEvent( | |
817 Handle<Script> script, bool before); | |
818 MUST_USE_RESULT MaybeHandle<Object> MakeScriptCollectedEvent(int id); | |
819 | 852 |
820 void CallEventCallback(v8::DebugEvent event, | 853 void CallEventCallback(v8::DebugEvent event, |
821 Handle<Object> exec_state, | 854 Handle<Object> exec_state, |
822 Handle<Object> event_data, | 855 Handle<Object> event_data, |
823 v8::Debug::ClientData* client_data); | 856 v8::Debug::ClientData* client_data); |
824 void CallCEventCallback(v8::DebugEvent event, | 857 void CallCEventCallback(v8::DebugEvent event, |
825 Handle<Object> exec_state, | 858 Handle<Object> exec_state, |
826 Handle<Object> event_data, | 859 Handle<Object> event_data, |
827 v8::Debug::ClientData* client_data); | 860 v8::Debug::ClientData* client_data); |
828 void CallJSEventCallback(v8::DebugEvent event, | 861 void CallJSEventCallback(v8::DebugEvent event, |
829 Handle<Object> exec_state, | 862 Handle<Object> exec_state, |
830 Handle<Object> event_data); | 863 Handle<Object> event_data); |
831 void UpdateState(); | 864 void ListenersChanged(); |
832 | |
833 void ProcessDebugEvent(v8::DebugEvent event, | |
834 Handle<JSObject> event_data, | |
835 bool auto_continue); | |
836 void NotifyMessageHandler(v8::DebugEvent event, | |
837 Handle<JSObject> exec_state, | |
838 Handle<JSObject> event_data, | |
839 bool auto_continue); | |
840 | 865 |
841 // Invoke the message handler function. | 866 // Invoke the message handler function. |
842 void InvokeMessageHandler(MessageImpl message); | 867 void InvokeMessageHandler(MessageImpl message); |
843 | 868 |
844 inline bool EventActive() { | 869 RecursiveMutex debugger_access_; // Mutex guarding debugger variables. |
845 // Check whether the message handler was been cleared. | |
846 // TODO(yangguo): handle loading and unloading of the debugger differently. | |
847 // Currently argument event is not used. | |
848 return !ignore_debugger_ && is_active_; | |
849 } | |
850 | |
851 Handle<Object> event_listener_; // Global handle to listener. | 870 Handle<Object> event_listener_; // Global handle to listener. |
852 Handle<Object> event_listener_data_; | 871 Handle<Object> event_listener_data_; |
853 bool is_active_; | 872 bool is_active_; |
854 bool ignore_debugger_; // Are we temporarily ignoring the debugger? | 873 bool ignore_debugger_; // Are we temporarily ignoring the debugger? |
855 bool live_edit_enabled_; // Enable LiveEdit. | 874 bool live_edit_enabled_; // Enable LiveEdit. |
| 875 bool never_unload_debugger_; // Can we unload the debugger? |
856 v8::Debug::MessageHandler message_handler_; | 876 v8::Debug::MessageHandler message_handler_; |
857 bool debugger_unload_pending_; // Was message handler cleared? | 877 bool debugger_unload_pending_; // Was message handler cleared? |
858 | 878 |
859 static const int kQueueInitialSize = 4; | 879 static const int kQueueInitialSize = 4; |
860 LockingCommandMessageQueue command_queue_; | 880 LockingCommandMessageQueue command_queue_; |
861 Semaphore command_received_; // Signaled for each command received. | 881 Semaphore command_received_; // Signaled for each command received. |
862 LockingCommandMessageQueue event_command_queue_; | 882 LockingCommandMessageQueue event_command_queue_; |
863 | 883 |
864 Isolate* isolate_; | 884 Isolate* isolate_; |
865 | 885 |
(...skipping 18 matching lines...) Expand all Loading... |
884 | 904 |
885 // Check whether there are any JavaScript frames on the stack. | 905 // Check whether there are any JavaScript frames on the stack. |
886 inline bool HasJavaScriptFrames() { return has_js_frames_; } | 906 inline bool HasJavaScriptFrames() { return has_js_frames_; } |
887 | 907 |
888 // Get the active context from before entering the debugger. | 908 // Get the active context from before entering the debugger. |
889 inline Handle<Context> GetContext() { return save_.context(); } | 909 inline Handle<Context> GetContext() { return save_.context(); } |
890 | 910 |
891 private: | 911 private: |
892 Isolate* isolate_; | 912 Isolate* isolate_; |
893 EnterDebugger* prev_; // Previous debugger entry if entered recursively. | 913 EnterDebugger* prev_; // Previous debugger entry if entered recursively. |
894 bool has_js_frames_; // Were there any JavaScript frames? | 914 JavaScriptFrameIterator it_; |
| 915 const bool has_js_frames_; // Were there any JavaScript frames? |
895 StackFrame::Id break_frame_id_; // Previous break frame id. | 916 StackFrame::Id break_frame_id_; // Previous break frame id. |
896 int break_id_; // Previous break id. | 917 int break_id_; // Previous break id. |
897 bool load_failed_; // Did the debugger fail to load? | 918 bool load_failed_; // Did the debugger fail to load? |
898 SaveContext save_; // Saves previous context. | 919 SaveContext save_; // Saves previous context. |
899 }; | 920 }; |
900 | 921 |
901 | 922 |
902 // Stack allocated class for disabling break. | 923 // Stack allocated class for disabling break. |
903 class DisableBreak BASE_EMBEDDED { | 924 class DisableBreak BASE_EMBEDDED { |
904 public: | 925 public: |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
947 } | 968 } |
948 } | 969 } |
949 | 970 |
950 private: | 971 private: |
951 Debug::AddressId id_; | 972 Debug::AddressId id_; |
952 }; | 973 }; |
953 | 974 |
954 } } // namespace v8::internal | 975 } } // namespace v8::internal |
955 | 976 |
956 #endif // V8_DEBUG_H_ | 977 #endif // V8_DEBUG_H_ |
OLD | NEW |