Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: test/cctest/test-weakmaps.cc

Issue 761343004: After moving unreachable weak global handles only process harmony collections (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: updates Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « test/cctest/test-api.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 // Keep global reference to the key. 90 // Keep global reference to the key.
91 Handle<Object> key; 91 Handle<Object> key;
92 { 92 {
93 HandleScope scope(isolate); 93 HandleScope scope(isolate);
94 Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); 94 Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
95 Handle<JSObject> object = factory->NewJSObjectFromMap(map); 95 Handle<JSObject> object = factory->NewJSObjectFromMap(map);
96 key = global_handles->Create(*object); 96 key = global_handles->Create(*object);
97 } 97 }
98 CHECK(!global_handles->IsWeak(key.location())); 98 CHECK(!global_handles->IsWeak(key.location()));
99 99
100 // Put entry into weak map. 100 // Put two chained entries into weak map.
101 { 101 {
102 HandleScope scope(isolate); 102 HandleScope scope(isolate);
103 PutIntoWeakMap(weakmap, 103 Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
104 Handle<JSObject>(JSObject::cast(*key)), 104 Handle<JSObject> object = factory->NewJSObjectFromMap(map);
105 Handle<Smi>(Smi::FromInt(23), isolate)); 105 PutIntoWeakMap(weakmap, Handle<JSObject>(JSObject::cast(*key)), object);
106 PutIntoWeakMap(weakmap, object, Handle<Smi>(Smi::FromInt(23), isolate));
106 } 107 }
107 CHECK_EQ(1, ObjectHashTable::cast(weakmap->table())->NumberOfElements()); 108 CHECK_EQ(2, ObjectHashTable::cast(weakmap->table())->NumberOfElements());
108 109
109 // Force a full GC. 110 // Force a full GC.
110 heap->CollectAllGarbage(false); 111 heap->CollectAllGarbage(false);
111 CHECK_EQ(0, NumberOfWeakCalls); 112 CHECK_EQ(0, NumberOfWeakCalls);
112 CHECK_EQ(1, ObjectHashTable::cast(weakmap->table())->NumberOfElements()); 113 CHECK_EQ(2, ObjectHashTable::cast(weakmap->table())->NumberOfElements());
113 CHECK_EQ( 114 CHECK_EQ(
114 0, ObjectHashTable::cast(weakmap->table())->NumberOfDeletedElements()); 115 0, ObjectHashTable::cast(weakmap->table())->NumberOfDeletedElements());
115 116
116 // Make the global reference to the key weak. 117 // Make the global reference to the key weak.
117 { 118 {
118 HandleScope scope(isolate); 119 HandleScope scope(isolate);
119 std::pair<Handle<Object>*, int> handle_and_id(&key, 1234); 120 std::pair<Handle<Object>*, int> handle_and_id(&key, 1234);
120 GlobalHandles::MakeWeak(key.location(), 121 GlobalHandles::MakeWeak(key.location(),
121 reinterpret_cast<void*>(&handle_and_id), 122 reinterpret_cast<void*>(&handle_and_id),
122 &WeakPointerCallback); 123 &WeakPointerCallback);
123 } 124 }
124 CHECK(global_handles->IsWeak(key.location())); 125 CHECK(global_handles->IsWeak(key.location()));
125 126
126 // Force a full GC. 127 // Force a full GC.
127 // Perform two consecutive GCs because the first one will only clear 128 // Perform two consecutive GCs because the first one will only clear
128 // weak references whereas the second one will also clear weak maps. 129 // weak references whereas the second one will also clear weak maps.
129 heap->CollectAllGarbage(false); 130 heap->CollectAllGarbage(false);
130 CHECK_EQ(1, NumberOfWeakCalls); 131 CHECK_EQ(1, NumberOfWeakCalls);
131 CHECK_EQ(1, ObjectHashTable::cast(weakmap->table())->NumberOfElements()); 132 CHECK_EQ(2, ObjectHashTable::cast(weakmap->table())->NumberOfElements());
132 CHECK_EQ( 133 CHECK_EQ(
133 0, ObjectHashTable::cast(weakmap->table())->NumberOfDeletedElements()); 134 0, ObjectHashTable::cast(weakmap->table())->NumberOfDeletedElements());
134 heap->CollectAllGarbage(false); 135 heap->CollectAllGarbage(false);
135 CHECK_EQ(1, NumberOfWeakCalls); 136 CHECK_EQ(1, NumberOfWeakCalls);
136 CHECK_EQ(0, ObjectHashTable::cast(weakmap->table())->NumberOfElements()); 137 CHECK_EQ(0, ObjectHashTable::cast(weakmap->table())->NumberOfElements());
137 CHECK_EQ( 138 CHECK_EQ(2,
138 1, ObjectHashTable::cast(weakmap->table())->NumberOfDeletedElements()); 139 ObjectHashTable::cast(weakmap->table())->NumberOfDeletedElements());
139 } 140 }
140 141
141 142
142 TEST(Shrinking) { 143 TEST(Shrinking) {
143 LocalContext context; 144 LocalContext context;
144 Isolate* isolate = GetIsolateFrom(&context); 145 Isolate* isolate = GetIsolateFrom(&context);
145 Factory* factory = isolate->factory(); 146 Factory* factory = isolate->factory();
146 Heap* heap = isolate->heap(); 147 Heap* heap = isolate->heap();
147 HandleScope scope(isolate); 148 HandleScope scope(isolate);
148 Handle<JSWeakMap> weakmap = AllocateJSWeakMap(isolate); 149 Handle<JSWeakMap> weakmap = AllocateJSWeakMap(isolate);
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 { 266 {
266 HandleScope scope(isolate); 267 HandleScope scope(isolate);
267 AllocateJSWeakMap(isolate); 268 AllocateJSWeakMap(isolate);
268 SimulateIncrementalMarking(heap); 269 SimulateIncrementalMarking(heap);
269 } 270 }
270 // The weak map is marked black here but leaving the handle scope will make 271 // The weak map is marked black here but leaving the handle scope will make
271 // the object unreachable. Aborting incremental marking will clear all the 272 // the object unreachable. Aborting incremental marking will clear all the
272 // marking bits which makes the weak map garbage. 273 // marking bits which makes the weak map garbage.
273 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); 274 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
274 } 275 }
OLDNEW
« no previous file with comments | « test/cctest/test-api.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698