| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/globals.h" | 5 #include "platform/globals.h" |
| 6 | 6 |
| 7 #include "include/dart_debugger_api.h" | 7 #include "include/dart_debugger_api.h" |
| 8 #include "vm/dart_api_impl.h" | 8 #include "vm/dart_api_impl.h" |
| 9 #include "vm/dart_entry.h" | 9 #include "vm/dart_entry.h" |
| 10 #include "vm/debugger.h" | 10 #include "vm/debugger.h" |
| (...skipping 1320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1331 | 1331 |
| 1332 // Request malformed native code. | 1332 // Request malformed native code. |
| 1333 service_msg = EvalF(lib, "[0, port, ['code', 'native%" Px "'], [], []]", | 1333 service_msg = EvalF(lib, "[0, port, ['code', 'native%" Px "'], [], []]", |
| 1334 address); | 1334 address); |
| 1335 Service::HandleIsolateMessage(isolate, service_msg); | 1335 Service::HandleIsolateMessage(isolate, service_msg); |
| 1336 handler.HandleNextMessage(); | 1336 handler.HandleNextMessage(); |
| 1337 EXPECT_SUBSTRING("\"message\":\"Malformed code id:", handler.msg()); | 1337 EXPECT_SUBSTRING("\"message\":\"Malformed code id:", handler.msg()); |
| 1338 } | 1338 } |
| 1339 | 1339 |
| 1340 | 1340 |
| 1341 TEST_CASE(Service_TokenStream) { |
| 1342 const char* kScript = |
| 1343 "var port;\n" // Set to our mock port by C++. |
| 1344 "\n" |
| 1345 "main() {\n" |
| 1346 "}"; |
| 1347 |
| 1348 Isolate* isolate = Isolate::Current(); |
| 1349 |
| 1350 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
| 1351 EXPECT_VALID(lib); |
| 1352 Library& vmlib = Library::Handle(); |
| 1353 vmlib ^= Api::UnwrapHandle(lib); |
| 1354 EXPECT(!vmlib.IsNull()); |
| 1355 |
| 1356 const String& script_name = String::Handle(String::New("test-lib")); |
| 1357 EXPECT(!script_name.IsNull()); |
| 1358 const Script& script = Script::Handle(vmlib.LookupScript(script_name)); |
| 1359 EXPECT(!script.IsNull()); |
| 1360 |
| 1361 const TokenStream& token_stream = TokenStream::Handle(script.tokens()); |
| 1362 EXPECT(!token_stream.IsNull()); |
| 1363 ObjectIdRing* ring = isolate->object_id_ring(); |
| 1364 intptr_t id = ring->GetIdForObject(token_stream.raw()); |
| 1365 |
| 1366 // Build a mock message handler and wrap it in a dart port. |
| 1367 ServiceTestMessageHandler handler; |
| 1368 Dart_Port port_id = PortMap::CreatePort(&handler); |
| 1369 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
| 1370 EXPECT_VALID(port); |
| 1371 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
| 1372 |
| 1373 Array& service_msg = Array::Handle(); |
| 1374 |
| 1375 // Fetch object. |
| 1376 service_msg = EvalF(lib, "[0, port, ['objects', '%" Pd "'], [], []]", id); |
| 1377 Service::HandleIsolateMessage(isolate, service_msg); |
| 1378 handler.HandleNextMessage(); |
| 1379 |
| 1380 // Check type. |
| 1381 EXPECT_SUBSTRING("\"type\":\"TokenStream\"", handler.msg()); |
| 1382 // Check for members array. |
| 1383 EXPECT_SUBSTRING("\"members\":[", handler.msg()); |
| 1384 } |
| 1385 |
| 1386 |
| 1387 TEST_CASE(Service_PcDescriptors) { |
| 1388 const char* kScript = |
| 1389 "var port;\n" // Set to our mock port by C++. |
| 1390 "\n" |
| 1391 "class A {\n" |
| 1392 " var a;\n" |
| 1393 " dynamic b() {}\n" |
| 1394 " dynamic c() {\n" |
| 1395 " var d = () { b(); };\n" |
| 1396 " return d;\n" |
| 1397 " }\n" |
| 1398 "}\n" |
| 1399 "main() {\n" |
| 1400 " var z = new A();\n" |
| 1401 " var x = z.c();\n" |
| 1402 " x();\n" |
| 1403 "}"; |
| 1404 |
| 1405 Isolate* isolate = Isolate::Current(); |
| 1406 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
| 1407 EXPECT_VALID(lib); |
| 1408 Library& vmlib = Library::Handle(); |
| 1409 vmlib ^= Api::UnwrapHandle(lib); |
| 1410 EXPECT(!vmlib.IsNull()); |
| 1411 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
| 1412 EXPECT_VALID(result); |
| 1413 const Class& class_a = Class::Handle(GetClass(vmlib, "A")); |
| 1414 EXPECT(!class_a.IsNull()); |
| 1415 const Function& function_c = Function::Handle(GetFunction(class_a, "c")); |
| 1416 EXPECT(!function_c.IsNull()); |
| 1417 const Code& code_c = Code::Handle(function_c.CurrentCode()); |
| 1418 EXPECT(!code_c.IsNull()); |
| 1419 |
| 1420 const PcDescriptors& descriptors = |
| 1421 PcDescriptors::Handle(code_c.pc_descriptors()); |
| 1422 EXPECT(!descriptors.IsNull()); |
| 1423 ObjectIdRing* ring = isolate->object_id_ring(); |
| 1424 intptr_t id = ring->GetIdForObject(descriptors.raw()); |
| 1425 |
| 1426 // Build a mock message handler and wrap it in a dart port. |
| 1427 ServiceTestMessageHandler handler; |
| 1428 Dart_Port port_id = PortMap::CreatePort(&handler); |
| 1429 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
| 1430 EXPECT_VALID(port); |
| 1431 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
| 1432 |
| 1433 Array& service_msg = Array::Handle(); |
| 1434 |
| 1435 // Fetch object. |
| 1436 service_msg = EvalF(lib, "[0, port, ['objects', '%" Pd "'], [], []]", id); |
| 1437 Service::HandleIsolateMessage(isolate, service_msg); |
| 1438 handler.HandleNextMessage(); |
| 1439 // Check type. |
| 1440 EXPECT_SUBSTRING("\"type\":\"PcDescriptors\"", handler.msg()); |
| 1441 // Check for members array. |
| 1442 EXPECT_SUBSTRING("\"members\":[", handler.msg()); |
| 1443 } |
| 1444 |
| 1445 |
| 1446 TEST_CASE(Service_LocalVarDescriptors) { |
| 1447 const char* kScript = |
| 1448 "var port;\n" // Set to our mock port by C++. |
| 1449 "\n" |
| 1450 "class A {\n" |
| 1451 " var a;\n" |
| 1452 " dynamic b() {}\n" |
| 1453 " dynamic c() {\n" |
| 1454 " var d = () { b(); };\n" |
| 1455 " return d;\n" |
| 1456 " }\n" |
| 1457 "}\n" |
| 1458 "main() {\n" |
| 1459 " var z = new A();\n" |
| 1460 " var x = z.c();\n" |
| 1461 " x();\n" |
| 1462 "}"; |
| 1463 |
| 1464 Isolate* isolate = Isolate::Current(); |
| 1465 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
| 1466 EXPECT_VALID(lib); |
| 1467 Library& vmlib = Library::Handle(); |
| 1468 vmlib ^= Api::UnwrapHandle(lib); |
| 1469 EXPECT(!vmlib.IsNull()); |
| 1470 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
| 1471 EXPECT_VALID(result); |
| 1472 const Class& class_a = Class::Handle(GetClass(vmlib, "A")); |
| 1473 EXPECT(!class_a.IsNull()); |
| 1474 const Function& function_c = Function::Handle(GetFunction(class_a, "c")); |
| 1475 EXPECT(!function_c.IsNull()); |
| 1476 const Code& code_c = Code::Handle(function_c.CurrentCode()); |
| 1477 EXPECT(!code_c.IsNull()); |
| 1478 |
| 1479 const LocalVarDescriptors& descriptors = |
| 1480 LocalVarDescriptors::Handle(code_c.var_descriptors()); |
| 1481 // Generate an ID for this object. |
| 1482 ObjectIdRing* ring = isolate->object_id_ring(); |
| 1483 intptr_t id = ring->GetIdForObject(descriptors.raw()); |
| 1484 |
| 1485 // Build a mock message handler and wrap it in a dart port. |
| 1486 ServiceTestMessageHandler handler; |
| 1487 Dart_Port port_id = PortMap::CreatePort(&handler); |
| 1488 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
| 1489 EXPECT_VALID(port); |
| 1490 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
| 1491 |
| 1492 Array& service_msg = Array::Handle(); |
| 1493 |
| 1494 // Fetch object. |
| 1495 service_msg = EvalF(lib, "[0, port, ['objects', '%" Pd "'], [], []]", id); |
| 1496 Service::HandleIsolateMessage(isolate, service_msg); |
| 1497 handler.HandleNextMessage(); |
| 1498 // Check type. |
| 1499 EXPECT_SUBSTRING("\"type\":\"LocalVarDescriptors\"", handler.msg()); |
| 1500 // Check for members array. |
| 1501 EXPECT_SUBSTRING("\"members\":[", handler.msg()); |
| 1502 } |
| 1503 |
| 1504 |
| 1341 TEST_CASE(Service_VM) { | 1505 TEST_CASE(Service_VM) { |
| 1342 const char* kScript = | 1506 const char* kScript = |
| 1343 "var port;\n" // Set to our mock port by C++. | 1507 "var port;\n" // Set to our mock port by C++. |
| 1344 "\n" | 1508 "\n" |
| 1345 "main() {\n" | 1509 "main() {\n" |
| 1346 "}"; | 1510 "}"; |
| 1347 | 1511 |
| 1348 Isolate* isolate = Isolate::Current(); | 1512 Isolate* isolate = Isolate::Current(); |
| 1349 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 1513 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
| 1350 EXPECT_VALID(lib); | 1514 EXPECT_VALID(lib); |
| (...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2025 service_msg = Eval(lib, "[0, port, ['profile'], ['tags'], ['hidden']]"); | 2189 service_msg = Eval(lib, "[0, port, ['profile'], ['tags'], ['hidden']]"); |
| 2026 Service::HandleIsolateMessage(isolate, service_msg); | 2190 Service::HandleIsolateMessage(isolate, service_msg); |
| 2027 handler.HandleNextMessage(); | 2191 handler.HandleNextMessage(); |
| 2028 // Expect error. | 2192 // Expect error. |
| 2029 EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); | 2193 EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); |
| 2030 } | 2194 } |
| 2031 | 2195 |
| 2032 #endif // !defined(TARGET_ARCH_ARM64) | 2196 #endif // !defined(TARGET_ARCH_ARM64) |
| 2033 | 2197 |
| 2034 } // namespace dart | 2198 } // namespace dart |
| OLD | NEW |