| Index: runtime/vm/dart_api_impl_test.cc
|
| ===================================================================
|
| --- runtime/vm/dart_api_impl_test.cc (revision 33235)
|
| +++ runtime/vm/dart_api_impl_test.cc (working copy)
|
| @@ -1712,7 +1712,8 @@
|
| Dart_TypedData_kUint8,
|
| data,
|
| ARRAY_SIZE(data));
|
| - Dart_NewWeakPersistentHandle(obj, &peer, ExternalTypedDataFinalizer);
|
| + Dart_NewWeakPersistentHandle(
|
| + obj, &peer, sizeof(data), ExternalTypedDataFinalizer);
|
| EXPECT_VALID(obj);
|
| Dart_ExitScope();
|
| }
|
| @@ -1767,7 +1768,8 @@
|
| {
|
| Dart_Handle lcl = Dart_NewExternalTypedData(
|
| Dart_TypedData_kFloat32x4, data, 10);
|
| - Dart_NewWeakPersistentHandle(lcl, &peer, ExternalTypedDataFinalizer);
|
| + Dart_NewWeakPersistentHandle(
|
| + lcl, &peer, sizeof(data), ExternalTypedDataFinalizer);
|
| CheckFloat32x4Data(lcl);
|
| }
|
| Dart_ExitScope();
|
| @@ -1955,11 +1957,11 @@
|
| TEST_CASE(WeakPersistentHandle) {
|
| Dart_Handle local_new_ref = Dart_Null();
|
| Dart_WeakPersistentHandle weak_new_ref = Dart_NewWeakPersistentHandle(
|
| - local_new_ref, NULL, NULL);
|
| + local_new_ref, NULL, 0, NULL);
|
|
|
| Dart_Handle local_old_ref = Dart_Null();
|
| Dart_WeakPersistentHandle weak_old_ref = Dart_NewWeakPersistentHandle(
|
| - local_old_ref, NULL, NULL);
|
| + local_old_ref, NULL, 0, NULL);
|
|
|
| {
|
| Dart_EnterScope();
|
| @@ -1978,12 +1980,12 @@
|
| }
|
|
|
| // Create a weak ref to the new space object.
|
| - weak_new_ref = Dart_NewWeakPersistentHandle(new_ref, NULL, NULL);
|
| + weak_new_ref = Dart_NewWeakPersistentHandle(new_ref, NULL, 0, NULL);
|
| 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);
|
| + weak_old_ref = Dart_NewWeakPersistentHandle(old_ref, NULL, 0, NULL);
|
| EXPECT_VALID(AsHandle(weak_old_ref));
|
| EXPECT(!Dart_IsNull(AsHandle(weak_old_ref)));
|
|
|
| @@ -2073,7 +2075,7 @@
|
| Dart_EnterScope();
|
| Dart_Handle obj = NewString("new string");
|
| EXPECT_VALID(obj);
|
| - weak_ref = Dart_NewWeakPersistentHandle(obj, &peer,
|
| + weak_ref = Dart_NewWeakPersistentHandle(obj, &peer, 0,
|
| WeakPersistentHandlePeerFinalizer);
|
| EXPECT_VALID(AsHandle(weak_ref));
|
| EXPECT(peer == 0);
|
| @@ -2094,7 +2096,7 @@
|
| Dart_EnterScope();
|
| Dart_Handle obj = NewString("new string");
|
| EXPECT_VALID(obj);
|
| - weak_ref = Dart_NewWeakPersistentHandle(obj, &peer,
|
| + weak_ref = Dart_NewWeakPersistentHandle(obj, &peer, 0,
|
| WeakPersistentHandlePeerFinalizer);
|
| Dart_ExitScope();
|
| }
|
| @@ -2116,12 +2118,103 @@
|
| int peer = 1234;
|
| Dart_NewWeakPersistentHandle(ref,
|
| &peer,
|
| + 0,
|
| WeakPersistentHandlePeerFinalizer);
|
| Dart_ShutdownIsolate();
|
| EXPECT(peer == 42);
|
| }
|
|
|
|
|
| +TEST_CASE(WeakPersistentHandleExternalAllocationSize) {
|
| + Heap* heap = Isolate::Current()->heap();
|
| + EXPECT(heap->ExternalAllocatedInWords(Heap::kNew) == 0);
|
| + EXPECT(heap->ExternalAllocatedInWords(Heap::kOld) == 0);
|
| + Dart_WeakPersistentHandle weak1 = NULL;
|
| + {
|
| + Dart_EnterScope();
|
| + Dart_Handle obj = NewString("weakly referenced string");
|
| + EXPECT_VALID(obj);
|
| + weak1 = Dart_NewWeakPersistentHandle(obj, NULL, 1024, NULL);
|
| + EXPECT_VALID(AsHandle(weak1));
|
| + Dart_ExitScope();
|
| + }
|
| + Dart_PersistentHandle strong_ref = NULL;
|
| + Dart_WeakPersistentHandle weak2 = NULL;
|
| + {
|
| + Dart_EnterScope();
|
| + Dart_Handle obj = NewString("strongly referenced string");
|
| + EXPECT_VALID(obj);
|
| + strong_ref = Dart_NewPersistentHandle(obj);
|
| + weak2 = Dart_NewWeakPersistentHandle(obj, NULL, 2048, NULL);
|
| + EXPECT_VALID(AsHandle(strong_ref));
|
| + Dart_ExitScope();
|
| + }
|
| + Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
|
| + EXPECT(heap->ExternalAllocatedInWords(Heap::kNew) == (1024 + 2048)/kWordSize);
|
| + // Collect weakly referenced string, and promote strongly referenced string.
|
| + GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
|
| + GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
|
| + EXPECT(heap->ExternalAllocatedInWords(Heap::kNew) == 0);
|
| + EXPECT(heap->ExternalAllocatedInWords(Heap::kOld) == 2048/kWordSize);
|
| + Dart_DeleteWeakPersistentHandle(weak1);
|
| + Dart_DeleteWeakPersistentHandle(weak2);
|
| + Dart_DeletePersistentHandle(strong_ref);
|
| +}
|
| +
|
| +
|
| +TEST_CASE(WeakPersistentHandleExternalAllocationSizeOversized) {
|
| + Heap* heap = Isolate::Current()->heap();
|
| + Dart_WeakPersistentHandle weak1 = NULL;
|
| + {
|
| + Dart_EnterScope();
|
| + Dart_Handle obj = NewString("weakly referenced string");
|
| + EXPECT_VALID(obj);
|
| + weak1 = Dart_NewWeakPersistentHandle(obj, NULL, 100*MB, NULL);
|
| + EXPECT_VALID(AsHandle(weak1));
|
| + // While new space is "full" of external data, any allocation will
|
| + // trigger GC, so after two of them, obj should be promoted.
|
| + Dart_Handle trigger1 = NewString("trigger1");
|
| + EXPECT_VALID(trigger1);
|
| + Dart_Handle trigger2 = NewString("trigger2");
|
| + EXPECT_VALID(trigger2);
|
| + {
|
| + DARTSCOPE(Isolate::Current());
|
| + String& handle = String::Handle();
|
| + handle ^= Api::UnwrapHandle(obj);
|
| + EXPECT(handle.IsOld());
|
| + }
|
| + EXPECT(heap->ExternalAllocatedInWords(Heap::kNew) == 0);
|
| + EXPECT(heap->ExternalAllocatedInWords(Heap::kOld) == 100*MBInWords);
|
| + Dart_ExitScope();
|
| + }
|
| + Dart_DeleteWeakPersistentHandle(weak1);
|
| +}
|
| +
|
| +
|
| +TEST_CASE(WeakPersistentHandleExternalAllocationSizeOddReferents) {
|
| + Heap* heap = Isolate::Current()->heap();
|
| + Dart_WeakPersistentHandle weak1 = NULL;
|
| + Dart_WeakPersistentHandle weak2 = NULL;
|
| + {
|
| + Dart_EnterScope();
|
| + Dart_Handle dart_null = Dart_Null(); // VM heap object.
|
| + EXPECT_VALID(dart_null);
|
| + weak1 = Dart_NewWeakPersistentHandle(dart_null, NULL, 1024, NULL);
|
| + EXPECT_VALID(AsHandle(weak1));
|
| + Dart_Handle zero = Dart_NewInteger(0); // Smi.
|
| + EXPECT_VALID(dart_null);
|
| + weak2 = Dart_NewWeakPersistentHandle(zero, NULL, 2048, NULL);
|
| + EXPECT_VALID(AsHandle(weak2));
|
| + // Both should be charged to old space.
|
| + EXPECT(heap->ExternalAllocatedInWords(Heap::kOld) ==
|
| + (1024 + 2048)/kWordSize);
|
| + Dart_ExitScope();
|
| + }
|
| + Dart_DeleteWeakPersistentHandle(weak1);
|
| + Dart_DeleteWeakPersistentHandle(weak2);
|
| +}
|
| +
|
| +
|
| TEST_CASE(ObjectGroups) {
|
| Dart_PersistentHandle strong = NULL;
|
| Dart_WeakPersistentHandle strong_weak = NULL;
|
| @@ -2139,31 +2232,31 @@
|
| Dart_Handle local = Api::NewHandle(
|
| isolate, String::New("strongly reachable", Heap::kOld));
|
| strong = Dart_NewPersistentHandle(local);
|
| - strong_weak = Dart_NewWeakPersistentHandle(local, NULL, NULL);
|
| + strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, 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);
|
| + NULL, 0, NULL);
|
| EXPECT_VALID(AsHandle(weak1));
|
| EXPECT(!Dart_IsNull(AsHandle(weak1)));
|
|
|
| weak2 = Dart_NewWeakPersistentHandle(
|
| Api::NewHandle(isolate, String::New("weakly reachable 2", Heap::kOld)),
|
| - NULL, NULL);
|
| + NULL, 0, NULL);
|
| EXPECT_VALID(AsHandle(weak2));
|
| EXPECT(!Dart_IsNull(AsHandle(weak2)));
|
|
|
| weak3 = Dart_NewWeakPersistentHandle(
|
| Api::NewHandle(isolate, String::New("weakly reachable 3", Heap::kOld)),
|
| - NULL, NULL);
|
| + NULL, 0, NULL);
|
| EXPECT_VALID(AsHandle(weak3));
|
| EXPECT(!Dart_IsNull(AsHandle(weak3)));
|
|
|
| weak4 = Dart_NewWeakPersistentHandle(
|
| Api::NewHandle(isolate, String::New("weakly reachable 4", Heap::kOld)),
|
| - NULL, NULL);
|
| + NULL, 0, NULL);
|
| EXPECT_VALID(AsHandle(weak4));
|
| EXPECT(!Dart_IsNull(AsHandle(weak4)));
|
| }
|
| @@ -2356,13 +2449,13 @@
|
| new_pwph = Dart_NewPrologueWeakPersistentHandle(
|
| Api::NewHandle(isolate,
|
| String::New("new space prologue weak", Heap::kNew)),
|
| - NULL, NULL);
|
| + NULL, 0, NULL);
|
| 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);
|
| + NULL, 0, NULL);
|
| EXPECT_VALID(AsHandle(old_pwph));
|
| EXPECT(!Dart_IsNull(AsHandle(old_pwph)));
|
| }
|
| @@ -2444,7 +2537,7 @@
|
| Dart_Handle local = Api::NewHandle(
|
| isolate, String::New("strongly reachable", Heap::kOld));
|
| strong = Dart_NewPersistentHandle(local);
|
| - strong_weak = Dart_NewWeakPersistentHandle(local, NULL, NULL);
|
| + strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NULL);
|
|
|
| EXPECT(!Dart_IsNull(AsHandle(strong)));
|
| EXPECT_VALID(AsHandle(strong));
|
| @@ -2454,19 +2547,19 @@
|
|
|
| weak1 = Dart_NewWeakPersistentHandle(
|
| Api::NewHandle(isolate, String::New("weakly reachable 1", Heap::kOld)),
|
| - NULL, NULL);
|
| + NULL, 0, NULL);
|
| EXPECT(!Dart_IsNull(AsHandle(weak1)));
|
| EXPECT_VALID(AsHandle(weak1));
|
|
|
| weak2 = Dart_NewWeakPersistentHandle(
|
| Api::NewHandle(isolate, String::New("weakly reachable 2", Heap::kOld)),
|
| - NULL, NULL);
|
| + NULL, 0, NULL);
|
| EXPECT(!Dart_IsNull(AsHandle(weak2)));
|
| EXPECT_VALID(AsHandle(weak2));
|
|
|
| weak3 = Dart_NewWeakPersistentHandle(
|
| Api::NewHandle(isolate, String::New("weakly reachable 3", Heap::kOld)),
|
| - NULL, NULL);
|
| + NULL, 0, NULL);
|
| EXPECT(!Dart_IsNull(AsHandle(weak3)));
|
| EXPECT_VALID(AsHandle(weak3));
|
| }
|
| @@ -2550,7 +2643,7 @@
|
| Dart_Handle local = Api::NewHandle(
|
| isolate, String::New("strongly reachable", Heap::kOld));
|
| strong = Dart_NewPersistentHandle(local);
|
| - strong_weak = Dart_NewWeakPersistentHandle(local, NULL, NULL);
|
| + strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NULL);
|
|
|
| EXPECT(!Dart_IsNull(AsHandle(strong)));
|
| EXPECT_VALID(AsHandle(strong));
|
| @@ -2560,19 +2653,19 @@
|
|
|
| weak1 = Dart_NewWeakPersistentHandle(
|
| Api::NewHandle(isolate, String::New("weakly reachable 1", Heap::kNew)),
|
| - NULL, NULL);
|
| + NULL, 0, NULL);
|
| EXPECT(!Dart_IsNull(AsHandle(weak1)));
|
| EXPECT_VALID(AsHandle(weak1));
|
|
|
| weak2 = Dart_NewWeakPersistentHandle(
|
| Api::NewHandle(isolate, String::New("weakly reachable 2", Heap::kNew)),
|
| - NULL, NULL);
|
| + NULL, 0, NULL);
|
| EXPECT(!Dart_IsNull(AsHandle(weak2)));
|
| EXPECT_VALID(AsHandle(weak2));
|
|
|
| weak3 = Dart_NewWeakPersistentHandle(
|
| Api::NewHandle(isolate, String::New("weakly reachable 3", Heap::kNew)),
|
| - NULL, NULL);
|
| + NULL, 0, NULL);
|
| EXPECT(!Dart_IsNull(AsHandle(weak3)));
|
| EXPECT_VALID(AsHandle(weak3));
|
| }
|
|
|