| Index: runtime/vm/object_test.cc
|
| diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
|
| index f5eca02aeacc19b9d25248e016668b9bf09192f9..b036b6de4e879f5c27d307bd87051fd46fe840cb 100644
|
| --- a/runtime/vm/object_test.cc
|
| +++ b/runtime/vm/object_test.cc
|
| @@ -2862,6 +2862,252 @@ TEST_CASE(StackTraceFormat) {
|
| "#10 main (dart:test-lib:37:24)");
|
| }
|
|
|
| +
|
| +TEST_CASE(WeakProperty_PreserveOne_NewSpace) {
|
| + Isolate* isolate = Isolate::Current();
|
| + WeakProperty& weak = WeakProperty::Handle();
|
| + OneByteString& key = OneByteString::Handle();
|
| + key ^= OneByteString::New("key");
|
| + {
|
| + HANDLESCOPE(isolate);
|
| + OneByteString& value = OneByteString::Handle();
|
| + value ^= OneByteString::New("value");
|
| + weak ^= WeakProperty::New();
|
| + weak.set_key(key);
|
| + weak.set_value(value);
|
| + }
|
| + isolate->heap()->CollectAllGarbage();
|
| + EXPECT(weak.key() != Object::null());
|
| + EXPECT(weak.value() != Object::null());
|
| +}
|
| +
|
| +
|
| +TEST_CASE(WeakProperty_PreserveTwo_NewSpace) {
|
| + Isolate* isolate = Isolate::Current();
|
| + WeakProperty& weak1 = WeakProperty::Handle();
|
| + OneByteString& key1 = OneByteString::Handle();
|
| + key1 ^= OneByteString::New("key1");
|
| + WeakProperty& weak2 = WeakProperty::Handle();
|
| + OneByteString& key2 = OneByteString::Handle();
|
| + key2 ^= OneByteString::New("key2");
|
| + {
|
| + HANDLESCOPE(isolate);
|
| + OneByteString& value1 = OneByteString::Handle();
|
| + value1 ^= OneByteString::New("value1");
|
| + weak1 ^= WeakProperty::New();
|
| + weak1.set_key(key1);
|
| + weak1.set_value(value1);
|
| + OneByteString& value2 = OneByteString::Handle();
|
| + value2 ^= OneByteString::New("value2");
|
| + weak2 ^= WeakProperty::New();
|
| + weak2.set_key(key2);
|
| + weak2.set_value(value2);
|
| + }
|
| + isolate->heap()->CollectAllGarbage();
|
| + EXPECT(weak1.key() != Object::null());
|
| + EXPECT(weak1.value() != Object::null());
|
| + EXPECT(weak2.key() != Object::null());
|
| + EXPECT(weak2.value() != Object::null());
|
| +}
|
| +
|
| +
|
| +TEST_CASE(WeakProperty_PreserveTwoShared_NewSpace) {
|
| + Isolate* isolate = Isolate::Current();
|
| + WeakProperty& weak1 = WeakProperty::Handle();
|
| + WeakProperty& weak2 = WeakProperty::Handle();
|
| + OneByteString& key = OneByteString::Handle();
|
| + key ^= OneByteString::New("key");
|
| + {
|
| + HANDLESCOPE(isolate);
|
| + OneByteString& value1 = OneByteString::Handle();
|
| + value1 ^= OneByteString::New("value1");
|
| + weak1 ^= WeakProperty::New();
|
| + weak1.set_key(key);
|
| + weak1.set_value(value1);
|
| + OneByteString& value2 = OneByteString::Handle();
|
| + value2 ^= OneByteString::New("value2");
|
| + weak2 ^= WeakProperty::New();
|
| + weak2.set_key(key);
|
| + weak2.set_value(value2);
|
| + }
|
| + isolate->heap()->CollectAllGarbage();
|
| + EXPECT(weak1.key() != Object::null());
|
| + EXPECT(weak1.value() != Object::null());
|
| + EXPECT(weak2.key() != Object::null());
|
| + EXPECT(weak2.value() != Object::null());
|
| +}
|
| +
|
| +
|
| +TEST_CASE(WeakProperty_PreserveOne_OldSpace) {
|
| + Isolate* isolate = Isolate::Current();
|
| + WeakProperty& weak = WeakProperty::Handle();
|
| + OneByteString& key = OneByteString::Handle();
|
| + key ^= OneByteString::New("key", Heap::kOld);
|
| + {
|
| + HANDLESCOPE(isolate);
|
| + OneByteString& value = OneByteString::Handle();
|
| + value ^= OneByteString::New("value", Heap::kOld);
|
| + weak ^= WeakProperty::New(Heap::kOld);
|
| + weak.set_key(key);
|
| + weak.set_value(value);
|
| + }
|
| + isolate->heap()->CollectAllGarbage();
|
| + EXPECT(weak.key() != Object::null());
|
| + EXPECT(weak.value() != Object::null());
|
| +}
|
| +
|
| +
|
| +TEST_CASE(WeakProperty_PreserveTwo_OldSpace) {
|
| + Isolate* isolate = Isolate::Current();
|
| + WeakProperty& weak1 = WeakProperty::Handle();
|
| + OneByteString& key1 = OneByteString::Handle();
|
| + key1 ^= OneByteString::New("key1", Heap::kOld);
|
| + WeakProperty& weak2 = WeakProperty::Handle();
|
| + OneByteString& key2 = OneByteString::Handle();
|
| + key2 ^= OneByteString::New("key2", Heap::kOld);
|
| + {
|
| + HANDLESCOPE(isolate);
|
| + OneByteString& value1 = OneByteString::Handle();
|
| + value1 ^= OneByteString::New("value1", Heap::kOld);
|
| + weak1 ^= WeakProperty::New(Heap::kOld);
|
| + weak1.set_key(key1);
|
| + weak1.set_value(value1);
|
| + OneByteString& value2 = OneByteString::Handle();
|
| + value2 ^= OneByteString::New("value2", Heap::kOld);
|
| + weak2 ^= WeakProperty::New(Heap::kOld);
|
| + weak2.set_key(key2);
|
| + weak2.set_value(value2);
|
| + }
|
| + isolate->heap()->CollectAllGarbage();
|
| + EXPECT(weak1.key() != Object::null());
|
| + EXPECT(weak1.value() != Object::null());
|
| + EXPECT(weak2.key() != Object::null());
|
| + EXPECT(weak2.value() != Object::null());
|
| +}
|
| +
|
| +
|
| +TEST_CASE(WeakProperty_PreserveTwoShared_OldSpace) {
|
| + Isolate* isolate = Isolate::Current();
|
| + WeakProperty& weak1 = WeakProperty::Handle();
|
| + WeakProperty& weak2 = WeakProperty::Handle();
|
| + OneByteString& key = OneByteString::Handle();
|
| + key ^= OneByteString::New("key", Heap::kOld);
|
| + {
|
| + HANDLESCOPE(isolate);
|
| + OneByteString& value1 = OneByteString::Handle();
|
| + value1 ^= OneByteString::New("value1", Heap::kOld);
|
| + weak1 ^= WeakProperty::New(Heap::kOld);
|
| + weak1.set_key(key);
|
| + weak1.set_value(value1);
|
| + OneByteString& value2 = OneByteString::Handle();
|
| + value2 ^= OneByteString::New("value2", Heap::kOld);
|
| + weak2 ^= WeakProperty::New(Heap::kOld);
|
| + weak2.set_key(key);
|
| + weak2.set_value(value2);
|
| + }
|
| + isolate->heap()->CollectAllGarbage();
|
| + EXPECT(weak1.key() != Object::null());
|
| + EXPECT(weak1.value() != Object::null());
|
| + EXPECT(weak2.key() != Object::null());
|
| + EXPECT(weak2.value() != Object::null());
|
| +}
|
| +
|
| +
|
| +TEST_CASE(WeakProperty_ClearOne_NewSpace) {
|
| + Isolate* isolate = Isolate::Current();
|
| + WeakProperty& weak = WeakProperty::Handle();
|
| + {
|
| + HANDLESCOPE(isolate);
|
| + OneByteString& key = OneByteString::Handle();
|
| + key ^= OneByteString::New("key");
|
| + OneByteString& value = OneByteString::Handle();
|
| + value ^= OneByteString::New("value");
|
| + weak ^= WeakProperty::New();
|
| + weak.set_key(key);
|
| + weak.set_value(value);
|
| + key ^= OneByteString::null();
|
| + value ^= OneByteString::null();
|
| + }
|
| + isolate->heap()->CollectAllGarbage();
|
| + EXPECT(weak.key() == Object::null());
|
| + EXPECT(weak.value() == Object::null());
|
| +}
|
| +
|
| +
|
| +TEST_CASE(WeakProperty_ClearTwoShared_NewSpace) {
|
| + Isolate* isolate = Isolate::Current();
|
| + WeakProperty& weak1 = WeakProperty::Handle();
|
| + WeakProperty& weak2 = WeakProperty::Handle();
|
| + {
|
| + HANDLESCOPE(isolate);
|
| + OneByteString& key = OneByteString::Handle();
|
| + key ^= OneByteString::New("key");
|
| + OneByteString& value1 = OneByteString::Handle();
|
| + value1 ^= OneByteString::New("value1");
|
| + weak1 ^= WeakProperty::New();
|
| + weak1.set_key(key);
|
| + weak1.set_value(value1);
|
| + OneByteString& value2 = OneByteString::Handle();
|
| + value2 ^= OneByteString::New("value2");
|
| + weak2 ^= WeakProperty::New();
|
| + weak2.set_key(key);
|
| + weak2.set_value(value2);
|
| + }
|
| + isolate->heap()->CollectAllGarbage();
|
| + EXPECT(weak1.key() == Object::null());
|
| + EXPECT(weak1.value() == Object::null());
|
| + EXPECT(weak2.key() == Object::null());
|
| + EXPECT(weak2.value() == Object::null());
|
| +}
|
| +
|
| +
|
| +TEST_CASE(WeakProperty_ClearOne_OldSpace) {
|
| + Isolate* isolate = Isolate::Current();
|
| + WeakProperty& weak = WeakProperty::Handle();
|
| + {
|
| + HANDLESCOPE(isolate);
|
| + OneByteString& key = OneByteString::Handle();
|
| + key ^= OneByteString::New("key", Heap::kOld);
|
| + OneByteString& value = OneByteString::Handle();
|
| + value ^= OneByteString::New("value", Heap::kOld);
|
| + weak ^= WeakProperty::New(Heap::kOld);
|
| + weak.set_key(key);
|
| + weak.set_value(value);
|
| + key ^= OneByteString::null();
|
| + value ^= OneByteString::null();
|
| + }
|
| + isolate->heap()->CollectAllGarbage();
|
| + EXPECT(weak.key() == Object::null());
|
| + EXPECT(weak.value() == Object::null());
|
| +}
|
| +
|
| +
|
| +TEST_CASE(WeakProperty_ClearTwoShared_OldSpace) {
|
| + Isolate* isolate = Isolate::Current();
|
| + WeakProperty& weak1 = WeakProperty::Handle();
|
| + WeakProperty& weak2 = WeakProperty::Handle();
|
| + {
|
| + HANDLESCOPE(isolate);
|
| + OneByteString& key = OneByteString::Handle();
|
| + key ^= OneByteString::New("key", Heap::kOld);
|
| + OneByteString& value1 = OneByteString::Handle();
|
| + value1 ^= OneByteString::New("value1");
|
| + weak1 ^= WeakProperty::New(Heap::kOld);
|
| + weak1.set_key(key);
|
| + weak1.set_value(value1);
|
| + OneByteString& value2 = OneByteString::Handle();
|
| + value2 ^= OneByteString::New("value2", Heap::kOld);
|
| + weak2 ^= WeakProperty::New(Heap::kOld);
|
| + weak2.set_key(key);
|
| + weak2.set_value(value2);
|
| + }
|
| + isolate->heap()->CollectAllGarbage();
|
| + EXPECT(weak1.key() == Object::null());
|
| + EXPECT(weak1.value() == Object::null());
|
| + EXPECT(weak2.key() == Object::null());
|
| + EXPECT(weak2.value() == Object::null());
|
| +}
|
| +
|
| #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64).
|
|
|
| } // namespace dart
|
|
|