Chromium Code Reviews| 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,102 @@ |
| int peer = 1234; |
| Dart_NewWeakPersistentHandle(ref, |
| &peer, |
| + 0, |
| WeakPersistentHandlePeerFinalizer); |
| Dart_ShutdownIsolate(); |
| EXPECT(peer == 42); |
| } |
| +TEST_CASE(WeakPersistentHandleExternalAllocationSize) { |
| + Heap* heap = Isolate::Current()->heap(); |
| + EXPECT(heap->ExternalInWords(Heap::kNew) == 0); |
| + EXPECT(heap->ExternalInWords(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); |
|
siva
2014/03/06 17:17:39
could we have constants
const intptr_t kWeak1Exter
koda
2014/03/06 22:55:07
Done.
|
| + 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->ExternalInWords(Heap::kNew) == (1024 + 2048)/kWordSize); |
| + // Collect weakly referenced string, and promote strongly referenced string. |
| + GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); |
| + GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); |
| + EXPECT(heap->ExternalInWords(Heap::kNew) == 0); |
| + EXPECT(heap->ExternalInWords(Heap::kOld) == 2048/kWordSize); |
| + Dart_DeleteWeakPersistentHandle(weak1); |
| + Dart_DeleteWeakPersistentHandle(weak2); |
| + Dart_DeletePersistentHandle(strong_ref); |
|
siva
2014/03/06 17:17:39
Should we invoke the garbage collector here and ch
koda
2014/03/06 22:55:07
Done.
|
| +} |
| + |
| + |
| +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); |
|
siva
2014/03/06 17:17:39
ditto comment here about use of constants.
koda
2014/03/06 22:55:07
Done.
|
| + 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->ExternalInWords(Heap::kNew) == 0); |
| + EXPECT(heap->ExternalInWords(Heap::kOld) == 100*MBInWords); |
| + Dart_ExitScope(); |
| + } |
| + Dart_DeleteWeakPersistentHandle(weak1); |
|
siva
2014/03/06 17:17:39
Ditto comment regarding check.
koda
2014/03/06 22:55:07
Done.
|
| +} |
| + |
| + |
| +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); |
|
siva
2014/03/06 17:17:39
Ditto.
koda
2014/03/06 22:55:07
Done.
|
| + 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->ExternalInWords(Heap::kOld) == (1024 + 2048)/kWordSize); |
| + Dart_ExitScope(); |
| + } |
| + Dart_DeleteWeakPersistentHandle(weak1); |
| + Dart_DeleteWeakPersistentHandle(weak2); |
|
siva
2014/03/06 17:17:39
Ditto comment regarding check.
koda
2014/03/06 22:55:07
Done.
|
| +} |
| + |
| + |
| TEST_CASE(ObjectGroups) { |
| Dart_PersistentHandle strong = NULL; |
| Dart_WeakPersistentHandle strong_weak = NULL; |
| @@ -2139,31 +2231,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 +2448,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 +2536,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 +2546,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 +2642,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 +2652,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)); |
| } |