Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(814)

Side by Side Diff: runtime/vm/service.cc

Issue 1424703004: Getting rid of Isolate::current_zone() usage. Pass thread instead of isolate where it makes sense. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Fix build Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/service.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 511 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 for (i = 0; enums[i] != NULL; i++) { 522 for (i = 0; enums[i] != NULL; i++) {
523 if (strcmp(value, enums[i]) == 0) { 523 if (strcmp(value, enums[i]) == 0) {
524 return values[i]; 524 return values[i];
525 } 525 }
526 } 526 }
527 // Default value. 527 // Default value.
528 return values[i]; 528 return values[i];
529 } 529 }
530 530
531 531
532 typedef bool (*ServiceMethodEntry)(Isolate* isolate, JSONStream* js); 532 typedef bool (*ServiceMethodEntry)(Thread* thread, JSONStream* js);
533 533
534 534
535 struct ServiceMethodDescriptor { 535 struct ServiceMethodDescriptor {
536 const char* name; 536 const char* name;
537 const ServiceMethodEntry entry; 537 const ServiceMethodEntry entry;
538 const MethodParameter* const * parameters; 538 const MethodParameter* const * parameters;
539 }; 539 };
540 540
541 541
542 // TODO(johnmccutchan): Do we reject unexpected parameters? 542 // TODO(johnmccutchan): Do we reject unexpected parameters?
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 } 643 }
644 } 644 }
645 const char* c_method_name = method_name.ToCString(); 645 const char* c_method_name = method_name.ToCString();
646 646
647 ServiceMethodDescriptor* method = FindMethod(c_method_name); 647 ServiceMethodDescriptor* method = FindMethod(c_method_name);
648 if (method != NULL) { 648 if (method != NULL) {
649 if (!ValidateParameters(method->parameters, &js)) { 649 if (!ValidateParameters(method->parameters, &js)) {
650 js.PostReply(); 650 js.PostReply();
651 return; 651 return;
652 } 652 }
653 if (method->entry(I, &js)) { 653 if (method->entry(T, &js)) {
654 js.PostReply(); 654 js.PostReply();
655 } else { 655 } else {
656 // NOTE(turnidge): All message handlers currently return true, 656 // NOTE(turnidge): All message handlers currently return true,
657 // so this case shouldn't be reached, at present. 657 // so this case shouldn't be reached, at present.
658 UNIMPLEMENTED(); 658 UNIMPLEMENTED();
659 } 659 }
660 return; 660 return;
661 } 661 }
662 662
663 EmbedderServiceHandler* handler = FindIsolateEmbedderHandler(c_method_name); 663 EmbedderServiceHandler* handler = FindIsolateEmbedderHandler(c_method_name);
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after
1004 id); 1004 id);
1005 } 1005 }
1006 1006
1007 1007
1008 static const MethodParameter* get_isolate_params[] = { 1008 static const MethodParameter* get_isolate_params[] = {
1009 ISOLATE_PARAMETER, 1009 ISOLATE_PARAMETER,
1010 NULL, 1010 NULL,
1011 }; 1011 };
1012 1012
1013 1013
1014 static bool GetIsolate(Isolate* isolate, JSONStream* js) { 1014 static bool GetIsolate(Thread* thread, JSONStream* js) {
1015 isolate->PrintJSON(js, false); 1015 thread->isolate()->PrintJSON(js, false);
1016 return true; 1016 return true;
1017 } 1017 }
1018 1018
1019 1019
1020 static const MethodParameter* get_stack_params[] = { 1020 static const MethodParameter* get_stack_params[] = {
1021 ISOLATE_PARAMETER, 1021 ISOLATE_PARAMETER,
1022 new BoolParameter("_full", false), 1022 new BoolParameter("_full", false),
1023 NULL, 1023 NULL,
1024 }; 1024 };
1025 1025
1026 1026
1027 static bool GetStack(Isolate* isolate, JSONStream* js) { 1027 static bool GetStack(Thread* thread, JSONStream* js) {
1028 Isolate* isolate = thread->isolate();
1028 DebuggerStackTrace* stack = isolate->debugger()->StackTrace(); 1029 DebuggerStackTrace* stack = isolate->debugger()->StackTrace();
1029 // Do we want the complete script object and complete local variable objects? 1030 // Do we want the complete script object and complete local variable objects?
1030 // This is true for dump requests. 1031 // This is true for dump requests.
1031 const bool full = BoolParameter::Parse(js->LookupParam("_full"), false); 1032 const bool full = BoolParameter::Parse(js->LookupParam("_full"), false);
1032 JSONObject jsobj(js); 1033 JSONObject jsobj(js);
1033 jsobj.AddProperty("type", "Stack"); 1034 jsobj.AddProperty("type", "Stack");
1034 { 1035 {
1035 JSONArray jsarr(&jsobj, "frames"); 1036 JSONArray jsarr(&jsobj, "frames");
1036 1037
1037 intptr_t num_frames = stack->Length(); 1038 intptr_t num_frames = stack->Length();
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1082 event.AddPropertyTimeMillis("timestamp", OS::GetCurrentTimeMillis()); 1083 event.AddPropertyTimeMillis("timestamp", OS::GetCurrentTimeMillis());
1083 } 1084 }
1084 } 1085 }
1085 } 1086 }
1086 const String& message = String::Handle(String::New(js.ToCString())); 1087 const String& message = String::Handle(String::New(js.ToCString()));
1087 uint8_t data[] = {0, 128, 255}; 1088 uint8_t data[] = {0, 128, 255};
1088 SendEventWithData(echo_stream.id(), "_Echo", message, data, sizeof(data)); 1089 SendEventWithData(echo_stream.id(), "_Echo", message, data, sizeof(data));
1089 } 1090 }
1090 1091
1091 1092
1092 static bool TriggerEchoEvent(Isolate* isolate, JSONStream* js) { 1093 static bool TriggerEchoEvent(Thread* thread, JSONStream* js) {
1093 if (Service::echo_stream.enabled()) { 1094 if (Service::echo_stream.enabled()) {
1094 Service::SendEchoEvent(isolate, js->LookupParam("text")); 1095 Service::SendEchoEvent(thread->isolate(), js->LookupParam("text"));
1095 } 1096 }
1096 JSONObject jsobj(js); 1097 JSONObject jsobj(js);
1097 return HandleCommonEcho(&jsobj, js); 1098 return HandleCommonEcho(&jsobj, js);
1098 } 1099 }
1099 1100
1100 1101
1101 static bool DumpIdZone(Isolate* isolate, JSONStream* js) { 1102 static bool DumpIdZone(Thread* thread, JSONStream* js) {
1102 // TODO(johnmccutchan): Respect _idZone parameter passed to RPC. For now, 1103 // TODO(johnmccutchan): Respect _idZone parameter passed to RPC. For now,
1103 // always send the ObjectIdRing. 1104 // always send the ObjectIdRing.
1104 // 1105 //
1105 ObjectIdRing* ring = isolate->object_id_ring(); 1106 ObjectIdRing* ring = thread->isolate()->object_id_ring();
1106 ASSERT(ring != NULL); 1107 ASSERT(ring != NULL);
1107 // When printing the ObjectIdRing, force object id reuse policy. 1108 // When printing the ObjectIdRing, force object id reuse policy.
1108 RingServiceIdZone reuse_zone; 1109 RingServiceIdZone reuse_zone;
1109 reuse_zone.Init(ring, ObjectIdRing::kReuseId); 1110 reuse_zone.Init(ring, ObjectIdRing::kReuseId);
1110 js->set_id_zone(&reuse_zone); 1111 js->set_id_zone(&reuse_zone);
1111 ring->PrintJSON(js); 1112 ring->PrintJSON(js);
1112 return true; 1113 return true;
1113 } 1114 }
1114 1115
1115 1116
1116 static bool Echo(Isolate* isolate, JSONStream* js) { 1117 static bool Echo(Thread* thread, JSONStream* js) {
1117 JSONObject jsobj(js); 1118 JSONObject jsobj(js);
1118 return HandleCommonEcho(&jsobj, js); 1119 return HandleCommonEcho(&jsobj, js);
1119 } 1120 }
1120 1121
1121 1122
1122 static bool ContainsNonInstance(const Object& obj) { 1123 static bool ContainsNonInstance(const Object& obj) {
1123 if (obj.IsArray()) { 1124 if (obj.IsArray()) {
1124 const Array& array = Array::Cast(obj); 1125 const Array& array = Array::Cast(obj);
1125 Object& element = Object::Handle(); 1126 Object& element = Object::Handle();
1126 for (intptr_t i = 0; i < array.Length(); ++i) { 1127 for (intptr_t i = 0; i < array.Length(); ++i) {
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
1414 Code& code = Code::Handle(Code::FindCode(pc, timestamp)); 1415 Code& code = Code::Handle(Code::FindCode(pc, timestamp));
1415 if (!code.IsNull()) { 1416 if (!code.IsNull()) {
1416 return code.raw(); 1417 return code.raw();
1417 } 1418 }
1418 1419
1419 // Not found. 1420 // Not found.
1420 return Object::sentinel().raw(); 1421 return Object::sentinel().raw();
1421 } 1422 }
1422 1423
1423 1424
1424 static RawObject* LookupHeapObjectMessage(Isolate* isolate, 1425 static RawObject* LookupHeapObjectMessage(Thread* thread,
1425 char** parts, int num_parts) { 1426 char** parts, int num_parts) {
1426 if (num_parts != 2) { 1427 if (num_parts != 2) {
1427 return Object::sentinel().raw(); 1428 return Object::sentinel().raw();
1428 } 1429 }
1429 uword message_id = 0; 1430 uword message_id = 0;
1430 if (!GetUnsignedIntegerId(parts[1], &message_id, 16)) { 1431 if (!GetUnsignedIntegerId(parts[1], &message_id, 16)) {
1431 return Object::sentinel().raw(); 1432 return Object::sentinel().raw();
1432 } 1433 }
1433 MessageHandler::AcquiredQueues aq; 1434 MessageHandler::AcquiredQueues aq;
1434 isolate->message_handler()->AcquireQueues(&aq); 1435 thread->isolate()->message_handler()->AcquireQueues(&aq);
1435 Message* message = aq.queue()->FindMessageById(message_id); 1436 Message* message = aq.queue()->FindMessageById(message_id);
1436 if (message == NULL) { 1437 if (message == NULL) {
1437 // The user may try to load an expired message. 1438 // The user may try to load an expired message.
1438 return Object::sentinel().raw(); 1439 return Object::sentinel().raw();
1439 } 1440 }
1440 MessageSnapshotReader reader(message->data(), 1441 MessageSnapshotReader reader(message->data(),
1441 message->len(), 1442 message->len(),
1442 Thread::Current()); 1443 thread);
1443 return reader.ReadObject(); 1444 return reader.ReadObject();
1444 } 1445 }
1445 1446
1446 1447
1447 static RawObject* LookupHeapObject(Isolate* isolate, 1448 static RawObject* LookupHeapObject(Thread* thread,
1448 const char* id_original, 1449 const char* id_original,
1449 ObjectIdRing::LookupResult* result) { 1450 ObjectIdRing::LookupResult* result) {
1450 Thread* thread = Thread::Current();
1451 char* id = thread->zone()->MakeCopyOfString(id_original); 1451 char* id = thread->zone()->MakeCopyOfString(id_original);
1452 1452
1453 // Parse the id by splitting at each '/'. 1453 // Parse the id by splitting at each '/'.
1454 const int MAX_PARTS = 8; 1454 const int MAX_PARTS = 8;
1455 char* parts[MAX_PARTS]; 1455 char* parts[MAX_PARTS];
1456 int num_parts = 0; 1456 int num_parts = 0;
1457 int i = 0; 1457 int i = 0;
1458 int start_pos = 0; 1458 int start_pos = 0;
1459 while (id[i] != '\0') { 1459 while (id[i] != '\0') {
1460 if (id[i] == '/') { 1460 if (id[i] == '/') {
1461 id[i++] = '\0'; 1461 id[i++] = '\0';
1462 parts[num_parts++] = &id[start_pos]; 1462 parts[num_parts++] = &id[start_pos];
1463 if (num_parts == MAX_PARTS) { 1463 if (num_parts == MAX_PARTS) {
1464 break; 1464 break;
1465 } 1465 }
1466 start_pos = i; 1466 start_pos = i;
1467 } else { 1467 } else {
1468 i++; 1468 i++;
1469 } 1469 }
1470 } 1470 }
1471 if (num_parts < MAX_PARTS) { 1471 if (num_parts < MAX_PARTS) {
1472 parts[num_parts++] = &id[start_pos]; 1472 parts[num_parts++] = &id[start_pos];
1473 } 1473 }
1474 1474
1475 if (result != NULL) { 1475 if (result != NULL) {
1476 *result = ObjectIdRing::kValid; 1476 *result = ObjectIdRing::kValid;
1477 } 1477 }
1478 1478
1479 Isolate* isolate = thread->isolate();
1479 if (strcmp(parts[0], "objects") == 0) { 1480 if (strcmp(parts[0], "objects") == 0) {
1480 // Object ids look like "objects/1123" 1481 // Object ids look like "objects/1123"
1481 Object& obj = Object::Handle(thread->zone()); 1482 Object& obj = Object::Handle(thread->zone());
1482 ObjectIdRing::LookupResult lookup_result; 1483 ObjectIdRing::LookupResult lookup_result;
1483 obj = LookupObjectId(thread, parts[1], &lookup_result); 1484 obj = LookupObjectId(thread, parts[1], &lookup_result);
1484 if (lookup_result != ObjectIdRing::kValid) { 1485 if (lookup_result != ObjectIdRing::kValid) {
1485 if (result != NULL) { 1486 if (result != NULL) {
1486 *result = lookup_result; 1487 *result = lookup_result;
1487 } 1488 }
1488 return Object::sentinel().raw(); 1489 return Object::sentinel().raw();
1489 } 1490 }
1490 return obj.raw(); 1491 return obj.raw();
1491 1492
1492 } else if (strcmp(parts[0], "libraries") == 0) { 1493 } else if (strcmp(parts[0], "libraries") == 0) {
1493 return LookupHeapObjectLibraries(isolate, parts, num_parts); 1494 return LookupHeapObjectLibraries(isolate, parts, num_parts);
1494 } else if (strcmp(parts[0], "classes") == 0) { 1495 } else if (strcmp(parts[0], "classes") == 0) {
1495 return LookupHeapObjectClasses(thread, parts, num_parts); 1496 return LookupHeapObjectClasses(thread, parts, num_parts);
1496 } else if (strcmp(parts[0], "typearguments") == 0) { 1497 } else if (strcmp(parts[0], "typearguments") == 0) {
1497 return LookupHeapObjectTypeArguments(thread, parts, num_parts); 1498 return LookupHeapObjectTypeArguments(thread, parts, num_parts);
1498 } else if (strcmp(parts[0], "code") == 0) { 1499 } else if (strcmp(parts[0], "code") == 0) {
1499 return LookupHeapObjectCode(isolate, parts, num_parts); 1500 return LookupHeapObjectCode(isolate, parts, num_parts);
1500 } else if (strcmp(parts[0], "messages") == 0) { 1501 } else if (strcmp(parts[0], "messages") == 0) {
1501 return LookupHeapObjectMessage(isolate, parts, num_parts); 1502 return LookupHeapObjectMessage(thread, parts, num_parts);
1502 } 1503 }
1503 1504
1504 // Not found. 1505 // Not found.
1505 return Object::sentinel().raw(); 1506 return Object::sentinel().raw();
1506 } 1507 }
1507 1508
1508 1509
1509 enum SentinelType { 1510 enum SentinelType {
1510 kCollectedSentinel, 1511 kCollectedSentinel,
1511 kExpiredSentinel, 1512 kExpiredSentinel,
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1613 return true; 1614 return true;
1614 } 1615 }
1615 1616
1616 1617
1617 static const MethodParameter* get_inbound_references_params[] = { 1618 static const MethodParameter* get_inbound_references_params[] = {
1618 ISOLATE_PARAMETER, 1619 ISOLATE_PARAMETER,
1619 NULL, 1620 NULL,
1620 }; 1621 };
1621 1622
1622 1623
1623 static bool GetInboundReferences(Isolate* isolate, JSONStream* js) { 1624 static bool GetInboundReferences(Thread* thread, JSONStream* js) {
1624 Thread* thread = Thread::Current();
1625 ASSERT(isolate == thread->isolate());
1626
1627 const char* target_id = js->LookupParam("targetId"); 1625 const char* target_id = js->LookupParam("targetId");
1628 if (target_id == NULL) { 1626 if (target_id == NULL) {
1629 PrintMissingParamError(js, "targetId"); 1627 PrintMissingParamError(js, "targetId");
1630 return true; 1628 return true;
1631 } 1629 }
1632 const char* limit_cstr = js->LookupParam("limit"); 1630 const char* limit_cstr = js->LookupParam("limit");
1633 if (limit_cstr == NULL) { 1631 if (limit_cstr == NULL) {
1634 PrintMissingParamError(js, "limit"); 1632 PrintMissingParamError(js, "limit");
1635 return true; 1633 return true;
1636 } 1634 }
1637 intptr_t limit; 1635 intptr_t limit;
1638 if (!GetIntegerId(limit_cstr, &limit)) { 1636 if (!GetIntegerId(limit_cstr, &limit)) {
1639 PrintInvalidParamError(js, "limit"); 1637 PrintInvalidParamError(js, "limit");
1640 return true; 1638 return true;
1641 } 1639 }
1642 1640
1643 Object& obj = Object::Handle(thread->zone()); 1641 Object& obj = Object::Handle(thread->zone());
1644 ObjectIdRing::LookupResult lookup_result; 1642 ObjectIdRing::LookupResult lookup_result;
1645 { 1643 {
1646 HANDLESCOPE(thread); 1644 HANDLESCOPE(thread);
1647 obj = LookupHeapObject(isolate, target_id, &lookup_result); 1645 obj = LookupHeapObject(thread, target_id, &lookup_result);
1648 } 1646 }
1649 if (obj.raw() == Object::sentinel().raw()) { 1647 if (obj.raw() == Object::sentinel().raw()) {
1650 if (lookup_result == ObjectIdRing::kCollected) { 1648 if (lookup_result == ObjectIdRing::kCollected) {
1651 PrintSentinel(js, kCollectedSentinel); 1649 PrintSentinel(js, kCollectedSentinel);
1652 } else if (lookup_result == ObjectIdRing::kExpired) { 1650 } else if (lookup_result == ObjectIdRing::kExpired) {
1653 PrintSentinel(js, kExpiredSentinel); 1651 PrintSentinel(js, kExpiredSentinel);
1654 } else { 1652 } else {
1655 PrintInvalidParamError(js, "targetId"); 1653 PrintInvalidParamError(js, "targetId");
1656 } 1654 }
1657 return true; 1655 return true;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1715 return true; 1713 return true;
1716 } 1714 }
1717 1715
1718 1716
1719 static const MethodParameter* get_retaining_path_params[] = { 1717 static const MethodParameter* get_retaining_path_params[] = {
1720 ISOLATE_PARAMETER, 1718 ISOLATE_PARAMETER,
1721 NULL, 1719 NULL,
1722 }; 1720 };
1723 1721
1724 1722
1725 static bool GetRetainingPath(Isolate* isolate, JSONStream* js) { 1723 static bool GetRetainingPath(Thread* thread, JSONStream* js) {
1726 Thread* thread = Thread::Current();
1727 ASSERT(isolate == thread->isolate());
1728
1729 const char* target_id = js->LookupParam("targetId"); 1724 const char* target_id = js->LookupParam("targetId");
1730 if (target_id == NULL) { 1725 if (target_id == NULL) {
1731 PrintMissingParamError(js, "targetId"); 1726 PrintMissingParamError(js, "targetId");
1732 return true; 1727 return true;
1733 } 1728 }
1734 const char* limit_cstr = js->LookupParam("limit"); 1729 const char* limit_cstr = js->LookupParam("limit");
1735 if (limit_cstr == NULL) { 1730 if (limit_cstr == NULL) {
1736 PrintMissingParamError(js, "limit"); 1731 PrintMissingParamError(js, "limit");
1737 return true; 1732 return true;
1738 } 1733 }
1739 intptr_t limit; 1734 intptr_t limit;
1740 if (!GetIntegerId(limit_cstr, &limit)) { 1735 if (!GetIntegerId(limit_cstr, &limit)) {
1741 PrintInvalidParamError(js, "limit"); 1736 PrintInvalidParamError(js, "limit");
1742 return true; 1737 return true;
1743 } 1738 }
1744 1739
1745 Object& obj = Object::Handle(thread->zone()); 1740 Object& obj = Object::Handle(thread->zone());
1746 ObjectIdRing::LookupResult lookup_result; 1741 ObjectIdRing::LookupResult lookup_result;
1747 { 1742 {
1748 HANDLESCOPE(thread); 1743 HANDLESCOPE(thread);
1749 obj = LookupHeapObject(isolate, target_id, &lookup_result); 1744 obj = LookupHeapObject(thread, target_id, &lookup_result);
1750 } 1745 }
1751 if (obj.raw() == Object::sentinel().raw()) { 1746 if (obj.raw() == Object::sentinel().raw()) {
1752 if (lookup_result == ObjectIdRing::kCollected) { 1747 if (lookup_result == ObjectIdRing::kCollected) {
1753 PrintSentinel(js, kCollectedSentinel); 1748 PrintSentinel(js, kCollectedSentinel);
1754 } else if (lookup_result == ObjectIdRing::kExpired) { 1749 } else if (lookup_result == ObjectIdRing::kExpired) {
1755 PrintSentinel(js, kExpiredSentinel); 1750 PrintSentinel(js, kExpiredSentinel);
1756 } else { 1751 } else {
1757 PrintInvalidParamError(js, "targetId"); 1752 PrintInvalidParamError(js, "targetId");
1758 } 1753 }
1759 return true; 1754 return true;
1760 } 1755 }
1761 return PrintRetainingPath(thread, &obj, limit, js); 1756 return PrintRetainingPath(thread, &obj, limit, js);
1762 } 1757 }
1763 1758
1764 1759
1765 static const MethodParameter* get_retained_size_params[] = { 1760 static const MethodParameter* get_retained_size_params[] = {
1766 ISOLATE_PARAMETER, 1761 ISOLATE_PARAMETER,
1767 NULL, 1762 NULL,
1768 }; 1763 };
1769 1764
1770 1765
1771 static bool GetRetainedSize(Isolate* isolate, JSONStream* js) { 1766 static bool GetRetainedSize(Thread* thread, JSONStream* js) {
1772 const char* target_id = js->LookupParam("targetId"); 1767 const char* target_id = js->LookupParam("targetId");
1773 if (target_id == NULL) { 1768 if (target_id == NULL) {
1774 PrintMissingParamError(js, "targetId"); 1769 PrintMissingParamError(js, "targetId");
1775 return true; 1770 return true;
1776 } 1771 }
1777 ObjectIdRing::LookupResult lookup_result; 1772 ObjectIdRing::LookupResult lookup_result;
1778 Object& obj = Object::Handle(LookupHeapObject(isolate, target_id, 1773 Object& obj = Object::Handle(LookupHeapObject(thread, target_id,
1779 &lookup_result)); 1774 &lookup_result));
1780 if (obj.raw() == Object::sentinel().raw()) { 1775 if (obj.raw() == Object::sentinel().raw()) {
1781 if (lookup_result == ObjectIdRing::kCollected) { 1776 if (lookup_result == ObjectIdRing::kCollected) {
1782 PrintSentinel(js, kCollectedSentinel); 1777 PrintSentinel(js, kCollectedSentinel);
1783 } else if (lookup_result == ObjectIdRing::kExpired) { 1778 } else if (lookup_result == ObjectIdRing::kExpired) {
1784 PrintSentinel(js, kExpiredSentinel); 1779 PrintSentinel(js, kExpiredSentinel);
1785 } else { 1780 } else {
1786 PrintInvalidParamError(js, "targetId"); 1781 PrintInvalidParamError(js, "targetId");
1787 } 1782 }
1788 return true; 1783 return true;
1789 } 1784 }
1790 Thread* thread = Thread::Current();
1791 // TODO(rmacnak): There is no way to get the size retained by a class object. 1785 // TODO(rmacnak): There is no way to get the size retained by a class object.
1792 // SizeRetainedByClass should be a separate RPC. 1786 // SizeRetainedByClass should be a separate RPC.
1793 if (obj.IsClass()) { 1787 if (obj.IsClass()) {
1794 const Class& cls = Class::Cast(obj); 1788 const Class& cls = Class::Cast(obj);
1795 ObjectGraph graph(thread); 1789 ObjectGraph graph(thread);
1796 intptr_t retained_size = graph.SizeRetainedByClass(cls.id()); 1790 intptr_t retained_size = graph.SizeRetainedByClass(cls.id());
1797 const Object& result = Object::Handle(Integer::New(retained_size)); 1791 const Object& result = Object::Handle(Integer::New(retained_size));
1798 result.PrintJSON(js, true); 1792 result.PrintJSON(js, true);
1799 return true; 1793 return true;
1800 } 1794 }
1801 1795
1802 ObjectGraph graph(thread); 1796 ObjectGraph graph(thread);
1803 intptr_t retained_size = graph.SizeRetainedByInstance(obj); 1797 intptr_t retained_size = graph.SizeRetainedByInstance(obj);
1804 const Object& result = Object::Handle(Integer::New(retained_size)); 1798 const Object& result = Object::Handle(Integer::New(retained_size));
1805 result.PrintJSON(js, true); 1799 result.PrintJSON(js, true);
1806 return true; 1800 return true;
1807 } 1801 }
1808 1802
1809 1803
1810 static const MethodParameter* evaluate_params[] = { 1804 static const MethodParameter* evaluate_params[] = {
1811 ISOLATE_PARAMETER, 1805 ISOLATE_PARAMETER,
1812 NULL, 1806 NULL,
1813 }; 1807 };
1814 1808
1815 1809
1816 static bool Evaluate(Isolate* isolate, JSONStream* js) { 1810 static bool Evaluate(Thread* thread, JSONStream* js) {
1817 if (!isolate->compilation_allowed()) { 1811 if (!thread->isolate()->compilation_allowed()) {
1818 js->PrintError(kFeatureDisabled, 1812 js->PrintError(kFeatureDisabled,
1819 "Cannot evaluate when running a precompiled program."); 1813 "Cannot evaluate when running a precompiled program.");
1820 return true; 1814 return true;
1821 } 1815 }
1822 const char* target_id = js->LookupParam("targetId"); 1816 const char* target_id = js->LookupParam("targetId");
1823 if (target_id == NULL) { 1817 if (target_id == NULL) {
1824 PrintMissingParamError(js, "targetId"); 1818 PrintMissingParamError(js, "targetId");
1825 return true; 1819 return true;
1826 } 1820 }
1827 const char* expr = js->LookupParam("expression"); 1821 const char* expr = js->LookupParam("expression");
1828 if (expr == NULL) { 1822 if (expr == NULL) {
1829 PrintMissingParamError(js, "expression"); 1823 PrintMissingParamError(js, "expression");
1830 return true; 1824 return true;
1831 } 1825 }
1832 Zone* zone = Thread::Current()->zone(); 1826 Zone* zone = thread->zone();
1833 const String& expr_str = String::Handle(zone, String::New(expr)); 1827 const String& expr_str = String::Handle(zone, String::New(expr));
1834 ObjectIdRing::LookupResult lookup_result; 1828 ObjectIdRing::LookupResult lookup_result;
1835 Object& obj = Object::Handle(zone, LookupHeapObject(isolate, target_id, 1829 Object& obj = Object::Handle(zone, LookupHeapObject(thread, target_id,
1836 &lookup_result)); 1830 &lookup_result));
1837 if (obj.raw() == Object::sentinel().raw()) { 1831 if (obj.raw() == Object::sentinel().raw()) {
1838 if (lookup_result == ObjectIdRing::kCollected) { 1832 if (lookup_result == ObjectIdRing::kCollected) {
1839 PrintSentinel(js, kCollectedSentinel); 1833 PrintSentinel(js, kCollectedSentinel);
1840 } else if (lookup_result == ObjectIdRing::kExpired) { 1834 } else if (lookup_result == ObjectIdRing::kExpired) {
1841 PrintSentinel(js, kExpiredSentinel); 1835 PrintSentinel(js, kExpiredSentinel);
1842 } else { 1836 } else {
1843 PrintInvalidParamError(js, "targetId"); 1837 PrintInvalidParamError(js, "targetId");
1844 } 1838 }
1845 return true; 1839 return true;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1879 1873
1880 1874
1881 static const MethodParameter* evaluate_in_frame_params[] = { 1875 static const MethodParameter* evaluate_in_frame_params[] = {
1882 ISOLATE_PARAMETER, 1876 ISOLATE_PARAMETER,
1883 new UIntParameter("frameIndex", true), 1877 new UIntParameter("frameIndex", true),
1884 new MethodParameter("expression", true), 1878 new MethodParameter("expression", true),
1885 NULL, 1879 NULL,
1886 }; 1880 };
1887 1881
1888 1882
1889 static bool EvaluateInFrame(Isolate* isolate, JSONStream* js) { 1883 static bool EvaluateInFrame(Thread* thread, JSONStream* js) {
1884 Isolate* isolate = thread->isolate();
1890 if (!isolate->compilation_allowed()) { 1885 if (!isolate->compilation_allowed()) {
1891 js->PrintError(kFeatureDisabled, 1886 js->PrintError(kFeatureDisabled,
1892 "Cannot evaluate when running a precompiled program."); 1887 "Cannot evaluate when running a precompiled program.");
1893 return true; 1888 return true;
1894 } 1889 }
1895 DebuggerStackTrace* stack = isolate->debugger()->StackTrace(); 1890 DebuggerStackTrace* stack = isolate->debugger()->StackTrace();
1896 intptr_t framePos = UIntParameter::Parse(js->LookupParam("frameIndex")); 1891 intptr_t framePos = UIntParameter::Parse(js->LookupParam("frameIndex"));
1897 if (framePos > stack->Length()) { 1892 if (framePos > stack->Length()) {
1898 PrintInvalidParamError(js, "frameIndex"); 1893 PrintInvalidParamError(js, "frameIndex");
1899 return true; 1894 return true;
1900 } 1895 }
1901 ActivationFrame* frame = stack->FrameAt(framePos); 1896 ActivationFrame* frame = stack->FrameAt(framePos);
1902 1897
1903 Zone* zone = Thread::Current()->zone(); 1898 Zone* zone = thread->zone();
1904 const char* expr = js->LookupParam("expression"); 1899 const char* expr = js->LookupParam("expression");
1905 const String& expr_str = String::Handle(zone, String::New(expr)); 1900 const String& expr_str = String::Handle(zone, String::New(expr));
1906 1901
1907 const Object& result = Object::Handle(zone, frame->Evaluate(expr_str)); 1902 const Object& result = Object::Handle(zone, frame->Evaluate(expr_str));
1908 result.PrintJSON(js, true); 1903 result.PrintJSON(js, true);
1909 return true; 1904 return true;
1910 } 1905 }
1911 1906
1912 1907
1913 class GetInstancesVisitor : public ObjectGraph::Visitor { 1908 class GetInstancesVisitor : public ObjectGraph::Visitor {
(...skipping 27 matching lines...) Expand all
1941 intptr_t count_; 1936 intptr_t count_;
1942 }; 1937 };
1943 1938
1944 1939
1945 static const MethodParameter* get_instances_params[] = { 1940 static const MethodParameter* get_instances_params[] = {
1946 ISOLATE_PARAMETER, 1941 ISOLATE_PARAMETER,
1947 NULL, 1942 NULL,
1948 }; 1943 };
1949 1944
1950 1945
1951 static bool GetInstances(Isolate* isolate, JSONStream* js) { 1946 static bool GetInstances(Thread* thread, JSONStream* js) {
1952 const char* target_id = js->LookupParam("classId"); 1947 const char* target_id = js->LookupParam("classId");
1953 if (target_id == NULL) { 1948 if (target_id == NULL) {
1954 PrintMissingParamError(js, "classId"); 1949 PrintMissingParamError(js, "classId");
1955 return true; 1950 return true;
1956 } 1951 }
1957 const char* limit_cstr = js->LookupParam("limit"); 1952 const char* limit_cstr = js->LookupParam("limit");
1958 if (limit_cstr == NULL) { 1953 if (limit_cstr == NULL) {
1959 PrintMissingParamError(js, "limit"); 1954 PrintMissingParamError(js, "limit");
1960 return true; 1955 return true;
1961 } 1956 }
1962 intptr_t limit; 1957 intptr_t limit;
1963 if (!GetIntegerId(limit_cstr, &limit)) { 1958 if (!GetIntegerId(limit_cstr, &limit)) {
1964 PrintInvalidParamError(js, "limit"); 1959 PrintInvalidParamError(js, "limit");
1965 return true; 1960 return true;
1966 } 1961 }
1967 const Object& obj = 1962 const Object& obj =
1968 Object::Handle(LookupHeapObject(isolate, target_id, NULL)); 1963 Object::Handle(LookupHeapObject(thread, target_id, NULL));
1969 if (obj.raw() == Object::sentinel().raw() || 1964 if (obj.raw() == Object::sentinel().raw() ||
1970 !obj.IsClass()) { 1965 !obj.IsClass()) {
1971 PrintInvalidParamError(js, "classId"); 1966 PrintInvalidParamError(js, "classId");
1972 return true; 1967 return true;
1973 } 1968 }
1974 const Class& cls = Class::Cast(obj); 1969 const Class& cls = Class::Cast(obj);
1975 Array& storage = Array::Handle(Array::New(limit)); 1970 Array& storage = Array::Handle(Array::New(limit));
1976 GetInstancesVisitor visitor(cls, storage); 1971 GetInstancesVisitor visitor(cls, storage);
1977 ObjectGraph graph(Thread::Current()); 1972 ObjectGraph graph(thread);
1978 graph.IterateObjects(&visitor); 1973 graph.IterateObjects(&visitor);
1979 intptr_t count = visitor.count(); 1974 intptr_t count = visitor.count();
1980 if (count < limit) { 1975 if (count < limit) {
1981 // Truncate the list using utility method for GrowableObjectArray. 1976 // Truncate the list using utility method for GrowableObjectArray.
1982 GrowableObjectArray& wrapper = GrowableObjectArray::Handle( 1977 GrowableObjectArray& wrapper = GrowableObjectArray::Handle(
1983 GrowableObjectArray::New(storage)); 1978 GrowableObjectArray::New(storage));
1984 wrapper.SetLength(count); 1979 wrapper.SetLength(count);
1985 storage = Array::MakeArray(wrapper); 1980 storage = Array::MakeArray(wrapper);
1986 } 1981 }
1987 JSONObject jsobj(js); 1982 JSONObject jsobj(js);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
2048 const Script& script, 2043 const Script& script,
2049 const Class& cls, 2044 const Class& cls,
2050 const Function& func) const { 2045 const Function& func) const {
2051 return func.raw() == func_.raw(); 2046 return func.raw() == func_.raw();
2052 } 2047 }
2053 private: 2048 private:
2054 const Function& func_; 2049 const Function& func_;
2055 }; 2050 };
2056 2051
2057 2052
2058 static bool GetHitsOrSites(Isolate* isolate, JSONStream* js, bool as_sites) { 2053 static bool GetHitsOrSites(Thread* thread, JSONStream* js, bool as_sites) {
2059 Thread* thread = Thread::Current();
2060 if (!js->HasParam("targetId")) { 2054 if (!js->HasParam("targetId")) {
2061 CodeCoverage::PrintJSON(thread, js, NULL, as_sites); 2055 CodeCoverage::PrintJSON(thread, js, NULL, as_sites);
2062 return true; 2056 return true;
2063 } 2057 }
2064 const char* target_id = js->LookupParam("targetId"); 2058 const char* target_id = js->LookupParam("targetId");
2065 Object& obj = Object::Handle(LookupHeapObject(isolate, target_id, NULL)); 2059 Object& obj = Object::Handle(LookupHeapObject(thread, target_id, NULL));
2066 if (obj.raw() == Object::sentinel().raw()) { 2060 if (obj.raw() == Object::sentinel().raw()) {
2067 PrintInvalidParamError(js, "targetId"); 2061 PrintInvalidParamError(js, "targetId");
2068 return true; 2062 return true;
2069 } 2063 }
2070 if (obj.IsScript()) { 2064 if (obj.IsScript()) {
2071 ScriptCoverageFilter sf(Script::Cast(obj)); 2065 ScriptCoverageFilter sf(Script::Cast(obj));
2072 CodeCoverage::PrintJSON(thread, js, &sf, as_sites); 2066 CodeCoverage::PrintJSON(thread, js, &sf, as_sites);
2073 return true; 2067 return true;
2074 } 2068 }
2075 if (obj.IsLibrary()) { 2069 if (obj.IsLibrary()) {
(...skipping 20 matching lines...) Expand all
2096 } 2090 }
2097 2091
2098 2092
2099 static const MethodParameter* get_coverage_params[] = { 2093 static const MethodParameter* get_coverage_params[] = {
2100 ISOLATE_PARAMETER, 2094 ISOLATE_PARAMETER,
2101 new IdParameter("targetId", false), 2095 new IdParameter("targetId", false),
2102 NULL, 2096 NULL,
2103 }; 2097 };
2104 2098
2105 2099
2106 static bool GetCoverage(Isolate* isolate, JSONStream* js) { 2100 static bool GetCoverage(Thread* thread, JSONStream* js) {
2107 // TODO(rmacnak): Remove this response; it is subsumed by GetCallSiteData. 2101 // TODO(rmacnak): Remove this response; it is subsumed by GetCallSiteData.
2108 return GetHitsOrSites(isolate, js, false); 2102 return GetHitsOrSites(thread, js, false);
2109 } 2103 }
2110 2104
2111 2105
2112 static const MethodParameter* get_call_site_data_params[] = { 2106 static const MethodParameter* get_call_site_data_params[] = {
2113 ISOLATE_PARAMETER, 2107 ISOLATE_PARAMETER,
2114 new IdParameter("targetId", false), 2108 new IdParameter("targetId", false),
2115 NULL, 2109 NULL,
2116 }; 2110 };
2117 2111
2118 2112
2119 static bool GetCallSiteData(Isolate* isolate, JSONStream* js) { 2113 static bool GetCallSiteData(Thread* thread, JSONStream* js) {
2120 return GetHitsOrSites(isolate, js, true); 2114 return GetHitsOrSites(thread, js, true);
2121 } 2115 }
2122 2116
2123 2117
2124 static bool AddBreakpointCommon(Isolate* isolate, 2118 static bool AddBreakpointCommon(Thread* thread,
2125 JSONStream* js, 2119 JSONStream* js,
2126 const String& script_uri) { 2120 const String& script_uri) {
2127 const char* line_param = js->LookupParam("line"); 2121 const char* line_param = js->LookupParam("line");
2128 intptr_t line = UIntParameter::Parse(line_param); 2122 intptr_t line = UIntParameter::Parse(line_param);
2129 const char* col_param = js->LookupParam("column"); 2123 const char* col_param = js->LookupParam("column");
2130 intptr_t col = -1; 2124 intptr_t col = -1;
2131 if (col_param != NULL) { 2125 if (col_param != NULL) {
2132 col = UIntParameter::Parse(col_param); 2126 col = UIntParameter::Parse(col_param);
2133 if (col == 0) { 2127 if (col == 0) {
2134 // Column number is 1-based. 2128 // Column number is 1-based.
2135 PrintInvalidParamError(js, "column"); 2129 PrintInvalidParamError(js, "column");
2136 return true; 2130 return true;
2137 } 2131 }
2138 } 2132 }
2139 ASSERT(!script_uri.IsNull()); 2133 ASSERT(!script_uri.IsNull());
2140 Breakpoint* bpt = NULL; 2134 Breakpoint* bpt = NULL;
2141 bpt = isolate->debugger()->SetBreakpointAtLineCol(script_uri, line, col); 2135 bpt = thread->isolate()->debugger()->
2136 SetBreakpointAtLineCol(script_uri, line, col);
2142 if (bpt == NULL) { 2137 if (bpt == NULL) {
2143 js->PrintError(kCannotAddBreakpoint, 2138 js->PrintError(kCannotAddBreakpoint,
2144 "%s: Cannot add breakpoint at line '%s'", 2139 "%s: Cannot add breakpoint at line '%s'",
2145 js->method(), line_param); 2140 js->method(), line_param);
2146 return true; 2141 return true;
2147 } 2142 }
2148 bpt->PrintJSON(js); 2143 bpt->PrintJSON(js);
2149 return true; 2144 return true;
2150 } 2145 }
2151 2146
2152 2147
2153 static const MethodParameter* add_breakpoint_params[] = { 2148 static const MethodParameter* add_breakpoint_params[] = {
2154 ISOLATE_PARAMETER, 2149 ISOLATE_PARAMETER,
2155 new IdParameter("scriptId", true), 2150 new IdParameter("scriptId", true),
2156 new UIntParameter("line", true), 2151 new UIntParameter("line", true),
2157 new UIntParameter("column", false), 2152 new UIntParameter("column", false),
2158 NULL, 2153 NULL,
2159 }; 2154 };
2160 2155
2161 2156
2162 static bool AddBreakpoint(Isolate* isolate, JSONStream* js) { 2157 static bool AddBreakpoint(Thread* thread, JSONStream* js) {
2163 const char* script_id_param = js->LookupParam("scriptId"); 2158 const char* script_id_param = js->LookupParam("scriptId");
2164 Object& obj = 2159 Object& obj = Object::Handle(LookupHeapObject(thread, script_id_param, NULL));
2165 Object::Handle(LookupHeapObject(isolate, script_id_param, NULL));
2166 if (obj.raw() == Object::sentinel().raw() || !obj.IsScript()) { 2160 if (obj.raw() == Object::sentinel().raw() || !obj.IsScript()) {
2167 PrintInvalidParamError(js, "scriptId"); 2161 PrintInvalidParamError(js, "scriptId");
2168 return true; 2162 return true;
2169 } 2163 }
2170 const Script& script = Script::Cast(obj); 2164 const Script& script = Script::Cast(obj);
2171 const String& script_uri = String::Handle(script.url()); 2165 const String& script_uri = String::Handle(script.url());
2172 ASSERT(!script_uri.IsNull()); 2166 ASSERT(!script_uri.IsNull());
2173 return AddBreakpointCommon(isolate, js, script_uri); 2167 return AddBreakpointCommon(thread, js, script_uri);
2174 } 2168 }
2175 2169
2176 2170
2177 static const MethodParameter* add_breakpoint_with_script_uri_params[] = { 2171 static const MethodParameter* add_breakpoint_with_script_uri_params[] = {
2178 ISOLATE_PARAMETER, 2172 ISOLATE_PARAMETER,
2179 new IdParameter("scriptUri", true), 2173 new IdParameter("scriptUri", true),
2180 new UIntParameter("line", true), 2174 new UIntParameter("line", true),
2181 new UIntParameter("column", false), 2175 new UIntParameter("column", false),
2182 NULL, 2176 NULL,
2183 }; 2177 };
2184 2178
2185 2179
2186 static bool AddBreakpointWithScriptUri(Isolate* isolate, JSONStream* js) { 2180 static bool AddBreakpointWithScriptUri(Thread* thread, JSONStream* js) {
2187 const char* script_uri_param = js->LookupParam("scriptUri"); 2181 const char* script_uri_param = js->LookupParam("scriptUri");
2188 const String& script_uri = String::Handle(String::New(script_uri_param)); 2182 const String& script_uri = String::Handle(String::New(script_uri_param));
2189 return AddBreakpointCommon(isolate, js, script_uri); 2183 return AddBreakpointCommon(thread, js, script_uri);
2190 } 2184 }
2191 2185
2192 2186
2193 static const MethodParameter* add_breakpoint_at_entry_params[] = { 2187 static const MethodParameter* add_breakpoint_at_entry_params[] = {
2194 ISOLATE_PARAMETER, 2188 ISOLATE_PARAMETER,
2195 new IdParameter("functionId", true), 2189 new IdParameter("functionId", true),
2196 NULL, 2190 NULL,
2197 }; 2191 };
2198 2192
2199 2193
2200 static bool AddBreakpointAtEntry(Isolate* isolate, JSONStream* js) { 2194 static bool AddBreakpointAtEntry(Thread* thread, JSONStream* js) {
2201 const char* function_id = js->LookupParam("functionId"); 2195 const char* function_id = js->LookupParam("functionId");
2202 Object& obj = Object::Handle(LookupHeapObject(isolate, function_id, NULL)); 2196 Object& obj = Object::Handle(LookupHeapObject(thread, function_id, NULL));
2203 if (obj.raw() == Object::sentinel().raw() || !obj.IsFunction()) { 2197 if (obj.raw() == Object::sentinel().raw() || !obj.IsFunction()) {
2204 PrintInvalidParamError(js, "functionId"); 2198 PrintInvalidParamError(js, "functionId");
2205 return true; 2199 return true;
2206 } 2200 }
2207 const Function& function = Function::Cast(obj); 2201 const Function& function = Function::Cast(obj);
2208 Breakpoint* bpt = 2202 Breakpoint* bpt =
2209 isolate->debugger()->SetBreakpointAtEntry(function, false); 2203 thread->isolate()->debugger()->SetBreakpointAtEntry(function, false);
2210 if (bpt == NULL) { 2204 if (bpt == NULL) {
2211 js->PrintError(kCannotAddBreakpoint, 2205 js->PrintError(kCannotAddBreakpoint,
2212 "%s: Cannot add breakpoint at function '%s'", 2206 "%s: Cannot add breakpoint at function '%s'",
2213 js->method(), function.ToCString()); 2207 js->method(), function.ToCString());
2214 return true; 2208 return true;
2215 } 2209 }
2216 bpt->PrintJSON(js); 2210 bpt->PrintJSON(js);
2217 return true; 2211 return true;
2218 } 2212 }
2219 2213
2220 2214
2221 static const MethodParameter* add_breakpoint_at_activation_params[] = { 2215 static const MethodParameter* add_breakpoint_at_activation_params[] = {
2222 ISOLATE_PARAMETER, 2216 ISOLATE_PARAMETER,
2223 new IdParameter("objectId", true), 2217 new IdParameter("objectId", true),
2224 NULL, 2218 NULL,
2225 }; 2219 };
2226 2220
2227 2221
2228 static bool AddBreakpointAtActivation(Isolate* isolate, JSONStream* js) { 2222 static bool AddBreakpointAtActivation(Thread* thread, JSONStream* js) {
2229 const char* object_id = js->LookupParam("objectId"); 2223 const char* object_id = js->LookupParam("objectId");
2230 Object& obj = Object::Handle(LookupHeapObject(isolate, object_id, NULL)); 2224 Object& obj = Object::Handle(LookupHeapObject(thread, object_id, NULL));
2231 if (obj.raw() == Object::sentinel().raw() || !obj.IsInstance()) { 2225 if (obj.raw() == Object::sentinel().raw() || !obj.IsInstance()) {
2232 PrintInvalidParamError(js, "objectId"); 2226 PrintInvalidParamError(js, "objectId");
2233 return true; 2227 return true;
2234 } 2228 }
2235 const Instance& closure = Instance::Cast(obj); 2229 const Instance& closure = Instance::Cast(obj);
2236 Breakpoint* bpt = 2230 Breakpoint* bpt =
2237 isolate->debugger()->SetBreakpointAtActivation(closure); 2231 thread->isolate()->debugger()->SetBreakpointAtActivation(closure);
2238 if (bpt == NULL) { 2232 if (bpt == NULL) {
2239 js->PrintError(kCannotAddBreakpoint, 2233 js->PrintError(kCannotAddBreakpoint,
2240 "%s: Cannot add breakpoint at activation", 2234 "%s: Cannot add breakpoint at activation",
2241 js->method()); 2235 js->method());
2242 return true; 2236 return true;
2243 } 2237 }
2244 bpt->PrintJSON(js); 2238 bpt->PrintJSON(js);
2245 return true; 2239 return true;
2246 } 2240 }
2247 2241
2248 2242
2249 static const MethodParameter* remove_breakpoint_params[] = { 2243 static const MethodParameter* remove_breakpoint_params[] = {
2250 ISOLATE_PARAMETER, 2244 ISOLATE_PARAMETER,
2251 NULL, 2245 NULL,
2252 }; 2246 };
2253 2247
2254 2248
2255 static bool RemoveBreakpoint(Isolate* isolate, JSONStream* js) { 2249 static bool RemoveBreakpoint(Thread* thread, JSONStream* js) {
2256 if (!js->HasParam("breakpointId")) { 2250 if (!js->HasParam("breakpointId")) {
2257 PrintMissingParamError(js, "breakpointId"); 2251 PrintMissingParamError(js, "breakpointId");
2258 return true; 2252 return true;
2259 } 2253 }
2260 const char* bpt_id = js->LookupParam("breakpointId"); 2254 const char* bpt_id = js->LookupParam("breakpointId");
2261 ObjectIdRing::LookupResult lookup_result; 2255 ObjectIdRing::LookupResult lookup_result;
2256 Isolate* isolate = thread->isolate();
2262 Breakpoint* bpt = LookupBreakpoint(isolate, bpt_id, &lookup_result); 2257 Breakpoint* bpt = LookupBreakpoint(isolate, bpt_id, &lookup_result);
2263 // TODO(turnidge): Should we return a different error for bpts whic 2258 // TODO(turnidge): Should we return a different error for bpts whic
2264 // have been already removed? 2259 // have been already removed?
2265 if (bpt == NULL) { 2260 if (bpt == NULL) {
2266 PrintInvalidParamError(js, "breakpointId"); 2261 PrintInvalidParamError(js, "breakpointId");
2267 return true; 2262 return true;
2268 } 2263 }
2269 isolate->debugger()->RemoveBreakpoint(bpt->id()); 2264 isolate->debugger()->RemoveBreakpoint(bpt->id());
2270 PrintSuccess(js); 2265 PrintSuccess(js);
2271 return true; 2266 return true;
2272 } 2267 }
2273 2268
2274 2269
2275 static RawClass* GetMetricsClass(Isolate* isolate) { 2270 static RawClass* GetMetricsClass(Thread* thread) {
2276 Zone* zone = isolate->current_zone(); 2271 Zone* zone = thread->zone();
2277 const Library& prof_lib = 2272 const Library& prof_lib =
2278 Library::Handle(zone, Library::DeveloperLibrary()); 2273 Library::Handle(zone, Library::DeveloperLibrary());
2279 ASSERT(!prof_lib.IsNull()); 2274 ASSERT(!prof_lib.IsNull());
2280 const String& metrics_cls_name = 2275 const String& metrics_cls_name =
2281 String::Handle(zone, String::New("Metrics")); 2276 String::Handle(zone, String::New("Metrics"));
2282 ASSERT(!metrics_cls_name.IsNull()); 2277 ASSERT(!metrics_cls_name.IsNull());
2283 const Class& metrics_cls = 2278 const Class& metrics_cls =
2284 Class::Handle(zone, prof_lib.LookupClass(metrics_cls_name)); 2279 Class::Handle(zone, prof_lib.LookupClass(metrics_cls_name));
2285 ASSERT(!metrics_cls.IsNull()); 2280 ASSERT(!metrics_cls.IsNull());
2286 return metrics_cls.raw(); 2281 return metrics_cls.raw();
2287 } 2282 }
2288 2283
2289 2284
2290 2285
2291 static bool HandleNativeMetricsList(Isolate* isolate, JSONStream* js) { 2286 static bool HandleNativeMetricsList(Thread* thread, JSONStream* js) {
2292 JSONObject obj(js); 2287 JSONObject obj(js);
2293 obj.AddProperty("type", "MetricList"); 2288 obj.AddProperty("type", "MetricList");
2294 { 2289 {
2295 JSONArray metrics(&obj, "metrics"); 2290 JSONArray metrics(&obj, "metrics");
2296 Metric* current = isolate->metrics_list_head(); 2291 Metric* current = thread->isolate()->metrics_list_head();
2297 while (current != NULL) { 2292 while (current != NULL) {
2298 metrics.AddValue(current); 2293 metrics.AddValue(current);
2299 current = current->next(); 2294 current = current->next();
2300 } 2295 }
2301 } 2296 }
2302 return true; 2297 return true;
2303 } 2298 }
2304 2299
2305 2300
2306 static bool HandleNativeMetric(Isolate* isolate, 2301 static bool HandleNativeMetric(Thread* thread, JSONStream* js, const char* id) {
2307 JSONStream* js, 2302 Metric* current = thread->isolate()->metrics_list_head();
2308 const char* id) {
2309 Metric* current = isolate->metrics_list_head();
2310 while (current != NULL) { 2303 while (current != NULL) {
2311 const char* name = current->name(); 2304 const char* name = current->name();
2312 ASSERT(name != NULL); 2305 ASSERT(name != NULL);
2313 if (strcmp(name, id) == 0) { 2306 if (strcmp(name, id) == 0) {
2314 current->PrintJSON(js); 2307 current->PrintJSON(js);
2315 return true; 2308 return true;
2316 } 2309 }
2317 current = current->next(); 2310 current = current->next();
2318 } 2311 }
2319 PrintInvalidParamError(js, "metricId"); 2312 PrintInvalidParamError(js, "metricId");
2320 return true; 2313 return true;
2321 } 2314 }
2322 2315
2323 2316
2324 static bool HandleDartMetricsList(Isolate* isolate, JSONStream* js) { 2317 static bool HandleDartMetricsList(Thread* thread, JSONStream* js) {
2325 Zone* zone = isolate->current_zone(); 2318 Zone* zone = thread->zone();
2326 const Class& metrics_cls = Class::Handle(zone, GetMetricsClass(isolate)); 2319 const Class& metrics_cls =
2320 Class::Handle(zone, GetMetricsClass(thread));
2327 const String& print_metrics_name = 2321 const String& print_metrics_name =
2328 String::Handle(String::New("_printMetrics")); 2322 String::Handle(String::New("_printMetrics"));
2329 ASSERT(!print_metrics_name.IsNull()); 2323 ASSERT(!print_metrics_name.IsNull());
2330 const Function& print_metrics = Function::Handle( 2324 const Function& print_metrics = Function::Handle(
2331 zone, 2325 zone,
2332 metrics_cls.LookupStaticFunctionAllowPrivate(print_metrics_name)); 2326 metrics_cls.LookupStaticFunctionAllowPrivate(print_metrics_name));
2333 ASSERT(!print_metrics.IsNull()); 2327 ASSERT(!print_metrics.IsNull());
2334 const Array& args = Object::empty_array(); 2328 const Array& args = Object::empty_array();
2335 const Object& result = 2329 const Object& result =
2336 Object::Handle(zone, DartEntry::InvokeFunction(print_metrics, args)); 2330 Object::Handle(zone, DartEntry::InvokeFunction(print_metrics, args));
2337 ASSERT(!result.IsNull()); 2331 ASSERT(!result.IsNull());
2338 ASSERT(result.IsString()); 2332 ASSERT(result.IsString());
2339 TextBuffer* buffer = js->buffer(); 2333 TextBuffer* buffer = js->buffer();
2340 buffer->AddString(String::Cast(result).ToCString()); 2334 buffer->AddString(String::Cast(result).ToCString());
2341 return true; 2335 return true;
2342 } 2336 }
2343 2337
2344 2338
2345 static bool HandleDartMetric(Isolate* isolate, JSONStream* js, const char* id) { 2339 static bool HandleDartMetric(Thread* thread, JSONStream* js, const char* id) {
2346 Zone* zone = isolate->current_zone(); 2340 Zone* zone = thread->zone();
2347 const Class& metrics_cls = Class::Handle(zone, GetMetricsClass(isolate)); 2341 const Class& metrics_cls =
2342 Class::Handle(zone, GetMetricsClass(thread));
2348 const String& print_metric_name = 2343 const String& print_metric_name =
2349 String::Handle(String::New("_printMetric")); 2344 String::Handle(String::New("_printMetric"));
2350 ASSERT(!print_metric_name.IsNull()); 2345 ASSERT(!print_metric_name.IsNull());
2351 const Function& print_metric = Function::Handle( 2346 const Function& print_metric = Function::Handle(
2352 zone, 2347 zone,
2353 metrics_cls.LookupStaticFunctionAllowPrivate(print_metric_name)); 2348 metrics_cls.LookupStaticFunctionAllowPrivate(print_metric_name));
2354 ASSERT(!print_metric.IsNull()); 2349 ASSERT(!print_metric.IsNull());
2355 const String& arg0 = String::Handle(String::New(id)); 2350 const String& arg0 = String::Handle(String::New(id));
2356 ASSERT(!arg0.IsNull()); 2351 ASSERT(!arg0.IsNull());
2357 const Array& args = Array::Handle(Array::New(1)); 2352 const Array& args = Array::Handle(Array::New(1));
(...skipping 11 matching lines...) Expand all
2369 return true; 2364 return true;
2370 } 2365 }
2371 2366
2372 2367
2373 static const MethodParameter* get_isolate_metric_list_params[] = { 2368 static const MethodParameter* get_isolate_metric_list_params[] = {
2374 ISOLATE_PARAMETER, 2369 ISOLATE_PARAMETER,
2375 NULL, 2370 NULL,
2376 }; 2371 };
2377 2372
2378 2373
2379 static bool GetIsolateMetricList(Isolate* isolate, JSONStream* js) { 2374 static bool GetIsolateMetricList(Thread* thread, JSONStream* js) {
2380 bool native_metrics = false; 2375 bool native_metrics = false;
2381 if (js->HasParam("type")) { 2376 if (js->HasParam("type")) {
2382 if (js->ParamIs("type", "Native")) { 2377 if (js->ParamIs("type", "Native")) {
2383 native_metrics = true; 2378 native_metrics = true;
2384 } else if (js->ParamIs("type", "Dart")) { 2379 } else if (js->ParamIs("type", "Dart")) {
2385 native_metrics = false; 2380 native_metrics = false;
2386 } else { 2381 } else {
2387 PrintInvalidParamError(js, "type"); 2382 PrintInvalidParamError(js, "type");
2388 return true; 2383 return true;
2389 } 2384 }
2390 } else { 2385 } else {
2391 PrintMissingParamError(js, "type"); 2386 PrintMissingParamError(js, "type");
2392 return true; 2387 return true;
2393 } 2388 }
2394 if (native_metrics) { 2389 if (native_metrics) {
2395 return HandleNativeMetricsList(isolate, js); 2390 return HandleNativeMetricsList(thread, js);
2396 } 2391 }
2397 return HandleDartMetricsList(isolate, js); 2392 return HandleDartMetricsList(thread, js);
2398 } 2393 }
2399 2394
2400 2395
2401 static const MethodParameter* get_isolate_metric_params[] = { 2396 static const MethodParameter* get_isolate_metric_params[] = {
2402 ISOLATE_PARAMETER, 2397 ISOLATE_PARAMETER,
2403 NULL, 2398 NULL,
2404 }; 2399 };
2405 2400
2406 2401
2407 static bool GetIsolateMetric(Isolate* isolate, JSONStream* js) { 2402 static bool GetIsolateMetric(Thread* thread, JSONStream* js) {
2408 const char* metric_id = js->LookupParam("metricId"); 2403 const char* metric_id = js->LookupParam("metricId");
2409 if (metric_id == NULL) { 2404 if (metric_id == NULL) {
2410 PrintMissingParamError(js, "metricId"); 2405 PrintMissingParamError(js, "metricId");
2411 return true; 2406 return true;
2412 } 2407 }
2413 // Verify id begins with "metrics/". 2408 // Verify id begins with "metrics/".
2414 static const char* kMetricIdPrefix = "metrics/"; 2409 static const char* kMetricIdPrefix = "metrics/";
2415 static intptr_t kMetricIdPrefixLen = strlen(kMetricIdPrefix); 2410 static intptr_t kMetricIdPrefixLen = strlen(kMetricIdPrefix);
2416 if (strncmp(metric_id, kMetricIdPrefix, kMetricIdPrefixLen) != 0) { 2411 if (strncmp(metric_id, kMetricIdPrefix, kMetricIdPrefixLen) != 0) {
2417 PrintInvalidParamError(js, "metricId"); 2412 PrintInvalidParamError(js, "metricId");
2418 return true; 2413 return true;
2419 } 2414 }
2420 // Check if id begins with "metrics/native/". 2415 // Check if id begins with "metrics/native/".
2421 static const char* kNativeMetricIdPrefix = "metrics/native/"; 2416 static const char* kNativeMetricIdPrefix = "metrics/native/";
2422 static intptr_t kNativeMetricIdPrefixLen = strlen(kNativeMetricIdPrefix); 2417 static intptr_t kNativeMetricIdPrefixLen = strlen(kNativeMetricIdPrefix);
2423 const bool native_metric = 2418 const bool native_metric =
2424 strncmp(metric_id, kNativeMetricIdPrefix, kNativeMetricIdPrefixLen) == 0; 2419 strncmp(metric_id, kNativeMetricIdPrefix, kNativeMetricIdPrefixLen) == 0;
2425 if (native_metric) { 2420 if (native_metric) {
2426 const char* id = metric_id + kNativeMetricIdPrefixLen; 2421 const char* id = metric_id + kNativeMetricIdPrefixLen;
2427 return HandleNativeMetric(isolate, js, id); 2422 return HandleNativeMetric(thread, js, id);
2428 } 2423 }
2429 const char* id = metric_id + kMetricIdPrefixLen; 2424 const char* id = metric_id + kMetricIdPrefixLen;
2430 return HandleDartMetric(isolate, js, id); 2425 return HandleDartMetric(thread, js, id);
2431 } 2426 }
2432 2427
2433 2428
2434 static const MethodParameter* get_vm_metric_list_params[] = { 2429 static const MethodParameter* get_vm_metric_list_params[] = {
2435 NO_ISOLATE_PARAMETER, 2430 NO_ISOLATE_PARAMETER,
2436 NULL, 2431 NULL,
2437 }; 2432 };
2438 2433
2439 2434
2440 static bool GetVMMetricList(Isolate* isolate, JSONStream* js) { 2435 static bool GetVMMetricList(Thread* thread, JSONStream* js) {
2441 return false; 2436 return false;
2442 } 2437 }
2443 2438
2444 2439
2445 static const MethodParameter* get_vm_metric_params[] = { 2440 static const MethodParameter* get_vm_metric_params[] = {
2446 NO_ISOLATE_PARAMETER, 2441 NO_ISOLATE_PARAMETER,
2447 NULL, 2442 NULL,
2448 }; 2443 };
2449 2444
2450 2445
2451 static bool GetVMMetric(Isolate* isolate, JSONStream* js) { 2446 static bool GetVMMetric(Thread* thread, JSONStream* js) {
2452 const char* metric_id = js->LookupParam("metricId"); 2447 const char* metric_id = js->LookupParam("metricId");
2453 if (metric_id == NULL) { 2448 if (metric_id == NULL) {
2454 PrintMissingParamError(js, "metricId"); 2449 PrintMissingParamError(js, "metricId");
2455 } 2450 }
2456 return false; 2451 return false;
2457 } 2452 }
2458 2453
2459 2454
2460 static const MethodParameter* resume_params[] = { 2455 static const MethodParameter* resume_params[] = {
2461 ISOLATE_PARAMETER, 2456 ISOLATE_PARAMETER,
2462 NULL, 2457 NULL,
2463 }; 2458 };
2464 2459
2465 2460
2466 static bool Resume(Isolate* isolate, JSONStream* js) { 2461 static bool Resume(Thread* thread, JSONStream* js) {
2467 const char* step_param = js->LookupParam("step"); 2462 const char* step_param = js->LookupParam("step");
2463 Isolate* isolate = thread->isolate();
2468 if (isolate->message_handler()->paused_on_start()) { 2464 if (isolate->message_handler()->paused_on_start()) {
2469 // If the user is issuing a 'Over' or an 'Out' step, that is the 2465 // If the user is issuing a 'Over' or an 'Out' step, that is the
2470 // same as a regular resume request. 2466 // same as a regular resume request.
2471 if ((step_param != NULL) && (strcmp(step_param, "Into") == 0)) { 2467 if ((step_param != NULL) && (strcmp(step_param, "Into") == 0)) {
2472 isolate->debugger()->EnterSingleStepMode(); 2468 isolate->debugger()->EnterSingleStepMode();
2473 } 2469 }
2474 isolate->message_handler()->set_pause_on_start(false); 2470 isolate->message_handler()->set_pause_on_start(false);
2475 isolate->set_last_resume_timestamp(); 2471 isolate->set_last_resume_timestamp();
2476 if (Service::debug_stream.enabled()) { 2472 if (Service::debug_stream.enabled()) {
2477 ServiceEvent event(isolate, ServiceEvent::kResume); 2473 ServiceEvent event(isolate, ServiceEvent::kResume);
(...skipping 30 matching lines...) Expand all
2508 return true; 2504 return true;
2509 } 2505 }
2510 2506
2511 2507
2512 static const MethodParameter* pause_params[] = { 2508 static const MethodParameter* pause_params[] = {
2513 ISOLATE_PARAMETER, 2509 ISOLATE_PARAMETER,
2514 NULL, 2510 NULL,
2515 }; 2511 };
2516 2512
2517 2513
2518 static bool Pause(Isolate* isolate, JSONStream* js) { 2514 static bool Pause(Thread* thread, JSONStream* js) {
2519 // TODO(turnidge): This interrupt message could have been sent from 2515 // TODO(turnidge): This interrupt message could have been sent from
2520 // the service isolate directly, but would require some special case 2516 // the service isolate directly, but would require some special case
2521 // code. That would prevent this isolate getting double-interrupted 2517 // code. That would prevent this isolate getting double-interrupted
2522 // with OOB messages. 2518 // with OOB messages.
2519 Isolate* isolate = thread->isolate();
2523 isolate->SendInternalLibMessage(Isolate::kInterruptMsg, 2520 isolate->SendInternalLibMessage(Isolate::kInterruptMsg,
2524 isolate->pause_capability()); 2521 isolate->pause_capability());
2525 PrintSuccess(js); 2522 PrintSuccess(js);
2526 return true; 2523 return true;
2527 } 2524 }
2528 2525
2529 2526
2530 static const MethodParameter* get_tag_profile_params[] = { 2527 static const MethodParameter* get_tag_profile_params[] = {
2531 ISOLATE_PARAMETER, 2528 ISOLATE_PARAMETER,
2532 NULL, 2529 NULL,
2533 }; 2530 };
2534 2531
2535 2532
2536 static bool GetTagProfile(Isolate* isolate, JSONStream* js) { 2533 static bool GetTagProfile(Thread* thread, JSONStream* js) {
2537 JSONObject miniProfile(js); 2534 JSONObject miniProfile(js);
2538 miniProfile.AddProperty("type", "TagProfile"); 2535 miniProfile.AddProperty("type", "TagProfile");
2539 isolate->vm_tag_counters()->PrintToJSONObject(&miniProfile); 2536 thread->isolate()->vm_tag_counters()->PrintToJSONObject(&miniProfile);
2540 return true; 2537 return true;
2541 } 2538 }
2542 2539
2543 2540
2544 static const char* tags_enum_names[] = { 2541 static const char* tags_enum_names[] = {
2545 "None", 2542 "None",
2546 "UserVM", 2543 "UserVM",
2547 "UserOnly", 2544 "UserOnly",
2548 "VMUser", 2545 "VMUser",
2549 "VMOnly", 2546 "VMOnly",
(...skipping 13 matching lines...) Expand all
2563 2560
2564 static const MethodParameter* get_cpu_profile_params[] = { 2561 static const MethodParameter* get_cpu_profile_params[] = {
2565 ISOLATE_PARAMETER, 2562 ISOLATE_PARAMETER,
2566 new EnumParameter("tags", true, tags_enum_names), 2563 new EnumParameter("tags", true, tags_enum_names),
2567 new BoolParameter("_codeTransitionTags", false), 2564 new BoolParameter("_codeTransitionTags", false),
2568 NULL, 2565 NULL,
2569 }; 2566 };
2570 2567
2571 2568
2572 // TODO(johnmccutchan): Rename this to GetCpuSamples. 2569 // TODO(johnmccutchan): Rename this to GetCpuSamples.
2573 static bool GetCpuProfile(Isolate* isolate, JSONStream* js) { 2570 static bool GetCpuProfile(Thread* thread, JSONStream* js) {
2574 Profile::TagOrder tag_order = 2571 Profile::TagOrder tag_order =
2575 EnumMapper(js->LookupParam("tags"), tags_enum_names, tags_enum_values); 2572 EnumMapper(js->LookupParam("tags"), tags_enum_names, tags_enum_values);
2576 intptr_t extra_tags = 0; 2573 intptr_t extra_tags = 0;
2577 if (BoolParameter::Parse(js->LookupParam("_codeTransitionTags"))) { 2574 if (BoolParameter::Parse(js->LookupParam("_codeTransitionTags"))) {
2578 extra_tags |= ProfilerService::kCodeTransitionTagsBit; 2575 extra_tags |= ProfilerService::kCodeTransitionTagsBit;
2579 } 2576 }
2580 ProfilerService::PrintJSON(js, tag_order, extra_tags); 2577 ProfilerService::PrintJSON(js, tag_order, extra_tags);
2581 return true; 2578 return true;
2582 } 2579 }
2583 2580
2584 2581
2585 static const MethodParameter* get_allocation_samples_params[] = { 2582 static const MethodParameter* get_allocation_samples_params[] = {
2586 ISOLATE_PARAMETER, 2583 ISOLATE_PARAMETER,
2587 new EnumParameter("tags", true, tags_enum_names), 2584 new EnumParameter("tags", true, tags_enum_names),
2588 new IdParameter("classId", false), 2585 new IdParameter("classId", false),
2589 NULL, 2586 NULL,
2590 }; 2587 };
2591 2588
2592 2589
2593 static bool GetAllocationSamples(Isolate* isolate, JSONStream* js) { 2590 static bool GetAllocationSamples(Thread* thread, JSONStream* js) {
2594 Profile::TagOrder tag_order = 2591 Profile::TagOrder tag_order =
2595 EnumMapper(js->LookupParam("tags"), tags_enum_names, tags_enum_values); 2592 EnumMapper(js->LookupParam("tags"), tags_enum_names, tags_enum_values);
2596 const char* class_id = js->LookupParam("classId"); 2593 const char* class_id = js->LookupParam("classId");
2597 intptr_t cid = -1; 2594 intptr_t cid = -1;
2598 GetPrefixedIntegerId(class_id, "classes/", &cid); 2595 GetPrefixedIntegerId(class_id, "classes/", &cid);
2596 Isolate* isolate = thread->isolate();
2599 if (IsValidClassId(isolate, cid)) { 2597 if (IsValidClassId(isolate, cid)) {
2600 const Class& cls = Class::Handle(GetClassForId(isolate, cid)); 2598 const Class& cls = Class::Handle(GetClassForId(isolate, cid));
2601 ProfilerService::PrintAllocationJSON(js, tag_order, cls); 2599 ProfilerService::PrintAllocationJSON(js, tag_order, cls);
2602 } else { 2600 } else {
2603 PrintInvalidParamError(js, "classId"); 2601 PrintInvalidParamError(js, "classId");
2604 } 2602 }
2605 return true; 2603 return true;
2606 } 2604 }
2607 2605
2608 2606
2609 static const MethodParameter* clear_cpu_profile_params[] = { 2607 static const MethodParameter* clear_cpu_profile_params[] = {
2610 ISOLATE_PARAMETER, 2608 ISOLATE_PARAMETER,
2611 NULL, 2609 NULL,
2612 }; 2610 };
2613 2611
2614 2612
2615 static bool ClearCpuProfile(Isolate* isolate, JSONStream* js) { 2613 static bool ClearCpuProfile(Thread* thread, JSONStream* js) {
2616 ProfilerService::ClearSamples(); 2614 ProfilerService::ClearSamples();
2617 PrintSuccess(js); 2615 PrintSuccess(js);
2618 return true; 2616 return true;
2619 } 2617 }
2620 2618
2621 2619
2622 static const MethodParameter* get_allocation_profile_params[] = { 2620 static const MethodParameter* get_allocation_profile_params[] = {
2623 ISOLATE_PARAMETER, 2621 ISOLATE_PARAMETER,
2624 NULL, 2622 NULL,
2625 }; 2623 };
2626 2624
2627 2625
2628 static bool GetAllocationProfile(Isolate* isolate, JSONStream* js) { 2626 static bool GetAllocationProfile(Thread* thread, JSONStream* js) {
2629 bool should_reset_accumulator = false; 2627 bool should_reset_accumulator = false;
2630 bool should_collect = false; 2628 bool should_collect = false;
2631 if (js->HasParam("reset")) { 2629 if (js->HasParam("reset")) {
2632 if (js->ParamIs("reset", "true")) { 2630 if (js->ParamIs("reset", "true")) {
2633 should_reset_accumulator = true; 2631 should_reset_accumulator = true;
2634 } else { 2632 } else {
2635 PrintInvalidParamError(js, "reset"); 2633 PrintInvalidParamError(js, "reset");
2636 return true; 2634 return true;
2637 } 2635 }
2638 } 2636 }
2639 if (js->HasParam("gc")) { 2637 if (js->HasParam("gc")) {
2640 if (js->ParamIs("gc", "full")) { 2638 if (js->ParamIs("gc", "full")) {
2641 should_collect = true; 2639 should_collect = true;
2642 } else { 2640 } else {
2643 PrintInvalidParamError(js, "gc"); 2641 PrintInvalidParamError(js, "gc");
2644 return true; 2642 return true;
2645 } 2643 }
2646 } 2644 }
2645 Isolate* isolate = thread->isolate();
2647 if (should_reset_accumulator) { 2646 if (should_reset_accumulator) {
2648 isolate->UpdateLastAllocationProfileAccumulatorResetTimestamp(); 2647 isolate->UpdateLastAllocationProfileAccumulatorResetTimestamp();
2649 isolate->class_table()->ResetAllocationAccumulators(); 2648 isolate->class_table()->ResetAllocationAccumulators();
2650 } 2649 }
2651 if (should_collect) { 2650 if (should_collect) {
2652 isolate->UpdateLastAllocationProfileGCTimestamp(); 2651 isolate->UpdateLastAllocationProfileGCTimestamp();
2653 isolate->heap()->CollectAllGarbage(); 2652 isolate->heap()->CollectAllGarbage();
2654 } 2653 }
2655 isolate->class_table()->AllocationProfilePrintJSON(js); 2654 isolate->class_table()->AllocationProfilePrintJSON(js);
2656 return true; 2655 return true;
2657 } 2656 }
2658 2657
2659 2658
2660 static const MethodParameter* get_heap_map_params[] = { 2659 static const MethodParameter* get_heap_map_params[] = {
2661 ISOLATE_PARAMETER, 2660 ISOLATE_PARAMETER,
2662 NULL, 2661 NULL,
2663 }; 2662 };
2664 2663
2665 2664
2666 static bool GetHeapMap(Isolate* isolate, JSONStream* js) { 2665 static bool GetHeapMap(Thread* thread, JSONStream* js) {
2666 Isolate* isolate = thread->isolate();
2667 isolate->heap()->PrintHeapMapToJSONStream(isolate, js); 2667 isolate->heap()->PrintHeapMapToJSONStream(isolate, js);
2668 return true; 2668 return true;
2669 } 2669 }
2670 2670
2671 2671
2672 static const MethodParameter* request_heap_snapshot_params[] = { 2672 static const MethodParameter* request_heap_snapshot_params[] = {
2673 ISOLATE_PARAMETER, 2673 ISOLATE_PARAMETER,
2674 NULL, 2674 NULL,
2675 }; 2675 };
2676 2676
2677 2677
2678 static bool RequestHeapSnapshot(Isolate* isolate, JSONStream* js) { 2678 static bool RequestHeapSnapshot(Thread* thread, JSONStream* js) {
2679 if (Service::graph_stream.enabled()) { 2679 if (Service::graph_stream.enabled()) {
2680 Service::SendGraphEvent(isolate); 2680 Service::SendGraphEvent(thread);
2681 } 2681 }
2682 // TODO(koda): Provide some id that ties this request to async response(s). 2682 // TODO(koda): Provide some id that ties this request to async response(s).
2683 JSONObject jsobj(js); 2683 JSONObject jsobj(js);
2684 jsobj.AddProperty("type", "OK"); 2684 jsobj.AddProperty("type", "OK");
2685 return true; 2685 return true;
2686 } 2686 }
2687 2687
2688 2688
2689 void Service::SendGraphEvent(Isolate* isolate) { 2689 void Service::SendGraphEvent(Thread* thread) {
2690 uint8_t* buffer = NULL; 2690 uint8_t* buffer = NULL;
2691 WriteStream stream(&buffer, &allocator, 1 * MB); 2691 WriteStream stream(&buffer, &allocator, 1 * MB);
2692 ObjectGraph graph(Thread::Current()); 2692 ObjectGraph graph(thread);
2693 intptr_t node_count = graph.Serialize(&stream); 2693 intptr_t node_count = graph.Serialize(&stream);
2694 2694
2695 // Chrome crashes receiving a single tens-of-megabytes blob, so send the 2695 // Chrome crashes receiving a single tens-of-megabytes blob, so send the
2696 // snapshot in megabyte-sized chunks instead. 2696 // snapshot in megabyte-sized chunks instead.
2697 const intptr_t kChunkSize = 1 * MB; 2697 const intptr_t kChunkSize = 1 * MB;
2698 intptr_t num_chunks = 2698 intptr_t num_chunks =
2699 (stream.bytes_written() + (kChunkSize - 1)) / kChunkSize; 2699 (stream.bytes_written() + (kChunkSize - 1)) / kChunkSize;
2700 for (intptr_t i = 0; i < num_chunks; i++) { 2700 for (intptr_t i = 0; i < num_chunks; i++) {
2701 JSONStream js; 2701 JSONStream js;
2702 { 2702 {
2703 JSONObject jsobj(&js); 2703 JSONObject jsobj(&js);
2704 jsobj.AddProperty("jsonrpc", "2.0"); 2704 jsobj.AddProperty("jsonrpc", "2.0");
2705 jsobj.AddProperty("method", "streamNotify"); 2705 jsobj.AddProperty("method", "streamNotify");
2706 { 2706 {
2707 JSONObject params(&jsobj, "params"); 2707 JSONObject params(&jsobj, "params");
2708 params.AddProperty("streamId", graph_stream.id()); 2708 params.AddProperty("streamId", graph_stream.id());
2709 { 2709 {
2710 JSONObject event(&params, "event"); 2710 JSONObject event(&params, "event");
2711 event.AddProperty("type", "Event"); 2711 event.AddProperty("type", "Event");
2712 event.AddProperty("kind", "_Graph"); 2712 event.AddProperty("kind", "_Graph");
2713 event.AddProperty("isolate", isolate); 2713 event.AddProperty("isolate", thread->isolate());
2714 event.AddPropertyTimeMillis("timestamp", OS::GetCurrentTimeMillis()); 2714 event.AddPropertyTimeMillis("timestamp", OS::GetCurrentTimeMillis());
2715 2715
2716 event.AddProperty("chunkIndex", i); 2716 event.AddProperty("chunkIndex", i);
2717 event.AddProperty("chunkCount", num_chunks); 2717 event.AddProperty("chunkCount", num_chunks);
2718 event.AddProperty("nodeCount", node_count); 2718 event.AddProperty("nodeCount", node_count);
2719 } 2719 }
2720 } 2720 }
2721 } 2721 }
2722 2722
2723 const String& message = String::Handle(String::New(js.ToCString())); 2723 const String& message = String::Handle(String::New(js.ToCString()));
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
2804 uword addr_; 2804 uword addr_;
2805 }; 2805 };
2806 2806
2807 2807
2808 static const MethodParameter* get_object_by_address_params[] = { 2808 static const MethodParameter* get_object_by_address_params[] = {
2809 ISOLATE_PARAMETER, 2809 ISOLATE_PARAMETER,
2810 NULL, 2810 NULL,
2811 }; 2811 };
2812 2812
2813 2813
2814 static RawObject* GetObjectHelper(Isolate* isolate, uword addr) { 2814 static RawObject* GetObjectHelper(Thread* thread, uword addr) {
2815 Object& object = Object::Handle(isolate->current_zone()); 2815 Object& object = Object::Handle(thread->zone());
2816 2816
2817 { 2817 {
2818 NoSafepointScope no_safepoint; 2818 NoSafepointScope no_safepoint;
2819 Isolate* isolate = thread->isolate();
2819 ContainsAddressVisitor visitor(isolate, addr); 2820 ContainsAddressVisitor visitor(isolate, addr);
2820 object = isolate->heap()->FindObject(&visitor); 2821 object = isolate->heap()->FindObject(&visitor);
2821 } 2822 }
2822 2823
2823 if (!object.IsNull()) { 2824 if (!object.IsNull()) {
2824 return object.raw(); 2825 return object.raw();
2825 } 2826 }
2826 2827
2827 { 2828 {
2828 NoSafepointScope no_safepoint; 2829 NoSafepointScope no_safepoint;
2829 ContainsAddressVisitor visitor(Dart::vm_isolate(), addr); 2830 ContainsAddressVisitor visitor(Dart::vm_isolate(), addr);
2830 object = Dart::vm_isolate()->heap()->FindObject(&visitor); 2831 object = Dart::vm_isolate()->heap()->FindObject(&visitor);
2831 } 2832 }
2832 2833
2833 return object.raw(); 2834 return object.raw();
2834 } 2835 }
2835 2836
2836 2837
2837 static bool GetObjectByAddress(Isolate* isolate, JSONStream* js) { 2838 static bool GetObjectByAddress(Thread* thread, JSONStream* js) {
2838 const char* addr_str = js->LookupParam("address"); 2839 const char* addr_str = js->LookupParam("address");
2839 if (addr_str == NULL) { 2840 if (addr_str == NULL) {
2840 PrintMissingParamError(js, "address"); 2841 PrintMissingParamError(js, "address");
2841 return true; 2842 return true;
2842 } 2843 }
2843 2844
2844 // Handle heap objects. 2845 // Handle heap objects.
2845 uword addr = 0; 2846 uword addr = 0;
2846 if (!GetUnsignedIntegerId(addr_str, &addr, 16)) { 2847 if (!GetUnsignedIntegerId(addr_str, &addr, 16)) {
2847 PrintInvalidParamError(js, "address"); 2848 PrintInvalidParamError(js, "address");
2848 return true; 2849 return true;
2849 } 2850 }
2850 bool ref = js->HasParam("ref") && js->ParamIs("ref", "true"); 2851 bool ref = js->HasParam("ref") && js->ParamIs("ref", "true");
2851 const Object& obj = Object::Handle(isolate->current_zone(), 2852 const Object& obj = Object::Handle(thread->zone(),
2852 GetObjectHelper(isolate, addr)); 2853 GetObjectHelper(thread, addr));
2853 if (obj.IsNull()) { 2854 if (obj.IsNull()) {
2854 PrintSentinel(js, kFreeSentinel); 2855 PrintSentinel(js, kFreeSentinel);
2855 } else { 2856 } else {
2856 obj.PrintJSON(js, ref); 2857 obj.PrintJSON(js, ref);
2857 } 2858 }
2858 return true; 2859 return true;
2859 } 2860 }
2860 2861
2861 2862
2862 static const MethodParameter* get_ports_params[] = { 2863 static const MethodParameter* get_ports_params[] = {
2863 ISOLATE_PARAMETER, 2864 ISOLATE_PARAMETER,
2864 NULL, 2865 NULL,
2865 }; 2866 };
2866 2867
2867 2868
2868 static bool GetPorts(Isolate* isolate, JSONStream* js) { 2869 static bool GetPorts(Thread* thread, JSONStream* js) {
2869 MessageHandler* message_handler = isolate->message_handler(); 2870 MessageHandler* message_handler = thread->isolate()->message_handler();
2870 PortMap::PrintPortsForMessageHandler(message_handler, js); 2871 PortMap::PrintPortsForMessageHandler(message_handler, js);
2871 return true; 2872 return true;
2872 } 2873 }
2873 2874
2874 2875
2875 static bool RespondWithMalformedJson(Isolate* isolate, 2876 static bool RespondWithMalformedJson(Thread* thread, JSONStream* js) {
2876 JSONStream* js) {
2877 JSONObject jsobj(js); 2877 JSONObject jsobj(js);
2878 jsobj.AddProperty("a", "a"); 2878 jsobj.AddProperty("a", "a");
2879 JSONObject jsobj1(js); 2879 JSONObject jsobj1(js);
2880 jsobj1.AddProperty("a", "a"); 2880 jsobj1.AddProperty("a", "a");
2881 JSONObject jsobj2(js); 2881 JSONObject jsobj2(js);
2882 jsobj2.AddProperty("a", "a"); 2882 jsobj2.AddProperty("a", "a");
2883 JSONObject jsobj3(js); 2883 JSONObject jsobj3(js);
2884 jsobj3.AddProperty("a", "a"); 2884 jsobj3.AddProperty("a", "a");
2885 return true; 2885 return true;
2886 } 2886 }
2887 2887
2888 2888
2889 static bool RespondWithMalformedObject(Isolate* isolate, 2889 static bool RespondWithMalformedObject(Thread* thread, JSONStream* js) {
2890 JSONStream* js) {
2891 JSONObject jsobj(js); 2890 JSONObject jsobj(js);
2892 jsobj.AddProperty("bart", "simpson"); 2891 jsobj.AddProperty("bart", "simpson");
2893 return true; 2892 return true;
2894 } 2893 }
2895 2894
2896 2895
2897 static const MethodParameter* get_object_params[] = { 2896 static const MethodParameter* get_object_params[] = {
2898 ISOLATE_PARAMETER, 2897 ISOLATE_PARAMETER,
2899 new UIntParameter("offset", false), 2898 new UIntParameter("offset", false),
2900 new UIntParameter("count", false), 2899 new UIntParameter("count", false),
2901 NULL, 2900 NULL,
2902 }; 2901 };
2903 2902
2904 2903
2905 static bool GetObject(Isolate* isolate, JSONStream* js) { 2904 static bool GetObject(Thread* thread, JSONStream* js) {
2906 const char* id = js->LookupParam("objectId"); 2905 const char* id = js->LookupParam("objectId");
2907 if (id == NULL) { 2906 if (id == NULL) {
2908 PrintMissingParamError(js, "objectId"); 2907 PrintMissingParamError(js, "objectId");
2909 return true; 2908 return true;
2910 } 2909 }
2911 if (js->HasParam("offset")) { 2910 if (js->HasParam("offset")) {
2912 intptr_t value = UIntParameter::Parse(js->LookupParam("offset")); 2911 intptr_t value = UIntParameter::Parse(js->LookupParam("offset"));
2913 if (value < 0) { 2912 if (value < 0) {
2914 PrintInvalidParamError(js, "offset"); 2913 PrintInvalidParamError(js, "offset");
2915 return true; 2914 return true;
2916 } 2915 }
2917 js->set_offset(value); 2916 js->set_offset(value);
2918 } 2917 }
2919 if (js->HasParam("count")) { 2918 if (js->HasParam("count")) {
2920 intptr_t value = UIntParameter::Parse(js->LookupParam("count")); 2919 intptr_t value = UIntParameter::Parse(js->LookupParam("count"));
2921 if (value < 0) { 2920 if (value < 0) {
2922 PrintInvalidParamError(js, "count"); 2921 PrintInvalidParamError(js, "count");
2923 return true; 2922 return true;
2924 } 2923 }
2925 js->set_count(value); 2924 js->set_count(value);
2926 } 2925 }
2927 2926
2928 // Handle heap objects. 2927 // Handle heap objects.
2929 ObjectIdRing::LookupResult lookup_result; 2928 ObjectIdRing::LookupResult lookup_result;
2930 const Object& obj = 2929 const Object& obj =
2931 Object::Handle(LookupHeapObject(isolate, id, &lookup_result)); 2930 Object::Handle(LookupHeapObject(thread, id, &lookup_result));
2932 if (obj.raw() != Object::sentinel().raw()) { 2931 if (obj.raw() != Object::sentinel().raw()) {
2933 // We found a heap object for this id. Return it. 2932 // We found a heap object for this id. Return it.
2934 obj.PrintJSON(js, false); 2933 obj.PrintJSON(js, false);
2935 return true; 2934 return true;
2936 } else if (lookup_result == ObjectIdRing::kCollected) { 2935 } else if (lookup_result == ObjectIdRing::kCollected) {
2937 PrintSentinel(js, kCollectedSentinel); 2936 PrintSentinel(js, kCollectedSentinel);
2938 return true; 2937 return true;
2939 } else if (lookup_result == ObjectIdRing::kExpired) { 2938 } else if (lookup_result == ObjectIdRing::kExpired) {
2940 PrintSentinel(js, kExpiredSentinel); 2939 PrintSentinel(js, kExpiredSentinel);
2941 return true; 2940 return true;
2942 } 2941 }
2943 2942
2944 // Handle non-heap objects. 2943 // Handle non-heap objects.
2945 Breakpoint* bpt = LookupBreakpoint(isolate, id, &lookup_result); 2944 Breakpoint* bpt = LookupBreakpoint(thread->isolate(), id, &lookup_result);
2946 if (bpt != NULL) { 2945 if (bpt != NULL) {
2947 bpt->PrintJSON(js); 2946 bpt->PrintJSON(js);
2948 return true; 2947 return true;
2949 } else if (lookup_result == ObjectIdRing::kCollected) { 2948 } else if (lookup_result == ObjectIdRing::kCollected) {
2950 PrintSentinel(js, kCollectedSentinel); 2949 PrintSentinel(js, kCollectedSentinel);
2951 return true; 2950 return true;
2952 } 2951 }
2953 2952
2954 PrintInvalidParamError(js, "objectId"); 2953 PrintInvalidParamError(js, "objectId");
2955 return true; 2954 return true;
2956 } 2955 }
2957 2956
2958 2957
2959 static const MethodParameter* get_class_list_params[] = { 2958 static const MethodParameter* get_class_list_params[] = {
2960 ISOLATE_PARAMETER, 2959 ISOLATE_PARAMETER,
2961 NULL, 2960 NULL,
2962 }; 2961 };
2963 2962
2964 2963
2965 static bool GetClassList(Isolate* isolate, JSONStream* js) { 2964 static bool GetClassList(Thread* thread, JSONStream* js) {
2966 ClassTable* table = isolate->class_table(); 2965 ClassTable* table = thread->isolate()->class_table();
2967 JSONObject jsobj(js); 2966 JSONObject jsobj(js);
2968 table->PrintToJSONObject(&jsobj); 2967 table->PrintToJSONObject(&jsobj);
2969 return true; 2968 return true;
2970 } 2969 }
2971 2970
2972 2971
2973 static const MethodParameter* get_type_arguments_list_params[] = { 2972 static const MethodParameter* get_type_arguments_list_params[] = {
2974 ISOLATE_PARAMETER, 2973 ISOLATE_PARAMETER,
2975 NULL, 2974 NULL,
2976 }; 2975 };
2977 2976
2978 2977
2979 static bool GetTypeArgumentsList(Isolate* isolate, JSONStream* js) { 2978 static bool GetTypeArgumentsList(Thread* thread, JSONStream* js) {
2980 bool only_with_instantiations = false; 2979 bool only_with_instantiations = false;
2981 if (js->ParamIs("onlyWithInstantiations", "true")) { 2980 if (js->ParamIs("onlyWithInstantiations", "true")) {
2982 only_with_instantiations = true; 2981 only_with_instantiations = true;
2983 } 2982 }
2984 ObjectStore* object_store = isolate->object_store(); 2983 ObjectStore* object_store = thread->isolate()->object_store();
2985 const Array& table = Array::Handle(object_store->canonical_type_arguments()); 2984 const Array& table = Array::Handle(object_store->canonical_type_arguments());
2986 ASSERT(table.Length() > 0); 2985 ASSERT(table.Length() > 0);
2987 TypeArguments& type_args = TypeArguments::Handle(); 2986 TypeArguments& type_args = TypeArguments::Handle();
2988 const intptr_t table_size = table.Length() - 1; 2987 const intptr_t table_size = table.Length() - 1;
2989 const intptr_t table_used = Smi::Value(Smi::RawCast(table.At(table_size))); 2988 const intptr_t table_used = Smi::Value(Smi::RawCast(table.At(table_size)));
2990 JSONObject jsobj(js); 2989 JSONObject jsobj(js);
2991 jsobj.AddProperty("type", "TypeArgumentsList"); 2990 jsobj.AddProperty("type", "TypeArgumentsList");
2992 jsobj.AddProperty("canonicalTypeArgumentsTableSize", table_size); 2991 jsobj.AddProperty("canonicalTypeArgumentsTableSize", table_size);
2993 jsobj.AddProperty("canonicalTypeArgumentsTableUsed", table_used); 2992 jsobj.AddProperty("canonicalTypeArgumentsTableUsed", table_used);
2994 JSONArray members(&jsobj, "typeArguments"); 2993 JSONArray members(&jsobj, "typeArguments");
2995 for (intptr_t i = 0; i < table_size; i++) { 2994 for (intptr_t i = 0; i < table_size; i++) {
2996 type_args ^= table.At(i); 2995 type_args ^= table.At(i);
2997 if (!type_args.IsNull()) { 2996 if (!type_args.IsNull()) {
2998 if (!only_with_instantiations || type_args.HasInstantiations()) { 2997 if (!only_with_instantiations || type_args.HasInstantiations()) {
2999 members.AddValue(type_args); 2998 members.AddValue(type_args);
3000 } 2999 }
3001 } 3000 }
3002 } 3001 }
3003 return true; 3002 return true;
3004 } 3003 }
3005 3004
3006 3005
3007 static const MethodParameter* get_version_params[] = { 3006 static const MethodParameter* get_version_params[] = {
3008 NO_ISOLATE_PARAMETER, 3007 NO_ISOLATE_PARAMETER,
3009 NULL, 3008 NULL,
3010 }; 3009 };
3011 3010
3012 3011
3013 static bool GetVersion(Isolate* isolate, JSONStream* js) { 3012 static bool GetVersion(Thread* thread, JSONStream* js) {
3014 JSONObject jsobj(js); 3013 JSONObject jsobj(js);
3015 jsobj.AddProperty("type", "Version"); 3014 jsobj.AddProperty("type", "Version");
3016 jsobj.AddProperty("major", static_cast<intptr_t>(3)); 3015 jsobj.AddProperty("major", static_cast<intptr_t>(3));
3017 jsobj.AddProperty("minor", static_cast<intptr_t>(0)); 3016 jsobj.AddProperty("minor", static_cast<intptr_t>(0));
3018 jsobj.AddProperty("_privateMajor", static_cast<intptr_t>(0)); 3017 jsobj.AddProperty("_privateMajor", static_cast<intptr_t>(0));
3019 jsobj.AddProperty("_privateMinor", static_cast<intptr_t>(0)); 3018 jsobj.AddProperty("_privateMinor", static_cast<intptr_t>(0));
3020 return true; 3019 return true;
3021 } 3020 }
3022 3021
3023 3022
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
3065 jsobj.AddPropertyTimeMillis("startTime", start_time_millis); 3064 jsobj.AddPropertyTimeMillis("startTime", start_time_millis);
3066 // Construct the isolate list. 3065 // Construct the isolate list.
3067 { 3066 {
3068 JSONArray jsarr(&jsobj, "isolates"); 3067 JSONArray jsarr(&jsobj, "isolates");
3069 ServiceIsolateVisitor visitor(&jsarr); 3068 ServiceIsolateVisitor visitor(&jsarr);
3070 Isolate::VisitIsolates(&visitor); 3069 Isolate::VisitIsolates(&visitor);
3071 } 3070 }
3072 } 3071 }
3073 3072
3074 3073
3075 static bool GetVM(Isolate* isolate, JSONStream* js) { 3074 static bool GetVM(Thread* thread, JSONStream* js) {
3076 Service::PrintJSONForVM(js, false); 3075 Service::PrintJSONForVM(js, false);
3077 return true; 3076 return true;
3078 } 3077 }
3079 3078
3080 3079
3081 static const MethodParameter* restart_vm_params[] = { 3080 static const MethodParameter* restart_vm_params[] = {
3082 NO_ISOLATE_PARAMETER, 3081 NO_ISOLATE_PARAMETER,
3083 NULL, 3082 NULL,
3084 }; 3083 };
3085 3084
3086 3085
3087 static bool RestartVM(Isolate* isolate, JSONStream* js) { 3086 static bool RestartVM(Thread* thread, JSONStream* js) {
3088 Isolate::KillAllIsolates(Isolate::kVMRestartMsg); 3087 Isolate::KillAllIsolates(Isolate::kVMRestartMsg);
3089 PrintSuccess(js); 3088 PrintSuccess(js);
3090 return true; 3089 return true;
3091 } 3090 }
3092 3091
3093 3092
3094 static const char* exception_pause_mode_names[] = { 3093 static const char* exception_pause_mode_names[] = {
3095 "All", 3094 "All",
3096 "None", 3095 "None",
3097 "Unhandled", 3096 "Unhandled",
3098 NULL, 3097 NULL,
3099 }; 3098 };
3100 3099
3101 3100
3102 static Dart_ExceptionPauseInfo exception_pause_mode_values[] = { 3101 static Dart_ExceptionPauseInfo exception_pause_mode_values[] = {
3103 kPauseOnAllExceptions, 3102 kPauseOnAllExceptions,
3104 kNoPauseOnExceptions, 3103 kNoPauseOnExceptions,
3105 kPauseOnUnhandledExceptions, 3104 kPauseOnUnhandledExceptions,
3106 kInvalidExceptionPauseInfo, 3105 kInvalidExceptionPauseInfo,
3107 }; 3106 };
3108 3107
3109 3108
3110 static const MethodParameter* set_exception_pause_mode_params[] = { 3109 static const MethodParameter* set_exception_pause_mode_params[] = {
3111 ISOLATE_PARAMETER, 3110 ISOLATE_PARAMETER,
3112 new EnumParameter("mode", true, exception_pause_mode_names), 3111 new EnumParameter("mode", true, exception_pause_mode_names),
3113 NULL, 3112 NULL,
3114 }; 3113 };
3115 3114
3116 3115
3117 static bool SetExceptionPauseMode(Isolate* isolate, JSONStream* js) { 3116 static bool SetExceptionPauseMode(Thread* thread, JSONStream* js) {
3118 const char* mode = js->LookupParam("mode"); 3117 const char* mode = js->LookupParam("mode");
3119 if (mode == NULL) { 3118 if (mode == NULL) {
3120 PrintMissingParamError(js, "mode"); 3119 PrintMissingParamError(js, "mode");
3121 return true; 3120 return true;
3122 } 3121 }
3123 Dart_ExceptionPauseInfo info = 3122 Dart_ExceptionPauseInfo info =
3124 EnumMapper(mode, exception_pause_mode_names, exception_pause_mode_values); 3123 EnumMapper(mode, exception_pause_mode_names, exception_pause_mode_values);
3125 if (info == kInvalidExceptionPauseInfo) { 3124 if (info == kInvalidExceptionPauseInfo) {
3126 PrintInvalidParamError(js, "mode"); 3125 PrintInvalidParamError(js, "mode");
3127 return true; 3126 return true;
3128 } 3127 }
3128 Isolate* isolate = thread->isolate();
3129 isolate->debugger()->SetExceptionPauseInfo(info); 3129 isolate->debugger()->SetExceptionPauseInfo(info);
3130 if (Service::debug_stream.enabled()) { 3130 if (Service::debug_stream.enabled()) {
3131 ServiceEvent event(isolate, ServiceEvent::kDebuggerSettingsUpdate); 3131 ServiceEvent event(isolate, ServiceEvent::kDebuggerSettingsUpdate);
3132 Service::HandleEvent(&event); 3132 Service::HandleEvent(&event);
3133 } 3133 }
3134 PrintSuccess(js); 3134 PrintSuccess(js);
3135 return true; 3135 return true;
3136 } 3136 }
3137 3137
3138 3138
3139 static const MethodParameter* get_flag_list_params[] = { 3139 static const MethodParameter* get_flag_list_params[] = {
3140 NO_ISOLATE_PARAMETER, 3140 NO_ISOLATE_PARAMETER,
3141 NULL, 3141 NULL,
3142 }; 3142 };
3143 3143
3144 3144
3145 static bool GetFlagList(Isolate* isolate, JSONStream* js) { 3145 static bool GetFlagList(Thread* thread, JSONStream* js) {
3146 Flags::PrintJSON(js); 3146 Flags::PrintJSON(js);
3147 return true; 3147 return true;
3148 } 3148 }
3149 3149
3150 3150
3151 static const MethodParameter* set_flags_params[] = { 3151 static const MethodParameter* set_flags_params[] = {
3152 NO_ISOLATE_PARAMETER, 3152 NO_ISOLATE_PARAMETER,
3153 NULL, 3153 NULL,
3154 }; 3154 };
3155 3155
3156 3156
3157 static bool SetFlag(Isolate* isolate, JSONStream* js) { 3157 static bool SetFlag(Thread* thread, JSONStream* js) {
3158 const char* flag_name = js->LookupParam("name"); 3158 const char* flag_name = js->LookupParam("name");
3159 if (flag_name == NULL) { 3159 if (flag_name == NULL) {
3160 PrintMissingParamError(js, "name"); 3160 PrintMissingParamError(js, "name");
3161 return true; 3161 return true;
3162 } 3162 }
3163 const char* flag_value = js->LookupParam("value"); 3163 const char* flag_value = js->LookupParam("value");
3164 if (flag_value == NULL) { 3164 if (flag_value == NULL) {
3165 PrintMissingParamError(js, "value"); 3165 PrintMissingParamError(js, "value");
3166 return true; 3166 return true;
3167 } 3167 }
(...skipping 11 matching lines...) Expand all
3179 3179
3180 3180
3181 static const MethodParameter* set_library_debuggable_params[] = { 3181 static const MethodParameter* set_library_debuggable_params[] = {
3182 ISOLATE_PARAMETER, 3182 ISOLATE_PARAMETER,
3183 new IdParameter("libraryId", true), 3183 new IdParameter("libraryId", true),
3184 new BoolParameter("isDebuggable", true), 3184 new BoolParameter("isDebuggable", true),
3185 NULL, 3185 NULL,
3186 }; 3186 };
3187 3187
3188 3188
3189 static bool SetLibraryDebuggable(Isolate* isolate, JSONStream* js) { 3189 static bool SetLibraryDebuggable(Thread* thread, JSONStream* js) {
3190 const char* lib_id = js->LookupParam("libraryId"); 3190 const char* lib_id = js->LookupParam("libraryId");
3191 ObjectIdRing::LookupResult lookup_result; 3191 ObjectIdRing::LookupResult lookup_result;
3192 Object& obj = Object::Handle(LookupHeapObject(isolate, lib_id, 3192 Object& obj = Object::Handle(LookupHeapObject(thread, lib_id,
3193 &lookup_result)); 3193 &lookup_result));
3194 const bool is_debuggable = 3194 const bool is_debuggable =
3195 BoolParameter::Parse(js->LookupParam("isDebuggable"), false); 3195 BoolParameter::Parse(js->LookupParam("isDebuggable"), false);
3196 if (obj.IsLibrary()) { 3196 if (obj.IsLibrary()) {
3197 const Library& lib = Library::Cast(obj); 3197 const Library& lib = Library::Cast(obj);
3198 lib.set_debuggable(is_debuggable); 3198 lib.set_debuggable(is_debuggable);
3199 PrintSuccess(js); 3199 PrintSuccess(js);
3200 return true; 3200 return true;
3201 } 3201 }
3202 PrintInvalidParamError(js, "libraryId"); 3202 PrintInvalidParamError(js, "libraryId");
3203 return true; 3203 return true;
3204 } 3204 }
3205 3205
3206 3206
3207 static const MethodParameter* set_name_params[] = { 3207 static const MethodParameter* set_name_params[] = {
3208 ISOLATE_PARAMETER, 3208 ISOLATE_PARAMETER,
3209 new MethodParameter("name", true), 3209 new MethodParameter("name", true),
3210 NULL, 3210 NULL,
3211 }; 3211 };
3212 3212
3213 3213
3214 static bool SetName(Isolate* isolate, JSONStream* js) { 3214 static bool SetName(Thread* thread, JSONStream* js) {
3215 Isolate* isolate = thread->isolate();
3215 isolate->set_debugger_name(js->LookupParam("name")); 3216 isolate->set_debugger_name(js->LookupParam("name"));
3216 if (Service::isolate_stream.enabled()) { 3217 if (Service::isolate_stream.enabled()) {
3217 ServiceEvent event(isolate, ServiceEvent::kIsolateUpdate); 3218 ServiceEvent event(isolate, ServiceEvent::kIsolateUpdate);
3218 Service::HandleEvent(&event); 3219 Service::HandleEvent(&event);
3219 } 3220 }
3220 PrintSuccess(js); 3221 PrintSuccess(js);
3221 return true; 3222 return true;
3222 } 3223 }
3223 3224
3224 3225
3225 static const MethodParameter* set_vm_name_params[] = { 3226 static const MethodParameter* set_vm_name_params[] = {
3226 new MethodParameter("name", true), 3227 new MethodParameter("name", true),
3227 NULL, 3228 NULL,
3228 }; 3229 };
3229 3230
3230 3231
3231 static bool SetVMName(Isolate* isolate, JSONStream* js) { 3232 static bool SetVMName(Thread* thread, JSONStream* js) {
3232 const char* name_param = js->LookupParam("name"); 3233 const char* name_param = js->LookupParam("name");
3233 free(vm_name); 3234 free(vm_name);
3234 vm_name = strdup(name_param); 3235 vm_name = strdup(name_param);
3235 if (Service::vm_stream.enabled()) { 3236 if (Service::vm_stream.enabled()) {
3236 ServiceEvent event(NULL, ServiceEvent::kVMUpdate); 3237 ServiceEvent event(NULL, ServiceEvent::kVMUpdate);
3237 Service::HandleEvent(&event); 3238 Service::HandleEvent(&event);
3238 } 3239 }
3239 PrintSuccess(js); 3240 PrintSuccess(js);
3240 return true; 3241 return true;
3241 } 3242 }
3242 3243
3243 3244
3244 static const MethodParameter* set_trace_class_allocation_params[] = { 3245 static const MethodParameter* set_trace_class_allocation_params[] = {
3245 ISOLATE_PARAMETER, 3246 ISOLATE_PARAMETER,
3246 new IdParameter("classId", true), 3247 new IdParameter("classId", true),
3247 new BoolParameter("enable", true), 3248 new BoolParameter("enable", true),
3248 NULL, 3249 NULL,
3249 }; 3250 };
3250 3251
3251 3252
3252 static bool SetTraceClassAllocation(Isolate* isolate, JSONStream* js) { 3253 static bool SetTraceClassAllocation(Thread* thread, JSONStream* js) {
3253 const char* class_id = js->LookupParam("classId"); 3254 const char* class_id = js->LookupParam("classId");
3254 const bool enable = BoolParameter::Parse(js->LookupParam("enable")); 3255 const bool enable = BoolParameter::Parse(js->LookupParam("enable"));
3255 intptr_t cid = -1; 3256 intptr_t cid = -1;
3256 GetPrefixedIntegerId(class_id, "classes/", &cid); 3257 GetPrefixedIntegerId(class_id, "classes/", &cid);
3258 Isolate* isolate = thread->isolate();
3257 if (!IsValidClassId(isolate, cid)) { 3259 if (!IsValidClassId(isolate, cid)) {
3258 PrintInvalidParamError(js, "classId"); 3260 PrintInvalidParamError(js, "classId");
3259 return true; 3261 return true;
3260 } 3262 }
3261 const Class& cls = Class::Handle(GetClassForId(isolate, cid)); 3263 const Class& cls = Class::Handle(GetClassForId(isolate, cid));
3262 ASSERT(!cls.IsNull()); 3264 ASSERT(!cls.IsNull());
3263 cls.SetTraceAllocation(enable); 3265 cls.SetTraceAllocation(enable);
3264 PrintSuccess(js); 3266 PrintSuccess(js);
3265 return true; 3267 return true;
3266 } 3268 }
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
3372 ServiceMethodDescriptor& method = service_methods_[i]; 3374 ServiceMethodDescriptor& method = service_methods_[i];
3373 if (strcmp(method_name, method.name) == 0) { 3375 if (strcmp(method_name, method.name) == 0) {
3374 return &method; 3376 return &method;
3375 } 3377 }
3376 } 3378 }
3377 return NULL; 3379 return NULL;
3378 } 3380 }
3379 3381
3380 3382
3381 } // namespace dart 3383 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/service.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698