| Index: runtime/vm/dart_api_impl_test.cc
|
| ===================================================================
|
| --- runtime/vm/dart_api_impl_test.cc (revision 34481)
|
| +++ runtime/vm/dart_api_impl_test.cc (working copy)
|
| @@ -2306,24 +2306,30 @@
|
|
|
|
|
| TEST_CASE(WeakPersistentHandleExternalAllocationSizeOversized) {
|
| + Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current());
|
| Heap* heap = Isolate::Current()->heap();
|
| Dart_WeakPersistentHandle weak1 = NULL;
|
| - const intptr_t kWeak1ExternalSize = 100 * MB;
|
| + // Large enough to exceed any new space limit. Not actually allocated.
|
| + const intptr_t kWeak1ExternalSize = 500 * MB;
|
| {
|
| Dart_EnterScope();
|
| Dart_Handle obj = NewString("weakly referenced string");
|
| EXPECT_VALID(obj);
|
| + // Triggers a scavenge immediately, since kWeak1ExternalSize is above limit.
|
| weak1 = Dart_NewWeakPersistentHandle(obj,
|
| NULL,
|
| kWeak1ExternalSize,
|
| NopCallback);
|
| 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);
|
| + // ... but the object is still alive and not yet promoted, so external size
|
| + // in new space is still above the limit. Thus, even the following tiny
|
| + // external allocation will trigger another scavenge.
|
| + Dart_WeakPersistentHandle trigger =
|
| + Dart_NewWeakPersistentHandle(obj, NULL, 1, NopCallback);
|
| + EXPECT_VALID(AsHandle(trigger));
|
| + Dart_DeleteWeakPersistentHandle(isolate, trigger);
|
| + // After the two scavenges above, 'obj' should now be promoted, hence its
|
| + // external size charged to old space.
|
| {
|
| DARTSCOPE(Isolate::Current());
|
| String& handle = String::Handle();
|
| @@ -2334,7 +2340,6 @@
|
| EXPECT(heap->ExternalInWords(Heap::kOld) == kWeak1ExternalSize / kWordSize);
|
| Dart_ExitScope();
|
| }
|
| - Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current());
|
| Dart_DeleteWeakPersistentHandle(isolate, weak1);
|
| Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
|
| EXPECT(heap->ExternalInWords(Heap::kOld) == 0);
|
|
|