Chromium Code Reviews| Index: vm/object_test.cc |
| =================================================================== |
| --- vm/object_test.cc (revision 13085) |
| +++ vm/object_test.cc (working copy) |
| @@ -2865,6 +2865,120 @@ |
| } |
| +TEST_CASE(WeakProperty_PreserveCrossGen) { |
| + Isolate* isolate = Isolate::Current(); |
| + WeakProperty& weak = WeakProperty::Handle(); |
| + { |
| + // Weak property and value in new. Key in old. |
| + HANDLESCOPE(isolate); |
| + OneByteString& key = OneByteString::Handle(); |
| + key ^= OneByteString::New("key", Heap::kOld); |
| + OneByteString& value = OneByteString::Handle(); |
| + value ^= OneByteString::New("value", Heap::kNew); |
| + weak ^= WeakProperty::New(Heap::kNew); |
| + weak.set_key(key); |
| + weak.set_value(value); |
| + key ^= OneByteString::null(); |
| + value ^= OneByteString::null(); |
| + } |
| + isolate->heap()->CollectAllGarbage(); |
| + // Weak property key and value should survive due to cross-generation |
| + // pointers. |
| + EXPECT(weak.key() != Object::null()); |
| + EXPECT(weak.value() != Object::null()); |
| + { |
| + // Weak property and value in old. Key in new. |
| + HANDLESCOPE(isolate); |
| + OneByteString& key = OneByteString::Handle(); |
| + key ^= OneByteString::New("key", Heap::kNew); |
| + 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(); |
| + // Weak property key and value should survive due to cross-generation |
| + // pointers. |
| + EXPECT(weak.key() != Object::null()); |
| + EXPECT(weak.value() != Object::null()); |
| + { |
| + // Weak property and value in new. Key is a Smi. |
| + HANDLESCOPE(isolate); |
| + Integer& key = Integer::Handle(); |
| + key ^= Integer::New(31); |
| + OneByteString& value = OneByteString::Handle(); |
| + value ^= OneByteString::New("value", Heap::kNew); |
| + weak ^= WeakProperty::New(Heap::kNew); |
| + weak.set_key(key); |
| + weak.set_value(value); |
| + key ^= Integer::null(); |
| + value ^= OneByteString::null(); |
| + } |
| + isolate->heap()->CollectAllGarbage(); |
| + // Weak property key and value should survive due to cross-generation |
|
cshapiro
2012/10/01 22:22:14
This comment is false, no? The key is implicitly
Ivan Posva
2012/10/01 22:27:39
Done.
|
| + // pointers. |
| + EXPECT(weak.key() != Object::null()); |
| + EXPECT(weak.value() != Object::null()); |
| + { |
| + // Weak property and value in old. Key is a Smi. |
| + HANDLESCOPE(isolate); |
| + Integer& key = Integer::Handle(); |
| + key ^= Integer::New(32); |
| + 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(); |
| + // Weak property key and value should survive due to cross-generation |
|
cshapiro
2012/10/01 22:22:14
Same here.
Ivan Posva
2012/10/01 22:27:39
Done.
|
| + // pointers. |
| + EXPECT(weak.key() != Object::null()); |
| + EXPECT(weak.value() != Object::null()); |
| + { |
| + // Weak property and value in new. Key in VM isolate. |
| + HANDLESCOPE(isolate); |
| + OneByteString& key = OneByteString::Handle(); |
| + key ^= Symbols::Dot(); |
| + OneByteString& value = OneByteString::Handle(); |
| + value ^= OneByteString::New("value", Heap::kNew); |
| + weak ^= WeakProperty::New(Heap::kNew); |
| + weak.set_key(key); |
| + weak.set_value(value); |
| + key ^= OneByteString::null(); |
| + value ^= OneByteString::null(); |
| + } |
| + isolate->heap()->CollectAllGarbage(); |
| + // Weak property key and value should survive due to cross-generation |
| + // pointers. |
| + EXPECT(weak.key() != Object::null()); |
| + EXPECT(weak.value() != Object::null()); |
| + { |
| + // Weak property and value in old. Key in VM isolate. |
| + HANDLESCOPE(isolate); |
| + OneByteString& key = OneByteString::Handle(); |
| + key ^= Symbols::Dot(); |
| + 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(); |
| + // Weak property key and value should survive due to cross-generation |
| + // pointers. |
| + EXPECT(weak.key() != Object::null()); |
| + EXPECT(weak.value() != Object::null()); |
| +} |
| + |
| + |
| TEST_CASE(WeakProperty_PreserveOne_NewSpace) { |
| Isolate* isolate = Isolate::Current(); |
| WeakProperty& weak = WeakProperty::Handle(); |