OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 "include/dart_debugger_api.h" | 5 #include "include/dart_debugger_api.h" |
6 #include "platform/assert.h" | 6 #include "platform/assert.h" |
7 #include "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
9 #include "vm/dart_api_impl.h" | 9 #include "vm/dart_api_impl.h" |
10 #include "vm/dart_api_message.h" | 10 #include "vm/dart_api_message.h" |
(...skipping 1302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1313 EXPECT_EQ(Dart_CObject::kNull, root->value.as_array.values[i]->type); | 1313 EXPECT_EQ(Dart_CObject::kNull, root->value.as_array.values[i]->type); |
1314 } | 1314 } |
1315 } | 1315 } |
1316 } | 1316 } |
1317 } | 1317 } |
1318 Dart_ExitScope(); | 1318 Dart_ExitScope(); |
1319 Dart_ShutdownIsolate(); | 1319 Dart_ShutdownIsolate(); |
1320 } | 1320 } |
1321 | 1321 |
1322 | 1322 |
| 1323 UNIT_TEST_CASE(DartGeneratedArrayLiteralMessages) { |
| 1324 const int kArrayLength = 10; |
| 1325 static const char* kScriptChars = |
| 1326 "final int kArrayLength = 10;\n" |
| 1327 "getList() {\n" |
| 1328 " return [null, null, null, null, null, null, null, null, null, null];\n" |
| 1329 "}\n" |
| 1330 "getIntList() {\n" |
| 1331 " return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];\n" |
| 1332 "}\n" |
| 1333 "getStringList() {\n" |
| 1334 " return ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];\n" |
| 1335 "}\n" |
| 1336 "getMixedList() {\n" |
| 1337 " var list = [];\n" |
| 1338 " list.add(0);\n" |
| 1339 " list.add('1');\n" |
| 1340 " list.add(2.2);\n" |
| 1341 " list.add(true);\n" |
| 1342 " list.add(null);\n" |
| 1343 " list.add(null);\n" |
| 1344 " list.add(null);\n" |
| 1345 " list.add(null);\n" |
| 1346 " list.add(null);\n" |
| 1347 " list.add(null);\n" |
| 1348 " return list;\n" |
| 1349 "}\n"; |
| 1350 |
| 1351 TestCase::CreateTestIsolate(); |
| 1352 Isolate* isolate = Isolate::Current(); |
| 1353 EXPECT(isolate != NULL); |
| 1354 Dart_EnterScope(); |
| 1355 |
| 1356 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| 1357 EXPECT_VALID(lib); |
| 1358 |
| 1359 { |
| 1360 DARTSCOPE_NOCHECKS(isolate); |
| 1361 { |
| 1362 // Generate a list of nulls from Dart code. |
| 1363 ApiNativeScope scope; |
| 1364 Dart_CObject* root = GetDeserializedDartMessage(lib, "getList"); |
| 1365 EXPECT_NOTNULL(root); |
| 1366 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 1367 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 1368 for (int i = 0; i < kArrayLength; i++) { |
| 1369 EXPECT_EQ(Dart_CObject::kNull, root->value.as_array.values[i]->type); |
| 1370 } |
| 1371 CheckEncodeDecodeMessage(root); |
| 1372 } |
| 1373 { |
| 1374 // Generate a list of ints from Dart code. |
| 1375 ApiNativeScope scope; |
| 1376 Dart_CObject* root = GetDeserializedDartMessage(lib, "getIntList"); |
| 1377 EXPECT_NOTNULL(root); |
| 1378 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 1379 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 1380 for (int i = 0; i < kArrayLength; i++) { |
| 1381 EXPECT_EQ(Dart_CObject::kInt32, root->value.as_array.values[i]->type); |
| 1382 EXPECT_EQ(i, root->value.as_array.values[i]->value.as_int32); |
| 1383 } |
| 1384 CheckEncodeDecodeMessage(root); |
| 1385 } |
| 1386 { |
| 1387 // Generate a list of strings from Dart code. |
| 1388 ApiNativeScope scope; |
| 1389 Dart_CObject* root = GetDeserializedDartMessage(lib, "getStringList"); |
| 1390 EXPECT_NOTNULL(root); |
| 1391 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 1392 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 1393 for (int i = 0; i < kArrayLength; i++) { |
| 1394 EXPECT_EQ(Dart_CObject::kString, root->value.as_array.values[i]->type); |
| 1395 char buffer[3]; |
| 1396 snprintf(buffer, sizeof(buffer), "%d", i); |
| 1397 EXPECT_STREQ(buffer, root->value.as_array.values[i]->value.as_string); |
| 1398 } |
| 1399 } |
| 1400 { |
| 1401 // Generate a list of objects of different types from Dart code. |
| 1402 ApiNativeScope scope; |
| 1403 Dart_CObject* root = GetDeserializedDartMessage(lib, "getMixedList"); |
| 1404 EXPECT_NOTNULL(root); |
| 1405 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 1406 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 1407 |
| 1408 EXPECT_EQ(Dart_CObject::kInt32, root->value.as_array.values[0]->type); |
| 1409 EXPECT_EQ(0, root->value.as_array.values[0]->value.as_int32); |
| 1410 EXPECT_EQ(Dart_CObject::kString, root->value.as_array.values[1]->type); |
| 1411 EXPECT_STREQ("1", root->value.as_array.values[1]->value.as_string); |
| 1412 EXPECT_EQ(Dart_CObject::kDouble, root->value.as_array.values[2]->type); |
| 1413 EXPECT_EQ(2.2, root->value.as_array.values[2]->value.as_double); |
| 1414 EXPECT_EQ(Dart_CObject::kBool, root->value.as_array.values[3]->type); |
| 1415 EXPECT_EQ(true, root->value.as_array.values[3]->value.as_bool); |
| 1416 |
| 1417 for (int i = 0; i < kArrayLength; i++) { |
| 1418 if (i > 3) { |
| 1419 EXPECT_EQ(Dart_CObject::kNull, root->value.as_array.values[i]->type); |
| 1420 } |
| 1421 } |
| 1422 } |
| 1423 } |
| 1424 Dart_ExitScope(); |
| 1425 Dart_ShutdownIsolate(); |
| 1426 } |
| 1427 |
| 1428 |
1323 UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { | 1429 UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
1324 const int kArrayLength = 10; | 1430 const int kArrayLength = 10; |
1325 static const char* kScriptChars = | 1431 static const char* kScriptChars = |
1326 "final int kArrayLength = 10;\n" | 1432 "final int kArrayLength = 10;\n" |
1327 "getStringList() {\n" | 1433 "getStringList() {\n" |
1328 " var s = 'Hello, world!';\n" | 1434 " var s = 'Hello, world!';\n" |
1329 " var list = new List<String>(kArrayLength);\n" | 1435 " var list = new List<String>(kArrayLength);\n" |
1330 " for (var i = 0; i < kArrayLength; i++) list[i] = s;\n" | 1436 " for (var i = 0; i < kArrayLength; i++) list[i] = s;\n" |
1331 " return list;\n" | 1437 " return list;\n" |
1332 "}\n" | 1438 "}\n" |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1398 // Generate a list of medium ints from Dart code. | 1504 // Generate a list of medium ints from Dart code. |
1399 ApiNativeScope scope; | 1505 ApiNativeScope scope; |
1400 Dart_CObject* root = GetDeserializedDartMessage(lib, "getMintList"); | 1506 Dart_CObject* root = GetDeserializedDartMessage(lib, "getMintList"); |
1401 EXPECT_NOTNULL(root); | 1507 EXPECT_NOTNULL(root); |
1402 EXPECT_EQ(Dart_CObject::kArray, root->type); | 1508 EXPECT_EQ(Dart_CObject::kArray, root->type); |
1403 EXPECT_EQ(kArrayLength, root->value.as_array.length); | 1509 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
1404 for (int i = 0; i < kArrayLength; i++) { | 1510 for (int i = 0; i < kArrayLength; i++) { |
1405 Dart_CObject* element = root->value.as_array.values[i]; | 1511 Dart_CObject* element = root->value.as_array.values[i]; |
1406 EXPECT_EQ(root->value.as_array.values[0], element); | 1512 EXPECT_EQ(root->value.as_array.values[0], element); |
1407 EXPECT_EQ(Dart_CObject::kInt64, element->type); | 1513 EXPECT_EQ(Dart_CObject::kInt64, element->type); |
| 1514 EXPECT_EQ(DART_INT64_C(0x7FFFFFFFFFFFFFFF), element->value.as_int64); |
1408 } | 1515 } |
1409 } | 1516 } |
1410 { | 1517 { |
| 1518 // Generate a list of bigints from Dart code. |
| 1519 ApiNativeScope scope; |
| 1520 Dart_CObject* root = GetDeserializedDartMessage(lib, "getBigintList"); |
| 1521 EXPECT_NOTNULL(root); |
| 1522 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 1523 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 1524 for (int i = 0; i < kArrayLength; i++) { |
| 1525 Dart_CObject* element = root->value.as_array.values[i]; |
| 1526 EXPECT_EQ(root->value.as_array.values[0], element); |
| 1527 EXPECT_EQ(Dart_CObject::kBigint, element->type); |
| 1528 EXPECT_STREQ("1234567890123456789012345678901234567890", |
| 1529 element->value.as_bigint); |
| 1530 } |
| 1531 } |
| 1532 { |
| 1533 // Generate a list of doubles from Dart code. |
| 1534 ApiNativeScope scope; |
| 1535 Dart_CObject* root = GetDeserializedDartMessage(lib, "getDoubleList"); |
| 1536 EXPECT_NOTNULL(root); |
| 1537 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 1538 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 1539 for (int i = 0; i < kArrayLength; i++) { |
| 1540 Dart_CObject* element = root->value.as_array.values[i]; |
| 1541 EXPECT_EQ(root->value.as_array.values[0], element); |
| 1542 EXPECT_EQ(Dart_CObject::kDouble, element->type); |
| 1543 EXPECT_EQ(3.14, element->value.as_double); |
| 1544 } |
| 1545 } |
| 1546 { |
| 1547 // Generate a list of doubles from Dart code. |
| 1548 ApiNativeScope scope; |
| 1549 Dart_CObject* root = GetDeserializedDartMessage(lib, "getByteArrayList"); |
| 1550 EXPECT_NOTNULL(root); |
| 1551 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 1552 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 1553 for (int i = 0; i < kArrayLength; i++) { |
| 1554 Dart_CObject* element = root->value.as_array.values[i]; |
| 1555 EXPECT_EQ(root->value.as_array.values[0], element); |
| 1556 EXPECT_EQ(Dart_CObject::kUint8Array, element->type); |
| 1557 EXPECT_EQ(256, element->value.as_byte_array.length); |
| 1558 } |
| 1559 } |
| 1560 { |
| 1561 // Generate a list of objects of different types from Dart code. |
| 1562 ApiNativeScope scope; |
| 1563 Dart_CObject* root = GetDeserializedDartMessage(lib, "getMixedList"); |
| 1564 EXPECT_NOTNULL(root); |
| 1565 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 1566 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 1567 for (int i = 0; i < kArrayLength; i++) { |
| 1568 Dart_CObject* element = root->value.as_array.values[i]; |
| 1569 if ((i % 2) == 0) { |
| 1570 EXPECT_EQ(root->value.as_array.values[0], element); |
| 1571 EXPECT_EQ(Dart_CObject::kString, element->type); |
| 1572 EXPECT_STREQ("A", element->value.as_string); |
| 1573 } else { |
| 1574 EXPECT_EQ(root->value.as_array.values[1], element); |
| 1575 EXPECT_EQ(Dart_CObject::kDouble, element->type); |
| 1576 EXPECT_STREQ(2.72, element->value.as_double); |
| 1577 } |
| 1578 } |
| 1579 } |
| 1580 { |
| 1581 // Generate a list of objects of different types from Dart code. |
| 1582 ApiNativeScope scope; |
| 1583 Dart_CObject* root = GetDeserializedDartMessage(lib, "getSelfRefList"); |
| 1584 EXPECT_NOTNULL(root); |
| 1585 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 1586 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 1587 for (int i = 0; i < kArrayLength; i++) { |
| 1588 Dart_CObject* element = root->value.as_array.values[i]; |
| 1589 EXPECT_EQ(Dart_CObject::kArray, element->type); |
| 1590 EXPECT_EQ(root, element); |
| 1591 } |
| 1592 } |
| 1593 } |
| 1594 Dart_ExitScope(); |
| 1595 Dart_ShutdownIsolate(); |
| 1596 } |
| 1597 |
| 1598 |
| 1599 UNIT_TEST_CASE(DartGeneratedArrayLiteralMessagesWithBackref) { |
| 1600 const int kArrayLength = 10; |
| 1601 static const char* kScriptChars = |
| 1602 "final int kArrayLength = 10;\n" |
| 1603 "getStringList() {\n" |
| 1604 " var s = 'Hello, world!';\n" |
| 1605 " var list = [s, s, s, s, s, s, s, s, s, s];\n" |
| 1606 " return list;\n" |
| 1607 "}\n" |
| 1608 "getMintList() {\n" |
| 1609 " var mint = 0x7FFFFFFFFFFFFFFF;\n" |
| 1610 " var list = [mint, mint, mint, mint, mint,\n" |
| 1611 " mint, mint, mint, mint, mint];\n" |
| 1612 " return list;\n" |
| 1613 "}\n" |
| 1614 "getBigintList() {\n" |
| 1615 " var bigint = 0x1234567890123456789012345678901234567890;\n" |
| 1616 " var list = [bigint, bigint, bigint, bigint, bigint,\n" |
| 1617 " bigint, bigint, bigint, bigint, bigint];\n" |
| 1618 " return list;\n" |
| 1619 "}\n" |
| 1620 "getDoubleList() {\n" |
| 1621 " var d = 3.14;\n" |
| 1622 " var list = [3.14, 3.14, 3.14, 3.14, 3.14, 3.14];\n" |
| 1623 " list.add(3.14);;\n" |
| 1624 " list.add(3.14);;\n" |
| 1625 " list.add(3.14);;\n" |
| 1626 " list.add(3.14);;\n" |
| 1627 " return list;\n" |
| 1628 "}\n" |
| 1629 "getByteArrayList() {\n" |
| 1630 " var byte_array = new Uint8List(256);\n" |
| 1631 " var list = [];\n" |
| 1632 " for (var i = 0; i < kArrayLength; i++) {\n" |
| 1633 " list.add(byte_array);\n" |
| 1634 " }\n" |
| 1635 " return list;\n" |
| 1636 "}\n" |
| 1637 "getMixedList() {\n" |
| 1638 " var list = [];\n" |
| 1639 " for (var i = 0; i < kArrayLength; i++) {\n" |
| 1640 " list.add(((i % 2) == 0) ? 'A' : 2.72);\n" |
| 1641 " }\n" |
| 1642 " return list;\n" |
| 1643 "}\n" |
| 1644 "getSelfRefList() {\n" |
| 1645 " var list = [];\n" |
| 1646 " for (var i = 0; i < kArrayLength; i++) {\n" |
| 1647 " list.add(list);\n" |
| 1648 " }\n" |
| 1649 " return list;\n" |
| 1650 "}\n"; |
| 1651 |
| 1652 TestCase::CreateTestIsolate(); |
| 1653 Isolate* isolate = Isolate::Current(); |
| 1654 EXPECT(isolate != NULL); |
| 1655 Dart_EnterScope(); |
| 1656 |
| 1657 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| 1658 EXPECT_VALID(lib); |
| 1659 |
| 1660 { |
| 1661 DARTSCOPE_NOCHECKS(isolate); |
| 1662 |
| 1663 { |
| 1664 // Generate a list of strings from Dart code. |
| 1665 ApiNativeScope scope; |
| 1666 Dart_CObject* root = GetDeserializedDartMessage(lib, "getStringList"); |
| 1667 EXPECT_NOTNULL(root); |
| 1668 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 1669 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 1670 for (int i = 0; i < kArrayLength; i++) { |
| 1671 Dart_CObject* element = root->value.as_array.values[i]; |
| 1672 EXPECT_EQ(root->value.as_array.values[0], element); |
| 1673 EXPECT_EQ(Dart_CObject::kString, element->type); |
| 1674 EXPECT_STREQ("Hello, world!", element->value.as_string); |
| 1675 } |
| 1676 } |
| 1677 { |
| 1678 // Generate a list of medium ints from Dart code. |
| 1679 ApiNativeScope scope; |
| 1680 Dart_CObject* root = GetDeserializedDartMessage(lib, "getMintList"); |
| 1681 EXPECT_NOTNULL(root); |
| 1682 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 1683 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 1684 for (int i = 0; i < kArrayLength; i++) { |
| 1685 Dart_CObject* element = root->value.as_array.values[i]; |
| 1686 EXPECT_EQ(root->value.as_array.values[0], element); |
| 1687 EXPECT_EQ(Dart_CObject::kInt64, element->type); |
| 1688 EXPECT_EQ(DART_INT64_C(0x7FFFFFFFFFFFFFFF), element->value.as_int64); |
| 1689 } |
| 1690 } |
| 1691 { |
1411 // Generate a list of bigints from Dart code. | 1692 // Generate a list of bigints from Dart code. |
1412 ApiNativeScope scope; | 1693 ApiNativeScope scope; |
1413 Dart_CObject* root = GetDeserializedDartMessage(lib, "getBigintList"); | 1694 Dart_CObject* root = GetDeserializedDartMessage(lib, "getBigintList"); |
1414 EXPECT_NOTNULL(root); | 1695 EXPECT_NOTNULL(root); |
1415 EXPECT_EQ(Dart_CObject::kArray, root->type); | 1696 EXPECT_EQ(Dart_CObject::kArray, root->type); |
1416 EXPECT_EQ(kArrayLength, root->value.as_array.length); | 1697 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
1417 for (int i = 0; i < kArrayLength; i++) { | 1698 for (int i = 0; i < kArrayLength; i++) { |
1418 Dart_CObject* element = root->value.as_array.values[i]; | 1699 Dart_CObject* element = root->value.as_array.values[i]; |
1419 EXPECT_EQ(root->value.as_array.values[0], element); | 1700 EXPECT_EQ(root->value.as_array.values[0], element); |
1420 EXPECT_EQ(Dart_CObject::kBigint, element->type); | 1701 EXPECT_EQ(Dart_CObject::kBigint, element->type); |
| 1702 EXPECT_STREQ("1234567890123456789012345678901234567890", |
| 1703 element->value.as_bigint); |
1421 } | 1704 } |
1422 } | 1705 } |
1423 { | 1706 { |
1424 // Generate a list of doubles from Dart code. | 1707 // Generate a list of doubles from Dart code. |
1425 ApiNativeScope scope; | 1708 ApiNativeScope scope; |
1426 Dart_CObject* root = GetDeserializedDartMessage(lib, "getDoubleList"); | 1709 Dart_CObject* root = GetDeserializedDartMessage(lib, "getDoubleList"); |
1427 EXPECT_NOTNULL(root); | 1710 EXPECT_NOTNULL(root); |
1428 EXPECT_EQ(Dart_CObject::kArray, root->type); | 1711 EXPECT_EQ(Dart_CObject::kArray, root->type); |
1429 EXPECT_EQ(kArrayLength, root->value.as_array.length); | 1712 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
1430 for (int i = 0; i < kArrayLength; i++) { | 1713 for (int i = 0; i < kArrayLength; i++) { |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1577 EXPECT(Dart_ErrorHasException(result)); | 1860 EXPECT(Dart_ErrorHasException(result)); |
1578 EXPECT_SUBSTRING("Exception: nulltruefalse1234563.14[]100123456789\n", | 1861 EXPECT_SUBSTRING("Exception: nulltruefalse1234563.14[]100123456789\n", |
1579 Dart_GetError(result)); | 1862 Dart_GetError(result)); |
1580 | 1863 |
1581 Dart_ExitScope(); | 1864 Dart_ExitScope(); |
1582 } | 1865 } |
1583 | 1866 |
1584 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). | 1867 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). |
1585 | 1868 |
1586 } // namespace dart | 1869 } // namespace dart |
OLD | NEW |