| Index: runtime/vm/dart_api_impl_test.cc
|
| ===================================================================
|
| --- runtime/vm/dart_api_impl_test.cc (revision 22905)
|
| +++ runtime/vm/dart_api_impl_test.cc (working copy)
|
| @@ -930,8 +930,7 @@
|
| Dart_EnterScope();
|
| Dart_Handle external_byte_data = Dart_NewExternalTypedData(kByteData,
|
| data,
|
| - 16,
|
| - NULL, NULL);
|
| + 16);
|
| EXPECT_VALID(external_byte_data);
|
| EXPECT_EQ(kByteData, Dart_GetTypeOfTypedData(external_byte_data));
|
| Dart_SetReturnValue(args, external_byte_data);
|
| @@ -1105,9 +1104,7 @@
|
| intptr_t data_length = ARRAY_SIZE(data);
|
| Dart_Handle ext_list_access_test_obj;
|
| ext_list_access_test_obj = Dart_NewExternalTypedData(kUint8,
|
| - data,
|
| - data_length,
|
| - NULL, NULL);
|
| + data, data_length);
|
| EXPECT_VALID(ext_list_access_test_obj);
|
| TestDirectAccess(lib, ext_list_access_test_obj, kUint8);
|
| }
|
| @@ -1256,9 +1253,7 @@
|
| uint8_t data[] = { 0, 11, 22, 33, 44, 55, 66, 77 };
|
| intptr_t data_length = ARRAY_SIZE(data);
|
|
|
| - Dart_Handle obj = Dart_NewExternalTypedData(kUint8,
|
| - data, data_length,
|
| - NULL, NULL);
|
| + Dart_Handle obj = Dart_NewExternalTypedData(kUint8, data, data_length);
|
| ExternalTypedDataAccessTests(obj, kUint8, data, data_length);
|
| }
|
|
|
| @@ -1267,9 +1262,7 @@
|
| uint8_t data[] = { 0, 11, 22, 33, 44, 55, 66, 77 };
|
| intptr_t data_length = ARRAY_SIZE(data);
|
|
|
| - Dart_Handle obj = Dart_NewExternalTypedData(kUint8Clamped,
|
| - data, data_length,
|
| - NULL, NULL);
|
| + Dart_Handle obj = Dart_NewExternalTypedData(kUint8Clamped, data, data_length);
|
| ExternalTypedDataAccessTests(obj, kUint8Clamped, data, data_length);
|
| }
|
|
|
| @@ -1290,8 +1283,7 @@
|
| uint8_t data[] = { 0, 11, 22, 33, 44, 55, 66, 77 };
|
| intptr_t data_length = ARRAY_SIZE(data);
|
| Dart_Handle obj = Dart_NewExternalTypedData(kUint8Clamped,
|
| - data, data_length,
|
| - NULL, NULL);
|
| + data, data_length);
|
| EXPECT_VALID(obj);
|
| Dart_Handle result;
|
| // Create a test library and Load up a test script in it.
|
| @@ -1310,9 +1302,9 @@
|
| }
|
|
|
|
|
| -static void ExternalTypedDataCallbackFinalizer(Dart_Handle handle,
|
| +static void ExternalTypedDataCallbackFinalizer(Dart_WeakPersistentHandle handle,
|
| void* peer) {
|
| - Dart_DeletePersistentHandle(handle);
|
| + Dart_DeleteWeakPersistentHandle(handle);
|
| *static_cast<int*>(peer) = 42;
|
| }
|
|
|
| @@ -1325,9 +1317,10 @@
|
| Dart_Handle obj = Dart_NewExternalTypedData(
|
| kUint8,
|
| data,
|
| - ARRAY_SIZE(data),
|
| - &peer,
|
| - ExternalTypedDataCallbackFinalizer);
|
| + ARRAY_SIZE(data));
|
| + Dart_NewWeakPersistentHandle(obj,
|
| + &peer,
|
| + ExternalTypedDataCallbackFinalizer);
|
| EXPECT_VALID(obj);
|
| void* api_peer = NULL;
|
| EXPECT_VALID(Dart_ExternalTypedDataGetPeer(obj, &api_peer));
|
| @@ -1383,8 +1376,8 @@
|
| // Dart_NewExternalTypedData.
|
| Dart_EnterScope();
|
| {
|
| - Dart_Handle lcl = Dart_NewExternalTypedData(
|
| - kFloat32x4, data, 10, &peer, ExternalTypedDataCallbackFinalizer);
|
| + Dart_Handle lcl = Dart_NewExternalTypedData(kFloat32x4, data, 10);
|
| + Dart_NewWeakPersistentHandle(lcl, &peer, ExternalTypedDataCallbackFinalizer);
|
| CheckFloat32x4Data(lcl);
|
| }
|
| Dart_ExitScope();
|
| @@ -1428,7 +1421,7 @@
|
| ApiState* state = isolate->api_state();
|
| EXPECT(state != NULL);
|
| ApiLocalScope* scope = state->top_scope();
|
| - Dart_Handle handles[2000];
|
| + Dart_PersistentHandle handles[2000];
|
| Dart_EnterScope();
|
| {
|
| DARTSCOPE(isolate);
|
| @@ -1459,22 +1452,22 @@
|
| HANDLESCOPE(isolate);
|
| for (int i = 0; i < 500; i++) {
|
| String& str = String::Handle();
|
| - str ^= Api::UnwrapHandle(handles[i]);
|
| + str ^= Api::UnwrapHandle(Dart_NewHandleFromPersistent(handles[i]));
|
| EXPECT(str.Equals(kTestString1));
|
| }
|
| for (int i = 500; i < 1000; i++) {
|
| String& str = String::Handle();
|
| - str ^= Api::UnwrapHandle(handles[i]);
|
| + str ^= Api::UnwrapHandle(Dart_NewHandleFromPersistent(handles[i]));
|
| EXPECT(str.Equals(kTestString2));
|
| }
|
| for (int i = 1000; i < 1500; i++) {
|
| String& str = String::Handle();
|
| - str ^= Api::UnwrapHandle(handles[i]);
|
| + str ^= Api::UnwrapHandle(Dart_NewHandleFromPersistent(handles[i]));
|
| EXPECT(str.Equals(kTestString1));
|
| }
|
| for (int i = 1500; i < 2000; i++) {
|
| String& str = String::Handle();
|
| - str ^= Api::UnwrapHandle(handles[i]);
|
| + str ^= Api::UnwrapHandle(Dart_NewHandleFromPersistent(handles[i]));
|
| EXPECT(str.Equals(kTestString2));
|
| }
|
| }
|
| @@ -1496,17 +1489,19 @@
|
| DARTSCOPE(isolate);
|
|
|
| // Start with a known persistent handle.
|
| - Dart_Handle obj1 = Dart_True();
|
| + Dart_PersistentHandle obj1 = Dart_NewPersistentHandle(Dart_True());
|
| EXPECT(state->IsValidPersistentHandle(obj1));
|
|
|
| // And use it to allocate a second persistent handle.
|
| - Dart_Handle obj2 = Dart_NewPersistentHandle(obj1);
|
| - EXPECT(state->IsValidPersistentHandle(obj2));
|
| + Dart_Handle obj2 = Dart_NewHandleFromPersistent(obj1);
|
| + Dart_PersistentHandle obj3 = Dart_NewPersistentHandle(obj2);
|
| + EXPECT(state->IsValidPersistentHandle(obj3));
|
|
|
| // Make sure that the value transferred.
|
| - EXPECT(Dart_IsBoolean(obj2));
|
| + Dart_Handle obj4 = Dart_NewHandleFromPersistent(obj3);
|
| + EXPECT(Dart_IsBoolean(obj4));
|
| bool value = false;
|
| - Dart_Handle result = Dart_BooleanValue(obj2, &value);
|
| + Dart_Handle result = Dart_BooleanValue(obj4, &value);
|
| EXPECT_VALID(result);
|
| EXPECT(value);
|
| }
|
| @@ -1525,12 +1520,24 @@
|
| };
|
|
|
|
|
| +static Dart_Handle AsHandle(Dart_PersistentHandle weak) {
|
| + return Dart_NewHandleFromPersistent(weak);
|
| +}
|
| +
|
| +
|
| +static Dart_Handle AsHandle(Dart_WeakPersistentHandle weak) {
|
| + return Dart_NewHandleFromWeakPersistent(weak);
|
| +}
|
| +
|
| +
|
| TEST_CASE(WeakPersistentHandle) {
|
| - Dart_Handle weak_new_ref = Dart_Null();
|
| - EXPECT(Dart_IsNull(weak_new_ref));
|
| + Dart_Handle local_new_ref = Dart_Null();
|
| + Dart_WeakPersistentHandle weak_new_ref = Dart_NewWeakPersistentHandle(
|
| + local_new_ref, NULL, NULL);
|
|
|
| - Dart_Handle weak_old_ref = Dart_Null();
|
| - EXPECT(Dart_IsNull(weak_old_ref));
|
| + Dart_Handle local_old_ref = Dart_Null();
|
| + Dart_WeakPersistentHandle weak_old_ref = Dart_NewWeakPersistentHandle(
|
| + local_old_ref, NULL, NULL);
|
|
|
| {
|
| Dart_EnterScope();
|
| @@ -1550,13 +1557,13 @@
|
|
|
| // Create a weak ref to the new space object.
|
| weak_new_ref = Dart_NewWeakPersistentHandle(new_ref, NULL, NULL);
|
| - EXPECT_VALID(weak_new_ref);
|
| - EXPECT(!Dart_IsNull(weak_new_ref));
|
| + EXPECT_VALID(AsHandle(weak_new_ref));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak_new_ref)));
|
|
|
| // Create a weak ref to the old space object.
|
| weak_old_ref = Dart_NewWeakPersistentHandle(old_ref, NULL, NULL);
|
| - EXPECT_VALID(weak_old_ref);
|
| - EXPECT(!Dart_IsNull(weak_old_ref));
|
| + EXPECT_VALID(AsHandle(weak_old_ref));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak_old_ref)));
|
|
|
| // Garbage collect new space.
|
| GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
|
| @@ -1567,13 +1574,13 @@
|
| EXPECT_VALID(old_ref);
|
| EXPECT(!Dart_IsNull(old_ref));
|
|
|
| - EXPECT_VALID(weak_new_ref);
|
| - EXPECT(!Dart_IsNull(weak_new_ref));
|
| - EXPECT(Dart_IdentityEquals(new_ref, weak_new_ref));
|
| + EXPECT_VALID(AsHandle(weak_new_ref));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak_new_ref)));
|
| + EXPECT(Dart_IdentityEquals(new_ref, AsHandle(weak_new_ref)));
|
|
|
| - EXPECT_VALID(weak_old_ref);
|
| - EXPECT(!Dart_IsNull(weak_old_ref));
|
| - EXPECT(Dart_IdentityEquals(old_ref, weak_old_ref));
|
| + EXPECT_VALID(AsHandle(weak_old_ref));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak_old_ref)));
|
| + EXPECT(Dart_IdentityEquals(old_ref, AsHandle(weak_old_ref)));
|
|
|
| // Garbage collect old space.
|
| Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
|
| @@ -1584,13 +1591,13 @@
|
| EXPECT_VALID(old_ref);
|
| EXPECT(!Dart_IsNull(old_ref));
|
|
|
| - EXPECT_VALID(weak_new_ref);
|
| - EXPECT(!Dart_IsNull(weak_new_ref));
|
| - EXPECT(Dart_IdentityEquals(new_ref, weak_new_ref));
|
| + EXPECT_VALID(AsHandle(weak_new_ref));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak_new_ref)));
|
| + EXPECT(Dart_IdentityEquals(new_ref, AsHandle(weak_new_ref)));
|
|
|
| - EXPECT_VALID(weak_old_ref);
|
| - EXPECT(!Dart_IsNull(weak_old_ref));
|
| - EXPECT(Dart_IdentityEquals(old_ref, weak_old_ref));
|
| + EXPECT_VALID(AsHandle(weak_old_ref));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak_old_ref)));
|
| + EXPECT(Dart_IdentityEquals(old_ref, AsHandle(weak_old_ref)));
|
|
|
| // Delete local (strong) references.
|
| Dart_ExitScope();
|
| @@ -1600,22 +1607,22 @@
|
| GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
|
|
|
| // Weak ref to new space object should now be cleared.
|
| - EXPECT_VALID(weak_new_ref);
|
| - EXPECT(Dart_IsNull(weak_new_ref));
|
| - EXPECT_VALID(weak_old_ref);
|
| - EXPECT(!Dart_IsNull(weak_old_ref));
|
| + EXPECT_VALID(AsHandle(weak_new_ref));
|
| + EXPECT(Dart_IsNull(AsHandle(weak_new_ref)));
|
| + EXPECT_VALID(AsHandle(weak_old_ref));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak_old_ref)));
|
|
|
| // Garbage collect old space again.
|
| Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
|
|
|
| // Weak ref to old space object should now be cleared.
|
| - EXPECT_VALID(weak_new_ref);
|
| - EXPECT(Dart_IsNull(weak_new_ref));
|
| - EXPECT_VALID(weak_old_ref);
|
| - EXPECT(Dart_IsNull(weak_old_ref));
|
| + EXPECT_VALID(AsHandle(weak_new_ref));
|
| + EXPECT(Dart_IsNull(AsHandle(weak_new_ref)));
|
| + EXPECT_VALID(AsHandle(weak_old_ref));
|
| + EXPECT(Dart_IsNull(AsHandle(weak_old_ref)));
|
|
|
| - Dart_DeletePersistentHandle(weak_new_ref);
|
| - Dart_DeletePersistentHandle(weak_old_ref);
|
| + Dart_DeleteWeakPersistentHandle(weak_new_ref);
|
| + Dart_DeleteWeakPersistentHandle(weak_old_ref);
|
|
|
| // Garbage collect one last time to revisit deleted handles.
|
| Isolate::Current()->heap()->CollectGarbage(Heap::kNew);
|
| @@ -1623,14 +1630,13 @@
|
| }
|
|
|
|
|
| -static void WeakPersistentHandlePeerFinalizer(Dart_Handle handle, void* peer) {
|
| +static void WeakPersistentHandlePeerFinalizer(Dart_WeakPersistentHandle handle, void* peer) {
|
| *static_cast<int*>(peer) = 42;
|
| }
|
|
|
|
|
| TEST_CASE(WeakPersistentHandleCallback) {
|
| - Dart_Handle weak_ref = Dart_Null();
|
| - EXPECT(Dart_IsNull(weak_ref));
|
| + Dart_WeakPersistentHandle weak_ref = NULL;
|
| int peer = 0;
|
| {
|
| Dart_EnterScope();
|
| @@ -1640,19 +1646,18 @@
|
| WeakPersistentHandlePeerFinalizer);
|
| Dart_ExitScope();
|
| }
|
| - EXPECT_VALID(weak_ref);
|
| + EXPECT_VALID(AsHandle(weak_ref));
|
| EXPECT(peer == 0);
|
| Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
|
| EXPECT(peer == 0);
|
| GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
|
| EXPECT(peer == 42);
|
| - Dart_DeletePersistentHandle(weak_ref);
|
| + Dart_DeleteWeakPersistentHandle(weak_ref);
|
| }
|
|
|
|
|
| TEST_CASE(WeakPersistentHandleNoCallback) {
|
| - Dart_Handle weak_ref = Dart_Null();
|
| - EXPECT(Dart_IsNull(weak_ref));
|
| + Dart_WeakPersistentHandle weak_ref = NULL;
|
| int peer = 0;
|
| {
|
| Dart_EnterScope();
|
| @@ -1664,8 +1669,7 @@
|
| }
|
| // A finalizer is not invoked on a deleted handle. Therefore, the
|
| // peer value should not change after the referent is collected.
|
| - Dart_DeletePersistentHandle(weak_ref);
|
| - EXPECT_VALID(weak_ref);
|
| + Dart_DeleteWeakPersistentHandle(weak_ref);
|
| EXPECT(peer == 0);
|
| Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
|
| EXPECT(peer == 0);
|
| @@ -1688,86 +1692,81 @@
|
|
|
|
|
| TEST_CASE(ObjectGroups) {
|
| - Dart_Handle strong = Dart_Null();
|
| - EXPECT(Dart_IsNull(strong));
|
| + Dart_PersistentHandle strong = NULL;
|
| + Dart_WeakPersistentHandle strong_weak = NULL;
|
|
|
| - Dart_Handle weak1 = Dart_Null();
|
| - EXPECT(Dart_IsNull(weak1));
|
| + Dart_WeakPersistentHandle weak1 = NULL;
|
| + Dart_WeakPersistentHandle weak2 = NULL;
|
| + Dart_WeakPersistentHandle weak3 = NULL;
|
| + Dart_WeakPersistentHandle weak4 = NULL;
|
|
|
| - Dart_Handle weak2 = Dart_Null();
|
| - EXPECT(Dart_IsNull(weak2));
|
| -
|
| - Dart_Handle weak3 = Dart_Null();
|
| - EXPECT(Dart_IsNull(weak3));
|
| -
|
| - Dart_Handle weak4 = Dart_Null();
|
| - EXPECT(Dart_IsNull(weak4));
|
| -
|
| Dart_EnterScope();
|
| {
|
| Isolate* isolate = Isolate::Current();
|
| DARTSCOPE(isolate);
|
|
|
| - strong = Dart_NewPersistentHandle(
|
| - Api::NewHandle(isolate, String::New("strongly reachable", Heap::kOld)));
|
| - EXPECT_VALID(strong);
|
| - EXPECT(!Dart_IsNull(strong));
|
| + Dart_Handle local = Api::NewHandle(isolate, String::New("strongly reachable", Heap::kOld));
|
| + strong = Dart_NewPersistentHandle(local);
|
| + strong_weak = Dart_NewWeakPersistentHandle(local, NULL, NULL);
|
| + EXPECT_VALID(AsHandle(strong));
|
| + EXPECT(!Dart_IsNull(AsHandle(strong)));
|
| +
|
|
|
| weak1 = Dart_NewWeakPersistentHandle(
|
| Api::NewHandle(isolate, String::New("weakly reachable 1", Heap::kOld)),
|
| NULL, NULL);
|
| - EXPECT_VALID(weak1);
|
| - EXPECT(!Dart_IsNull(weak1));
|
| + EXPECT_VALID(AsHandle(weak1));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak1)));
|
|
|
| weak2 = Dart_NewWeakPersistentHandle(
|
| Api::NewHandle(isolate, String::New("weakly reachable 2", Heap::kOld)),
|
| NULL, NULL);
|
| - EXPECT_VALID(weak2);
|
| - EXPECT(!Dart_IsNull(weak2));
|
| + EXPECT_VALID(AsHandle(weak2));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak2)));
|
|
|
| weak3 = Dart_NewWeakPersistentHandle(
|
| Api::NewHandle(isolate, String::New("weakly reachable 3", Heap::kOld)),
|
| NULL, NULL);
|
| - EXPECT_VALID(weak3);
|
| - EXPECT(!Dart_IsNull(weak3));
|
| + EXPECT_VALID(AsHandle(weak3));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak3)));
|
|
|
| weak4 = Dart_NewWeakPersistentHandle(
|
| Api::NewHandle(isolate, String::New("weakly reachable 4", Heap::kOld)),
|
| NULL, NULL);
|
| - EXPECT_VALID(weak4);
|
| - EXPECT(!Dart_IsNull(weak4));
|
| + EXPECT_VALID(AsHandle(weak4));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak4)));
|
| }
|
| Dart_ExitScope();
|
|
|
| - EXPECT_VALID(strong);
|
| + EXPECT_VALID(AsHandle(strong));
|
|
|
| - EXPECT_VALID(weak1);
|
| - EXPECT_VALID(weak2);
|
| - EXPECT_VALID(weak3);
|
| - EXPECT_VALID(weak4);
|
| + EXPECT_VALID(AsHandle(weak1));
|
| + EXPECT_VALID(AsHandle(weak2));
|
| + EXPECT_VALID(AsHandle(weak3));
|
| + EXPECT_VALID(AsHandle(weak4));
|
|
|
| GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
|
|
|
| // New space collection should not affect old space objects
|
| - EXPECT(!Dart_IsNull(weak1));
|
| - EXPECT(!Dart_IsNull(weak2));
|
| - EXPECT(!Dart_IsNull(weak3));
|
| - EXPECT(!Dart_IsNull(weak4));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak1)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak2)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak3)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak4)));
|
|
|
| {
|
| - Dart_Handle array1[] = { weak1, strong };
|
| + Dart_WeakPersistentHandle array1[] = { weak1, strong_weak };
|
| EXPECT_VALID(Dart_NewWeakReferenceSet(array1, ARRAY_SIZE(array1),
|
| array1, ARRAY_SIZE(array1)));
|
|
|
| - Dart_Handle array2[] = { weak2, weak1 };
|
| + Dart_WeakPersistentHandle array2[] = { weak2, weak1 };
|
| EXPECT_VALID(Dart_NewWeakReferenceSet(array2, ARRAY_SIZE(array2),
|
| array2, ARRAY_SIZE(array2)));
|
|
|
| - Dart_Handle array3[] = { weak3, weak2 };
|
| + Dart_WeakPersistentHandle array3[] = { weak3, weak2 };
|
| EXPECT_VALID(Dart_NewWeakReferenceSet(array3, ARRAY_SIZE(array3),
|
| array3, ARRAY_SIZE(array3)));
|
|
|
| - Dart_Handle array4[] = { weak4, weak3 };
|
| + Dart_WeakPersistentHandle array4[] = { weak4, weak3 };
|
| EXPECT_VALID(Dart_NewWeakReferenceSet(array4, ARRAY_SIZE(array4),
|
| array4, ARRAY_SIZE(array4)));
|
|
|
| @@ -1775,29 +1774,30 @@
|
| }
|
|
|
| // All weak references should be preserved.
|
| - EXPECT(!Dart_IsNull(weak1));
|
| - EXPECT(!Dart_IsNull(weak2));
|
| - EXPECT(!Dart_IsNull(weak3));
|
| - EXPECT(!Dart_IsNull(weak4));
|
| + EXPECT(!Dart_IsNull(AsHandle(strong_weak)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak1)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak2)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak3)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak4)));
|
|
|
| {
|
| - Dart_Handle array1[] = { weak1, strong };
|
| + Dart_WeakPersistentHandle array1[] = { weak1, strong_weak };
|
| EXPECT_VALID(Dart_NewWeakReferenceSet(array1, ARRAY_SIZE(array1),
|
| array1, ARRAY_SIZE(array1)));
|
|
|
| - Dart_Handle array2[] = { weak2, weak1 };
|
| + Dart_WeakPersistentHandle array2[] = { weak2, weak1 };
|
| EXPECT_VALID(Dart_NewWeakReferenceSet(array2, ARRAY_SIZE(array2),
|
| array2, ARRAY_SIZE(array2)));
|
|
|
| - Dart_Handle array3[] = { weak2 };
|
| + Dart_WeakPersistentHandle array3[] = { weak2 };
|
| EXPECT_VALID(Dart_NewWeakReferenceSet(array3, ARRAY_SIZE(array3),
|
| array3, ARRAY_SIZE(array3)));
|
|
|
| // Strong reference to weak3 to retain weak3 and weak4.
|
| - Dart_Handle weak3_strong_ref = Dart_NewPersistentHandle(weak3);
|
| - EXPECT_VALID(weak3_strong_ref);
|
| + Dart_PersistentHandle weak3_strong_ref = Dart_NewPersistentHandle(AsHandle(weak3));
|
| + EXPECT_VALID(AsHandle(weak3_strong_ref));
|
|
|
| - Dart_Handle array4[] = { weak4, weak3 };
|
| + Dart_WeakPersistentHandle array4[] = { weak4, weak3 };
|
| EXPECT_VALID(Dart_NewWeakReferenceSet(array4, ARRAY_SIZE(array4),
|
| array4, ARRAY_SIZE(array4)));
|
|
|
| @@ -1808,25 +1808,26 @@
|
| }
|
|
|
| // All weak references should be preserved.
|
| - EXPECT(!Dart_IsNull(weak1));
|
| - EXPECT(!Dart_IsNull(weak2));
|
| - EXPECT(!Dart_IsNull(weak3));
|
| - EXPECT(!Dart_IsNull(weak4));
|
| + EXPECT(!Dart_IsNull(AsHandle(strong_weak)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak1)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak2)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak3)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak4)));
|
|
|
| {
|
| - Dart_Handle array1[] = { weak1, strong };
|
| + Dart_WeakPersistentHandle array1[] = { weak1, strong_weak };
|
| EXPECT_VALID(Dart_NewWeakReferenceSet(array1, ARRAY_SIZE(array1),
|
| array1, ARRAY_SIZE(array1)));
|
|
|
| - Dart_Handle array2[] = { weak2, weak1 };
|
| + Dart_WeakPersistentHandle array2[] = { weak2, weak1 };
|
| EXPECT_VALID(Dart_NewWeakReferenceSet(array2, ARRAY_SIZE(array2),
|
| array2, ARRAY_SIZE(array2)));
|
|
|
| - Dart_Handle array3[] = { weak2 };
|
| + Dart_WeakPersistentHandle array3[] = { weak2 };
|
| EXPECT_VALID(Dart_NewWeakReferenceSet(array3, ARRAY_SIZE(array3),
|
| array3, ARRAY_SIZE(array3)));
|
|
|
| - Dart_Handle array4[] = { weak4, weak3 };
|
| + Dart_WeakPersistentHandle array4[] = { weak4, weak3 };
|
| EXPECT_VALID(Dart_NewWeakReferenceSet(array4, ARRAY_SIZE(array4),
|
| array4, ARRAY_SIZE(array4)));
|
|
|
| @@ -1834,18 +1835,19 @@
|
| }
|
|
|
| // Only weak1 and weak2 should be preserved.
|
| - EXPECT(!Dart_IsNull(weak1));
|
| - EXPECT(!Dart_IsNull(weak2));
|
| - EXPECT(Dart_IsNull(weak3));
|
| - EXPECT(Dart_IsNull(weak4));
|
| + EXPECT(!Dart_IsNull(AsHandle(strong_weak)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak1)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak2)));
|
| + EXPECT(Dart_IsNull(AsHandle(weak3)));
|
| + EXPECT(Dart_IsNull(AsHandle(weak4)));
|
|
|
| {
|
| - Dart_Handle array1[] = { weak1, strong };
|
| + Dart_WeakPersistentHandle array1[] = { weak1, strong_weak };
|
| EXPECT_VALID(Dart_NewWeakReferenceSet(array1, ARRAY_SIZE(array1),
|
| array1, ARRAY_SIZE(array1)));
|
|
|
| // weak3 is cleared so weak2 is unreferenced and should be cleared
|
| - Dart_Handle array2[] = { weak2, weak3 };
|
| + Dart_WeakPersistentHandle array2[] = { weak2, weak3 };
|
| EXPECT_VALID(Dart_NewWeakReferenceSet(array2, ARRAY_SIZE(array2),
|
| array2, ARRAY_SIZE(array2)));
|
|
|
| @@ -1853,19 +1855,20 @@
|
| }
|
|
|
| // Only weak1 should be preserved, weak3 should not preserve weak2.
|
| - EXPECT(!Dart_IsNull(weak1));
|
| - EXPECT(Dart_IsNull(weak2));
|
| - EXPECT(Dart_IsNull(weak3)); // was cleared, should remain cleared
|
| - EXPECT(Dart_IsNull(weak4)); // was cleared, should remain cleared
|
| + EXPECT(!Dart_IsNull(AsHandle(strong_weak)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak1)));
|
| + EXPECT(Dart_IsNull(AsHandle(weak2)));
|
| + EXPECT(Dart_IsNull(AsHandle(weak3))); // was cleared, should remain cleared
|
| + EXPECT(Dart_IsNull(AsHandle(weak4))); // was cleared, should remain cleared
|
|
|
| {
|
| // weak{2,3,4} are cleared and should have no effect on weak1
|
| - Dart_Handle array1[] = { strong, weak2, weak3, weak4 };
|
| + Dart_WeakPersistentHandle array1[] = { strong_weak, weak2, weak3, weak4 };
|
| EXPECT_VALID(Dart_NewWeakReferenceSet(array1, ARRAY_SIZE(array1),
|
| array1, ARRAY_SIZE(array1)));
|
|
|
| // weak1 is weakly reachable and should be cleared
|
| - Dart_Handle array2[] = { weak1 };
|
| + Dart_WeakPersistentHandle array2[] = { weak1 };
|
| EXPECT_VALID(Dart_NewWeakReferenceSet(array2, ARRAY_SIZE(array2),
|
| array2, ARRAY_SIZE(array2)));
|
|
|
| @@ -1873,18 +1876,18 @@
|
| }
|
|
|
| // All weak references should now be cleared.
|
| - EXPECT(Dart_IsNull(weak1));
|
| - EXPECT(Dart_IsNull(weak2));
|
| - EXPECT(Dart_IsNull(weak3));
|
| - EXPECT(Dart_IsNull(weak4));
|
| + EXPECT(!Dart_IsNull(AsHandle(strong_weak)));
|
| + EXPECT(Dart_IsNull(AsHandle(weak1)));
|
| + EXPECT(Dart_IsNull(AsHandle(weak2)));
|
| + EXPECT(Dart_IsNull(AsHandle(weak3)));
|
| + EXPECT(Dart_IsNull(AsHandle(weak4)));
|
| }
|
|
|
|
|
| TEST_CASE(PrologueWeakPersistentHandles) {
|
| - Dart_Handle old_pwph = Dart_Null();
|
| - EXPECT(Dart_IsNull(old_pwph));
|
| - Dart_Handle new_pwph = Dart_Null();
|
| - EXPECT(Dart_IsNull(new_pwph));
|
| + Dart_WeakPersistentHandle old_pwph = NULL;
|
| + Dart_WeakPersistentHandle new_pwph = NULL;
|
| +
|
| Dart_EnterScope();
|
| {
|
| Isolate* isolate = Isolate::Current();
|
| @@ -1893,110 +1896,110 @@
|
| Api::NewHandle(isolate,
|
| String::New("new space prologue weak", Heap::kNew)),
|
| NULL, NULL);
|
| - EXPECT_VALID(new_pwph);
|
| - EXPECT(!Dart_IsNull(new_pwph));
|
| + EXPECT_VALID(AsHandle(new_pwph));
|
| + EXPECT(!Dart_IsNull(AsHandle(new_pwph)));
|
| old_pwph = Dart_NewPrologueWeakPersistentHandle(
|
| Api::NewHandle(isolate,
|
| String::New("old space prologue weak", Heap::kOld)),
|
| NULL, NULL);
|
| - EXPECT_VALID(old_pwph);
|
| - EXPECT(!Dart_IsNull(old_pwph));
|
| + EXPECT_VALID(AsHandle(old_pwph));
|
| + EXPECT(!Dart_IsNull(AsHandle(old_pwph)));
|
| }
|
| Dart_ExitScope();
|
| - EXPECT_VALID(new_pwph);
|
| - EXPECT(!Dart_IsNull(new_pwph));
|
| + EXPECT_VALID(AsHandle(new_pwph));
|
| + EXPECT(!Dart_IsNull(AsHandle(new_pwph)));
|
| EXPECT(Dart_IsPrologueWeakPersistentHandle(new_pwph));
|
| - EXPECT_VALID(old_pwph);
|
| - EXPECT(!Dart_IsNull(old_pwph));
|
| + EXPECT_VALID(AsHandle(old_pwph));
|
| + EXPECT(!Dart_IsNull(AsHandle(old_pwph)));
|
| EXPECT(Dart_IsPrologueWeakPersistentHandle(old_pwph));
|
| // Garbage collect new space without invoking API callbacks.
|
| GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
|
|
|
| // Both prologue weak handles should be preserved.
|
| - EXPECT(!Dart_IsNull(new_pwph));
|
| - EXPECT(!Dart_IsNull(old_pwph));
|
| + EXPECT(!Dart_IsNull(AsHandle(new_pwph)));
|
| + EXPECT(!Dart_IsNull(AsHandle(old_pwph)));
|
| // Garbage collect old space without invoking API callbacks.
|
| Isolate::Current()->heap()->CollectGarbage(Heap::kOld,
|
| Heap::kIgnoreApiCallbacks);
|
| // Both prologue weak handles should be preserved.
|
| - EXPECT(!Dart_IsNull(new_pwph));
|
| - EXPECT(!Dart_IsNull(old_pwph));
|
| + EXPECT(!Dart_IsNull(AsHandle(new_pwph)));
|
| + EXPECT(!Dart_IsNull(AsHandle(old_pwph)));
|
| // Garbage collect new space invoking API callbacks.
|
| GCTestHelper::CollectNewSpace(Heap::kInvokeApiCallbacks);
|
|
|
| // The prologue weak handle with a new space referent should now be
|
| // cleared. The old space referent should be preserved.
|
| - EXPECT(Dart_IsNull(new_pwph));
|
| - EXPECT(!Dart_IsNull(old_pwph));
|
| + EXPECT(Dart_IsNull(AsHandle(new_pwph)));
|
| + EXPECT(!Dart_IsNull(AsHandle(old_pwph)));
|
| Isolate::Current()->heap()->CollectGarbage(Heap::kOld,
|
| Heap::kInvokeApiCallbacks);
|
| // The prologue weak handle with an old space referent should now be
|
| // cleared. The new space referent should remain cleared.
|
| - EXPECT(Dart_IsNull(new_pwph));
|
| - EXPECT(Dart_IsNull(old_pwph));
|
| + EXPECT(Dart_IsNull(AsHandle(new_pwph)));
|
| + EXPECT(Dart_IsNull(AsHandle(old_pwph)));
|
| }
|
|
|
|
|
| TEST_CASE(ImplicitReferencesOldSpace) {
|
| - Dart_Handle strong = Dart_Null();
|
| - EXPECT(Dart_IsNull(strong));
|
| + Dart_PersistentHandle strong = NULL;
|
| + Dart_WeakPersistentHandle strong_weak = NULL;
|
|
|
| - Dart_Handle weak1 = Dart_Null();
|
| - EXPECT(Dart_IsNull(weak1));
|
| + Dart_WeakPersistentHandle weak1 = NULL;
|
| + Dart_WeakPersistentHandle weak2 = NULL;
|
| + Dart_WeakPersistentHandle weak3 = NULL;
|
|
|
| - Dart_Handle weak2 = Dart_Null();
|
| - EXPECT(Dart_IsNull(weak2));
|
| -
|
| - Dart_Handle weak3 = Dart_Null();
|
| - EXPECT(Dart_IsNull(weak3));
|
| -
|
| Dart_EnterScope();
|
| {
|
| Isolate* isolate = Isolate::Current();
|
| DARTSCOPE(isolate);
|
|
|
| - strong = Dart_NewPersistentHandle(
|
| - Api::NewHandle(isolate, String::New("strongly reachable", Heap::kOld)));
|
| - EXPECT(!Dart_IsNull(strong));
|
| - EXPECT_VALID(strong);
|
| + Dart_Handle local = Api::NewHandle(isolate, String::New("strongly reachable", Heap::kOld));
|
| + strong = Dart_NewPersistentHandle(local);
|
| + strong_weak = Dart_NewWeakPersistentHandle(local, NULL, NULL);
|
|
|
| + EXPECT(!Dart_IsNull(AsHandle(strong)));
|
| + EXPECT_VALID(AsHandle(strong));
|
| + EXPECT(!Dart_IsNull(AsHandle(strong_weak)));
|
| + EXPECT_VALID(AsHandle(strong_weak));
|
| + EXPECT(Dart_IdentityEquals(AsHandle(strong), AsHandle(strong_weak)))
|
| +
|
| weak1 = Dart_NewWeakPersistentHandle(
|
| Api::NewHandle(isolate, String::New("weakly reachable 1", Heap::kOld)),
|
| NULL, NULL);
|
| - EXPECT(!Dart_IsNull(weak1));
|
| - EXPECT_VALID(weak1);
|
| + EXPECT(!Dart_IsNull(AsHandle(weak1)));
|
| + EXPECT_VALID(AsHandle(weak1));
|
|
|
| weak2 = Dart_NewWeakPersistentHandle(
|
| Api::NewHandle(isolate, String::New("weakly reachable 2", Heap::kOld)),
|
| NULL, NULL);
|
| - EXPECT(!Dart_IsNull(weak2));
|
| - EXPECT_VALID(weak2);
|
| + EXPECT(!Dart_IsNull(AsHandle(weak2)));
|
| + EXPECT_VALID(AsHandle(weak2));
|
|
|
| weak3 = Dart_NewWeakPersistentHandle(
|
| Api::NewHandle(isolate, String::New("weakly reachable 3", Heap::kOld)),
|
| NULL, NULL);
|
| - EXPECT(!Dart_IsNull(weak3));
|
| - EXPECT_VALID(weak3);
|
| + EXPECT(!Dart_IsNull(AsHandle(weak3)));
|
| + EXPECT_VALID(AsHandle(weak3));
|
| }
|
| Dart_ExitScope();
|
|
|
| - EXPECT_VALID(strong);
|
| + EXPECT_VALID(AsHandle(strong_weak));
|
| + EXPECT_VALID(AsHandle(weak1));
|
| + EXPECT_VALID(AsHandle(weak2));
|
| + EXPECT_VALID(AsHandle(weak3));
|
|
|
| - EXPECT_VALID(weak1);
|
| - EXPECT_VALID(weak2);
|
| - EXPECT_VALID(weak3);
|
| -
|
| GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
|
|
|
| // New space collection should not affect old space objects
|
| - EXPECT(!Dart_IsNull(weak1));
|
| - EXPECT(!Dart_IsNull(weak2));
|
| - EXPECT(!Dart_IsNull(weak3));
|
| + EXPECT_VALID(AsHandle(strong_weak));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak1)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak2)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak3)));
|
|
|
| // A strongly referenced key should preserve all the values.
|
| {
|
| - Dart_Handle keys[] = { strong };
|
| - Dart_Handle values[] = { weak1, weak2, weak3 };
|
| + Dart_WeakPersistentHandle keys[] = { strong_weak };
|
| + Dart_WeakPersistentHandle values[] = { weak1, weak2, weak3 };
|
| EXPECT_VALID(Dart_NewWeakReferenceSet(keys, ARRAY_SIZE(keys),
|
| values, ARRAY_SIZE(values)));
|
|
|
| @@ -2004,14 +2007,15 @@
|
| }
|
|
|
| // All weak references should be preserved.
|
| - EXPECT(!Dart_IsNull(weak1));
|
| - EXPECT(!Dart_IsNull(weak2));
|
| - EXPECT(!Dart_IsNull(weak3));
|
| + EXPECT_VALID(AsHandle(strong_weak));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak1)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak2)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak3)));
|
|
|
| // Key membership does not imply a strong reference.
|
| {
|
| - Dart_Handle keys[] = { strong, weak3 };
|
| - Dart_Handle values[] = { weak1, weak2 };
|
| + Dart_WeakPersistentHandle keys[] = { strong_weak, weak3 };
|
| + Dart_WeakPersistentHandle values[] = { weak1, weak2 };
|
| EXPECT_VALID(Dart_NewWeakReferenceSet(keys, ARRAY_SIZE(keys),
|
| values, ARRAY_SIZE(values)));
|
|
|
| @@ -2019,72 +2023,71 @@
|
| }
|
|
|
| // All weak references except weak3 should be preserved.
|
| - EXPECT(!Dart_IsNull(weak1));
|
| - EXPECT(!Dart_IsNull(weak2));
|
| - EXPECT(Dart_IsNull(weak3));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak1)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak2)));
|
| + EXPECT(Dart_IsNull(AsHandle(weak3)));
|
| }
|
|
|
|
|
| TEST_CASE(ImplicitReferencesNewSpace) {
|
| - Dart_Handle strong = Dart_Null();
|
| - EXPECT(Dart_IsNull(strong));
|
| + Dart_PersistentHandle strong = NULL;
|
| + Dart_WeakPersistentHandle strong_weak = NULL;
|
| +
|
| + Dart_WeakPersistentHandle weak1 = NULL;
|
| + Dart_WeakPersistentHandle weak2 = NULL;
|
| + Dart_WeakPersistentHandle weak3 = NULL;
|
|
|
| - Dart_Handle weak1 = Dart_Null();
|
| - EXPECT(Dart_IsNull(weak1));
|
| -
|
| - Dart_Handle weak2 = Dart_Null();
|
| - EXPECT(Dart_IsNull(weak2));
|
| -
|
| - Dart_Handle weak3 = Dart_Null();
|
| - EXPECT(Dart_IsNull(weak3));
|
| -
|
| Dart_EnterScope();
|
| {
|
| Isolate* isolate = Isolate::Current();
|
| DARTSCOPE(isolate);
|
|
|
| - strong = Dart_NewPersistentHandle(
|
| - Api::NewHandle(isolate, String::New("strongly reachable", Heap::kNew)));
|
| - EXPECT(!Dart_IsNull(strong));
|
| - EXPECT_VALID(strong);
|
| + Dart_Handle local = Api::NewHandle(isolate, String::New("strongly reachable", Heap::kOld));
|
| + strong = Dart_NewPersistentHandle(local);
|
| + strong_weak = Dart_NewWeakPersistentHandle(local, NULL, NULL);
|
| +
|
| + EXPECT(!Dart_IsNull(AsHandle(strong)));
|
| + EXPECT_VALID(AsHandle(strong));
|
| + EXPECT(!Dart_IsNull(AsHandle(strong_weak)));
|
| + EXPECT_VALID(AsHandle(strong_weak));
|
| + EXPECT(Dart_IdentityEquals(AsHandle(strong), AsHandle(strong_weak)))
|
|
|
| weak1 = Dart_NewWeakPersistentHandle(
|
| Api::NewHandle(isolate, String::New("weakly reachable 1", Heap::kNew)),
|
| NULL, NULL);
|
| - EXPECT(!Dart_IsNull(weak1));
|
| - EXPECT_VALID(weak1);
|
| + EXPECT(!Dart_IsNull(AsHandle(weak1)));
|
| + EXPECT_VALID(AsHandle(weak1));
|
|
|
| weak2 = Dart_NewWeakPersistentHandle(
|
| Api::NewHandle(isolate, String::New("weakly reachable 2", Heap::kNew)),
|
| NULL, NULL);
|
| - EXPECT(!Dart_IsNull(weak2));
|
| - EXPECT_VALID(weak2);
|
| + EXPECT(!Dart_IsNull(AsHandle(weak2)));
|
| + EXPECT_VALID(AsHandle(weak2));
|
|
|
| weak3 = Dart_NewWeakPersistentHandle(
|
| Api::NewHandle(isolate, String::New("weakly reachable 3", Heap::kNew)),
|
| NULL, NULL);
|
| - EXPECT(!Dart_IsNull(weak3));
|
| - EXPECT_VALID(weak3);
|
| + EXPECT(!Dart_IsNull(AsHandle(weak3)));
|
| + EXPECT_VALID(AsHandle(weak3));
|
| }
|
| Dart_ExitScope();
|
|
|
| - EXPECT_VALID(strong);
|
| + EXPECT_VALID(AsHandle(strong_weak));
|
| + EXPECT_VALID(AsHandle(weak1));
|
| + EXPECT_VALID(AsHandle(weak2));
|
| + EXPECT_VALID(AsHandle(weak3));
|
|
|
| - EXPECT_VALID(weak1);
|
| - EXPECT_VALID(weak2);
|
| - EXPECT_VALID(weak3);
|
| -
|
| Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
|
|
|
| // Old space collection should not affect old space objects.
|
| - EXPECT(!Dart_IsNull(weak1));
|
| - EXPECT(!Dart_IsNull(weak2));
|
| - EXPECT(!Dart_IsNull(weak3));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak1)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak2)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak3)));
|
|
|
| // A strongly referenced key should preserve all the values.
|
| {
|
| - Dart_Handle keys[] = { strong };
|
| - Dart_Handle values[] = { weak1, weak2, weak3 };
|
| + Dart_WeakPersistentHandle keys[] = { strong_weak };
|
| + Dart_WeakPersistentHandle values[] = { weak1, weak2, weak3 };
|
| EXPECT_VALID(Dart_NewWeakReferenceSet(keys, ARRAY_SIZE(keys),
|
| values, ARRAY_SIZE(values)));
|
|
|
| @@ -2092,16 +2095,16 @@
|
| }
|
|
|
| // All weak references should be preserved.
|
| - EXPECT(!Dart_IsNull(weak1));
|
| - EXPECT(!Dart_IsNull(weak2));
|
| - EXPECT(!Dart_IsNull(weak3));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak1)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak2)));
|
| + EXPECT(!Dart_IsNull(AsHandle(weak3)));
|
|
|
| GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
|
|
|
| // No weak references should be preserved.
|
| - EXPECT(Dart_IsNull(weak1));
|
| - EXPECT(Dart_IsNull(weak2));
|
| - EXPECT(Dart_IsNull(weak3));
|
| + EXPECT(Dart_IsNull(AsHandle(weak1)));
|
| + EXPECT(Dart_IsNull(AsHandle(weak2)));
|
| + EXPECT(Dart_IsNull(AsHandle(weak3)));
|
| }
|
|
|
|
|
|
|