| 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 "platform/globals.h" | 8 #include "platform/globals.h" |
| 9 | 9 |
| 10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
| 11 #include "vm/coverage.h" | 11 #include "vm/coverage.h" |
| 12 #include "vm/cpu.h" | 12 #include "vm/cpu.h" |
| 13 #include "vm/dart_api_impl.h" | 13 #include "vm/dart_api_impl.h" |
| 14 #include "vm/dart_entry.h" | 14 #include "vm/dart_entry.h" |
| 15 #include "vm/debugger.h" | 15 #include "vm/debugger.h" |
| 16 #include "vm/isolate.h" | 16 #include "vm/isolate.h" |
| 17 #include "vm/lockers.h" | 17 #include "vm/lockers.h" |
| 18 #include "vm/message.h" | 18 #include "vm/message.h" |
| 19 #include "vm/message_handler.h" | 19 #include "vm/message_handler.h" |
| 20 #include "vm/native_entry.h" | 20 #include "vm/native_entry.h" |
| 21 #include "vm/native_arguments.h" | 21 #include "vm/native_arguments.h" |
| 22 #include "vm/object.h" | 22 #include "vm/object.h" |
| 23 #include "vm/object_graph.h" | 23 #include "vm/object_graph.h" |
| 24 #include "vm/object_id_ring.h" | 24 #include "vm/object_id_ring.h" |
| 25 #include "vm/object_store.h" | 25 #include "vm/object_store.h" |
| 26 #include "vm/parser.h" | 26 #include "vm/parser.h" |
| 27 #include "vm/port.h" | 27 #include "vm/port.h" |
| 28 #include "vm/profiler_service.h" | 28 #include "vm/profiler_service.h" |
| 29 #include "vm/reusable_handles.h" | 29 #include "vm/reusable_handles.h" |
| 30 #include "vm/service_event.h" |
| 30 #include "vm/service_isolate.h" | 31 #include "vm/service_isolate.h" |
| 31 #include "vm/stack_frame.h" | 32 #include "vm/stack_frame.h" |
| 32 #include "vm/symbols.h" | 33 #include "vm/symbols.h" |
| 33 #include "vm/unicode.h" | 34 #include "vm/unicode.h" |
| 34 #include "vm/version.h" | 35 #include "vm/version.h" |
| 35 | 36 |
| 36 namespace dart { | 37 namespace dart { |
| 37 | 38 |
| 38 DECLARE_FLAG(bool, trace_service); | 39 DECLARE_FLAG(bool, trace_service); |
| 39 DECLARE_FLAG(bool, trace_service_pause_events); | 40 DECLARE_FLAG(bool, trace_service_pause_events); |
| (...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 494 ASSERT(isolate != NULL); | 495 ASSERT(isolate != NULL); |
| 495 InvokeMethod(isolate, msg); | 496 InvokeMethod(isolate, msg); |
| 496 } | 497 } |
| 497 | 498 |
| 498 | 499 |
| 499 bool Service::EventMaskHas(uint32_t mask) { | 500 bool Service::EventMaskHas(uint32_t mask) { |
| 500 return (event_mask_ & mask) != 0; | 501 return (event_mask_ & mask) != 0; |
| 501 } | 502 } |
| 502 | 503 |
| 503 | 504 |
| 505 bool Service::NeedsEvents() { |
| 506 return ServiceIsolate::IsRunning(); |
| 507 } |
| 508 |
| 509 |
| 504 bool Service::NeedsDebuggerEvents() { | 510 bool Service::NeedsDebuggerEvents() { |
| 505 return ServiceIsolate::IsRunning() && EventMaskHas(kEventFamilyDebugMask); | 511 return NeedsEvents() && EventMaskHas(kEventFamilyDebugMask); |
| 506 } | 512 } |
| 507 | 513 |
| 508 | 514 |
| 509 bool Service::NeedsGCEvents() { | 515 bool Service::NeedsGCEvents() { |
| 510 return ServiceIsolate::IsRunning() && EventMaskHas(kEventFamilyGCMask); | 516 return NeedsEvents() && EventMaskHas(kEventFamilyGCMask); |
| 511 } | 517 } |
| 512 | 518 |
| 513 | 519 |
| 514 void Service::SetEventMask(uint32_t mask) { | 520 void Service::SetEventMask(uint32_t mask) { |
| 515 event_mask_ = mask; | 521 event_mask_ = mask; |
| 516 } | 522 } |
| 517 | 523 |
| 518 | 524 |
| 519 void Service::SendEvent(intptr_t eventId, const Object& eventMessage) { | 525 void Service::SendEvent(intptr_t eventId, const Object& eventMessage) { |
| 520 if (!ServiceIsolate::IsRunning()) { | 526 if (!ServiceIsolate::IsRunning()) { |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 | 582 |
| 577 | 583 |
| 578 void Service::HandleGCEvent(GCEvent* event) { | 584 void Service::HandleGCEvent(GCEvent* event) { |
| 579 JSONStream js; | 585 JSONStream js; |
| 580 event->PrintJSON(&js); | 586 event->PrintJSON(&js); |
| 581 const String& message = String::Handle(String::New(js.ToCString())); | 587 const String& message = String::Handle(String::New(js.ToCString())); |
| 582 SendEvent(kEventFamilyGC, message); | 588 SendEvent(kEventFamilyGC, message); |
| 583 } | 589 } |
| 584 | 590 |
| 585 | 591 |
| 586 void Service::HandleDebuggerEvent(DebuggerEvent* event) { | 592 void Service::HandleEvent(ServiceEvent* event) { |
| 587 JSONStream js; | 593 JSONStream js; |
| 588 event->PrintJSON(&js); | 594 event->PrintJSON(&js); |
| 589 const String& message = String::Handle(String::New(js.ToCString())); | 595 const String& message = String::Handle(String::New(js.ToCString())); |
| 590 SendEvent(kEventFamilyDebug, message); | 596 SendEvent(kEventFamilyDebug, message); |
| 591 } | 597 } |
| 592 | 598 |
| 593 | 599 |
| 594 class EmbedderServiceHandler { | 600 class EmbedderServiceHandler { |
| 595 public: | 601 public: |
| 596 explicit EmbedderServiceHandler(const char* name) : name_(NULL), | 602 explicit EmbedderServiceHandler(const char* name) : name_(NULL), |
| (...skipping 1412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2009 | 2015 |
| 2010 | 2016 |
| 2011 static bool Resume(Isolate* isolate, JSONStream* js) { | 2017 static bool Resume(Isolate* isolate, JSONStream* js) { |
| 2012 const char* step_param = js->LookupParam("step"); | 2018 const char* step_param = js->LookupParam("step"); |
| 2013 if (isolate->message_handler()->paused_on_start()) { | 2019 if (isolate->message_handler()->paused_on_start()) { |
| 2014 isolate->message_handler()->set_pause_on_start(false); | 2020 isolate->message_handler()->set_pause_on_start(false); |
| 2015 JSONObject jsobj(js); | 2021 JSONObject jsobj(js); |
| 2016 jsobj.AddProperty("type", "Success"); | 2022 jsobj.AddProperty("type", "Success"); |
| 2017 jsobj.AddProperty("id", ""); | 2023 jsobj.AddProperty("id", ""); |
| 2018 { | 2024 { |
| 2019 DebuggerEvent resumeEvent(isolate, DebuggerEvent::kIsolateResumed); | 2025 ServiceEvent event(isolate, ServiceEvent::kResume); |
| 2020 Service::HandleDebuggerEvent(&resumeEvent); | 2026 Service::HandleEvent(&event); |
| 2021 } | 2027 } |
| 2022 return true; | 2028 return true; |
| 2023 } | 2029 } |
| 2024 if (isolate->message_handler()->paused_on_exit()) { | 2030 if (isolate->message_handler()->paused_on_exit()) { |
| 2025 isolate->message_handler()->set_pause_on_exit(false); | 2031 isolate->message_handler()->set_pause_on_exit(false); |
| 2026 JSONObject jsobj(js); | 2032 JSONObject jsobj(js); |
| 2027 jsobj.AddProperty("type", "Success"); | 2033 jsobj.AddProperty("type", "Success"); |
| 2028 jsobj.AddProperty("id", ""); | 2034 jsobj.AddProperty("id", ""); |
| 2029 // We don't send a resume event because we will be exiting. | 2035 // We don't send a resume event because we will be exiting. |
| 2030 return true; | 2036 return true; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2047 jsobj.AddProperty("type", "Success"); | 2053 jsobj.AddProperty("type", "Success"); |
| 2048 jsobj.AddProperty("id", ""); | 2054 jsobj.AddProperty("id", ""); |
| 2049 return true; | 2055 return true; |
| 2050 } | 2056 } |
| 2051 | 2057 |
| 2052 PrintError(js, "VM was not paused"); | 2058 PrintError(js, "VM was not paused"); |
| 2053 return true; | 2059 return true; |
| 2054 } | 2060 } |
| 2055 | 2061 |
| 2056 | 2062 |
| 2057 static const MethodParameter* get_breakpoints_params[] = { | |
| 2058 ISOLATE_PARAMETER, | |
| 2059 NULL, | |
| 2060 }; | |
| 2061 | |
| 2062 | |
| 2063 static bool GetBreakpoints(Isolate* isolate, JSONStream* js) { | |
| 2064 JSONObject jsobj(js); | |
| 2065 jsobj.AddProperty("type", "BreakpointList"); | |
| 2066 JSONArray jsarr(&jsobj, "breakpoints"); | |
| 2067 isolate->debugger()->PrintBreakpointsToJSONArray(&jsarr); | |
| 2068 return true; | |
| 2069 } | |
| 2070 | |
| 2071 | |
| 2072 static const MethodParameter* pause_params[] = { | 2063 static const MethodParameter* pause_params[] = { |
| 2073 ISOLATE_PARAMETER, | 2064 ISOLATE_PARAMETER, |
| 2074 NULL, | 2065 NULL, |
| 2075 }; | 2066 }; |
| 2076 | 2067 |
| 2077 | 2068 |
| 2078 static bool Pause(Isolate* isolate, JSONStream* js) { | 2069 static bool Pause(Isolate* isolate, JSONStream* js) { |
| 2079 // TODO(turnidge): Don't double-interrupt the isolate here. | 2070 // TODO(turnidge): Don't double-interrupt the isolate here. |
| 2080 isolate->ScheduleInterrupts(Isolate::kApiInterrupt); | 2071 isolate->ScheduleInterrupts(Isolate::kApiInterrupt); |
| 2081 JSONObject jsobj(js); | 2072 JSONObject jsobj(js); |
| (...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2510 { "addBreakpoint", AddBreakpoint, | 2501 { "addBreakpoint", AddBreakpoint, |
| 2511 add_breakpoint_params }, | 2502 add_breakpoint_params }, |
| 2512 { "addBreakpointAtEntry", AddBreakpointAtEntry, | 2503 { "addBreakpointAtEntry", AddBreakpointAtEntry, |
| 2513 add_breakpoint_at_entry_params }, | 2504 add_breakpoint_at_entry_params }, |
| 2514 { "clearCpuProfile", ClearCpuProfile, | 2505 { "clearCpuProfile", ClearCpuProfile, |
| 2515 clear_cpu_profile_params }, | 2506 clear_cpu_profile_params }, |
| 2516 { "eval", Eval, | 2507 { "eval", Eval, |
| 2517 eval_params }, | 2508 eval_params }, |
| 2518 { "getAllocationProfile", GetAllocationProfile, | 2509 { "getAllocationProfile", GetAllocationProfile, |
| 2519 get_allocation_profile_params }, | 2510 get_allocation_profile_params }, |
| 2520 { "getBreakpoints", GetBreakpoints, | |
| 2521 get_breakpoints_params }, | |
| 2522 { "getCallSiteData", GetCallSiteData, | 2511 { "getCallSiteData", GetCallSiteData, |
| 2523 get_call_site_data_params }, | 2512 get_call_site_data_params }, |
| 2524 { "getClassList", GetClassList, | 2513 { "getClassList", GetClassList, |
| 2525 get_class_list_params }, | 2514 get_class_list_params }, |
| 2526 { "getCoverage", GetCoverage, | 2515 { "getCoverage", GetCoverage, |
| 2527 get_coverage_params }, | 2516 get_coverage_params }, |
| 2528 { "getCpuProfile", GetCpuProfile, | 2517 { "getCpuProfile", GetCpuProfile, |
| 2529 get_cpu_profile_params }, | 2518 get_cpu_profile_params }, |
| 2530 { "getFlagList", GetFlagList , | 2519 { "getFlagList", GetFlagList , |
| 2531 get_flag_list_params }, | 2520 get_flag_list_params }, |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2581 ServiceMethodDescriptor& method = service_methods_[i]; | 2570 ServiceMethodDescriptor& method = service_methods_[i]; |
| 2582 if (strcmp(method_name, method.name) == 0) { | 2571 if (strcmp(method_name, method.name) == 0) { |
| 2583 return &method; | 2572 return &method; |
| 2584 } | 2573 } |
| 2585 } | 2574 } |
| 2586 return NULL; | 2575 return NULL; |
| 2587 } | 2576 } |
| 2588 | 2577 |
| 2589 | 2578 |
| 2590 } // namespace dart | 2579 } // namespace dart |
| OLD | NEW |