| 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 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 865 | 866 |
| 866 void Debug::Break(Arguments args, JavaScriptFrame* frame) { | 867 void Debug::Break(Arguments args, JavaScriptFrame* frame) { |
| 867 Heap* heap = isolate_->heap(); | 868 Heap* heap = isolate_->heap(); |
| 868 HandleScope scope(isolate_); | 869 HandleScope scope(isolate_); |
| 869 DCHECK(args.length() == 0); | 870 DCHECK(args.length() == 0); |
| 870 | 871 |
| 871 // Initialize LiveEdit. | 872 // Initialize LiveEdit. |
| 872 LiveEdit::InitializeThreadLocal(this); | 873 LiveEdit::InitializeThreadLocal(this); |
| 873 | 874 |
| 874 // Just continue if breaks are disabled or debugger cannot be loaded. | 875 // Just continue if breaks are disabled or debugger cannot be loaded. |
| 875 if (break_disabled_) return; | 876 if (break_disabled()) return; |
| 876 | 877 |
| 877 // Enter the debugger. | 878 // Enter the debugger. |
| 878 DebugScope debug_scope(this); | 879 DebugScope debug_scope(this); |
| 879 if (debug_scope.failed()) return; | 880 if (debug_scope.failed()) return; |
| 880 | 881 |
| 881 // Postpone interrupt during breakpoint processing. | 882 // Postpone interrupt during breakpoint processing. |
| 882 PostponeInterruptsScope postpone(isolate_); | 883 PostponeInterruptsScope postpone(isolate_); |
| 883 | 884 |
| 884 // Get the debug info (create it if it does not exist). | 885 // Get the debug info (create it if it does not exist). |
| 885 Handle<SharedFunctionInfo> shared = | 886 Handle<SharedFunctionInfo> shared = |
| (...skipping 1919 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2805 command.Dispose(); | 2806 command.Dispose(); |
| 2806 } | 2807 } |
| 2807 } | 2808 } |
| 2808 } | 2809 } |
| 2809 | 2810 |
| 2810 | 2811 |
| 2811 void Debug::CallEventCallback(v8::DebugEvent event, | 2812 void Debug::CallEventCallback(v8::DebugEvent event, |
| 2812 Handle<Object> exec_state, | 2813 Handle<Object> exec_state, |
| 2813 Handle<Object> event_data, | 2814 Handle<Object> event_data, |
| 2814 v8::Debug::ClientData* client_data) { | 2815 v8::Debug::ClientData* client_data) { |
| 2815 DisableBreak no_break(this, true); | 2816 bool previous = in_debug_event_listener_; |
| 2817 in_debug_event_listener_ = true; |
| 2816 if (event_listener_->IsForeign()) { | 2818 if (event_listener_->IsForeign()) { |
| 2817 // Invoke the C debug event listener. | 2819 // Invoke the C debug event listener. |
| 2818 v8::Debug::EventCallback callback = | 2820 v8::Debug::EventCallback callback = |
| 2819 FUNCTION_CAST<v8::Debug::EventCallback>( | 2821 FUNCTION_CAST<v8::Debug::EventCallback>( |
| 2820 Handle<Foreign>::cast(event_listener_)->foreign_address()); | 2822 Handle<Foreign>::cast(event_listener_)->foreign_address()); |
| 2821 EventDetailsImpl event_details(event, | 2823 EventDetailsImpl event_details(event, |
| 2822 Handle<JSObject>::cast(exec_state), | 2824 Handle<JSObject>::cast(exec_state), |
| 2823 Handle<JSObject>::cast(event_data), | 2825 Handle<JSObject>::cast(event_data), |
| 2824 event_listener_data_, | 2826 event_listener_data_, |
| 2825 client_data); | 2827 client_data); |
| 2826 callback(event_details); | 2828 callback(event_details); |
| 2827 DCHECK(!isolate_->has_scheduled_exception()); | 2829 DCHECK(!isolate_->has_scheduled_exception()); |
| 2828 } else { | 2830 } else { |
| 2829 // Invoke the JavaScript debug event listener. | 2831 // Invoke the JavaScript debug event listener. |
| 2830 DCHECK(event_listener_->IsJSFunction()); | 2832 DCHECK(event_listener_->IsJSFunction()); |
| 2831 Handle<Object> argv[] = { Handle<Object>(Smi::FromInt(event), isolate_), | 2833 Handle<Object> argv[] = { Handle<Object>(Smi::FromInt(event), isolate_), |
| 2832 exec_state, | 2834 exec_state, |
| 2833 event_data, | 2835 event_data, |
| 2834 event_listener_data_ }; | 2836 event_listener_data_ }; |
| 2835 Handle<JSReceiver> global(isolate_->global_proxy()); | 2837 Handle<JSReceiver> global(isolate_->global_proxy()); |
| 2836 Execution::TryCall(Handle<JSFunction>::cast(event_listener_), | 2838 Execution::TryCall(Handle<JSFunction>::cast(event_listener_), |
| 2837 global, arraysize(argv), argv); | 2839 global, arraysize(argv), argv); |
| 2838 } | 2840 } |
| 2841 in_debug_event_listener_ = previous; |
| 2839 } | 2842 } |
| 2840 | 2843 |
| 2841 | 2844 |
| 2842 Handle<Context> Debug::GetDebugContext() { | 2845 Handle<Context> Debug::GetDebugContext() { |
| 2843 DebugScope debug_scope(this); | 2846 DebugScope debug_scope(this); |
| 2844 // The global handle may be destroyed soon after. Return it reboxed. | 2847 // The global handle may be destroyed soon after. Return it reboxed. |
| 2845 return handle(*debug_context(), isolate_); | 2848 return handle(*debug_context(), isolate_); |
| 2846 } | 2849 } |
| 2847 | 2850 |
| 2848 | 2851 |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3082 Handle<Object>(debug_context()->global_proxy(), isolate_), | 3085 Handle<Object>(debug_context()->global_proxy(), isolate_), |
| 3083 arraysize(argv), | 3086 arraysize(argv), |
| 3084 argv); | 3087 argv); |
| 3085 } | 3088 } |
| 3086 | 3089 |
| 3087 | 3090 |
| 3088 void Debug::HandleDebugBreak() { | 3091 void Debug::HandleDebugBreak() { |
| 3089 // Ignore debug break during bootstrapping. | 3092 // Ignore debug break during bootstrapping. |
| 3090 if (isolate_->bootstrapper()->IsActive()) return; | 3093 if (isolate_->bootstrapper()->IsActive()) return; |
| 3091 // Just continue if breaks are disabled. | 3094 // Just continue if breaks are disabled. |
| 3092 if (break_disabled_) return; | 3095 if (break_disabled()) return; |
| 3093 // Ignore debug break if debugger is not active. | 3096 // Ignore debug break if debugger is not active. |
| 3094 if (!is_active()) return; | 3097 if (!is_active()) return; |
| 3095 | 3098 |
| 3096 StackLimitCheck check(isolate_); | 3099 StackLimitCheck check(isolate_); |
| 3097 if (check.HasOverflowed()) return; | 3100 if (check.HasOverflowed()) return; |
| 3098 | 3101 |
| 3099 { JavaScriptFrameIterator it(isolate_); | 3102 { JavaScriptFrameIterator it(isolate_); |
| 3100 DCHECK(!it.done()); | 3103 DCHECK(!it.done()); |
| 3101 Object* fun = it.frame()->function(); | 3104 Object* fun = it.frame()->function(); |
| 3102 if (fun && fun->IsJSFunction()) { | 3105 if (fun && fun->IsJSFunction()) { |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3436 logger_->DebugEvent("Put", message.text()); | 3439 logger_->DebugEvent("Put", message.text()); |
| 3437 } | 3440 } |
| 3438 | 3441 |
| 3439 | 3442 |
| 3440 void LockingCommandMessageQueue::Clear() { | 3443 void LockingCommandMessageQueue::Clear() { |
| 3441 base::LockGuard<base::Mutex> lock_guard(&mutex_); | 3444 base::LockGuard<base::Mutex> lock_guard(&mutex_); |
| 3442 queue_.Clear(); | 3445 queue_.Clear(); |
| 3443 } | 3446 } |
| 3444 | 3447 |
| 3445 } } // namespace v8::internal | 3448 } } // namespace v8::internal |
| OLD | NEW |