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 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 static void PrintUnrecognizedMethodError(JSONStream* js) { | 227 static void PrintUnrecognizedMethodError(JSONStream* js) { |
228 js->PrintError(kMethodNotFound, NULL); | 228 js->PrintError(kMethodNotFound, NULL); |
229 } | 229 } |
230 | 230 |
231 | 231 |
232 static void PrintSuccess(JSONStream* js) { | 232 static void PrintSuccess(JSONStream* js) { |
233 JSONObject jsobj(js); | 233 JSONObject jsobj(js); |
234 jsobj.AddProperty("type", "Success"); | 234 jsobj.AddProperty("type", "Success"); |
235 } | 235 } |
236 | 236 |
| 237 |
237 static bool GetIntegerId(const char* s, intptr_t* id, int base = 10) { | 238 static bool GetIntegerId(const char* s, intptr_t* id, int base = 10) { |
238 if ((s == NULL) || (*s == '\0')) { | 239 if ((s == NULL) || (*s == '\0')) { |
239 // Empty string. | 240 // Empty string. |
240 return false; | 241 return false; |
241 } | 242 } |
242 if (id == NULL) { | 243 if (id == NULL) { |
243 // No id pointer. | 244 // No id pointer. |
244 return false; | 245 return false; |
245 } | 246 } |
246 intptr_t r = 0; | 247 intptr_t r = 0; |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 } | 398 } |
398 | 399 |
399 const char* name() const { | 400 const char* name() const { |
400 return name_; | 401 return name_; |
401 } | 402 } |
402 | 403 |
403 bool required() const { | 404 bool required() const { |
404 return required_; | 405 return required_; |
405 } | 406 } |
406 | 407 |
| 408 virtual void PrintError(const char* name, |
| 409 const char* value, |
| 410 JSONStream* js) const { |
| 411 PrintInvalidParamError(js, name); |
| 412 } |
| 413 |
407 private: | 414 private: |
408 const char* name_; | 415 const char* name_; |
409 bool required_; | 416 bool required_; |
410 }; | 417 }; |
411 | 418 |
412 | 419 |
413 class NoSuchParameter : public MethodParameter { | 420 class NoSuchParameter : public MethodParameter { |
414 public: | 421 public: |
415 explicit NoSuchParameter(const char* name) | 422 explicit NoSuchParameter(const char* name) |
416 : MethodParameter(name, false) { | 423 : MethodParameter(name, false) { |
417 } | 424 } |
418 | 425 |
419 virtual bool Validate(const char* value) const { | 426 virtual bool Validate(const char* value) const { |
420 return (value == NULL); | 427 return (value == NULL); |
421 } | 428 } |
422 }; | 429 }; |
423 | 430 |
424 | 431 |
425 #define NO_ISOLATE_PARAMETER new NoSuchParameter("isolateId") | |
426 | |
427 | |
428 class BoolParameter : public MethodParameter { | 432 class BoolParameter : public MethodParameter { |
429 public: | 433 public: |
430 BoolParameter(const char* name, bool required) | 434 BoolParameter(const char* name, bool required) |
431 : MethodParameter(name, required) { | 435 : MethodParameter(name, required) { |
432 } | 436 } |
433 | 437 |
434 virtual bool Validate(const char* value) const { | 438 virtual bool Validate(const char* value) const { |
435 if (value == NULL) { | 439 if (value == NULL) { |
436 return false; | 440 return false; |
437 } | 441 } |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
512 IdParameter(const char* name, bool required) | 516 IdParameter(const char* name, bool required) |
513 : MethodParameter(name, required) { | 517 : MethodParameter(name, required) { |
514 } | 518 } |
515 | 519 |
516 virtual bool Validate(const char* value) const { | 520 virtual bool Validate(const char* value) const { |
517 return (value != NULL); | 521 return (value != NULL); |
518 } | 522 } |
519 }; | 523 }; |
520 | 524 |
521 | 525 |
| 526 class RunnableIsolateParameter : public MethodParameter { |
| 527 public: |
| 528 explicit RunnableIsolateParameter(const char* name) |
| 529 : MethodParameter(name, true) { |
| 530 } |
| 531 |
| 532 virtual bool Validate(const char* value) const { |
| 533 Isolate* isolate = Isolate::Current(); |
| 534 return (value != NULL) && (isolate != NULL) && (isolate->is_runnable()); |
| 535 } |
| 536 |
| 537 virtual void PrintError(const char* name, |
| 538 const char* value, |
| 539 JSONStream* js) const { |
| 540 js->PrintError(kIsolateMustBeRunnable, |
| 541 "Isolate must be runnable before this request is made."); |
| 542 } |
| 543 }; |
| 544 |
| 545 |
522 #define ISOLATE_PARAMETER new IdParameter("isolateId", true) | 546 #define ISOLATE_PARAMETER new IdParameter("isolateId", true) |
523 | 547 #define NO_ISOLATE_PARAMETER new NoSuchParameter("isolateId") |
| 548 #define RUNNABLE_ISOLATE_PARAMETER new RunnableIsolateParameter("isolateId") |
524 | 549 |
525 class EnumParameter : public MethodParameter { | 550 class EnumParameter : public MethodParameter { |
526 public: | 551 public: |
527 EnumParameter(const char* name, bool required, const char* const* enums) | 552 EnumParameter(const char* name, bool required, const char* const* enums) |
528 : MethodParameter(name, required), | 553 : MethodParameter(name, required), |
529 enums_(enums) { | 554 enums_(enums) { |
530 } | 555 } |
531 | 556 |
532 virtual bool Validate(const char* value) const { | 557 virtual bool Validate(const char* value) const { |
533 if (value == NULL) { | 558 if (value == NULL) { |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
701 const MethodParameter* parameter = parameters[i]; | 726 const MethodParameter* parameter = parameters[i]; |
702 const char* name = parameter->name(); | 727 const char* name = parameter->name(); |
703 const bool required = parameter->required(); | 728 const bool required = parameter->required(); |
704 const char* value = js->LookupParam(name); | 729 const char* value = js->LookupParam(name); |
705 const bool has_parameter = (value != NULL); | 730 const bool has_parameter = (value != NULL); |
706 if (required && !has_parameter) { | 731 if (required && !has_parameter) { |
707 PrintMissingParamError(js, name); | 732 PrintMissingParamError(js, name); |
708 return false; | 733 return false; |
709 } | 734 } |
710 if (has_parameter && !parameter->Validate(value)) { | 735 if (has_parameter && !parameter->Validate(value)) { |
711 PrintInvalidParamError(js, name); | 736 parameter->PrintError(name, value, js); |
712 return false; | 737 return false; |
713 } | 738 } |
714 } | 739 } |
715 return true; | 740 return true; |
716 } | 741 } |
717 | 742 |
718 | 743 |
719 void Service::PostError(const String& method_name, | 744 void Service::PostError(const String& method_name, |
720 const Array& parameter_keys, | 745 const Array& parameter_keys, |
721 const Array& parameter_values, | 746 const Array& parameter_values, |
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1163 }; | 1188 }; |
1164 | 1189 |
1165 | 1190 |
1166 static bool GetIsolate(Thread* thread, JSONStream* js) { | 1191 static bool GetIsolate(Thread* thread, JSONStream* js) { |
1167 thread->isolate()->PrintJSON(js, false); | 1192 thread->isolate()->PrintJSON(js, false); |
1168 return true; | 1193 return true; |
1169 } | 1194 } |
1170 | 1195 |
1171 | 1196 |
1172 static const MethodParameter* get_stack_params[] = { | 1197 static const MethodParameter* get_stack_params[] = { |
1173 ISOLATE_PARAMETER, | 1198 RUNNABLE_ISOLATE_PARAMETER, |
1174 new BoolParameter("_full", false), | 1199 new BoolParameter("_full", false), |
1175 NULL, | 1200 NULL, |
1176 }; | 1201 }; |
1177 | 1202 |
1178 | 1203 |
1179 static bool GetStack(Thread* thread, JSONStream* js) { | 1204 static bool GetStack(Thread* thread, JSONStream* js) { |
1180 if (!thread->isolate()->compilation_allowed()) { | 1205 if (!thread->isolate()->compilation_allowed()) { |
1181 js->PrintError(kFeatureDisabled, | 1206 js->PrintError(kFeatureDisabled, |
1182 "Cannot get stack when running a precompiled program."); | 1207 "Cannot get stack when running a precompiled program."); |
1183 return true; | 1208 return true; |
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1772 // reporting suprious references when repeatedly looking for the | 1797 // reporting suprious references when repeatedly looking for the |
1773 // references to an object. | 1798 // references to an object. |
1774 path.SetAt(i * 2, Object::null_object()); | 1799 path.SetAt(i * 2, Object::null_object()); |
1775 } | 1800 } |
1776 } | 1801 } |
1777 return true; | 1802 return true; |
1778 } | 1803 } |
1779 | 1804 |
1780 | 1805 |
1781 static const MethodParameter* get_inbound_references_params[] = { | 1806 static const MethodParameter* get_inbound_references_params[] = { |
1782 ISOLATE_PARAMETER, | 1807 RUNNABLE_ISOLATE_PARAMETER, |
1783 NULL, | 1808 NULL, |
1784 }; | 1809 }; |
1785 | 1810 |
1786 | 1811 |
1787 static bool GetInboundReferences(Thread* thread, JSONStream* js) { | 1812 static bool GetInboundReferences(Thread* thread, JSONStream* js) { |
1788 const char* target_id = js->LookupParam("targetId"); | 1813 const char* target_id = js->LookupParam("targetId"); |
1789 if (target_id == NULL) { | 1814 if (target_id == NULL) { |
1790 PrintMissingParamError(js, "targetId"); | 1815 PrintMissingParamError(js, "targetId"); |
1791 return true; | 1816 return true; |
1792 } | 1817 } |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1871 // after looking for a retaining path. | 1896 // after looking for a retaining path. |
1872 for (intptr_t i = 0; i < limit; ++i) { | 1897 for (intptr_t i = 0; i < limit; ++i) { |
1873 path.SetAt(i * 2, Object::null_object()); | 1898 path.SetAt(i * 2, Object::null_object()); |
1874 } | 1899 } |
1875 | 1900 |
1876 return true; | 1901 return true; |
1877 } | 1902 } |
1878 | 1903 |
1879 | 1904 |
1880 static const MethodParameter* get_retaining_path_params[] = { | 1905 static const MethodParameter* get_retaining_path_params[] = { |
1881 ISOLATE_PARAMETER, | 1906 RUNNABLE_ISOLATE_PARAMETER, |
1882 NULL, | 1907 NULL, |
1883 }; | 1908 }; |
1884 | 1909 |
1885 | 1910 |
1886 static bool GetRetainingPath(Thread* thread, JSONStream* js) { | 1911 static bool GetRetainingPath(Thread* thread, JSONStream* js) { |
1887 const char* target_id = js->LookupParam("targetId"); | 1912 const char* target_id = js->LookupParam("targetId"); |
1888 if (target_id == NULL) { | 1913 if (target_id == NULL) { |
1889 PrintMissingParamError(js, "targetId"); | 1914 PrintMissingParamError(js, "targetId"); |
1890 return true; | 1915 return true; |
1891 } | 1916 } |
(...skipping 22 matching lines...) Expand all Loading... |
1914 } else { | 1939 } else { |
1915 PrintInvalidParamError(js, "targetId"); | 1940 PrintInvalidParamError(js, "targetId"); |
1916 } | 1941 } |
1917 return true; | 1942 return true; |
1918 } | 1943 } |
1919 return PrintRetainingPath(thread, &obj, limit, js); | 1944 return PrintRetainingPath(thread, &obj, limit, js); |
1920 } | 1945 } |
1921 | 1946 |
1922 | 1947 |
1923 static const MethodParameter* get_retained_size_params[] = { | 1948 static const MethodParameter* get_retained_size_params[] = { |
1924 ISOLATE_PARAMETER, | 1949 RUNNABLE_ISOLATE_PARAMETER, |
1925 new IdParameter("targetId", true), | 1950 new IdParameter("targetId", true), |
1926 NULL, | 1951 NULL, |
1927 }; | 1952 }; |
1928 | 1953 |
1929 | 1954 |
1930 static bool GetRetainedSize(Thread* thread, JSONStream* js) { | 1955 static bool GetRetainedSize(Thread* thread, JSONStream* js) { |
1931 const char* target_id = js->LookupParam("targetId"); | 1956 const char* target_id = js->LookupParam("targetId"); |
1932 ASSERT(target_id != NULL); | 1957 ASSERT(target_id != NULL); |
1933 ObjectIdRing::LookupResult lookup_result; | 1958 ObjectIdRing::LookupResult lookup_result; |
1934 Object& obj = Object::Handle(LookupHeapObject(thread, target_id, | 1959 Object& obj = Object::Handle(LookupHeapObject(thread, target_id, |
(...skipping 21 matching lines...) Expand all Loading... |
1956 | 1981 |
1957 ObjectGraph graph(thread); | 1982 ObjectGraph graph(thread); |
1958 intptr_t retained_size = graph.SizeRetainedByInstance(obj); | 1983 intptr_t retained_size = graph.SizeRetainedByInstance(obj); |
1959 const Object& result = Object::Handle(Integer::New(retained_size)); | 1984 const Object& result = Object::Handle(Integer::New(retained_size)); |
1960 result.PrintJSON(js, true); | 1985 result.PrintJSON(js, true); |
1961 return true; | 1986 return true; |
1962 } | 1987 } |
1963 | 1988 |
1964 | 1989 |
1965 static const MethodParameter* get_reachable_size_params[] = { | 1990 static const MethodParameter* get_reachable_size_params[] = { |
1966 ISOLATE_PARAMETER, | 1991 RUNNABLE_ISOLATE_PARAMETER, |
1967 new IdParameter("targetId", true), | 1992 new IdParameter("targetId", true), |
1968 NULL, | 1993 NULL, |
1969 }; | 1994 }; |
1970 | 1995 |
1971 | 1996 |
1972 static bool GetReachableSize(Thread* thread, JSONStream* js) { | 1997 static bool GetReachableSize(Thread* thread, JSONStream* js) { |
1973 const char* target_id = js->LookupParam("targetId"); | 1998 const char* target_id = js->LookupParam("targetId"); |
1974 ASSERT(target_id != NULL); | 1999 ASSERT(target_id != NULL); |
1975 ObjectIdRing::LookupResult lookup_result; | 2000 ObjectIdRing::LookupResult lookup_result; |
1976 Object& obj = Object::Handle(LookupHeapObject(thread, target_id, | 2001 Object& obj = Object::Handle(LookupHeapObject(thread, target_id, |
(...skipping 21 matching lines...) Expand all Loading... |
1998 | 2023 |
1999 ObjectGraph graph(thread); | 2024 ObjectGraph graph(thread); |
2000 intptr_t retained_size = graph.SizeReachableByInstance(obj); | 2025 intptr_t retained_size = graph.SizeReachableByInstance(obj); |
2001 const Object& result = Object::Handle(Integer::New(retained_size)); | 2026 const Object& result = Object::Handle(Integer::New(retained_size)); |
2002 result.PrintJSON(js, true); | 2027 result.PrintJSON(js, true); |
2003 return true; | 2028 return true; |
2004 } | 2029 } |
2005 | 2030 |
2006 | 2031 |
2007 static const MethodParameter* evaluate_params[] = { | 2032 static const MethodParameter* evaluate_params[] = { |
2008 ISOLATE_PARAMETER, | 2033 RUNNABLE_ISOLATE_PARAMETER, |
2009 NULL, | 2034 NULL, |
2010 }; | 2035 }; |
2011 | 2036 |
2012 | 2037 |
2013 static bool Evaluate(Thread* thread, JSONStream* js) { | 2038 static bool Evaluate(Thread* thread, JSONStream* js) { |
2014 if (!thread->isolate()->compilation_allowed()) { | 2039 if (!thread->isolate()->compilation_allowed()) { |
2015 js->PrintError(kFeatureDisabled, | 2040 js->PrintError(kFeatureDisabled, |
2016 "Cannot evaluate when running a precompiled program."); | 2041 "Cannot evaluate when running a precompiled program."); |
2017 return true; | 2042 return true; |
2018 } | 2043 } |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2069 } | 2094 } |
2070 js->PrintError(kInvalidParams, | 2095 js->PrintError(kInvalidParams, |
2071 "%s: invalid 'targetId' parameter: " | 2096 "%s: invalid 'targetId' parameter: " |
2072 "id '%s' does not correspond to a " | 2097 "id '%s' does not correspond to a " |
2073 "library, class, or instance", js->method(), target_id); | 2098 "library, class, or instance", js->method(), target_id); |
2074 return true; | 2099 return true; |
2075 } | 2100 } |
2076 | 2101 |
2077 | 2102 |
2078 static const MethodParameter* evaluate_in_frame_params[] = { | 2103 static const MethodParameter* evaluate_in_frame_params[] = { |
2079 ISOLATE_PARAMETER, | 2104 RUNNABLE_ISOLATE_PARAMETER, |
2080 new UIntParameter("frameIndex", true), | 2105 new UIntParameter("frameIndex", true), |
2081 new MethodParameter("expression", true), | 2106 new MethodParameter("expression", true), |
2082 NULL, | 2107 NULL, |
2083 }; | 2108 }; |
2084 | 2109 |
2085 | 2110 |
2086 static bool EvaluateInFrame(Thread* thread, JSONStream* js) { | 2111 static bool EvaluateInFrame(Thread* thread, JSONStream* js) { |
2087 Isolate* isolate = thread->isolate(); | 2112 Isolate* isolate = thread->isolate(); |
2088 if (!isolate->compilation_allowed()) { | 2113 if (!isolate->compilation_allowed()) { |
2089 js->PrintError(kFeatureDisabled, | 2114 js->PrintError(kFeatureDisabled, |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2134 intptr_t count() const { return count_; } | 2159 intptr_t count() const { return count_; } |
2135 | 2160 |
2136 private: | 2161 private: |
2137 const Class& cls_; | 2162 const Class& cls_; |
2138 const Array& storage_; | 2163 const Array& storage_; |
2139 intptr_t count_; | 2164 intptr_t count_; |
2140 }; | 2165 }; |
2141 | 2166 |
2142 | 2167 |
2143 static const MethodParameter* get_instances_params[] = { | 2168 static const MethodParameter* get_instances_params[] = { |
2144 ISOLATE_PARAMETER, | 2169 RUNNABLE_ISOLATE_PARAMETER, |
2145 NULL, | 2170 NULL, |
2146 }; | 2171 }; |
2147 | 2172 |
2148 | 2173 |
2149 static bool GetInstances(Thread* thread, JSONStream* js) { | 2174 static bool GetInstances(Thread* thread, JSONStream* js) { |
2150 const char* target_id = js->LookupParam("classId"); | 2175 const char* target_id = js->LookupParam("classId"); |
2151 if (target_id == NULL) { | 2176 if (target_id == NULL) { |
2152 PrintMissingParamError(js, "classId"); | 2177 PrintMissingParamError(js, "classId"); |
2153 return true; | 2178 return true; |
2154 } | 2179 } |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2292 js->PrintError(kInvalidParams, | 2317 js->PrintError(kInvalidParams, |
2293 "%s: invalid 'targetId' parameter: " | 2318 "%s: invalid 'targetId' parameter: " |
2294 "id '%s' does not correspond to a " | 2319 "id '%s' does not correspond to a " |
2295 "script, library, class, or function", | 2320 "script, library, class, or function", |
2296 js->method(), target_id); | 2321 js->method(), target_id); |
2297 return true; | 2322 return true; |
2298 } | 2323 } |
2299 | 2324 |
2300 | 2325 |
2301 static const MethodParameter* get_coverage_params[] = { | 2326 static const MethodParameter* get_coverage_params[] = { |
2302 ISOLATE_PARAMETER, | 2327 RUNNABLE_ISOLATE_PARAMETER, |
2303 new IdParameter("targetId", false), | 2328 new IdParameter("targetId", false), |
2304 NULL, | 2329 NULL, |
2305 }; | 2330 }; |
2306 | 2331 |
2307 | 2332 |
2308 static bool GetCoverage(Thread* thread, JSONStream* js) { | 2333 static bool GetCoverage(Thread* thread, JSONStream* js) { |
2309 // TODO(rmacnak): Remove this response; it is subsumed by GetCallSiteData. | 2334 // TODO(rmacnak): Remove this response; it is subsumed by GetCallSiteData. |
2310 return GetHitsOrSites(thread, js, false); | 2335 return GetHitsOrSites(thread, js, false); |
2311 } | 2336 } |
2312 | 2337 |
2313 | 2338 |
2314 static const char* kCallSitesStr = "_CallSites"; | 2339 static const char* kCallSitesStr = "_CallSites"; |
2315 static const char* kCoverageStr = "Coverage"; | 2340 static const char* kCoverageStr = "Coverage"; |
2316 static const char* kPossibleBreakpointsStr = "PossibleBreakpoints"; | 2341 static const char* kPossibleBreakpointsStr = "PossibleBreakpoints"; |
2317 | 2342 |
2318 | 2343 |
2319 static const char* const report_enum_names[] = { | 2344 static const char* const report_enum_names[] = { |
2320 kCallSitesStr, | 2345 kCallSitesStr, |
2321 kCoverageStr, | 2346 kCoverageStr, |
2322 kPossibleBreakpointsStr, | 2347 kPossibleBreakpointsStr, |
2323 NULL, | 2348 NULL, |
2324 }; | 2349 }; |
2325 | 2350 |
2326 | 2351 |
2327 static const EnumListParameter* reports_parameter = | 2352 static const EnumListParameter* reports_parameter = |
2328 new EnumListParameter("reports", true, report_enum_names); | 2353 new EnumListParameter("reports", true, report_enum_names); |
2329 | 2354 |
2330 | 2355 |
2331 static const MethodParameter* get_source_report_params[] = { | 2356 static const MethodParameter* get_source_report_params[] = { |
2332 ISOLATE_PARAMETER, | 2357 RUNNABLE_ISOLATE_PARAMETER, |
2333 reports_parameter, | 2358 reports_parameter, |
2334 new IdParameter("scriptId", false), | 2359 new IdParameter("scriptId", false), |
2335 new UIntParameter("tokenPos", false), | 2360 new UIntParameter("tokenPos", false), |
2336 new UIntParameter("endTokenPos", false), | 2361 new UIntParameter("endTokenPos", false), |
2337 new BoolParameter("forceCompile", false), | 2362 new BoolParameter("forceCompile", false), |
2338 NULL, | 2363 NULL, |
2339 }; | 2364 }; |
2340 | 2365 |
2341 | 2366 |
2342 static bool GetSourceReport(Thread* thread, JSONStream* js) { | 2367 static bool GetSourceReport(Thread* thread, JSONStream* js) { |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2389 return true; | 2414 return true; |
2390 } | 2415 } |
2391 } | 2416 } |
2392 SourceReport report(report_set, compile_mode); | 2417 SourceReport report(report_set, compile_mode); |
2393 report.PrintJSON(js, script, start_pos, end_pos); | 2418 report.PrintJSON(js, script, start_pos, end_pos); |
2394 return true; | 2419 return true; |
2395 } | 2420 } |
2396 | 2421 |
2397 | 2422 |
2398 static const MethodParameter* get_call_site_data_params[] = { | 2423 static const MethodParameter* get_call_site_data_params[] = { |
2399 ISOLATE_PARAMETER, | 2424 RUNNABLE_ISOLATE_PARAMETER, |
2400 new IdParameter("targetId", false), | 2425 new IdParameter("targetId", false), |
2401 NULL, | 2426 NULL, |
2402 }; | 2427 }; |
2403 | 2428 |
2404 | 2429 |
2405 static bool GetCallSiteData(Thread* thread, JSONStream* js) { | 2430 static bool GetCallSiteData(Thread* thread, JSONStream* js) { |
2406 return GetHitsOrSites(thread, js, true); | 2431 return GetHitsOrSites(thread, js, true); |
2407 } | 2432 } |
2408 | 2433 |
2409 | 2434 |
(...skipping 26 matching lines...) Expand all Loading... |
2436 "%s: Cannot add breakpoint at line '%s'", | 2461 "%s: Cannot add breakpoint at line '%s'", |
2437 js->method(), line_param); | 2462 js->method(), line_param); |
2438 return true; | 2463 return true; |
2439 } | 2464 } |
2440 bpt->PrintJSON(js); | 2465 bpt->PrintJSON(js); |
2441 return true; | 2466 return true; |
2442 } | 2467 } |
2443 | 2468 |
2444 | 2469 |
2445 static const MethodParameter* add_breakpoint_params[] = { | 2470 static const MethodParameter* add_breakpoint_params[] = { |
2446 ISOLATE_PARAMETER, | 2471 RUNNABLE_ISOLATE_PARAMETER, |
2447 new IdParameter("scriptId", true), | 2472 new IdParameter("scriptId", true), |
2448 new UIntParameter("line", true), | 2473 new UIntParameter("line", true), |
2449 new UIntParameter("column", false), | 2474 new UIntParameter("column", false), |
2450 NULL, | 2475 NULL, |
2451 }; | 2476 }; |
2452 | 2477 |
2453 | 2478 |
2454 static bool AddBreakpoint(Thread* thread, JSONStream* js) { | 2479 static bool AddBreakpoint(Thread* thread, JSONStream* js) { |
2455 if (!thread->isolate()->compilation_allowed()) { | 2480 if (!thread->isolate()->compilation_allowed()) { |
2456 js->PrintError(kFeatureDisabled, | 2481 js->PrintError(kFeatureDisabled, |
2457 "Cannot use breakpoints when running a precompiled program."); | 2482 "Cannot use breakpoints when running a precompiled program."); |
2458 return true; | 2483 return true; |
2459 } | 2484 } |
2460 const char* script_id_param = js->LookupParam("scriptId"); | 2485 const char* script_id_param = js->LookupParam("scriptId"); |
2461 Object& obj = Object::Handle(LookupHeapObject(thread, script_id_param, NULL)); | 2486 Object& obj = Object::Handle(LookupHeapObject(thread, script_id_param, NULL)); |
2462 if (obj.raw() == Object::sentinel().raw() || !obj.IsScript()) { | 2487 if (obj.raw() == Object::sentinel().raw() || !obj.IsScript()) { |
2463 PrintInvalidParamError(js, "scriptId"); | 2488 PrintInvalidParamError(js, "scriptId"); |
2464 return true; | 2489 return true; |
2465 } | 2490 } |
2466 const Script& script = Script::Cast(obj); | 2491 const Script& script = Script::Cast(obj); |
2467 const String& script_uri = String::Handle(script.url()); | 2492 const String& script_uri = String::Handle(script.url()); |
2468 ASSERT(!script_uri.IsNull()); | 2493 ASSERT(!script_uri.IsNull()); |
2469 return AddBreakpointCommon(thread, js, script_uri); | 2494 return AddBreakpointCommon(thread, js, script_uri); |
2470 } | 2495 } |
2471 | 2496 |
2472 | 2497 |
2473 static const MethodParameter* add_breakpoint_with_script_uri_params[] = { | 2498 static const MethodParameter* add_breakpoint_with_script_uri_params[] = { |
2474 ISOLATE_PARAMETER, | 2499 RUNNABLE_ISOLATE_PARAMETER, |
2475 new IdParameter("scriptUri", true), | 2500 new IdParameter("scriptUri", true), |
2476 new UIntParameter("line", true), | 2501 new UIntParameter("line", true), |
2477 new UIntParameter("column", false), | 2502 new UIntParameter("column", false), |
2478 NULL, | 2503 NULL, |
2479 }; | 2504 }; |
2480 | 2505 |
2481 | 2506 |
2482 static bool AddBreakpointWithScriptUri(Thread* thread, JSONStream* js) { | 2507 static bool AddBreakpointWithScriptUri(Thread* thread, JSONStream* js) { |
2483 if (!thread->isolate()->compilation_allowed()) { | 2508 if (!thread->isolate()->compilation_allowed()) { |
2484 js->PrintError(kFeatureDisabled, | 2509 js->PrintError(kFeatureDisabled, |
2485 "Cannot use breakpoints when running a precompiled program."); | 2510 "Cannot use breakpoints when running a precompiled program."); |
2486 return true; | 2511 return true; |
2487 } | 2512 } |
2488 const char* script_uri_param = js->LookupParam("scriptUri"); | 2513 const char* script_uri_param = js->LookupParam("scriptUri"); |
2489 const String& script_uri = String::Handle(String::New(script_uri_param)); | 2514 const String& script_uri = String::Handle(String::New(script_uri_param)); |
2490 return AddBreakpointCommon(thread, js, script_uri); | 2515 return AddBreakpointCommon(thread, js, script_uri); |
2491 } | 2516 } |
2492 | 2517 |
2493 | 2518 |
2494 static const MethodParameter* add_breakpoint_at_entry_params[] = { | 2519 static const MethodParameter* add_breakpoint_at_entry_params[] = { |
2495 ISOLATE_PARAMETER, | 2520 RUNNABLE_ISOLATE_PARAMETER, |
2496 new IdParameter("functionId", true), | 2521 new IdParameter("functionId", true), |
2497 NULL, | 2522 NULL, |
2498 }; | 2523 }; |
2499 | 2524 |
2500 | 2525 |
2501 static bool AddBreakpointAtEntry(Thread* thread, JSONStream* js) { | 2526 static bool AddBreakpointAtEntry(Thread* thread, JSONStream* js) { |
2502 if (!thread->isolate()->compilation_allowed()) { | 2527 if (!thread->isolate()->compilation_allowed()) { |
2503 js->PrintError(kFeatureDisabled, | 2528 js->PrintError(kFeatureDisabled, |
2504 "Cannot use breakpoints when running a precompiled program."); | 2529 "Cannot use breakpoints when running a precompiled program."); |
2505 return true; | 2530 return true; |
(...skipping 12 matching lines...) Expand all Loading... |
2518 "%s: Cannot add breakpoint at function '%s'", | 2543 "%s: Cannot add breakpoint at function '%s'", |
2519 js->method(), function.ToCString()); | 2544 js->method(), function.ToCString()); |
2520 return true; | 2545 return true; |
2521 } | 2546 } |
2522 bpt->PrintJSON(js); | 2547 bpt->PrintJSON(js); |
2523 return true; | 2548 return true; |
2524 } | 2549 } |
2525 | 2550 |
2526 | 2551 |
2527 static const MethodParameter* add_breakpoint_at_activation_params[] = { | 2552 static const MethodParameter* add_breakpoint_at_activation_params[] = { |
2528 ISOLATE_PARAMETER, | 2553 RUNNABLE_ISOLATE_PARAMETER, |
2529 new IdParameter("objectId", true), | 2554 new IdParameter("objectId", true), |
2530 NULL, | 2555 NULL, |
2531 }; | 2556 }; |
2532 | 2557 |
2533 | 2558 |
2534 static bool AddBreakpointAtActivation(Thread* thread, JSONStream* js) { | 2559 static bool AddBreakpointAtActivation(Thread* thread, JSONStream* js) { |
2535 if (!thread->isolate()->compilation_allowed()) { | 2560 if (!thread->isolate()->compilation_allowed()) { |
2536 js->PrintError(kFeatureDisabled, | 2561 js->PrintError(kFeatureDisabled, |
2537 "Cannot use breakpoints when running a precompiled program."); | 2562 "Cannot use breakpoints when running a precompiled program."); |
2538 return true; | 2563 return true; |
(...skipping 12 matching lines...) Expand all Loading... |
2551 "%s: Cannot add breakpoint at activation", | 2576 "%s: Cannot add breakpoint at activation", |
2552 js->method()); | 2577 js->method()); |
2553 return true; | 2578 return true; |
2554 } | 2579 } |
2555 bpt->PrintJSON(js); | 2580 bpt->PrintJSON(js); |
2556 return true; | 2581 return true; |
2557 } | 2582 } |
2558 | 2583 |
2559 | 2584 |
2560 static const MethodParameter* remove_breakpoint_params[] = { | 2585 static const MethodParameter* remove_breakpoint_params[] = { |
2561 ISOLATE_PARAMETER, | 2586 RUNNABLE_ISOLATE_PARAMETER, |
2562 NULL, | 2587 NULL, |
2563 }; | 2588 }; |
2564 | 2589 |
2565 | 2590 |
2566 static bool RemoveBreakpoint(Thread* thread, JSONStream* js) { | 2591 static bool RemoveBreakpoint(Thread* thread, JSONStream* js) { |
2567 if (!thread->isolate()->compilation_allowed()) { | 2592 if (!thread->isolate()->compilation_allowed()) { |
2568 js->PrintError(kFeatureDisabled, | 2593 js->PrintError(kFeatureDisabled, |
2569 "Cannot use breakpoints when running a precompiled program."); | 2594 "Cannot use breakpoints when running a precompiled program."); |
2570 return true; | 2595 return true; |
2571 } | 2596 } |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2681 TextBuffer* buffer = js->buffer(); | 2706 TextBuffer* buffer = js->buffer(); |
2682 buffer->AddString(String::Cast(result).ToCString()); | 2707 buffer->AddString(String::Cast(result).ToCString()); |
2683 return true; | 2708 return true; |
2684 } | 2709 } |
2685 PrintInvalidParamError(js, "metricId"); | 2710 PrintInvalidParamError(js, "metricId"); |
2686 return true; | 2711 return true; |
2687 } | 2712 } |
2688 | 2713 |
2689 | 2714 |
2690 static const MethodParameter* get_isolate_metric_list_params[] = { | 2715 static const MethodParameter* get_isolate_metric_list_params[] = { |
2691 ISOLATE_PARAMETER, | 2716 RUNNABLE_ISOLATE_PARAMETER, |
2692 NULL, | 2717 NULL, |
2693 }; | 2718 }; |
2694 | 2719 |
2695 | 2720 |
2696 static bool GetIsolateMetricList(Thread* thread, JSONStream* js) { | 2721 static bool GetIsolateMetricList(Thread* thread, JSONStream* js) { |
2697 bool native_metrics = false; | 2722 bool native_metrics = false; |
2698 if (js->HasParam("type")) { | 2723 if (js->HasParam("type")) { |
2699 if (js->ParamIs("type", "Native")) { | 2724 if (js->ParamIs("type", "Native")) { |
2700 native_metrics = true; | 2725 native_metrics = true; |
2701 } else if (js->ParamIs("type", "Dart")) { | 2726 } else if (js->ParamIs("type", "Dart")) { |
2702 native_metrics = false; | 2727 native_metrics = false; |
2703 } else { | 2728 } else { |
2704 PrintInvalidParamError(js, "type"); | 2729 PrintInvalidParamError(js, "type"); |
2705 return true; | 2730 return true; |
2706 } | 2731 } |
2707 } else { | 2732 } else { |
2708 PrintMissingParamError(js, "type"); | 2733 PrintMissingParamError(js, "type"); |
2709 return true; | 2734 return true; |
2710 } | 2735 } |
2711 if (native_metrics) { | 2736 if (native_metrics) { |
2712 return HandleNativeMetricsList(thread, js); | 2737 return HandleNativeMetricsList(thread, js); |
2713 } | 2738 } |
2714 return HandleDartMetricsList(thread, js); | 2739 return HandleDartMetricsList(thread, js); |
2715 } | 2740 } |
2716 | 2741 |
2717 | 2742 |
2718 static const MethodParameter* get_isolate_metric_params[] = { | 2743 static const MethodParameter* get_isolate_metric_params[] = { |
2719 ISOLATE_PARAMETER, | 2744 RUNNABLE_ISOLATE_PARAMETER, |
2720 NULL, | 2745 NULL, |
2721 }; | 2746 }; |
2722 | 2747 |
2723 | 2748 |
2724 static bool GetIsolateMetric(Thread* thread, JSONStream* js) { | 2749 static bool GetIsolateMetric(Thread* thread, JSONStream* js) { |
2725 const char* metric_id = js->LookupParam("metricId"); | 2750 const char* metric_id = js->LookupParam("metricId"); |
2726 if (metric_id == NULL) { | 2751 if (metric_id == NULL) { |
2727 PrintMissingParamError(js, "metricId"); | 2752 PrintMissingParamError(js, "metricId"); |
2728 return true; | 2753 return true; |
2729 } | 2754 } |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2857 Int64Parameter::Parse(js->LookupParam("timeOriginMicros")); | 2882 Int64Parameter::Parse(js->LookupParam("timeOriginMicros")); |
2858 int64_t time_extent_micros = | 2883 int64_t time_extent_micros = |
2859 Int64Parameter::Parse(js->LookupParam("timeExtentMicros")); | 2884 Int64Parameter::Parse(js->LookupParam("timeExtentMicros")); |
2860 TimelineEventFilter filter(time_origin_micros, time_extent_micros); | 2885 TimelineEventFilter filter(time_origin_micros, time_extent_micros); |
2861 timeline_recorder->PrintJSON(js, &filter); | 2886 timeline_recorder->PrintJSON(js, &filter); |
2862 return true; | 2887 return true; |
2863 } | 2888 } |
2864 | 2889 |
2865 | 2890 |
2866 static const MethodParameter* resume_params[] = { | 2891 static const MethodParameter* resume_params[] = { |
2867 ISOLATE_PARAMETER, | 2892 RUNNABLE_ISOLATE_PARAMETER, |
2868 NULL, | 2893 NULL, |
2869 }; | 2894 }; |
2870 | 2895 |
2871 | 2896 |
2872 static bool Resume(Thread* thread, JSONStream* js) { | 2897 static bool Resume(Thread* thread, JSONStream* js) { |
2873 const char* step_param = js->LookupParam("step"); | 2898 const char* step_param = js->LookupParam("step"); |
2874 Isolate* isolate = thread->isolate(); | 2899 Isolate* isolate = thread->isolate(); |
2875 if (isolate->message_handler()->paused_on_start()) { | 2900 if (isolate->message_handler()->paused_on_start()) { |
2876 // If the user is issuing a 'Over' or an 'Out' step, that is the | 2901 // If the user is issuing a 'Over' or an 'Out' step, that is the |
2877 // same as a regular resume request. | 2902 // same as a regular resume request. |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2910 PrintSuccess(js); | 2935 PrintSuccess(js); |
2911 return true; | 2936 return true; |
2912 } | 2937 } |
2913 | 2938 |
2914 js->PrintError(kVMMustBePaused, NULL); | 2939 js->PrintError(kVMMustBePaused, NULL); |
2915 return true; | 2940 return true; |
2916 } | 2941 } |
2917 | 2942 |
2918 | 2943 |
2919 static const MethodParameter* pause_params[] = { | 2944 static const MethodParameter* pause_params[] = { |
2920 ISOLATE_PARAMETER, | 2945 RUNNABLE_ISOLATE_PARAMETER, |
2921 NULL, | 2946 NULL, |
2922 }; | 2947 }; |
2923 | 2948 |
2924 | 2949 |
2925 static bool Pause(Thread* thread, JSONStream* js) { | 2950 static bool Pause(Thread* thread, JSONStream* js) { |
2926 // TODO(turnidge): This interrupt message could have been sent from | 2951 // TODO(turnidge): This interrupt message could have been sent from |
2927 // the service isolate directly, but would require some special case | 2952 // the service isolate directly, but would require some special case |
2928 // code. That would prevent this isolate getting double-interrupted | 2953 // code. That would prevent this isolate getting double-interrupted |
2929 // with OOB messages. | 2954 // with OOB messages. |
2930 Isolate* isolate = thread->isolate(); | 2955 Isolate* isolate = thread->isolate(); |
2931 isolate->SendInternalLibMessage(Isolate::kInterruptMsg, | 2956 isolate->SendInternalLibMessage(Isolate::kInterruptMsg, |
2932 isolate->pause_capability()); | 2957 isolate->pause_capability()); |
2933 PrintSuccess(js); | 2958 PrintSuccess(js); |
2934 return true; | 2959 return true; |
2935 } | 2960 } |
2936 | 2961 |
2937 | 2962 |
2938 static const MethodParameter* get_tag_profile_params[] = { | 2963 static const MethodParameter* get_tag_profile_params[] = { |
2939 ISOLATE_PARAMETER, | 2964 RUNNABLE_ISOLATE_PARAMETER, |
2940 NULL, | 2965 NULL, |
2941 }; | 2966 }; |
2942 | 2967 |
2943 | 2968 |
2944 static bool GetTagProfile(Thread* thread, JSONStream* js) { | 2969 static bool GetTagProfile(Thread* thread, JSONStream* js) { |
2945 JSONObject miniProfile(js); | 2970 JSONObject miniProfile(js); |
2946 miniProfile.AddProperty("type", "TagProfile"); | 2971 miniProfile.AddProperty("type", "TagProfile"); |
2947 thread->isolate()->vm_tag_counters()->PrintToJSONObject(&miniProfile); | 2972 thread->isolate()->vm_tag_counters()->PrintToJSONObject(&miniProfile); |
2948 return true; | 2973 return true; |
2949 } | 2974 } |
(...skipping 13 matching lines...) Expand all Loading... |
2963 Profile::kNoTags, | 2988 Profile::kNoTags, |
2964 Profile::kUserVM, | 2989 Profile::kUserVM, |
2965 Profile::kUser, | 2990 Profile::kUser, |
2966 Profile::kVMUser, | 2991 Profile::kVMUser, |
2967 Profile::kVM, | 2992 Profile::kVM, |
2968 Profile::kNoTags, // Default value. | 2993 Profile::kNoTags, // Default value. |
2969 }; | 2994 }; |
2970 | 2995 |
2971 | 2996 |
2972 static const MethodParameter* get_cpu_profile_params[] = { | 2997 static const MethodParameter* get_cpu_profile_params[] = { |
2973 ISOLATE_PARAMETER, | 2998 RUNNABLE_ISOLATE_PARAMETER, |
2974 new EnumParameter("tags", true, tags_enum_names), | 2999 new EnumParameter("tags", true, tags_enum_names), |
2975 new BoolParameter("_codeTransitionTags", false), | 3000 new BoolParameter("_codeTransitionTags", false), |
2976 new Int64Parameter("timeOriginMicros", false), | 3001 new Int64Parameter("timeOriginMicros", false), |
2977 new Int64Parameter("timeExtentMicros", false), | 3002 new Int64Parameter("timeExtentMicros", false), |
2978 NULL, | 3003 NULL, |
2979 }; | 3004 }; |
2980 | 3005 |
2981 | 3006 |
2982 // TODO(johnmccutchan): Rename this to GetCpuSamples. | 3007 // TODO(johnmccutchan): Rename this to GetCpuSamples. |
2983 static bool GetCpuProfile(Thread* thread, JSONStream* js) { | 3008 static bool GetCpuProfile(Thread* thread, JSONStream* js) { |
(...skipping 10 matching lines...) Expand all Loading... |
2994 ProfilerService::PrintJSON(js, | 3019 ProfilerService::PrintJSON(js, |
2995 tag_order, | 3020 tag_order, |
2996 extra_tags, | 3021 extra_tags, |
2997 time_origin_micros, | 3022 time_origin_micros, |
2998 time_extent_micros); | 3023 time_extent_micros); |
2999 return true; | 3024 return true; |
3000 } | 3025 } |
3001 | 3026 |
3002 | 3027 |
3003 static const MethodParameter* get_cpu_profile_timeline_params[] = { | 3028 static const MethodParameter* get_cpu_profile_timeline_params[] = { |
3004 ISOLATE_PARAMETER, | 3029 RUNNABLE_ISOLATE_PARAMETER, |
3005 new EnumParameter("tags", true, tags_enum_names), | 3030 new EnumParameter("tags", true, tags_enum_names), |
3006 new Int64Parameter("timeOriginMicros", false), | 3031 new Int64Parameter("timeOriginMicros", false), |
3007 new Int64Parameter("timeExtentMicros", false), | 3032 new Int64Parameter("timeExtentMicros", false), |
3008 NULL, | 3033 NULL, |
3009 }; | 3034 }; |
3010 | 3035 |
3011 | 3036 |
3012 static bool GetCpuProfileTimeline(Thread* thread, JSONStream* js) { | 3037 static bool GetCpuProfileTimeline(Thread* thread, JSONStream* js) { |
3013 Profile::TagOrder tag_order = | 3038 Profile::TagOrder tag_order = |
3014 EnumMapper(js->LookupParam("tags"), tags_enum_names, tags_enum_values); | 3039 EnumMapper(js->LookupParam("tags"), tags_enum_names, tags_enum_values); |
3015 int64_t time_origin_micros = | 3040 int64_t time_origin_micros = |
3016 UIntParameter::Parse(js->LookupParam("timeOriginMicros")); | 3041 UIntParameter::Parse(js->LookupParam("timeOriginMicros")); |
3017 int64_t time_extent_micros = | 3042 int64_t time_extent_micros = |
3018 UIntParameter::Parse(js->LookupParam("timeExtentMicros")); | 3043 UIntParameter::Parse(js->LookupParam("timeExtentMicros")); |
3019 ProfilerService::PrintTimelineJSON(js, | 3044 ProfilerService::PrintTimelineJSON(js, |
3020 tag_order, | 3045 tag_order, |
3021 time_origin_micros, | 3046 time_origin_micros, |
3022 time_extent_micros); | 3047 time_extent_micros); |
3023 return true; | 3048 return true; |
3024 } | 3049 } |
3025 | 3050 |
3026 | 3051 |
3027 static const MethodParameter* get_allocation_samples_params[] = { | 3052 static const MethodParameter* get_allocation_samples_params[] = { |
3028 ISOLATE_PARAMETER, | 3053 RUNNABLE_ISOLATE_PARAMETER, |
3029 new EnumParameter("tags", true, tags_enum_names), | 3054 new EnumParameter("tags", true, tags_enum_names), |
3030 new IdParameter("classId", false), | 3055 new IdParameter("classId", false), |
3031 new Int64Parameter("timeOriginMicros", false), | 3056 new Int64Parameter("timeOriginMicros", false), |
3032 new Int64Parameter("timeExtentMicros", false), | 3057 new Int64Parameter("timeExtentMicros", false), |
3033 NULL, | 3058 NULL, |
3034 }; | 3059 }; |
3035 | 3060 |
3036 | 3061 |
3037 static bool GetAllocationSamples(Thread* thread, JSONStream* js) { | 3062 static bool GetAllocationSamples(Thread* thread, JSONStream* js) { |
3038 Profile::TagOrder tag_order = | 3063 Profile::TagOrder tag_order = |
(...skipping 14 matching lines...) Expand all Loading... |
3053 time_origin_micros, | 3078 time_origin_micros, |
3054 time_extent_micros); | 3079 time_extent_micros); |
3055 } else { | 3080 } else { |
3056 PrintInvalidParamError(js, "classId"); | 3081 PrintInvalidParamError(js, "classId"); |
3057 } | 3082 } |
3058 return true; | 3083 return true; |
3059 } | 3084 } |
3060 | 3085 |
3061 | 3086 |
3062 static const MethodParameter* clear_cpu_profile_params[] = { | 3087 static const MethodParameter* clear_cpu_profile_params[] = { |
3063 ISOLATE_PARAMETER, | 3088 RUNNABLE_ISOLATE_PARAMETER, |
3064 NULL, | 3089 NULL, |
3065 }; | 3090 }; |
3066 | 3091 |
3067 | 3092 |
3068 static bool ClearCpuProfile(Thread* thread, JSONStream* js) { | 3093 static bool ClearCpuProfile(Thread* thread, JSONStream* js) { |
3069 ProfilerService::ClearSamples(); | 3094 ProfilerService::ClearSamples(); |
3070 PrintSuccess(js); | 3095 PrintSuccess(js); |
3071 return true; | 3096 return true; |
3072 } | 3097 } |
3073 | 3098 |
3074 | 3099 |
3075 static const MethodParameter* get_allocation_profile_params[] = { | 3100 static const MethodParameter* get_allocation_profile_params[] = { |
3076 ISOLATE_PARAMETER, | 3101 RUNNABLE_ISOLATE_PARAMETER, |
3077 NULL, | 3102 NULL, |
3078 }; | 3103 }; |
3079 | 3104 |
3080 | 3105 |
3081 static bool GetAllocationProfile(Thread* thread, JSONStream* js) { | 3106 static bool GetAllocationProfile(Thread* thread, JSONStream* js) { |
3082 bool should_reset_accumulator = false; | 3107 bool should_reset_accumulator = false; |
3083 bool should_collect = false; | 3108 bool should_collect = false; |
3084 if (js->HasParam("reset")) { | 3109 if (js->HasParam("reset")) { |
3085 if (js->ParamIs("reset", "true")) { | 3110 if (js->ParamIs("reset", "true")) { |
3086 should_reset_accumulator = true; | 3111 should_reset_accumulator = true; |
(...skipping 18 matching lines...) Expand all Loading... |
3105 if (should_collect) { | 3130 if (should_collect) { |
3106 isolate->UpdateLastAllocationProfileGCTimestamp(); | 3131 isolate->UpdateLastAllocationProfileGCTimestamp(); |
3107 isolate->heap()->CollectAllGarbage(); | 3132 isolate->heap()->CollectAllGarbage(); |
3108 } | 3133 } |
3109 isolate->class_table()->AllocationProfilePrintJSON(js); | 3134 isolate->class_table()->AllocationProfilePrintJSON(js); |
3110 return true; | 3135 return true; |
3111 } | 3136 } |
3112 | 3137 |
3113 | 3138 |
3114 static const MethodParameter* get_heap_map_params[] = { | 3139 static const MethodParameter* get_heap_map_params[] = { |
3115 ISOLATE_PARAMETER, | 3140 RUNNABLE_ISOLATE_PARAMETER, |
3116 NULL, | 3141 NULL, |
3117 }; | 3142 }; |
3118 | 3143 |
3119 | 3144 |
3120 static bool GetHeapMap(Thread* thread, JSONStream* js) { | 3145 static bool GetHeapMap(Thread* thread, JSONStream* js) { |
3121 Isolate* isolate = thread->isolate(); | 3146 Isolate* isolate = thread->isolate(); |
3122 isolate->heap()->PrintHeapMapToJSONStream(isolate, js); | 3147 isolate->heap()->PrintHeapMapToJSONStream(isolate, js); |
3123 return true; | 3148 return true; |
3124 } | 3149 } |
3125 | 3150 |
3126 | 3151 |
3127 static const MethodParameter* request_heap_snapshot_params[] = { | 3152 static const MethodParameter* request_heap_snapshot_params[] = { |
3128 ISOLATE_PARAMETER, | 3153 RUNNABLE_ISOLATE_PARAMETER, |
3129 NULL, | 3154 NULL, |
3130 }; | 3155 }; |
3131 | 3156 |
3132 | 3157 |
3133 static bool RequestHeapSnapshot(Thread* thread, JSONStream* js) { | 3158 static bool RequestHeapSnapshot(Thread* thread, JSONStream* js) { |
3134 if (Service::graph_stream.enabled()) { | 3159 if (Service::graph_stream.enabled()) { |
3135 Service::SendGraphEvent(thread); | 3160 Service::SendGraphEvent(thread); |
3136 } | 3161 } |
3137 // TODO(koda): Provide some id that ties this request to async response(s). | 3162 // TODO(koda): Provide some id that ties this request to async response(s). |
3138 JSONObject jsobj(js); | 3163 JSONObject jsobj(js); |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3272 uword obj_begin = RawObject::ToAddr(obj); | 3297 uword obj_begin = RawObject::ToAddr(obj); |
3273 uword obj_end = obj_begin + obj->Size(); | 3298 uword obj_end = obj_begin + obj->Size(); |
3274 return obj_begin <= addr_ && addr_ < obj_end; | 3299 return obj_begin <= addr_ && addr_ < obj_end; |
3275 } | 3300 } |
3276 private: | 3301 private: |
3277 uword addr_; | 3302 uword addr_; |
3278 }; | 3303 }; |
3279 | 3304 |
3280 | 3305 |
3281 static const MethodParameter* get_object_by_address_params[] = { | 3306 static const MethodParameter* get_object_by_address_params[] = { |
3282 ISOLATE_PARAMETER, | 3307 RUNNABLE_ISOLATE_PARAMETER, |
3283 NULL, | 3308 NULL, |
3284 }; | 3309 }; |
3285 | 3310 |
3286 | 3311 |
3287 static RawObject* GetObjectHelper(Thread* thread, uword addr) { | 3312 static RawObject* GetObjectHelper(Thread* thread, uword addr) { |
3288 Object& object = Object::Handle(thread->zone()); | 3313 Object& object = Object::Handle(thread->zone()); |
3289 | 3314 |
3290 { | 3315 { |
3291 NoSafepointScope no_safepoint; | 3316 NoSafepointScope no_safepoint; |
3292 Isolate* isolate = thread->isolate(); | 3317 Isolate* isolate = thread->isolate(); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3327 if (obj.IsNull()) { | 3352 if (obj.IsNull()) { |
3328 PrintSentinel(js, kFreeSentinel); | 3353 PrintSentinel(js, kFreeSentinel); |
3329 } else { | 3354 } else { |
3330 obj.PrintJSON(js, ref); | 3355 obj.PrintJSON(js, ref); |
3331 } | 3356 } |
3332 return true; | 3357 return true; |
3333 } | 3358 } |
3334 | 3359 |
3335 | 3360 |
3336 static const MethodParameter* get_ports_params[] = { | 3361 static const MethodParameter* get_ports_params[] = { |
3337 ISOLATE_PARAMETER, | 3362 RUNNABLE_ISOLATE_PARAMETER, |
3338 NULL, | 3363 NULL, |
3339 }; | 3364 }; |
3340 | 3365 |
3341 | 3366 |
3342 static bool GetPorts(Thread* thread, JSONStream* js) { | 3367 static bool GetPorts(Thread* thread, JSONStream* js) { |
3343 MessageHandler* message_handler = thread->isolate()->message_handler(); | 3368 MessageHandler* message_handler = thread->isolate()->message_handler(); |
3344 PortMap::PrintPortsForMessageHandler(message_handler, js); | 3369 PortMap::PrintPortsForMessageHandler(message_handler, js); |
3345 return true; | 3370 return true; |
3346 } | 3371 } |
3347 | 3372 |
(...skipping 12 matching lines...) Expand all Loading... |
3360 | 3385 |
3361 | 3386 |
3362 static bool RespondWithMalformedObject(Thread* thread, JSONStream* js) { | 3387 static bool RespondWithMalformedObject(Thread* thread, JSONStream* js) { |
3363 JSONObject jsobj(js); | 3388 JSONObject jsobj(js); |
3364 jsobj.AddProperty("bart", "simpson"); | 3389 jsobj.AddProperty("bart", "simpson"); |
3365 return true; | 3390 return true; |
3366 } | 3391 } |
3367 | 3392 |
3368 | 3393 |
3369 static const MethodParameter* get_object_params[] = { | 3394 static const MethodParameter* get_object_params[] = { |
3370 ISOLATE_PARAMETER, | 3395 RUNNABLE_ISOLATE_PARAMETER, |
3371 new UIntParameter("offset", false), | 3396 new UIntParameter("offset", false), |
3372 new UIntParameter("count", false), | 3397 new UIntParameter("count", false), |
3373 NULL, | 3398 NULL, |
3374 }; | 3399 }; |
3375 | 3400 |
3376 | 3401 |
3377 static bool GetObject(Thread* thread, JSONStream* js) { | 3402 static bool GetObject(Thread* thread, JSONStream* js) { |
3378 const char* id = js->LookupParam("objectId"); | 3403 const char* id = js->LookupParam("objectId"); |
3379 if (id == NULL) { | 3404 if (id == NULL) { |
3380 PrintMissingParamError(js, "objectId"); | 3405 PrintMissingParamError(js, "objectId"); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3422 PrintSentinel(js, kCollectedSentinel); | 3447 PrintSentinel(js, kCollectedSentinel); |
3423 return true; | 3448 return true; |
3424 } | 3449 } |
3425 | 3450 |
3426 PrintInvalidParamError(js, "objectId"); | 3451 PrintInvalidParamError(js, "objectId"); |
3427 return true; | 3452 return true; |
3428 } | 3453 } |
3429 | 3454 |
3430 | 3455 |
3431 static const MethodParameter* get_class_list_params[] = { | 3456 static const MethodParameter* get_class_list_params[] = { |
3432 ISOLATE_PARAMETER, | 3457 RUNNABLE_ISOLATE_PARAMETER, |
3433 NULL, | 3458 NULL, |
3434 }; | 3459 }; |
3435 | 3460 |
3436 | 3461 |
3437 static bool GetClassList(Thread* thread, JSONStream* js) { | 3462 static bool GetClassList(Thread* thread, JSONStream* js) { |
3438 ClassTable* table = thread->isolate()->class_table(); | 3463 ClassTable* table = thread->isolate()->class_table(); |
3439 JSONObject jsobj(js); | 3464 JSONObject jsobj(js); |
3440 table->PrintToJSONObject(&jsobj); | 3465 table->PrintToJSONObject(&jsobj); |
3441 return true; | 3466 return true; |
3442 } | 3467 } |
3443 | 3468 |
3444 | 3469 |
3445 static const MethodParameter* get_type_arguments_list_params[] = { | 3470 static const MethodParameter* get_type_arguments_list_params[] = { |
3446 ISOLATE_PARAMETER, | 3471 RUNNABLE_ISOLATE_PARAMETER, |
3447 NULL, | 3472 NULL, |
3448 }; | 3473 }; |
3449 | 3474 |
3450 | 3475 |
3451 static bool GetTypeArgumentsList(Thread* thread, JSONStream* js) { | 3476 static bool GetTypeArgumentsList(Thread* thread, JSONStream* js) { |
3452 bool only_with_instantiations = false; | 3477 bool only_with_instantiations = false; |
3453 if (js->ParamIs("onlyWithInstantiations", "true")) { | 3478 if (js->ParamIs("onlyWithInstantiations", "true")) { |
3454 only_with_instantiations = true; | 3479 only_with_instantiations = true; |
3455 } | 3480 } |
3456 ObjectStore* object_store = thread->isolate()->object_store(); | 3481 ObjectStore* object_store = thread->isolate()->object_store(); |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3645 } else { | 3670 } else { |
3646 JSONObject jsobj(js); | 3671 JSONObject jsobj(js); |
3647 jsobj.AddProperty("type", "Error"); | 3672 jsobj.AddProperty("type", "Error"); |
3648 jsobj.AddProperty("message", error); | 3673 jsobj.AddProperty("message", error); |
3649 return true; | 3674 return true; |
3650 } | 3675 } |
3651 } | 3676 } |
3652 | 3677 |
3653 | 3678 |
3654 static const MethodParameter* set_library_debuggable_params[] = { | 3679 static const MethodParameter* set_library_debuggable_params[] = { |
3655 ISOLATE_PARAMETER, | 3680 RUNNABLE_ISOLATE_PARAMETER, |
3656 new IdParameter("libraryId", true), | 3681 new IdParameter("libraryId", true), |
3657 new BoolParameter("isDebuggable", true), | 3682 new BoolParameter("isDebuggable", true), |
3658 NULL, | 3683 NULL, |
3659 }; | 3684 }; |
3660 | 3685 |
3661 | 3686 |
3662 static bool SetLibraryDebuggable(Thread* thread, JSONStream* js) { | 3687 static bool SetLibraryDebuggable(Thread* thread, JSONStream* js) { |
3663 const char* lib_id = js->LookupParam("libraryId"); | 3688 const char* lib_id = js->LookupParam("libraryId"); |
3664 ObjectIdRing::LookupResult lookup_result; | 3689 ObjectIdRing::LookupResult lookup_result; |
3665 Object& obj = Object::Handle(LookupHeapObject(thread, lib_id, | 3690 Object& obj = Object::Handle(LookupHeapObject(thread, lib_id, |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3709 if (Service::vm_stream.enabled()) { | 3734 if (Service::vm_stream.enabled()) { |
3710 ServiceEvent event(NULL, ServiceEvent::kVMUpdate); | 3735 ServiceEvent event(NULL, ServiceEvent::kVMUpdate); |
3711 Service::HandleEvent(&event); | 3736 Service::HandleEvent(&event); |
3712 } | 3737 } |
3713 PrintSuccess(js); | 3738 PrintSuccess(js); |
3714 return true; | 3739 return true; |
3715 } | 3740 } |
3716 | 3741 |
3717 | 3742 |
3718 static const MethodParameter* set_trace_class_allocation_params[] = { | 3743 static const MethodParameter* set_trace_class_allocation_params[] = { |
3719 ISOLATE_PARAMETER, | 3744 RUNNABLE_ISOLATE_PARAMETER, |
3720 new IdParameter("classId", true), | 3745 new IdParameter("classId", true), |
3721 new BoolParameter("enable", true), | 3746 new BoolParameter("enable", true), |
3722 NULL, | 3747 NULL, |
3723 }; | 3748 }; |
3724 | 3749 |
3725 | 3750 |
3726 static bool SetTraceClassAllocation(Thread* thread, JSONStream* js) { | 3751 static bool SetTraceClassAllocation(Thread* thread, JSONStream* js) { |
3727 if (!thread->isolate()->compilation_allowed()) { | 3752 if (!thread->isolate()->compilation_allowed()) { |
3728 js->PrintError(kFeatureDisabled, | 3753 js->PrintError(kFeatureDisabled, |
3729 "Cannot trace allocation when running a precompiled program."); | 3754 "Cannot trace allocation when running a precompiled program."); |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3866 const ServiceMethodDescriptor& method = service_methods_[i]; | 3891 const ServiceMethodDescriptor& method = service_methods_[i]; |
3867 if (strcmp(method_name, method.name) == 0) { | 3892 if (strcmp(method_name, method.name) == 0) { |
3868 return &method; | 3893 return &method; |
3869 } | 3894 } |
3870 } | 3895 } |
3871 return NULL; | 3896 return NULL; |
3872 } | 3897 } |
3873 | 3898 |
3874 | 3899 |
3875 } // namespace dart | 3900 } // namespace dart |
OLD | NEW |