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 16 matching lines...) Expand all Loading... |
27 namespace v8 { | 27 namespace v8 { |
28 namespace internal { | 28 namespace internal { |
29 | 29 |
30 Debug::Debug(Isolate* isolate) | 30 Debug::Debug(Isolate* isolate) |
31 : debug_context_(Handle<Context>()), | 31 : debug_context_(Handle<Context>()), |
32 event_listener_(Handle<Object>()), | 32 event_listener_(Handle<Object>()), |
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), | |
38 is_active_(false), | 37 is_active_(false), |
39 is_suppressed_(false), | 38 is_suppressed_(false), |
40 live_edit_enabled_(true), // TODO(yangguo): set to false by default. | 39 live_edit_enabled_(true), // TODO(yangguo): set to false by default. |
41 has_break_points_(false), | 40 has_break_points_(false), |
42 break_disabled_(false), | 41 break_disabled_(false), |
43 in_debug_event_listener_(false), | 42 in_debug_event_listener_(false), |
44 break_on_exception_(false), | 43 break_on_exception_(false), |
45 break_on_uncaught_exception_(false), | 44 break_on_uncaught_exception_(false), |
46 script_cache_(NULL), | 45 script_cache_(NULL), |
47 debug_info_list_(NULL), | 46 debug_info_list_(NULL), |
(...skipping 2691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2739 Handle<JSObject>::cast(exec_state), | 2738 Handle<JSObject>::cast(exec_state), |
2740 event_data, | 2739 event_data, |
2741 auto_continue); | 2740 auto_continue); |
2742 } | 2741 } |
2743 // Notify registered debug event listener. This can be either a C or | 2742 // Notify registered debug event listener. This can be either a C or |
2744 // a JavaScript function. Don't call event listener for v8::Break | 2743 // a JavaScript function. Don't call event listener for v8::Break |
2745 // here, if it's only a debug command -- they will be processed later. | 2744 // here, if it's only a debug command -- they will be processed later. |
2746 if ((event != v8::Break || !auto_continue) && !event_listener_.is_null()) { | 2745 if ((event != v8::Break || !auto_continue) && !event_listener_.is_null()) { |
2747 CallEventCallback(event, exec_state, event_data, NULL); | 2746 CallEventCallback(event, exec_state, event_data, NULL); |
2748 } | 2747 } |
2749 // Process pending debug commands. | |
2750 if (event == v8::Break) { | |
2751 while (!event_command_queue_.IsEmpty()) { | |
2752 CommandMessage command = event_command_queue_.Get(); | |
2753 if (!event_listener_.is_null()) { | |
2754 CallEventCallback(v8::BreakForCommand, | |
2755 exec_state, | |
2756 event_data, | |
2757 command.client_data()); | |
2758 } | |
2759 command.Dispose(); | |
2760 } | |
2761 } | |
2762 } | 2748 } |
2763 | 2749 |
2764 | 2750 |
2765 void Debug::CallEventCallback(v8::DebugEvent event, | 2751 void Debug::CallEventCallback(v8::DebugEvent event, |
2766 Handle<Object> exec_state, | 2752 Handle<Object> exec_state, |
2767 Handle<Object> event_data, | 2753 Handle<Object> event_data, |
2768 v8::Debug::ClientData* client_data) { | 2754 v8::Debug::ClientData* client_data) { |
2769 bool previous = in_debug_event_listener_; | 2755 bool previous = in_debug_event_listener_; |
2770 in_debug_event_listener_ = true; | 2756 in_debug_event_listener_ = true; |
2771 if (event_listener_->IsForeign()) { | 2757 if (event_listener_->IsForeign()) { |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3026 client_data); | 3012 client_data); |
3027 isolate_->logger()->DebugTag("Put command on command_queue."); | 3013 isolate_->logger()->DebugTag("Put command on command_queue."); |
3028 command_queue_.Put(message); | 3014 command_queue_.Put(message); |
3029 command_received_.Signal(); | 3015 command_received_.Signal(); |
3030 | 3016 |
3031 // Set the debug command break flag to have the command processed. | 3017 // Set the debug command break flag to have the command processed. |
3032 if (!in_debug_scope()) isolate_->stack_guard()->RequestDebugCommand(); | 3018 if (!in_debug_scope()) isolate_->stack_guard()->RequestDebugCommand(); |
3033 } | 3019 } |
3034 | 3020 |
3035 | 3021 |
3036 void Debug::EnqueueDebugCommand(v8::Debug::ClientData* client_data) { | |
3037 CommandMessage message = CommandMessage::New(Vector<uint16_t>(), client_data); | |
3038 event_command_queue_.Put(message); | |
3039 | |
3040 // Set the debug command break flag to have the command processed. | |
3041 if (!in_debug_scope()) isolate_->stack_guard()->RequestDebugCommand(); | |
3042 } | |
3043 | |
3044 | |
3045 MaybeHandle<Object> Debug::Call(Handle<JSFunction> fun, Handle<Object> data) { | 3022 MaybeHandle<Object> Debug::Call(Handle<JSFunction> fun, Handle<Object> data) { |
3046 DebugScope debug_scope(this); | 3023 DebugScope debug_scope(this); |
3047 if (debug_scope.failed()) return isolate_->factory()->undefined_value(); | 3024 if (debug_scope.failed()) return isolate_->factory()->undefined_value(); |
3048 | 3025 |
3049 // Create the execution state. | 3026 // Create the execution state. |
3050 Handle<Object> exec_state; | 3027 Handle<Object> exec_state; |
3051 if (!MakeExecutionState().ToHandle(&exec_state)) { | 3028 if (!MakeExecutionState().ToHandle(&exec_state)) { |
3052 return isolate_->factory()->undefined_value(); | 3029 return isolate_->factory()->undefined_value(); |
3053 } | 3030 } |
3054 | 3031 |
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3424 logger_->DebugEvent("Put", message.text()); | 3401 logger_->DebugEvent("Put", message.text()); |
3425 } | 3402 } |
3426 | 3403 |
3427 | 3404 |
3428 void LockingCommandMessageQueue::Clear() { | 3405 void LockingCommandMessageQueue::Clear() { |
3429 base::LockGuard<base::Mutex> lock_guard(&mutex_); | 3406 base::LockGuard<base::Mutex> lock_guard(&mutex_); |
3430 queue_.Clear(); | 3407 queue_.Clear(); |
3431 } | 3408 } |
3432 | 3409 |
3433 } } // namespace v8::internal | 3410 } } // namespace v8::internal |
OLD | NEW |