| 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_api.h" | 5 #include "include/dart_api.h" |
| 6 #include "platform/assert.h" | 6 #include "platform/assert.h" |
| 7 #include "platform/utils.h" | 7 #include "platform/utils.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_state.h" | 10 #include "vm/dart_api_state.h" |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 EXPECT(!same); | 158 EXPECT(!same); |
| 159 | 159 |
| 160 // Different objects. | 160 // Different objects. |
| 161 EXPECT_VALID(Dart_IsSame(five, seven, &same)); | 161 EXPECT_VALID(Dart_IsSame(five, seven, &same)); |
| 162 EXPECT(!same); | 162 EXPECT(!same); |
| 163 | 163 |
| 164 // Non-instance objects. | 164 // Non-instance objects. |
| 165 { | 165 { |
| 166 Isolate* isolate = Isolate::Current(); | 166 Isolate* isolate = Isolate::Current(); |
| 167 DARTSCOPE_NOCHECKS(isolate); | 167 DARTSCOPE_NOCHECKS(isolate); |
| 168 const Object& cls1 = Object::Handle(Object::null_class()); | 168 Dart_Handle class1 = Api::NewHandle(isolate, Object::null_class()); |
| 169 const Object& cls2 = Object::Handle(Object::class_class()); | 169 Dart_Handle class2 = Api::NewHandle(isolate, Object::class_class()); |
| 170 Dart_Handle class1 = Api::NewLocalHandle(isolate, cls1); | |
| 171 Dart_Handle class2 = Api::NewLocalHandle(isolate, cls2); | |
| 172 | 170 |
| 173 EXPECT_VALID(Dart_IsSame(class1, class1, &same)); | 171 EXPECT_VALID(Dart_IsSame(class1, class1, &same)); |
| 174 EXPECT(same); | 172 EXPECT(same); |
| 175 | 173 |
| 176 EXPECT_VALID(Dart_IsSame(class1, class2, &same)); | 174 EXPECT_VALID(Dart_IsSame(class1, class2, &same)); |
| 177 EXPECT(!same); | 175 EXPECT(!same); |
| 178 } | 176 } |
| 179 } | 177 } |
| 180 | 178 |
| 181 | 179 |
| (...skipping 940 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1122 Isolate* isolate = Isolate::Current(); | 1120 Isolate* isolate = Isolate::Current(); |
| 1123 EXPECT(isolate != NULL); | 1121 EXPECT(isolate != NULL); |
| 1124 ApiState* state = isolate->api_state(); | 1122 ApiState* state = isolate->api_state(); |
| 1125 EXPECT(state != NULL); | 1123 EXPECT(state != NULL); |
| 1126 ApiLocalScope* scope = state->top_scope(); | 1124 ApiLocalScope* scope = state->top_scope(); |
| 1127 Dart_EnterScope(); | 1125 Dart_EnterScope(); |
| 1128 { | 1126 { |
| 1129 EXPECT(state->top_scope() != NULL); | 1127 EXPECT(state->top_scope() != NULL); |
| 1130 DARTSCOPE_NOCHECKS(isolate); | 1128 DARTSCOPE_NOCHECKS(isolate); |
| 1131 const String& str1 = String::Handle(String::New("Test String")); | 1129 const String& str1 = String::Handle(String::New("Test String")); |
| 1132 Dart_Handle ref = Api::NewLocalHandle(isolate, str1); | 1130 Dart_Handle ref = Api::NewHandle(isolate, str1.raw()); |
| 1133 String& str2 = String::Handle(); | 1131 String& str2 = String::Handle(); |
| 1134 str2 ^= Api::UnwrapHandle(ref); | 1132 str2 ^= Api::UnwrapHandle(ref); |
| 1135 EXPECT(str1.Equals(str2)); | 1133 EXPECT(str1.Equals(str2)); |
| 1136 } | 1134 } |
| 1137 Dart_ExitScope(); | 1135 Dart_ExitScope(); |
| 1138 EXPECT(scope == state->top_scope()); | 1136 EXPECT(scope == state->top_scope()); |
| 1139 } | 1137 } |
| 1140 | 1138 |
| 1141 | 1139 |
| 1142 // Unit test for creating and deleting persistent handles. | 1140 // Unit test for creating and deleting persistent handles. |
| 1143 UNIT_TEST_CASE(PersistentHandles) { | 1141 UNIT_TEST_CASE(PersistentHandles) { |
| 1144 const char* kTestString1 = "Test String1"; | 1142 const char* kTestString1 = "Test String1"; |
| 1145 const char* kTestString2 = "Test String2"; | 1143 const char* kTestString2 = "Test String2"; |
| 1146 TestCase::CreateTestIsolate(); | 1144 TestCase::CreateTestIsolate(); |
| 1147 Isolate* isolate = Isolate::Current(); | 1145 Isolate* isolate = Isolate::Current(); |
| 1148 EXPECT(isolate != NULL); | 1146 EXPECT(isolate != NULL); |
| 1149 ApiState* state = isolate->api_state(); | 1147 ApiState* state = isolate->api_state(); |
| 1150 EXPECT(state != NULL); | 1148 EXPECT(state != NULL); |
| 1151 ApiLocalScope* scope = state->top_scope(); | 1149 ApiLocalScope* scope = state->top_scope(); |
| 1152 Dart_Handle handles[2000]; | 1150 Dart_Handle handles[2000]; |
| 1153 Dart_EnterScope(); | 1151 Dart_EnterScope(); |
| 1154 { | 1152 { |
| 1155 DARTSCOPE_NOCHECKS(isolate); | 1153 DARTSCOPE_NOCHECKS(isolate); |
| 1156 const String& str1 = String::Handle(String::New(kTestString1)); | 1154 Dart_Handle ref1 = Api::NewHandle(isolate, String::New(kTestString1)); |
| 1157 Dart_Handle ref1 = Api::NewLocalHandle(isolate, str1); | |
| 1158 for (int i = 0; i < 1000; i++) { | 1155 for (int i = 0; i < 1000; i++) { |
| 1159 handles[i] = Dart_NewPersistentHandle(ref1); | 1156 handles[i] = Dart_NewPersistentHandle(ref1); |
| 1160 } | 1157 } |
| 1161 Dart_EnterScope(); | 1158 Dart_EnterScope(); |
| 1162 const String& str2 = String::Handle(String::New(kTestString2)); | 1159 Dart_Handle ref2 = Api::NewHandle(isolate, String::New(kTestString2)); |
| 1163 Dart_Handle ref2 = Api::NewLocalHandle(isolate, str2); | |
| 1164 for (int i = 1000; i < 2000; i++) { | 1160 for (int i = 1000; i < 2000; i++) { |
| 1165 handles[i] = Dart_NewPersistentHandle(ref2); | 1161 handles[i] = Dart_NewPersistentHandle(ref2); |
| 1166 } | 1162 } |
| 1167 for (int i = 500; i < 1500; i++) { | 1163 for (int i = 500; i < 1500; i++) { |
| 1168 Dart_DeletePersistentHandle(handles[i]); | 1164 Dart_DeletePersistentHandle(handles[i]); |
| 1169 } | 1165 } |
| 1170 for (int i = 500; i < 1000; i++) { | 1166 for (int i = 500; i < 1000; i++) { |
| 1171 handles[i] = Dart_NewPersistentHandle(ref2); | 1167 handles[i] = Dart_NewPersistentHandle(ref2); |
| 1172 } | 1168 } |
| 1173 for (int i = 1000; i < 1500; i++) { | 1169 for (int i = 1000; i < 1500; i++) { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1250 | 1246 |
| 1251 // create an object in new space | 1247 // create an object in new space |
| 1252 Dart_Handle new_ref = Dart_NewString("new string"); | 1248 Dart_Handle new_ref = Dart_NewString("new string"); |
| 1253 EXPECT_VALID(new_ref); | 1249 EXPECT_VALID(new_ref); |
| 1254 | 1250 |
| 1255 // create an object in old space | 1251 // create an object in old space |
| 1256 Dart_Handle old_ref; | 1252 Dart_Handle old_ref; |
| 1257 { | 1253 { |
| 1258 Isolate* isolate = Isolate::Current(); | 1254 Isolate* isolate = Isolate::Current(); |
| 1259 DARTSCOPE(isolate); | 1255 DARTSCOPE(isolate); |
| 1260 const String& str = | 1256 old_ref = Api::NewHandle(isolate, String::New("old string", Heap::kOld)); |
| 1261 String::Handle(String::New("old string", Heap::kOld)); | |
| 1262 old_ref = Api::NewLocalHandle(isolate, str); | |
| 1263 EXPECT_VALID(old_ref); | 1257 EXPECT_VALID(old_ref); |
| 1264 } | 1258 } |
| 1265 | 1259 |
| 1266 // create a weak ref to the new space object | 1260 // create a weak ref to the new space object |
| 1267 weak_new_ref = Dart_NewWeakPersistentHandle(new_ref, NULL, NULL); | 1261 weak_new_ref = Dart_NewWeakPersistentHandle(new_ref, NULL, NULL); |
| 1268 EXPECT_VALID(weak_new_ref); | 1262 EXPECT_VALID(weak_new_ref); |
| 1269 EXPECT(!Dart_IsNull(weak_new_ref)); | 1263 EXPECT(!Dart_IsNull(weak_new_ref)); |
| 1270 | 1264 |
| 1271 // create a weak ref to the old space object | 1265 // create a weak ref to the old space object |
| 1272 weak_old_ref = Dart_NewWeakPersistentHandle(old_ref, NULL, NULL); | 1266 weak_old_ref = Dart_NewWeakPersistentHandle(old_ref, NULL, NULL); |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1387 Dart_Handle weak3 = Dart_Null(); | 1381 Dart_Handle weak3 = Dart_Null(); |
| 1388 EXPECT(Dart_IsNull(weak3)); | 1382 EXPECT(Dart_IsNull(weak3)); |
| 1389 | 1383 |
| 1390 Dart_Handle weak4 = Dart_Null(); | 1384 Dart_Handle weak4 = Dart_Null(); |
| 1391 EXPECT(Dart_IsNull(weak4)); | 1385 EXPECT(Dart_IsNull(weak4)); |
| 1392 | 1386 |
| 1393 Dart_EnterScope(); | 1387 Dart_EnterScope(); |
| 1394 { | 1388 { |
| 1395 Isolate* isolate = Isolate::Current(); | 1389 Isolate* isolate = Isolate::Current(); |
| 1396 DARTSCOPE(isolate); | 1390 DARTSCOPE(isolate); |
| 1397 String& str = String::Handle(); | |
| 1398 | 1391 |
| 1399 str ^= String::New("strongly reachable", Heap::kOld); | 1392 strong = Dart_NewPersistentHandle( |
| 1400 strong = Dart_NewPersistentHandle(Api::NewLocalHandle(isolate, str)); | 1393 Api::NewHandle(isolate, String::New("strongly reachable", Heap::kOld))); |
| 1401 EXPECT_VALID(strong); | 1394 EXPECT_VALID(strong); |
| 1402 EXPECT(!Dart_IsNull(strong)); | 1395 EXPECT(!Dart_IsNull(strong)); |
| 1403 | 1396 |
| 1404 str ^= String::New("weakly reachable 1", Heap::kOld); | |
| 1405 weak1 = Dart_NewWeakPersistentHandle( | 1397 weak1 = Dart_NewWeakPersistentHandle( |
| 1406 Api::NewLocalHandle(isolate, str), NULL, NULL); | 1398 Api::NewHandle(isolate, String::New("weakly reachable 1", Heap::kOld)), |
| 1399 NULL, NULL); |
| 1407 EXPECT_VALID(weak1); | 1400 EXPECT_VALID(weak1); |
| 1408 EXPECT(!Dart_IsNull(weak1)); | 1401 EXPECT(!Dart_IsNull(weak1)); |
| 1409 | 1402 |
| 1410 str ^= String::New("weakly reachable 2", Heap::kOld); | |
| 1411 weak2 = Dart_NewWeakPersistentHandle( | 1403 weak2 = Dart_NewWeakPersistentHandle( |
| 1412 Api::NewLocalHandle(isolate, str), NULL, NULL); | 1404 Api::NewHandle(isolate, String::New("weakly reachable 2", Heap::kOld)), |
| 1405 NULL, NULL); |
| 1413 EXPECT_VALID(weak2); | 1406 EXPECT_VALID(weak2); |
| 1414 EXPECT(!Dart_IsNull(weak2)); | 1407 EXPECT(!Dart_IsNull(weak2)); |
| 1415 | 1408 |
| 1416 str ^= String::New("weakly reachable 3", Heap::kOld); | |
| 1417 weak3 = Dart_NewWeakPersistentHandle( | 1409 weak3 = Dart_NewWeakPersistentHandle( |
| 1418 Api::NewLocalHandle(isolate, str), NULL, NULL); | 1410 Api::NewHandle(isolate, String::New("weakly reachable 3", Heap::kOld)), |
| 1411 NULL, NULL); |
| 1419 EXPECT_VALID(weak3); | 1412 EXPECT_VALID(weak3); |
| 1420 EXPECT(!Dart_IsNull(weak3)); | 1413 EXPECT(!Dart_IsNull(weak3)); |
| 1421 | 1414 |
| 1422 str ^= String::New("weakly reachable 4", Heap::kOld); | |
| 1423 weak4 = Dart_NewWeakPersistentHandle( | 1415 weak4 = Dart_NewWeakPersistentHandle( |
| 1424 Api::NewLocalHandle(isolate, str), NULL, NULL); | 1416 Api::NewHandle(isolate, String::New("weakly reachable 4", Heap::kOld)), |
| 1417 NULL, NULL); |
| 1425 EXPECT_VALID(weak4); | 1418 EXPECT_VALID(weak4); |
| 1426 EXPECT(!Dart_IsNull(weak4)); | 1419 EXPECT(!Dart_IsNull(weak4)); |
| 1427 } | 1420 } |
| 1428 Dart_ExitScope(); | 1421 Dart_ExitScope(); |
| 1429 | 1422 |
| 1430 EXPECT_VALID(strong); | 1423 EXPECT_VALID(strong); |
| 1431 | 1424 |
| 1432 EXPECT_VALID(weak1); | 1425 EXPECT_VALID(weak1); |
| 1433 EXPECT_VALID(weak2); | 1426 EXPECT_VALID(weak2); |
| 1434 EXPECT_VALID(weak3); | 1427 EXPECT_VALID(weak3); |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1570 | 1563 |
| 1571 TEST_CASE(PrologueWeakPersistentHandles) { | 1564 TEST_CASE(PrologueWeakPersistentHandles) { |
| 1572 Dart_Handle old_pwph = Dart_Null(); | 1565 Dart_Handle old_pwph = Dart_Null(); |
| 1573 EXPECT(Dart_IsNull(old_pwph)); | 1566 EXPECT(Dart_IsNull(old_pwph)); |
| 1574 Dart_Handle new_pwph = Dart_Null(); | 1567 Dart_Handle new_pwph = Dart_Null(); |
| 1575 EXPECT(Dart_IsNull(new_pwph)); | 1568 EXPECT(Dart_IsNull(new_pwph)); |
| 1576 Dart_EnterScope(); | 1569 Dart_EnterScope(); |
| 1577 { | 1570 { |
| 1578 Isolate* isolate = Isolate::Current(); | 1571 Isolate* isolate = Isolate::Current(); |
| 1579 DARTSCOPE(isolate); | 1572 DARTSCOPE(isolate); |
| 1580 String& str = String::Handle(); | |
| 1581 str ^= String::New("new space prologue weak", Heap::kNew); | |
| 1582 new_pwph = Dart_NewPrologueWeakPersistentHandle( | 1573 new_pwph = Dart_NewPrologueWeakPersistentHandle( |
| 1583 Api::NewLocalHandle(isolate, str), NULL, NULL); | 1574 Api::NewHandle(isolate, |
| 1575 String::New("new space prologue weak", Heap::kNew)), |
| 1576 NULL, NULL); |
| 1584 EXPECT_VALID(new_pwph); | 1577 EXPECT_VALID(new_pwph); |
| 1585 EXPECT(!Dart_IsNull(new_pwph)); | 1578 EXPECT(!Dart_IsNull(new_pwph)); |
| 1586 str ^= String::New("old space prologue weak", Heap::kOld); | |
| 1587 old_pwph = Dart_NewPrologueWeakPersistentHandle( | 1579 old_pwph = Dart_NewPrologueWeakPersistentHandle( |
| 1588 Api::NewLocalHandle(isolate, str), NULL, NULL); | 1580 Api::NewHandle(isolate, |
| 1581 String::New("old space prologue weak", Heap::kOld)), |
| 1582 NULL, NULL); |
| 1589 EXPECT_VALID(old_pwph); | 1583 EXPECT_VALID(old_pwph); |
| 1590 EXPECT(!Dart_IsNull(old_pwph)); | 1584 EXPECT(!Dart_IsNull(old_pwph)); |
| 1591 str ^= String::null(); | |
| 1592 } | 1585 } |
| 1593 Dart_ExitScope(); | 1586 Dart_ExitScope(); |
| 1594 EXPECT_VALID(new_pwph); | 1587 EXPECT_VALID(new_pwph); |
| 1595 EXPECT(!Dart_IsNull(new_pwph)); | 1588 EXPECT(!Dart_IsNull(new_pwph)); |
| 1596 EXPECT(Dart_IsPrologueWeakPersistentHandle(new_pwph)); | 1589 EXPECT(Dart_IsPrologueWeakPersistentHandle(new_pwph)); |
| 1597 EXPECT_VALID(old_pwph); | 1590 EXPECT_VALID(old_pwph); |
| 1598 EXPECT(!Dart_IsNull(old_pwph)); | 1591 EXPECT(!Dart_IsNull(old_pwph)); |
| 1599 EXPECT(Dart_IsPrologueWeakPersistentHandle(old_pwph)); | 1592 EXPECT(Dart_IsPrologueWeakPersistentHandle(old_pwph)); |
| 1600 // Garbage collect new space without invoking API callbacks. | 1593 // Garbage collect new space without invoking API callbacks. |
| 1601 Isolate::Current()->heap()->CollectGarbage(Heap::kNew, | 1594 Isolate::Current()->heap()->CollectGarbage(Heap::kNew, |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1636 EXPECT(Dart_IsNull(weak2)); | 1629 EXPECT(Dart_IsNull(weak2)); |
| 1637 | 1630 |
| 1638 Dart_Handle weak3 = Dart_Null(); | 1631 Dart_Handle weak3 = Dart_Null(); |
| 1639 EXPECT(Dart_IsNull(weak3)); | 1632 EXPECT(Dart_IsNull(weak3)); |
| 1640 | 1633 |
| 1641 | 1634 |
| 1642 Dart_EnterScope(); | 1635 Dart_EnterScope(); |
| 1643 { | 1636 { |
| 1644 Isolate* isolate = Isolate::Current(); | 1637 Isolate* isolate = Isolate::Current(); |
| 1645 DARTSCOPE(isolate); | 1638 DARTSCOPE(isolate); |
| 1646 String& str = String::Handle(); | |
| 1647 | 1639 |
| 1648 str ^= String::New("strongly reachable", Heap::kOld); | 1640 strong = Dart_NewPersistentHandle( |
| 1649 strong = Dart_NewPersistentHandle(Api::NewLocalHandle(isolate, str)); | 1641 Api::NewHandle(isolate, String::New("strongly reachable", Heap::kOld))); |
| 1650 EXPECT(!Dart_IsNull(strong)); | 1642 EXPECT(!Dart_IsNull(strong)); |
| 1651 EXPECT_VALID(strong); | 1643 EXPECT_VALID(strong); |
| 1652 | 1644 |
| 1653 str ^= String::New("weakly reachable 1", Heap::kOld); | |
| 1654 weak1 = Dart_NewWeakPersistentHandle( | 1645 weak1 = Dart_NewWeakPersistentHandle( |
| 1655 Api::NewLocalHandle(isolate, str), NULL, NULL); | 1646 Api::NewHandle(isolate, String::New("weakly reachable 1", Heap::kOld)), |
| 1647 NULL, NULL); |
| 1656 EXPECT(!Dart_IsNull(weak1)); | 1648 EXPECT(!Dart_IsNull(weak1)); |
| 1657 EXPECT_VALID(weak1); | 1649 EXPECT_VALID(weak1); |
| 1658 | 1650 |
| 1659 str ^= String::New("weakly reachable 2", Heap::kOld); | |
| 1660 weak2 = Dart_NewWeakPersistentHandle( | 1651 weak2 = Dart_NewWeakPersistentHandle( |
| 1661 Api::NewLocalHandle(isolate, str), NULL, NULL); | 1652 Api::NewHandle(isolate, String::New("weakly reachable 2", Heap::kOld)), |
| 1653 NULL, NULL); |
| 1662 EXPECT(!Dart_IsNull(weak2)); | 1654 EXPECT(!Dart_IsNull(weak2)); |
| 1663 EXPECT_VALID(weak2); | 1655 EXPECT_VALID(weak2); |
| 1664 | 1656 |
| 1665 str ^= String::New("weakly reachable 3", Heap::kOld); | |
| 1666 weak3 = Dart_NewWeakPersistentHandle( | 1657 weak3 = Dart_NewWeakPersistentHandle( |
| 1667 Api::NewLocalHandle(isolate, str), NULL, NULL); | 1658 Api::NewHandle(isolate, String::New("weakly reachable 3", Heap::kOld)), |
| 1659 NULL, NULL); |
| 1668 EXPECT(!Dart_IsNull(weak3)); | 1660 EXPECT(!Dart_IsNull(weak3)); |
| 1669 EXPECT_VALID(weak3); | 1661 EXPECT_VALID(weak3); |
| 1670 } | 1662 } |
| 1671 Dart_ExitScope(); | 1663 Dart_ExitScope(); |
| 1672 | 1664 |
| 1673 EXPECT_VALID(strong); | 1665 EXPECT_VALID(strong); |
| 1674 | 1666 |
| 1675 EXPECT_VALID(weak1); | 1667 EXPECT_VALID(weak1); |
| 1676 EXPECT_VALID(weak2); | 1668 EXPECT_VALID(weak2); |
| 1677 EXPECT_VALID(weak3); | 1669 EXPECT_VALID(weak3); |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1977 EXPECT(state != NULL); | 1969 EXPECT(state != NULL); |
| 1978 ApiLocalScope* scope = state->top_scope(); | 1970 ApiLocalScope* scope = state->top_scope(); |
| 1979 Dart_Handle handles[300]; | 1971 Dart_Handle handles[300]; |
| 1980 { | 1972 { |
| 1981 DARTSCOPE_NOCHECKS(isolate); | 1973 DARTSCOPE_NOCHECKS(isolate); |
| 1982 Smi& val = Smi::Handle(); | 1974 Smi& val = Smi::Handle(); |
| 1983 | 1975 |
| 1984 // Start a new scope and allocate some local handles. | 1976 // Start a new scope and allocate some local handles. |
| 1985 Dart_EnterScope(); | 1977 Dart_EnterScope(); |
| 1986 for (int i = 0; i < 100; i++) { | 1978 for (int i = 0; i < 100; i++) { |
| 1987 val ^= Smi::New(i); | 1979 handles[i] = Api::NewHandle(isolate, Smi::New(i)); |
| 1988 handles[i] = Api::NewLocalHandle(isolate, val); | |
| 1989 } | 1980 } |
| 1990 EXPECT_EQ(100, state->CountLocalHandles()); | 1981 EXPECT_EQ(100, state->CountLocalHandles()); |
| 1991 for (int i = 0; i < 100; i++) { | 1982 for (int i = 0; i < 100; i++) { |
| 1992 val ^= Api::UnwrapHandle(handles[i]); | 1983 val ^= Api::UnwrapHandle(handles[i]); |
| 1993 EXPECT_EQ(i, val.Value()); | 1984 EXPECT_EQ(i, val.Value()); |
| 1994 } | 1985 } |
| 1995 // Start another scope and allocate some more local handles. | 1986 // Start another scope and allocate some more local handles. |
| 1996 { | 1987 { |
| 1997 Dart_EnterScope(); | 1988 Dart_EnterScope(); |
| 1998 for (int i = 100; i < 200; i++) { | 1989 for (int i = 100; i < 200; i++) { |
| 1999 val ^= Smi::New(i); | 1990 handles[i] = Api::NewHandle(isolate, Smi::New(i)); |
| 2000 handles[i] = Api::NewLocalHandle(isolate, val); | |
| 2001 } | 1991 } |
| 2002 EXPECT_EQ(200, state->CountLocalHandles()); | 1992 EXPECT_EQ(200, state->CountLocalHandles()); |
| 2003 for (int i = 100; i < 200; i++) { | 1993 for (int i = 100; i < 200; i++) { |
| 2004 val ^= Api::UnwrapHandle(handles[i]); | 1994 val ^= Api::UnwrapHandle(handles[i]); |
| 2005 EXPECT_EQ(i, val.Value()); | 1995 EXPECT_EQ(i, val.Value()); |
| 2006 } | 1996 } |
| 2007 | 1997 |
| 2008 // Start another scope and allocate some more local handles. | 1998 // Start another scope and allocate some more local handles. |
| 2009 { | 1999 { |
| 2010 Dart_EnterScope(); | 2000 Dart_EnterScope(); |
| 2011 for (int i = 200; i < 300; i++) { | 2001 for (int i = 200; i < 300; i++) { |
| 2012 val ^= Smi::New(i); | 2002 handles[i] = Api::NewHandle(isolate, Smi::New(i)); |
| 2013 handles[i] = Api::NewLocalHandle(isolate, val); | |
| 2014 } | 2003 } |
| 2015 EXPECT_EQ(300, state->CountLocalHandles()); | 2004 EXPECT_EQ(300, state->CountLocalHandles()); |
| 2016 for (int i = 200; i < 300; i++) { | 2005 for (int i = 200; i < 300; i++) { |
| 2017 val ^= Api::UnwrapHandle(handles[i]); | 2006 val ^= Api::UnwrapHandle(handles[i]); |
| 2018 EXPECT_EQ(i, val.Value()); | 2007 EXPECT_EQ(i, val.Value()); |
| 2019 } | 2008 } |
| 2020 EXPECT_EQ(300, state->CountLocalHandles()); | 2009 EXPECT_EQ(300, state->CountLocalHandles()); |
| 2021 VERIFY_ON_TRANSITION; | 2010 VERIFY_ON_TRANSITION; |
| 2022 Dart_ExitScope(); | 2011 Dart_ExitScope(); |
| 2023 } | 2012 } |
| (...skipping 1512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3536 EXPECT(Dart_IsError(result)); | 3525 EXPECT(Dart_IsError(result)); |
| 3537 } | 3526 } |
| 3538 | 3527 |
| 3539 | 3528 |
| 3540 TEST_CASE(NullReceiver) { | 3529 TEST_CASE(NullReceiver) { |
| 3541 Isolate* isolate = Isolate::Current(); | 3530 Isolate* isolate = Isolate::Current(); |
| 3542 DARTSCOPE_NOCHECKS(isolate); | 3531 DARTSCOPE_NOCHECKS(isolate); |
| 3543 | 3532 |
| 3544 Dart_Handle function_name = Dart_NewString("toString"); | 3533 Dart_Handle function_name = Dart_NewString("toString"); |
| 3545 const int number_of_arguments = 0; | 3534 const int number_of_arguments = 0; |
| 3546 Dart_Handle null_receiver = Api::NewLocalHandle(isolate, Object::Handle()); | 3535 Dart_Handle result = Dart_InvokeDynamic(Dart_Null(), |
| 3547 Dart_Handle result = Dart_InvokeDynamic(null_receiver, | |
| 3548 function_name, | 3536 function_name, |
| 3549 number_of_arguments, | 3537 number_of_arguments, |
| 3550 NULL); | 3538 NULL); |
| 3551 EXPECT_VALID(result); | 3539 EXPECT_VALID(result); |
| 3552 EXPECT(Dart_IsString(result)); | 3540 EXPECT(Dart_IsString(result)); |
| 3553 | 3541 |
| 3554 // Should throw a NullPointerException. Disabled due to bug 5415268. | 3542 // Should throw a NullPointerException. Disabled due to bug 5415268. |
| 3555 /* | 3543 /* |
| 3556 Dart_Handle function_name2 = Dart_NewString("NoNoNo"); | 3544 Dart_Handle function_name2 = Dart_NewString("NoNoNo"); |
| 3557 result = Dart_InvokeDynamic(null_receiver, | 3545 result = Dart_InvokeDynamic(null_receiver, |
| (...skipping 1292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4850 EXPECT_VALID(result); | 4838 EXPECT_VALID(result); |
| 4851 EXPECT(Dart_IsDouble(result)); | 4839 EXPECT(Dart_IsDouble(result)); |
| 4852 double out; | 4840 double out; |
| 4853 result = Dart_DoubleValue(result, &out); | 4841 result = Dart_DoubleValue(result, &out); |
| 4854 fprintf(stderr, "Benchmark_UseDartApi: %f us per iteration\n", out); | 4842 fprintf(stderr, "Benchmark_UseDartApi: %f us per iteration\n", out); |
| 4855 } | 4843 } |
| 4856 | 4844 |
| 4857 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). | 4845 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). |
| 4858 | 4846 |
| 4859 } // namespace dart | 4847 } // namespace dart |
| OLD | NEW |