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 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/api.h" | 7 #include "src/api.h" |
8 #include "src/arguments.h" | 8 #include "src/arguments.h" |
9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 22 matching lines...) Expand all Loading... |
33 event_listener_data_(Handle<Object>()), | 33 event_listener_data_(Handle<Object>()), |
34 message_handler_(NULL), | 34 message_handler_(NULL), |
35 command_received_(0), | 35 command_received_(0), |
36 command_queue_(isolate->logger(), kQueueInitialSize), | 36 command_queue_(isolate->logger(), kQueueInitialSize), |
37 event_command_queue_(isolate->logger(), kQueueInitialSize), | 37 event_command_queue_(isolate->logger(), kQueueInitialSize), |
38 is_active_(false), | 38 is_active_(false), |
39 is_suppressed_(false), | 39 is_suppressed_(false), |
40 live_edit_enabled_(true), // TODO(yangguo): set to false by default. | 40 live_edit_enabled_(true), // TODO(yangguo): set to false by default. |
41 has_break_points_(false), | 41 has_break_points_(false), |
42 break_disabled_(false), | 42 break_disabled_(false), |
| 43 in_debug_event_listener_(false), |
43 break_on_exception_(false), | 44 break_on_exception_(false), |
44 break_on_uncaught_exception_(false), | 45 break_on_uncaught_exception_(false), |
45 script_cache_(NULL), | 46 script_cache_(NULL), |
46 debug_info_list_(NULL), | 47 debug_info_list_(NULL), |
47 isolate_(isolate) { | 48 isolate_(isolate) { |
48 ThreadInit(); | 49 ThreadInit(); |
49 } | 50 } |
50 | 51 |
51 | 52 |
52 static v8::Handle<v8::Context> GetDebugEventContext(Isolate* isolate) { | 53 static v8::Handle<v8::Context> GetDebugEventContext(Isolate* isolate) { |
(...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
857 | 858 |
858 void Debug::Break(Arguments args, JavaScriptFrame* frame) { | 859 void Debug::Break(Arguments args, JavaScriptFrame* frame) { |
859 Heap* heap = isolate_->heap(); | 860 Heap* heap = isolate_->heap(); |
860 HandleScope scope(isolate_); | 861 HandleScope scope(isolate_); |
861 DCHECK(args.length() == 0); | 862 DCHECK(args.length() == 0); |
862 | 863 |
863 // Initialize LiveEdit. | 864 // Initialize LiveEdit. |
864 LiveEdit::InitializeThreadLocal(this); | 865 LiveEdit::InitializeThreadLocal(this); |
865 | 866 |
866 // Just continue if breaks are disabled or debugger cannot be loaded. | 867 // Just continue if breaks are disabled or debugger cannot be loaded. |
867 if (break_disabled_) return; | 868 if (break_disabled()) return; |
868 | 869 |
869 // Enter the debugger. | 870 // Enter the debugger. |
870 DebugScope debug_scope(this); | 871 DebugScope debug_scope(this); |
871 if (debug_scope.failed()) return; | 872 if (debug_scope.failed()) return; |
872 | 873 |
873 // Postpone interrupt during breakpoint processing. | 874 // Postpone interrupt during breakpoint processing. |
874 PostponeInterruptsScope postpone(isolate_); | 875 PostponeInterruptsScope postpone(isolate_); |
875 | 876 |
876 // Get the debug info (create it if it does not exist). | 877 // Get the debug info (create it if it does not exist). |
877 Handle<SharedFunctionInfo> shared = | 878 Handle<SharedFunctionInfo> shared = |
(...skipping 1896 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2774 command.Dispose(); | 2775 command.Dispose(); |
2775 } | 2776 } |
2776 } | 2777 } |
2777 } | 2778 } |
2778 | 2779 |
2779 | 2780 |
2780 void Debug::CallEventCallback(v8::DebugEvent event, | 2781 void Debug::CallEventCallback(v8::DebugEvent event, |
2781 Handle<Object> exec_state, | 2782 Handle<Object> exec_state, |
2782 Handle<Object> event_data, | 2783 Handle<Object> event_data, |
2783 v8::Debug::ClientData* client_data) { | 2784 v8::Debug::ClientData* client_data) { |
2784 DisableBreak no_break(this, true); | 2785 bool previous = in_debug_event_listener_; |
| 2786 in_debug_event_listener_ = true; |
2785 if (event_listener_->IsForeign()) { | 2787 if (event_listener_->IsForeign()) { |
2786 // Invoke the C debug event listener. | 2788 // Invoke the C debug event listener. |
2787 v8::Debug::EventCallback callback = | 2789 v8::Debug::EventCallback callback = |
2788 FUNCTION_CAST<v8::Debug::EventCallback>( | 2790 FUNCTION_CAST<v8::Debug::EventCallback>( |
2789 Handle<Foreign>::cast(event_listener_)->foreign_address()); | 2791 Handle<Foreign>::cast(event_listener_)->foreign_address()); |
2790 EventDetailsImpl event_details(event, | 2792 EventDetailsImpl event_details(event, |
2791 Handle<JSObject>::cast(exec_state), | 2793 Handle<JSObject>::cast(exec_state), |
2792 Handle<JSObject>::cast(event_data), | 2794 Handle<JSObject>::cast(event_data), |
2793 event_listener_data_, | 2795 event_listener_data_, |
2794 client_data); | 2796 client_data); |
2795 callback(event_details); | 2797 callback(event_details); |
2796 DCHECK(!isolate_->has_scheduled_exception()); | 2798 DCHECK(!isolate_->has_scheduled_exception()); |
2797 } else { | 2799 } else { |
2798 // Invoke the JavaScript debug event listener. | 2800 // Invoke the JavaScript debug event listener. |
2799 DCHECK(event_listener_->IsJSFunction()); | 2801 DCHECK(event_listener_->IsJSFunction()); |
2800 Handle<Object> argv[] = { Handle<Object>(Smi::FromInt(event), isolate_), | 2802 Handle<Object> argv[] = { Handle<Object>(Smi::FromInt(event), isolate_), |
2801 exec_state, | 2803 exec_state, |
2802 event_data, | 2804 event_data, |
2803 event_listener_data_ }; | 2805 event_listener_data_ }; |
2804 Handle<JSReceiver> global(isolate_->global_proxy()); | 2806 Handle<JSReceiver> global(isolate_->global_proxy()); |
2805 Execution::TryCall(Handle<JSFunction>::cast(event_listener_), | 2807 Execution::TryCall(Handle<JSFunction>::cast(event_listener_), |
2806 global, arraysize(argv), argv); | 2808 global, arraysize(argv), argv); |
2807 } | 2809 } |
| 2810 in_debug_event_listener_ = previous; |
2808 } | 2811 } |
2809 | 2812 |
2810 | 2813 |
2811 Handle<Context> Debug::GetDebugContext() { | 2814 Handle<Context> Debug::GetDebugContext() { |
2812 DebugScope debug_scope(this); | 2815 DebugScope debug_scope(this); |
2813 // The global handle may be destroyed soon after. Return it reboxed. | 2816 // The global handle may be destroyed soon after. Return it reboxed. |
2814 return handle(*debug_context(), isolate_); | 2817 return handle(*debug_context(), isolate_); |
2815 } | 2818 } |
2816 | 2819 |
2817 | 2820 |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3051 Handle<Object>(debug_context()->global_proxy(), isolate_), | 3054 Handle<Object>(debug_context()->global_proxy(), isolate_), |
3052 arraysize(argv), | 3055 arraysize(argv), |
3053 argv); | 3056 argv); |
3054 } | 3057 } |
3055 | 3058 |
3056 | 3059 |
3057 void Debug::HandleDebugBreak() { | 3060 void Debug::HandleDebugBreak() { |
3058 // Ignore debug break during bootstrapping. | 3061 // Ignore debug break during bootstrapping. |
3059 if (isolate_->bootstrapper()->IsActive()) return; | 3062 if (isolate_->bootstrapper()->IsActive()) return; |
3060 // Just continue if breaks are disabled. | 3063 // Just continue if breaks are disabled. |
3061 if (break_disabled_) return; | 3064 if (break_disabled()) return; |
3062 // Ignore debug break if debugger is not active. | 3065 // Ignore debug break if debugger is not active. |
3063 if (!is_active()) return; | 3066 if (!is_active()) return; |
3064 | 3067 |
3065 StackLimitCheck check(isolate_); | 3068 StackLimitCheck check(isolate_); |
3066 if (check.HasOverflowed()) return; | 3069 if (check.HasOverflowed()) return; |
3067 | 3070 |
3068 { JavaScriptFrameIterator it(isolate_); | 3071 { JavaScriptFrameIterator it(isolate_); |
3069 DCHECK(!it.done()); | 3072 DCHECK(!it.done()); |
3070 Object* fun = it.frame()->function(); | 3073 Object* fun = it.frame()->function(); |
3071 if (fun && fun->IsJSFunction()) { | 3074 if (fun && fun->IsJSFunction()) { |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3405 logger_->DebugEvent("Put", message.text()); | 3408 logger_->DebugEvent("Put", message.text()); |
3406 } | 3409 } |
3407 | 3410 |
3408 | 3411 |
3409 void LockingCommandMessageQueue::Clear() { | 3412 void LockingCommandMessageQueue::Clear() { |
3410 base::LockGuard<base::Mutex> lock_guard(&mutex_); | 3413 base::LockGuard<base::Mutex> lock_guard(&mutex_); |
3411 queue_.Clear(); | 3414 queue_.Clear(); |
3412 } | 3415 } |
3413 | 3416 |
3414 } } // namespace v8::internal | 3417 } } // namespace v8::internal |
OLD | NEW |