| 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 |