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

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

Issue 1120133002: Rework error handling in the service protocol and in Observatory. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 7 months 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 | Annotate | Revision Log
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 "platform/globals.h" 8 #include "platform/globals.h"
9 9
10 #include "vm/compiler.h" 10 #include "vm/compiler.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 EmbedderServiceHandler* Service::isolate_service_handler_head_ = NULL; 43 EmbedderServiceHandler* Service::isolate_service_handler_head_ = NULL;
44 EmbedderServiceHandler* Service::root_service_handler_head_ = NULL; 44 EmbedderServiceHandler* Service::root_service_handler_head_ = NULL;
45 struct ServiceMethodDescriptor; 45 struct ServiceMethodDescriptor;
46 ServiceMethodDescriptor* FindMethod(const char* method_name); 46 ServiceMethodDescriptor* FindMethod(const char* method_name);
47 47
48 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { 48 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
49 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); 49 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size);
50 return reinterpret_cast<uint8_t*>(new_ptr); 50 return reinterpret_cast<uint8_t*>(new_ptr);
51 } 51 }
52 52
53 static void PrintRequest(const JSONObject& obj, JSONStream* js) {
54 JSONObject jsobj(&obj, "request");
55 jsobj.AddProperty("method", js->method());
56 {
57 JSONObject params(&jsobj, "params");
58 for (intptr_t i = 0; i < js->num_params(); i++) {
59 params.AddProperty(js->GetParamKey(i), js->GetParamValue(i));
60 }
61 }
62 }
63
64
65 static void PrintError(JSONStream* js,
66 const char* format, ...) {
67 Isolate* isolate = Isolate::Current();
68
69 va_list args;
70 va_start(args, format);
71 intptr_t len = OS::VSNPrint(NULL, 0, format, args);
72 va_end(args);
73
74 char* buffer = isolate->current_zone()->Alloc<char>(len + 1);
75 va_list args2;
76 va_start(args2, format);
77 OS::VSNPrint(buffer, (len + 1), format, args2);
78 va_end(args2);
79
80 JSONObject jsobj(js);
81 jsobj.AddProperty("type", "Error");
82 jsobj.AddProperty("message", buffer);
83 PrintRequest(jsobj, js);
84 }
85
86
87 static void PrintMissingParamError(JSONStream* js, 53 static void PrintMissingParamError(JSONStream* js,
88 const char* param) { 54 const char* param) {
89 PrintError(js, "%s expects the '%s' parameter", 55 js->PrintError(kInvalidParams,
90 js->method(), param); 56 "%s expects the '%s' parameter", js->method(), param);
91 } 57 }
92 58
93 59
94 static void PrintInvalidParamError(JSONStream* js, 60 static void PrintInvalidParamError(JSONStream* js,
95 const char* param) { 61 const char* param) {
96 PrintError(js, "%s: invalid '%s' parameter: %s", 62 js->PrintError(kInvalidParams,
97 js->method(), param, js->LookupParam(param)); 63 "%s: invalid '%s' parameter: %s",
64 js->method(), param, js->LookupParam(param));
98 } 65 }
99 66
100 67
101 static void PrintUnrecognizedMethodError(JSONStream* js) { 68 static void PrintUnrecognizedMethodError(JSONStream* js) {
102 PrintError(js, "unrecognized method: %s", js->method()); 69 js->PrintError(kMethodNotFound, NULL);
103 } 70 }
104 71
105 72
106 static void PrintErrorWithKind(JSONStream* js,
107 const char* kind,
108 const char* format, ...) {
109 Isolate* isolate = Isolate::Current();
110
111 va_list args;
112 va_start(args, format);
113 intptr_t len = OS::VSNPrint(NULL, 0, format, args);
114 va_end(args);
115
116 char* buffer = isolate->current_zone()->Alloc<char>(len + 1);
117 va_list args2;
118 va_start(args2, format);
119 OS::VSNPrint(buffer, (len + 1), format, args2);
120 va_end(args2);
121
122 JSONObject jsobj(js);
123 jsobj.AddProperty("type", "Error");
124 jsobj.AddProperty("id", "");
125 jsobj.AddProperty("kind", kind);
126 jsobj.AddProperty("message", buffer);
127 PrintRequest(jsobj, js);
128 }
129
130
131 static bool GetIntegerId(const char* s, intptr_t* id, int base = 10) { 73 static bool GetIntegerId(const char* s, intptr_t* id, int base = 10) {
132 if ((s == NULL) || (*s == '\0')) { 74 if ((s == NULL) || (*s == '\0')) {
133 // Empty string. 75 // Empty string.
134 return false; 76 return false;
135 } 77 }
136 if (id == NULL) { 78 if (id == NULL) {
137 // No id pointer. 79 // No id pointer.
138 return false; 80 return false;
139 } 81 }
140 intptr_t r = 0; 82 intptr_t r = 0;
(...skipping 1054 matching lines...) Expand 10 before | Expand all | Expand 10 after
1195 return false; 1137 return false;
1196 } 1138 }
1197 const char* rest = id + end_pos + 1; // +1 for '/'. 1139 const char* rest = id + end_pos + 1; // +1 for '/'.
1198 if (strncmp("messages", id, end_pos) == 0) { 1140 if (strncmp("messages", id, end_pos) == 0) {
1199 uword message_id = 0; 1141 uword message_id = 0;
1200 if (GetUnsignedIntegerId(rest, &message_id, 16)) { 1142 if (GetUnsignedIntegerId(rest, &message_id, 16)) {
1201 MessageHandler::AcquiredQueues aq; 1143 MessageHandler::AcquiredQueues aq;
1202 isolate->message_handler()->AcquireQueues(&aq); 1144 isolate->message_handler()->AcquireQueues(&aq);
1203 Message* message = aq.queue()->FindMessageById(message_id); 1145 Message* message = aq.queue()->FindMessageById(message_id);
1204 if (message == NULL) { 1146 if (message == NULL) {
1205 printf("Could not find message %" Px "\n", message_id); 1147 // The user may try to load an expired message, so we treat
1206 // Not found. 1148 // unrecognized ids as if they are expired.
1207 return false; 1149 PrintSentinel(js, "objects/expired", "<expired>");
Cutch 2015/05/13 17:50:10 Should PrintSentinel take an enum and handle setti
turnidge 2015/05/14 17:53:43 Done.
1150 return true;
1208 } 1151 }
1209 SnapshotReader reader(message->data(), 1152 SnapshotReader reader(message->data(),
1210 message->len(), 1153 message->len(),
1211 Snapshot::kMessage, 1154 Snapshot::kMessage,
1212 isolate, 1155 isolate,
1213 isolate->current_zone()); 1156 isolate->current_zone());
1214 const Object& msg_obj = Object::Handle(reader.ReadObject()); 1157 const Object& msg_obj = Object::Handle(reader.ReadObject());
1215 msg_obj.PrintJSON(js); 1158 msg_obj.PrintJSON(js);
1216 return true; 1159 return true;
1217 } else {
1218 printf("Could not get id from %s\n", rest);
1219 } 1160 }
1220 } 1161 }
1221 return false; 1162 return false;
1222 } 1163 }
1223 1164
1224 1165
1225 static bool PrintInboundReferences(Isolate* isolate, 1166 static bool PrintInboundReferences(Isolate* isolate,
1226 Object* target, 1167 Object* target,
1227 intptr_t limit, 1168 intptr_t limit,
1228 JSONStream* js) { 1169 JSONStream* js) {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1276 }; 1217 };
1277 1218
1278 1219
1279 static bool GetInboundReferences(Isolate* isolate, JSONStream* js) { 1220 static bool GetInboundReferences(Isolate* isolate, JSONStream* js) {
1280 const char* target_id = js->LookupParam("targetId"); 1221 const char* target_id = js->LookupParam("targetId");
1281 if (target_id == NULL) { 1222 if (target_id == NULL) {
1282 PrintMissingParamError(js, "targetId"); 1223 PrintMissingParamError(js, "targetId");
1283 return true; 1224 return true;
1284 } 1225 }
1285 const char* limit_cstr = js->LookupParam("limit"); 1226 const char* limit_cstr = js->LookupParam("limit");
1286 if (target_id == NULL) { 1227 if (limit_cstr == NULL) {
1287 PrintMissingParamError(js, "limit"); 1228 PrintMissingParamError(js, "limit");
1288 return true; 1229 return true;
1289 } 1230 }
1290 intptr_t limit; 1231 intptr_t limit;
1291 if (!GetIntegerId(limit_cstr, &limit)) { 1232 if (!GetIntegerId(limit_cstr, &limit)) {
1292 PrintInvalidParamError(js, "limit"); 1233 PrintInvalidParamError(js, "limit");
1293 return true; 1234 return true;
1294 } 1235 }
1295 1236
1296 Object& obj = Object::Handle(isolate); 1237 Object& obj = Object::Handle(isolate);
1297 ObjectIdRing::LookupResult lookup_result; 1238 ObjectIdRing::LookupResult lookup_result;
1298 { 1239 {
1299 HANDLESCOPE(isolate); 1240 HANDLESCOPE(isolate);
1300 obj = LookupHeapObject(isolate, target_id, &lookup_result); 1241 obj = LookupHeapObject(isolate, target_id, &lookup_result);
1301 } 1242 }
1302 if (obj.raw() == Object::sentinel().raw()) { 1243 if (obj.raw() == Object::sentinel().raw()) {
1303 if (lookup_result == ObjectIdRing::kCollected) { 1244 if (lookup_result == ObjectIdRing::kCollected) {
1304 PrintErrorWithKind( 1245 PrintSentinel(js, "objects/collected", "<collected>");
1305 js, "InboundReferencesCollected",
1306 "attempt to find a retaining path for a collected object\n");
1307 return true;
1308 } else if (lookup_result == ObjectIdRing::kExpired) { 1246 } else if (lookup_result == ObjectIdRing::kExpired) {
1309 PrintErrorWithKind( 1247 PrintSentinel(js, "objects/expired", "<expired>");
1310 js, "InboundReferencesExpired", 1248 } else {
1311 "attempt to find a retaining path for an expired object\n"); 1249 PrintInvalidParamError(js, "targetId");
1312 return true;
1313 } 1250 }
1314 PrintInvalidParamError(js, "targetId");
1315 return true; 1251 return true;
1316 } 1252 }
1317 return PrintInboundReferences(isolate, &obj, limit, js); 1253 return PrintInboundReferences(isolate, &obj, limit, js);
1318 } 1254 }
1319 1255
1320 1256
1321 static bool PrintRetainingPath(Isolate* isolate, 1257 static bool PrintRetainingPath(Isolate* isolate,
1322 Object* obj, 1258 Object* obj,
1323 intptr_t limit, 1259 intptr_t limit,
1324 JSONStream* js) { 1260 JSONStream* js) {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1380 }; 1316 };
1381 1317
1382 1318
1383 static bool GetRetainingPath(Isolate* isolate, JSONStream* js) { 1319 static bool GetRetainingPath(Isolate* isolate, JSONStream* js) {
1384 const char* target_id = js->LookupParam("targetId"); 1320 const char* target_id = js->LookupParam("targetId");
1385 if (target_id == NULL) { 1321 if (target_id == NULL) {
1386 PrintMissingParamError(js, "targetId"); 1322 PrintMissingParamError(js, "targetId");
1387 return true; 1323 return true;
1388 } 1324 }
1389 const char* limit_cstr = js->LookupParam("limit"); 1325 const char* limit_cstr = js->LookupParam("limit");
1390 if (target_id == NULL) { 1326 if (limit_cstr == NULL) {
1391 PrintMissingParamError(js, "limit"); 1327 PrintMissingParamError(js, "limit");
1392 return true; 1328 return true;
1393 } 1329 }
1394 intptr_t limit; 1330 intptr_t limit;
1395 if (!GetIntegerId(limit_cstr, &limit)) { 1331 if (!GetIntegerId(limit_cstr, &limit)) {
1396 PrintInvalidParamError(js, "limit"); 1332 PrintInvalidParamError(js, "limit");
1397 return true; 1333 return true;
1398 } 1334 }
1399 1335
1400 Object& obj = Object::Handle(isolate); 1336 Object& obj = Object::Handle(isolate);
1401 ObjectIdRing::LookupResult lookup_result; 1337 ObjectIdRing::LookupResult lookup_result;
1402 { 1338 {
1403 HANDLESCOPE(isolate); 1339 HANDLESCOPE(isolate);
1404 obj = LookupHeapObject(isolate, target_id, &lookup_result); 1340 obj = LookupHeapObject(isolate, target_id, &lookup_result);
1405 } 1341 }
1406 if (obj.raw() == Object::sentinel().raw()) { 1342 if (obj.raw() == Object::sentinel().raw()) {
1407 if (lookup_result == ObjectIdRing::kCollected) { 1343 if (lookup_result == ObjectIdRing::kCollected) {
1408 PrintErrorWithKind( 1344 PrintSentinel(js, "objects/collected", "<collected>");
1409 js, "RetainingPathCollected",
1410 "attempt to find a retaining path for a collected object\n");
1411 return true;
1412 } else if (lookup_result == ObjectIdRing::kExpired) { 1345 } else if (lookup_result == ObjectIdRing::kExpired) {
1413 PrintErrorWithKind( 1346 PrintSentinel(js, "objects/expired", "<expired>");
1414 js, "RetainingPathExpired", 1347 } else {
1415 "attempt to find a retaining path for an expired object\n"); 1348 PrintInvalidParamError(js, "targetId");
1416 return true;
1417 } 1349 }
1418 PrintInvalidParamError(js, "targetId");
1419 return true; 1350 return true;
1420 } 1351 }
1421 return PrintRetainingPath(isolate, &obj, limit, js); 1352 return PrintRetainingPath(isolate, &obj, limit, js);
1422 } 1353 }
1423 1354
1424 1355
1425 static const MethodParameter* get_retained_size_params[] = { 1356 static const MethodParameter* get_retained_size_params[] = {
1426 ISOLATE_PARAMETER, 1357 ISOLATE_PARAMETER,
1427 NULL, 1358 NULL,
1428 }; 1359 };
1429 1360
1430 1361
1431 static bool GetRetainedSize(Isolate* isolate, JSONStream* js) { 1362 static bool GetRetainedSize(Isolate* isolate, JSONStream* js) {
1432 const char* target_id = js->LookupParam("targetId"); 1363 const char* target_id = js->LookupParam("targetId");
1433 if (target_id == NULL) { 1364 if (target_id == NULL) {
1434 PrintMissingParamError(js, "targetId"); 1365 PrintMissingParamError(js, "targetId");
1435 return true; 1366 return true;
1436 } 1367 }
1437 ObjectIdRing::LookupResult lookup_result; 1368 ObjectIdRing::LookupResult lookup_result;
1438 Object& obj = Object::Handle(LookupHeapObject(isolate, target_id, 1369 Object& obj = Object::Handle(LookupHeapObject(isolate, target_id,
1439 &lookup_result)); 1370 &lookup_result));
1440 if (obj.raw() == Object::sentinel().raw()) { 1371 if (obj.raw() == Object::sentinel().raw()) {
1441 if (lookup_result == ObjectIdRing::kCollected) { 1372 if (lookup_result == ObjectIdRing::kCollected) {
1442 PrintErrorWithKind( 1373 PrintSentinel(js, "objects/collected", "<collected>");
1443 js, "RetainedCollected",
1444 "attempt to calculate size retained by a collected object\n");
1445 return true;
1446 } else if (lookup_result == ObjectIdRing::kExpired) { 1374 } else if (lookup_result == ObjectIdRing::kExpired) {
1447 PrintErrorWithKind( 1375 PrintSentinel(js, "objects/expired", "<expired>");
1448 js, "RetainedExpired", 1376 } else {
1449 "attempt to calculate size retained by an expired object\n"); 1377 PrintInvalidParamError(js, "targetId");
1450 return true;
1451 } 1378 }
1452 PrintInvalidParamError(js, "targetId");
1453 return true; 1379 return true;
1454 } 1380 }
1455 if (obj.IsClass()) { 1381 if (obj.IsClass()) {
1456 const Class& cls = Class::Cast(obj); 1382 const Class& cls = Class::Cast(obj);
1457 ObjectGraph graph(isolate); 1383 ObjectGraph graph(isolate);
1458 intptr_t retained_size = graph.SizeRetainedByClass(cls.id()); 1384 intptr_t retained_size = graph.SizeRetainedByClass(cls.id());
1459 const Object& result = Object::Handle(Integer::New(retained_size)); 1385 const Object& result = Object::Handle(Integer::New(retained_size));
1460 result.PrintJSON(js, true); 1386 result.PrintJSON(js, true);
1461 return true; 1387 return true;
1462 } 1388 }
1463 if (obj.IsInstance() || obj.IsNull()) { 1389 if (obj.IsInstance() || obj.IsNull()) {
1464 // We don't use Instance::Cast here because it doesn't allow null. 1390 // We don't use Instance::Cast here because it doesn't allow null.
1465 ObjectGraph graph(isolate); 1391 ObjectGraph graph(isolate);
1466 intptr_t retained_size = graph.SizeRetainedByInstance(obj); 1392 intptr_t retained_size = graph.SizeRetainedByInstance(obj);
1467 const Object& result = Object::Handle(Integer::New(retained_size)); 1393 const Object& result = Object::Handle(Integer::New(retained_size));
1468 result.PrintJSON(js, true); 1394 result.PrintJSON(js, true);
1469 return true; 1395 return true;
1470 } 1396 }
1471 PrintError(js, "%s: Invalid 'targetId' parameter value: " 1397 js->PrintError(kInvalidParams,
1472 "id '%s' does not correspond to a " 1398 "%s: invalid 'targetId' parameter: "
1473 "library, class, or instance", js->method(), target_id); 1399 "id '%s' does not correspond to a "
1400 "library, class, or instance", js->method(), target_id);
1474 return true; 1401 return true;
1475 } 1402 }
1476 1403
1477 1404
1478 static const MethodParameter* eval_params[] = { 1405 static const MethodParameter* eval_params[] = {
1479 ISOLATE_PARAMETER, 1406 ISOLATE_PARAMETER,
1480 NULL, 1407 NULL,
1481 }; 1408 };
1482 1409
1483 1410
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1527 // We don't use Instance::Cast here because it doesn't allow null. 1454 // We don't use Instance::Cast here because it doesn't allow null.
1528 Instance& instance = Instance::Handle(isolate); 1455 Instance& instance = Instance::Handle(isolate);
1529 instance ^= obj.raw(); 1456 instance ^= obj.raw();
1530 const Object& result = 1457 const Object& result =
1531 Object::Handle(instance.Evaluate(expr_str, 1458 Object::Handle(instance.Evaluate(expr_str,
1532 Array::empty_array(), 1459 Array::empty_array(),
1533 Array::empty_array())); 1460 Array::empty_array()));
1534 result.PrintJSON(js, true); 1461 result.PrintJSON(js, true);
1535 return true; 1462 return true;
1536 } 1463 }
1537 PrintError(js, "%s: Invalid 'targetId' parameter value: " 1464 js->PrintError(kInvalidParams,
1538 "id '%s' does not correspond to a " 1465 "%s: invalid 'targetId' parameter: "
1539 "library, class, or instance", js->method(), target_id); 1466 "id '%s' does not correspond to a "
1467 "library, class, or instance", js->method(), target_id);
1540 return true; 1468 return true;
1541 } 1469 }
1542 1470
1543 1471
1544 static const MethodParameter* eval_frame_params[] = { 1472 static const MethodParameter* eval_frame_params[] = {
1545 ISOLATE_PARAMETER, 1473 ISOLATE_PARAMETER,
1546 new UIntParameter("frame", true), 1474 new UIntParameter("frame", true),
1547 new MethodParameter("expression", true), 1475 new MethodParameter("expression", true),
1548 NULL, 1476 NULL,
1549 }; 1477 };
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1605 }; 1533 };
1606 1534
1607 1535
1608 static bool GetInstances(Isolate* isolate, JSONStream* js) { 1536 static bool GetInstances(Isolate* isolate, JSONStream* js) {
1609 const char* target_id = js->LookupParam("classId"); 1537 const char* target_id = js->LookupParam("classId");
1610 if (target_id == NULL) { 1538 if (target_id == NULL) {
1611 PrintMissingParamError(js, "classId"); 1539 PrintMissingParamError(js, "classId");
1612 return true; 1540 return true;
1613 } 1541 }
1614 const char* limit_cstr = js->LookupParam("limit"); 1542 const char* limit_cstr = js->LookupParam("limit");
1615 if (target_id == NULL) { 1543 if (limit_cstr == NULL) {
1616 PrintMissingParamError(js, "limit"); 1544 PrintMissingParamError(js, "limit");
1617 return true; 1545 return true;
1618 } 1546 }
1619 intptr_t limit; 1547 intptr_t limit;
1620 if (!GetIntegerId(limit_cstr, &limit)) { 1548 if (!GetIntegerId(limit_cstr, &limit)) {
1621 PrintInvalidParamError(js, "limit"); 1549 PrintInvalidParamError(js, "limit");
1622 return true; 1550 return true;
1623 } 1551 }
1624 const Object& obj = 1552 const Object& obj =
1625 Object::Handle(LookupHeapObject(isolate, target_id, NULL)); 1553 Object::Handle(LookupHeapObject(isolate, target_id, NULL));
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
1736 if (obj.IsClass()) { 1664 if (obj.IsClass()) {
1737 ClassCoverageFilter cf(Class::Cast(obj)); 1665 ClassCoverageFilter cf(Class::Cast(obj));
1738 CodeCoverage::PrintJSON(isolate, js, &cf, as_sites); 1666 CodeCoverage::PrintJSON(isolate, js, &cf, as_sites);
1739 return true; 1667 return true;
1740 } 1668 }
1741 if (obj.IsFunction()) { 1669 if (obj.IsFunction()) {
1742 FunctionCoverageFilter ff(Function::Cast(obj)); 1670 FunctionCoverageFilter ff(Function::Cast(obj));
1743 CodeCoverage::PrintJSON(isolate, js, &ff, as_sites); 1671 CodeCoverage::PrintJSON(isolate, js, &ff, as_sites);
1744 return true; 1672 return true;
1745 } 1673 }
1746 PrintError(js, "%s: Invalid 'targetId' parameter value: " 1674 js->PrintError(kInvalidParams,
1747 "id '%s' does not correspond to a " 1675 "%s: invalid 'targetId' parameter: "
1748 "script, library, class, or function", js->method(), target_id); 1676 "id '%s' does not correspond to a "
1677 "script, library, class, or function",
1678 js->method(), target_id);
1749 return true; 1679 return true;
1750 } 1680 }
1751 1681
1752 1682
1753 static const MethodParameter* get_coverage_params[] = { 1683 static const MethodParameter* get_coverage_params[] = {
1754 ISOLATE_PARAMETER, 1684 ISOLATE_PARAMETER,
1755 NULL, 1685 NULL,
1756 }; 1686 };
1757 1687
1758 1688
(...skipping 30 matching lines...) Expand all
1789 Object& obj = Object::Handle(LookupHeapObject(isolate, script_id, NULL)); 1719 Object& obj = Object::Handle(LookupHeapObject(isolate, script_id, NULL));
1790 if (obj.raw() == Object::sentinel().raw() || !obj.IsScript()) { 1720 if (obj.raw() == Object::sentinel().raw() || !obj.IsScript()) {
1791 PrintInvalidParamError(js, "scriptId"); 1721 PrintInvalidParamError(js, "scriptId");
1792 return true; 1722 return true;
1793 } 1723 }
1794 const Script& script = Script::Cast(obj); 1724 const Script& script = Script::Cast(obj);
1795 const String& script_url = String::Handle(script.url()); 1725 const String& script_url = String::Handle(script.url());
1796 SourceBreakpoint* bpt = 1726 SourceBreakpoint* bpt =
1797 isolate->debugger()->SetBreakpointAtLine(script_url, line); 1727 isolate->debugger()->SetBreakpointAtLine(script_url, line);
1798 if (bpt == NULL) { 1728 if (bpt == NULL) {
1799 PrintError(js, "Unable to set breakpoint at line %s", line_param); 1729 js->PrintError(kNoBreakAtLine, NULL);
1800 return true; 1730 return true;
1801 } 1731 }
1802 bpt->PrintJSON(js); 1732 bpt->PrintJSON(js);
1803 return true; 1733 return true;
1804 } 1734 }
1805 1735
1806 1736
1807 static const MethodParameter* add_breakpoint_at_entry_params[] = { 1737 static const MethodParameter* add_breakpoint_at_entry_params[] = {
1808 ISOLATE_PARAMETER, 1738 ISOLATE_PARAMETER,
1809 new IdParameter("functionId", true), 1739 new IdParameter("functionId", true),
1810 NULL, 1740 NULL,
1811 }; 1741 };
1812 1742
1813 1743
1814 static bool AddBreakpointAtEntry(Isolate* isolate, JSONStream* js) { 1744 static bool AddBreakpointAtEntry(Isolate* isolate, JSONStream* js) {
1815 const char* function_id = js->LookupParam("functionId"); 1745 const char* function_id = js->LookupParam("functionId");
1816 Object& obj = Object::Handle(LookupHeapObject(isolate, function_id, NULL)); 1746 Object& obj = Object::Handle(LookupHeapObject(isolate, function_id, NULL));
1817 if (obj.raw() == Object::sentinel().raw() || !obj.IsFunction()) { 1747 if (obj.raw() == Object::sentinel().raw() || !obj.IsFunction()) {
1818 PrintInvalidParamError(js, "functionId"); 1748 PrintInvalidParamError(js, "functionId");
1819 return true; 1749 return true;
1820 } 1750 }
1821 const Function& function = Function::Cast(obj); 1751 const Function& function = Function::Cast(obj);
1822 SourceBreakpoint* bpt = 1752 SourceBreakpoint* bpt =
1823 isolate->debugger()->SetBreakpointAtEntry(function); 1753 isolate->debugger()->SetBreakpointAtEntry(function);
1824 if (bpt == NULL) { 1754 if (bpt == NULL) {
1825 const String& funcName = String::Handle(function.PrettyName()); 1755 js->PrintError(kNoBreakAtFunction, NULL);
1826 PrintError(js, "Unable to set breakpoint at function '%s'",
1827 funcName.ToCString());
1828 return true; 1756 return true;
1829 } 1757 }
1830 bpt->PrintJSON(js); 1758 bpt->PrintJSON(js);
1831 return true; 1759 return true;
1832 } 1760 }
1833 1761
1834 1762
1835 static const MethodParameter* remove_breakpoint_params[] = { 1763 static const MethodParameter* remove_breakpoint_params[] = {
1836 ISOLATE_PARAMETER, 1764 ISOLATE_PARAMETER,
1837 NULL, 1765 NULL,
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1895 Metric* current = isolate->metrics_list_head(); 1823 Metric* current = isolate->metrics_list_head();
1896 while (current != NULL) { 1824 while (current != NULL) {
1897 const char* name = current->name(); 1825 const char* name = current->name();
1898 ASSERT(name != NULL); 1826 ASSERT(name != NULL);
1899 if (strcmp(name, id) == 0) { 1827 if (strcmp(name, id) == 0) {
1900 current->PrintJSON(js); 1828 current->PrintJSON(js);
1901 return true; 1829 return true;
1902 } 1830 }
1903 current = current->next(); 1831 current = current->next();
1904 } 1832 }
1905 PrintError(js, "Native Metric %s not found\n", id); 1833 PrintInvalidParamError(js, "metricId");
1906 return true; 1834 return true;
1907 } 1835 }
1908 1836
1909 1837
1910 static bool HandleDartMetricsList(Isolate* isolate, JSONStream* js) { 1838 static bool HandleDartMetricsList(Isolate* isolate, JSONStream* js) {
1911 const Class& metrics_cls = Class::Handle(isolate, GetMetricsClass(isolate)); 1839 const Class& metrics_cls = Class::Handle(isolate, GetMetricsClass(isolate));
1912 const String& print_metrics_name = 1840 const String& print_metrics_name =
1913 String::Handle(String::New("_printMetrics")); 1841 String::Handle(String::New("_printMetrics"));
1914 ASSERT(!print_metrics_name.IsNull()); 1842 ASSERT(!print_metrics_name.IsNull());
1915 const Function& print_metrics = Function::Handle( 1843 const Function& print_metrics = Function::Handle(
(...skipping 26 matching lines...) Expand all
1942 ASSERT(!args.IsNull()); 1870 ASSERT(!args.IsNull());
1943 args.SetAt(0, arg0); 1871 args.SetAt(0, arg0);
1944 const Object& result = 1872 const Object& result =
1945 Object::Handle(isolate, DartEntry::InvokeFunction(print_metric, args)); 1873 Object::Handle(isolate, DartEntry::InvokeFunction(print_metric, args));
1946 if (!result.IsNull()) { 1874 if (!result.IsNull()) {
1947 ASSERT(result.IsString()); 1875 ASSERT(result.IsString());
1948 TextBuffer* buffer = js->buffer(); 1876 TextBuffer* buffer = js->buffer();
1949 buffer->AddString(String::Cast(result).ToCString()); 1877 buffer->AddString(String::Cast(result).ToCString());
1950 return true; 1878 return true;
1951 } 1879 }
1952 PrintError(js, "Dart Metric %s not found\n", id); 1880 PrintInvalidParamError(js, "metricId");
1953 return true; 1881 return true;
1954 } 1882 }
1955 1883
1956 1884
1957 static const MethodParameter* get_isolate_metric_list_params[] = { 1885 static const MethodParameter* get_isolate_metric_list_params[] = {
1958 ISOLATE_PARAMETER, 1886 ISOLATE_PARAMETER,
1959 NULL, 1887 NULL,
1960 }; 1888 };
1961 1889
1962 1890
(...skipping 28 matching lines...) Expand all
1991 static bool GetIsolateMetric(Isolate* isolate, JSONStream* js) { 1919 static bool GetIsolateMetric(Isolate* isolate, JSONStream* js) {
1992 const char* metric_id = js->LookupParam("metricId"); 1920 const char* metric_id = js->LookupParam("metricId");
1993 if (metric_id == NULL) { 1921 if (metric_id == NULL) {
1994 PrintMissingParamError(js, "metricId"); 1922 PrintMissingParamError(js, "metricId");
1995 return true; 1923 return true;
1996 } 1924 }
1997 // Verify id begins with "metrics/". 1925 // Verify id begins with "metrics/".
1998 static const char* kMetricIdPrefix = "metrics/"; 1926 static const char* kMetricIdPrefix = "metrics/";
1999 static intptr_t kMetricIdPrefixLen = strlen(kMetricIdPrefix); 1927 static intptr_t kMetricIdPrefixLen = strlen(kMetricIdPrefix);
2000 if (strncmp(metric_id, kMetricIdPrefix, kMetricIdPrefixLen) != 0) { 1928 if (strncmp(metric_id, kMetricIdPrefix, kMetricIdPrefixLen) != 0) {
2001 PrintError(js, "Metric %s not found\n", metric_id); 1929 PrintInvalidParamError(js, "metricId");
1930 return true;
2002 } 1931 }
2003 // Check if id begins with "metrics/native/". 1932 // Check if id begins with "metrics/native/".
2004 static const char* kNativeMetricIdPrefix = "metrics/native/"; 1933 static const char* kNativeMetricIdPrefix = "metrics/native/";
2005 static intptr_t kNativeMetricIdPrefixLen = strlen(kNativeMetricIdPrefix); 1934 static intptr_t kNativeMetricIdPrefixLen = strlen(kNativeMetricIdPrefix);
2006 const bool native_metric = 1935 const bool native_metric =
2007 strncmp(metric_id, kNativeMetricIdPrefix, kNativeMetricIdPrefixLen) == 0; 1936 strncmp(metric_id, kNativeMetricIdPrefix, kNativeMetricIdPrefixLen) == 0;
2008 if (native_metric) { 1937 if (native_metric) {
2009 const char* id = metric_id + kNativeMetricIdPrefixLen; 1938 const char* id = metric_id + kNativeMetricIdPrefixLen;
2010 return HandleNativeMetric(isolate, js, id); 1939 return HandleNativeMetric(isolate, js, id);
2011 } 1940 }
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
2077 PrintInvalidParamError(js, "step"); 2006 PrintInvalidParamError(js, "step");
2078 return true; 2007 return true;
2079 } 2008 }
2080 } 2009 }
2081 isolate->Resume(); 2010 isolate->Resume();
2082 JSONObject jsobj(js); 2011 JSONObject jsobj(js);
2083 jsobj.AddProperty("type", "Success"); 2012 jsobj.AddProperty("type", "Success");
2084 return true; 2013 return true;
2085 } 2014 }
2086 2015
2087 PrintError(js, "VM was not paused"); 2016 js->PrintError(kVMMustBePaused, NULL);
2088 return true; 2017 return true;
2089 } 2018 }
2090 2019
2091 2020
2092 static const MethodParameter* pause_params[] = { 2021 static const MethodParameter* pause_params[] = {
2093 ISOLATE_PARAMETER, 2022 ISOLATE_PARAMETER,
2094 NULL, 2023 NULL,
2095 }; 2024 };
2096 2025
2097 2026
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
2373 SourceBreakpoint* bpt = LookupBreakpoint(isolate, id); 2302 SourceBreakpoint* bpt = LookupBreakpoint(isolate, id);
2374 if (bpt != NULL) { 2303 if (bpt != NULL) {
2375 bpt->PrintJSON(js); 2304 bpt->PrintJSON(js);
2376 return true; 2305 return true;
2377 } 2306 }
2378 2307
2379 if (PrintMessage(js, isolate, id)) { 2308 if (PrintMessage(js, isolate, id)) {
2380 return true; 2309 return true;
2381 } 2310 }
2382 2311
2383 PrintError(js, "Unrecognized object id: %s\n", id); 2312 PrintInvalidParamError(js, "objectId");
2384 return true; 2313 return true;
2385 } 2314 }
2386 2315
2387 2316
2388 static const MethodParameter* get_class_list_params[] = { 2317 static const MethodParameter* get_class_list_params[] = {
2389 ISOLATE_PARAMETER, 2318 ISOLATE_PARAMETER,
2390 NULL, 2319 NULL,
2391 }; 2320 };
2392 2321
2393 2322
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
2631 ServiceMethodDescriptor& method = service_methods_[i]; 2560 ServiceMethodDescriptor& method = service_methods_[i];
2632 if (strcmp(method_name, method.name) == 0) { 2561 if (strcmp(method_name, method.name) == 0) {
2633 return &method; 2562 return &method;
2634 } 2563 }
2635 } 2564 }
2636 return NULL; 2565 return NULL;
2637 } 2566 }
2638 2567
2639 2568
2640 } // namespace dart 2569 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698