OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/service.h" | 5 #include "vm/service.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 #include "include/dart_native_api.h" | 8 #include "include/dart_native_api.h" |
9 #include "platform/globals.h" | 9 #include "platform/globals.h" |
10 | 10 |
(...skipping 2970 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2981 int64_t time_origin_micros = | 2981 int64_t time_origin_micros = |
2982 Int64Parameter::Parse(js->LookupParam("timeOriginMicros")); | 2982 Int64Parameter::Parse(js->LookupParam("timeOriginMicros")); |
2983 int64_t time_extent_micros = | 2983 int64_t time_extent_micros = |
2984 Int64Parameter::Parse(js->LookupParam("timeExtentMicros")); | 2984 Int64Parameter::Parse(js->LookupParam("timeExtentMicros")); |
2985 TimelineEventFilter filter(time_origin_micros, time_extent_micros); | 2985 TimelineEventFilter filter(time_origin_micros, time_extent_micros); |
2986 timeline_recorder->PrintJSON(js, &filter); | 2986 timeline_recorder->PrintJSON(js, &filter); |
2987 return true; | 2987 return true; |
2988 } | 2988 } |
2989 | 2989 |
2990 | 2990 |
2991 static const char* const step_enum_names[] = { | |
2992 "None", "Into", "Over", "Out", "Rewind", "OverAsyncSuspension", NULL, | |
2993 }; | |
2994 | |
2995 | |
2996 static const Debugger::ResumeAction step_enum_values[] = { | |
2997 Debugger::kContinue, Debugger::kStepInto, | |
2998 Debugger::kStepOver, Debugger::kStepOut, | |
2999 Debugger::kStepRewind, Debugger::kStepOverAsyncSuspension, | |
3000 Debugger::kContinue, // Default value | |
3001 }; | |
3002 | |
3003 | |
3004 static const MethodParameter* resume_params[] = { | 2991 static const MethodParameter* resume_params[] = { |
3005 RUNNABLE_ISOLATE_PARAMETER, | 2992 RUNNABLE_ISOLATE_PARAMETER, NULL, |
3006 new EnumParameter("step", false, step_enum_names), | |
3007 new UIntParameter("frameIndex", false), NULL, | |
3008 }; | 2993 }; |
3009 | 2994 |
3010 | 2995 |
3011 static bool Resume(Thread* thread, JSONStream* js) { | 2996 static bool Resume(Thread* thread, JSONStream* js) { |
3012 const char* step_param = js->LookupParam("step"); | 2997 const char* step_param = js->LookupParam("step"); |
3013 Debugger::ResumeAction step = Debugger::kContinue; | |
3014 if (step_param != NULL) { | |
3015 step = EnumMapper(step_param, step_enum_names, step_enum_values); | |
3016 } | |
3017 #if defined(TARGET_ARCH_DBC) | |
3018 if (step == Debugger::kStepRewind) { | |
3019 js->PrintError(kCannotResume, | |
3020 "Rewind not yet implemented on this architecture"); | |
3021 return true; | |
3022 } | |
3023 #endif | |
3024 intptr_t frame_index = 1; | |
3025 const char* frame_index_param = js->LookupParam("frameIndex"); | |
3026 if (frame_index_param != NULL) { | |
3027 if (step != Debugger::kStepRewind) { | |
3028 // Only rewind supports the frameIndex parameter. | |
3029 js->PrintError( | |
3030 kInvalidParams, | |
3031 "%s: the 'frameIndex' parameter can only be used when rewinding", | |
3032 js->method()); | |
3033 return true; | |
3034 } | |
3035 frame_index = UIntParameter::Parse(js->LookupParam("frameIndex")); | |
3036 } | |
3037 Isolate* isolate = thread->isolate(); | 2998 Isolate* isolate = thread->isolate(); |
3038 if (isolate->message_handler()->is_paused_on_start()) { | 2999 if (isolate->message_handler()->is_paused_on_start()) { |
3039 // If the user is issuing a 'Over' or an 'Out' step, that is the | 3000 // If the user is issuing a 'Over' or an 'Out' step, that is the |
3040 // same as a regular resume request. | 3001 // same as a regular resume request. |
3041 if (step == Debugger::kStepInto) { | 3002 if ((step_param != NULL) && (strcmp(step_param, "Into") == 0)) { |
3042 isolate->debugger()->EnterSingleStepMode(); | 3003 isolate->debugger()->EnterSingleStepMode(); |
3043 } | 3004 } |
3044 isolate->message_handler()->set_should_pause_on_start(false); | 3005 isolate->message_handler()->set_should_pause_on_start(false); |
3045 isolate->SetResumeRequest(); | 3006 isolate->SetResumeRequest(); |
3046 if (Service::debug_stream.enabled()) { | 3007 if (Service::debug_stream.enabled()) { |
3047 ServiceEvent event(isolate, ServiceEvent::kResume); | 3008 ServiceEvent event(isolate, ServiceEvent::kResume); |
3048 Service::HandleEvent(&event); | 3009 Service::HandleEvent(&event); |
3049 } | 3010 } |
3050 PrintSuccess(js); | 3011 PrintSuccess(js); |
3051 return true; | 3012 return true; |
3052 } | 3013 } |
3053 if (isolate->message_handler()->should_pause_on_start()) { | 3014 if (isolate->message_handler()->should_pause_on_start()) { |
3054 isolate->message_handler()->set_should_pause_on_start(false); | 3015 isolate->message_handler()->set_should_pause_on_start(false); |
3055 isolate->SetResumeRequest(); | 3016 isolate->SetResumeRequest(); |
3056 if (Service::debug_stream.enabled()) { | 3017 if (Service::debug_stream.enabled()) { |
3057 ServiceEvent event(isolate, ServiceEvent::kResume); | 3018 ServiceEvent event(isolate, ServiceEvent::kResume); |
3058 Service::HandleEvent(&event); | 3019 Service::HandleEvent(&event); |
3059 } | 3020 } |
3060 PrintSuccess(js); | 3021 PrintSuccess(js); |
3061 return true; | 3022 return true; |
3062 } | 3023 } |
3063 if (isolate->message_handler()->is_paused_on_exit()) { | 3024 if (isolate->message_handler()->is_paused_on_exit()) { |
3064 isolate->message_handler()->set_should_pause_on_exit(false); | 3025 isolate->message_handler()->set_should_pause_on_exit(false); |
3065 isolate->SetResumeRequest(); | 3026 isolate->SetResumeRequest(); |
3066 // We don't send a resume event because we will be exiting. | 3027 // We don't send a resume event because we will be exiting. |
3067 PrintSuccess(js); | 3028 PrintSuccess(js); |
3068 return true; | 3029 return true; |
3069 } | 3030 } |
3070 if (isolate->debugger()->PauseEvent() == NULL) { | 3031 if (isolate->debugger()->PauseEvent() != NULL) { |
3071 js->PrintError(kIsolateMustBePaused, NULL); | 3032 if (step_param != NULL) { |
| 3033 if (strcmp(step_param, "Into") == 0) { |
| 3034 isolate->debugger()->SetSingleStep(); |
| 3035 } else if (strcmp(step_param, "Over") == 0) { |
| 3036 isolate->debugger()->SetStepOver(); |
| 3037 } else if (strcmp(step_param, "Out") == 0) { |
| 3038 isolate->debugger()->SetStepOut(); |
| 3039 } else if (strcmp(step_param, "OverAsyncSuspension") == 0) { |
| 3040 if (!isolate->debugger()->SetupStepOverAsyncSuspension()) { |
| 3041 js->PrintError(kInvalidParams, |
| 3042 "Isolate must be paused at an async suspension point"); |
| 3043 return true; |
| 3044 } |
| 3045 } else { |
| 3046 PrintInvalidParamError(js, "step"); |
| 3047 return true; |
| 3048 } |
| 3049 } |
| 3050 isolate->SetResumeRequest(); |
| 3051 PrintSuccess(js); |
3072 return true; | 3052 return true; |
3073 } | 3053 } |
3074 | 3054 |
3075 const char* error = NULL; | 3055 js->PrintError(kIsolateMustBePaused, NULL); |
3076 if (!isolate->debugger()->SetResumeAction(step, frame_index, &error)) { | |
3077 js->PrintError(kCannotResume, error); | |
3078 return true; | |
3079 } | |
3080 isolate->SetResumeRequest(); | |
3081 PrintSuccess(js); | |
3082 return true; | 3056 return true; |
3083 } | 3057 } |
3084 | 3058 |
3085 | 3059 |
3086 static const MethodParameter* pause_params[] = { | 3060 static const MethodParameter* pause_params[] = { |
3087 RUNNABLE_ISOLATE_PARAMETER, NULL, | 3061 RUNNABLE_ISOLATE_PARAMETER, NULL, |
3088 }; | 3062 }; |
3089 | 3063 |
3090 | 3064 |
3091 static bool Pause(Thread* thread, JSONStream* js) { | 3065 static bool Pause(Thread* thread, JSONStream* js) { |
(...skipping 1015 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4107 if (strcmp(method_name, method.name) == 0) { | 4081 if (strcmp(method_name, method.name) == 0) { |
4108 return &method; | 4082 return &method; |
4109 } | 4083 } |
4110 } | 4084 } |
4111 return NULL; | 4085 return NULL; |
4112 } | 4086 } |
4113 | 4087 |
4114 #endif // !PRODUCT | 4088 #endif // !PRODUCT |
4115 | 4089 |
4116 } // namespace dart | 4090 } // namespace dart |
OLD | NEW |