| 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 |
| 11 #include "vm/compiler.h" | 11 #include "vm/compiler.h" |
| 12 #include "vm/coverage.h" | |
| 13 #include "vm/cpu.h" | 12 #include "vm/cpu.h" |
| 14 #include "vm/dart_api_impl.h" | 13 #include "vm/dart_api_impl.h" |
| 15 #include "vm/dart_api_state.h" | 14 #include "vm/dart_api_state.h" |
| 16 #include "vm/dart_entry.h" | 15 #include "vm/dart_entry.h" |
| 17 #include "vm/debugger.h" | 16 #include "vm/debugger.h" |
| 18 #include "vm/isolate.h" | 17 #include "vm/isolate.h" |
| 19 #include "vm/lockers.h" | 18 #include "vm/lockers.h" |
| 20 #include "vm/message.h" | 19 #include "vm/message.h" |
| 21 #include "vm/message_handler.h" | 20 #include "vm/message_handler.h" |
| 22 #include "vm/native_entry.h" | 21 #include "vm/native_entry.h" |
| (...skipping 2255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2278 JSONArray samples(&jsobj, "samples"); | 2277 JSONArray samples(&jsobj, "samples"); |
| 2279 for (int i = 0; i < storage.Length(); i++) { | 2278 for (int i = 0; i < storage.Length(); i++) { |
| 2280 const Object& sample = Object::Handle(storage.At(i)); | 2279 const Object& sample = Object::Handle(storage.At(i)); |
| 2281 samples.AddValue(sample); | 2280 samples.AddValue(sample); |
| 2282 } | 2281 } |
| 2283 } | 2282 } |
| 2284 return true; | 2283 return true; |
| 2285 } | 2284 } |
| 2286 | 2285 |
| 2287 | 2286 |
| 2288 class LibraryCoverageFilter : public CoverageFilter { | |
| 2289 public: | |
| 2290 explicit LibraryCoverageFilter(const Library& lib) : lib_(lib) {} | |
| 2291 bool ShouldOutputCoverageFor(const Library& lib, | |
| 2292 const Script& script, | |
| 2293 const Class& cls, | |
| 2294 const Function& func) const { | |
| 2295 return lib.raw() == lib_.raw(); | |
| 2296 } | |
| 2297 private: | |
| 2298 const Library& lib_; | |
| 2299 }; | |
| 2300 | |
| 2301 | |
| 2302 class ScriptCoverageFilter : public CoverageFilter { | |
| 2303 public: | |
| 2304 explicit ScriptCoverageFilter(const Script& script) | |
| 2305 : script_(script) {} | |
| 2306 bool ShouldOutputCoverageFor(const Library& lib, | |
| 2307 const Script& script, | |
| 2308 const Class& cls, | |
| 2309 const Function& func) const { | |
| 2310 return script.raw() == script_.raw(); | |
| 2311 } | |
| 2312 private: | |
| 2313 const Script& script_; | |
| 2314 }; | |
| 2315 | |
| 2316 | |
| 2317 class ClassCoverageFilter : public CoverageFilter { | |
| 2318 public: | |
| 2319 explicit ClassCoverageFilter(const Class& cls) : cls_(cls) {} | |
| 2320 bool ShouldOutputCoverageFor(const Library& lib, | |
| 2321 const Script& script, | |
| 2322 const Class& cls, | |
| 2323 const Function& func) const { | |
| 2324 return cls.raw() == cls_.raw(); | |
| 2325 } | |
| 2326 private: | |
| 2327 const Class& cls_; | |
| 2328 }; | |
| 2329 | |
| 2330 | |
| 2331 class FunctionCoverageFilter : public CoverageFilter { | |
| 2332 public: | |
| 2333 explicit FunctionCoverageFilter(const Function& func) : func_(func) {} | |
| 2334 bool ShouldOutputCoverageFor(const Library& lib, | |
| 2335 const Script& script, | |
| 2336 const Class& cls, | |
| 2337 const Function& func) const { | |
| 2338 return func.raw() == func_.raw(); | |
| 2339 } | |
| 2340 private: | |
| 2341 const Function& func_; | |
| 2342 }; | |
| 2343 | |
| 2344 | |
| 2345 static bool GetHitsOrSites(Thread* thread, JSONStream* js, bool as_sites) { | |
| 2346 if (!thread->isolate()->compilation_allowed()) { | |
| 2347 js->PrintError(kFeatureDisabled, | |
| 2348 "Cannot get coverage data when running a precompiled program."); | |
| 2349 return true; | |
| 2350 } | |
| 2351 if (!js->HasParam("targetId")) { | |
| 2352 CodeCoverage::PrintJSON(thread, js, NULL, as_sites); | |
| 2353 return true; | |
| 2354 } | |
| 2355 const char* target_id = js->LookupParam("targetId"); | |
| 2356 Object& obj = Object::Handle(LookupHeapObject(thread, target_id, NULL)); | |
| 2357 if (obj.raw() == Object::sentinel().raw()) { | |
| 2358 PrintInvalidParamError(js, "targetId"); | |
| 2359 return true; | |
| 2360 } | |
| 2361 if (obj.IsScript()) { | |
| 2362 ScriptCoverageFilter sf(Script::Cast(obj)); | |
| 2363 CodeCoverage::PrintJSON(thread, js, &sf, as_sites); | |
| 2364 return true; | |
| 2365 } | |
| 2366 if (obj.IsLibrary()) { | |
| 2367 LibraryCoverageFilter lf(Library::Cast(obj)); | |
| 2368 CodeCoverage::PrintJSON(thread, js, &lf, as_sites); | |
| 2369 return true; | |
| 2370 } | |
| 2371 if (obj.IsClass()) { | |
| 2372 ClassCoverageFilter cf(Class::Cast(obj)); | |
| 2373 CodeCoverage::PrintJSON(thread, js, &cf, as_sites); | |
| 2374 return true; | |
| 2375 } | |
| 2376 if (obj.IsFunction()) { | |
| 2377 FunctionCoverageFilter ff(Function::Cast(obj)); | |
| 2378 CodeCoverage::PrintJSON(thread, js, &ff, as_sites); | |
| 2379 return true; | |
| 2380 } | |
| 2381 js->PrintError(kInvalidParams, | |
| 2382 "%s: invalid 'targetId' parameter: " | |
| 2383 "id '%s' does not correspond to a " | |
| 2384 "script, library, class, or function", | |
| 2385 js->method(), target_id); | |
| 2386 return true; | |
| 2387 } | |
| 2388 | |
| 2389 | |
| 2390 static const MethodParameter* get_coverage_params[] = { | |
| 2391 RUNNABLE_ISOLATE_PARAMETER, | |
| 2392 new IdParameter("targetId", false), | |
| 2393 NULL, | |
| 2394 }; | |
| 2395 | |
| 2396 | |
| 2397 static bool GetCoverage(Thread* thread, JSONStream* js) { | |
| 2398 // TODO(rmacnak): Remove this response; it is subsumed by GetCallSiteData. | |
| 2399 return GetHitsOrSites(thread, js, false); | |
| 2400 } | |
| 2401 | |
| 2402 | |
| 2403 static const char* const report_enum_names[] = { | 2287 static const char* const report_enum_names[] = { |
| 2404 SourceReport::kCallSitesStr, | 2288 SourceReport::kCallSitesStr, |
| 2405 SourceReport::kCoverageStr, | 2289 SourceReport::kCoverageStr, |
| 2406 SourceReport::kPossibleBreakpointsStr, | 2290 SourceReport::kPossibleBreakpointsStr, |
| 2407 SourceReport::kProfileStr, | 2291 SourceReport::kProfileStr, |
| 2408 NULL, | 2292 NULL, |
| 2409 }; | 2293 }; |
| 2410 | 2294 |
| 2411 | 2295 |
| 2412 static const MethodParameter* get_source_report_params[] = { | 2296 static const MethodParameter* get_source_report_params[] = { |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2481 } | 2365 } |
| 2482 SourceReport report(report_set, compile_mode); | 2366 SourceReport report(report_set, compile_mode); |
| 2483 report.PrintJSON(js, | 2367 report.PrintJSON(js, |
| 2484 script, | 2368 script, |
| 2485 TokenPosition(start_pos), | 2369 TokenPosition(start_pos), |
| 2486 TokenPosition(end_pos)); | 2370 TokenPosition(end_pos)); |
| 2487 return true; | 2371 return true; |
| 2488 } | 2372 } |
| 2489 | 2373 |
| 2490 | 2374 |
| 2491 static const MethodParameter* get_call_site_data_params[] = { | |
| 2492 RUNNABLE_ISOLATE_PARAMETER, | |
| 2493 new IdParameter("targetId", false), | |
| 2494 NULL, | |
| 2495 }; | |
| 2496 | |
| 2497 | |
| 2498 static bool GetCallSiteData(Thread* thread, JSONStream* js) { | |
| 2499 return GetHitsOrSites(thread, js, true); | |
| 2500 } | |
| 2501 | |
| 2502 | |
| 2503 static bool AddBreakpointCommon(Thread* thread, | 2375 static bool AddBreakpointCommon(Thread* thread, |
| 2504 JSONStream* js, | 2376 JSONStream* js, |
| 2505 const String& script_uri) { | 2377 const String& script_uri) { |
| 2506 if (!thread->isolate()->compilation_allowed()) { | 2378 if (!thread->isolate()->compilation_allowed()) { |
| 2507 js->PrintError(kFeatureDisabled, | 2379 js->PrintError(kFeatureDisabled, |
| 2508 "Cannot use breakpoints when running a precompiled program."); | 2380 "Cannot use breakpoints when running a precompiled program."); |
| 2509 return true; | 2381 return true; |
| 2510 } | 2382 } |
| 2511 const char* line_param = js->LookupParam("line"); | 2383 const char* line_param = js->LookupParam("line"); |
| 2512 intptr_t line = UIntParameter::Parse(line_param); | 2384 intptr_t line = UIntParameter::Parse(line_param); |
| (...skipping 1494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4007 { "_clearVMTimeline", ClearVMTimeline, | 3879 { "_clearVMTimeline", ClearVMTimeline, |
| 4008 clear_vm_timeline_params, }, | 3880 clear_vm_timeline_params, }, |
| 4009 { "evaluate", Evaluate, | 3881 { "evaluate", Evaluate, |
| 4010 evaluate_params }, | 3882 evaluate_params }, |
| 4011 { "evaluateInFrame", EvaluateInFrame, | 3883 { "evaluateInFrame", EvaluateInFrame, |
| 4012 evaluate_in_frame_params }, | 3884 evaluate_in_frame_params }, |
| 4013 { "_getAllocationProfile", GetAllocationProfile, | 3885 { "_getAllocationProfile", GetAllocationProfile, |
| 4014 get_allocation_profile_params }, | 3886 get_allocation_profile_params }, |
| 4015 { "_getAllocationSamples", GetAllocationSamples, | 3887 { "_getAllocationSamples", GetAllocationSamples, |
| 4016 get_allocation_samples_params }, | 3888 get_allocation_samples_params }, |
| 4017 { "_getCallSiteData", GetCallSiteData, | |
| 4018 get_call_site_data_params }, | |
| 4019 { "getClassList", GetClassList, | 3889 { "getClassList", GetClassList, |
| 4020 get_class_list_params }, | 3890 get_class_list_params }, |
| 4021 { "_getCoverage", GetCoverage, | |
| 4022 get_coverage_params }, | |
| 4023 { "_getCpuProfile", GetCpuProfile, | 3891 { "_getCpuProfile", GetCpuProfile, |
| 4024 get_cpu_profile_params }, | 3892 get_cpu_profile_params }, |
| 4025 { "_getCpuProfileTimeline", GetCpuProfileTimeline, | 3893 { "_getCpuProfileTimeline", GetCpuProfileTimeline, |
| 4026 get_cpu_profile_timeline_params }, | 3894 get_cpu_profile_timeline_params }, |
| 4027 { "getFlagList", GetFlagList, | 3895 { "getFlagList", GetFlagList, |
| 4028 get_flag_list_params }, | 3896 get_flag_list_params }, |
| 4029 { "_getHeapMap", GetHeapMap, | 3897 { "_getHeapMap", GetHeapMap, |
| 4030 get_heap_map_params }, | 3898 get_heap_map_params }, |
| 4031 { "_getInboundReferences", GetInboundReferences, | 3899 { "_getInboundReferences", GetInboundReferences, |
| 4032 get_inbound_references_params }, | 3900 get_inbound_references_params }, |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4107 if (strcmp(method_name, method.name) == 0) { | 3975 if (strcmp(method_name, method.name) == 0) { |
| 4108 return &method; | 3976 return &method; |
| 4109 } | 3977 } |
| 4110 } | 3978 } |
| 4111 return NULL; | 3979 return NULL; |
| 4112 } | 3980 } |
| 4113 | 3981 |
| 4114 #endif // !PRODUCT | 3982 #endif // !PRODUCT |
| 4115 | 3983 |
| 4116 } // namespace dart | 3984 } // namespace dart |
| OLD | NEW |