Chromium Code Reviews| Index: src/runtime/runtime-collections.cc |
| diff --git a/src/runtime/runtime-collections.cc b/src/runtime/runtime-collections.cc |
| index abdd056998e70f5903d887789f9a4ca40b2258a4..ffffbdd2f2d601a3c60c5f0061653b5cddd7523d 100644 |
| --- a/src/runtime/runtime-collections.cc |
| +++ b/src/runtime/runtime-collections.cc |
| @@ -296,12 +296,11 @@ RUNTIME_FUNCTION(Runtime_MapIteratorNext) { |
| } |
| -static Handle<JSWeakCollection> WeakCollectionInitialize( |
| +void Runtime::WeakCollectionInitialize( |
| Isolate* isolate, Handle<JSWeakCollection> weak_collection) { |
| DCHECK(weak_collection->map()->inobject_properties() == 0); |
| Handle<ObjectHashTable> table = ObjectHashTable::New(isolate, 0); |
| weak_collection->set_table(*table); |
| - return weak_collection; |
| } |
| @@ -309,7 +308,8 @@ RUNTIME_FUNCTION(Runtime_WeakCollectionInitialize) { |
| HandleScope scope(isolate); |
| DCHECK(args.length() == 1); |
| CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); |
| - return *WeakCollectionInitialize(isolate, weak_collection); |
| + Runtime::WeakCollectionInitialize(isolate, weak_collection); |
| + return *weak_collection; |
| } |
| @@ -341,6 +341,24 @@ RUNTIME_FUNCTION(Runtime_WeakCollectionHas) { |
| } |
| +bool Runtime::WeakCollectionDelete(Handle<JSWeakCollection> weak_collection, |
| + Handle<Object> key) { |
| + DCHECK(key->IsJSReceiver() || key->IsSymbol()); |
| + Handle<ObjectHashTable> table( |
| + ObjectHashTable::cast(weak_collection->table())); |
| + DCHECK(table->IsKey(*key)); |
| + bool was_present = false; |
| + Handle<ObjectHashTable> new_table = |
| + ObjectHashTable::Remove(table, key, &was_present); |
| + weak_collection->set_table(*new_table); |
| + if (*table != *new_table) { |
| + // Zap the old table since we didn't record slots for its elements. |
| + table->FillWithHoles(0, table->length()); |
| + } |
| + return was_present; |
| +} |
| + |
| + |
| RUNTIME_FUNCTION(Runtime_WeakCollectionDelete) { |
| HandleScope scope(isolate); |
| DCHECK(args.length() == 2); |
| @@ -350,15 +368,23 @@ RUNTIME_FUNCTION(Runtime_WeakCollectionDelete) { |
| Handle<ObjectHashTable> table( |
| ObjectHashTable::cast(weak_collection->table())); |
| RUNTIME_ASSERT(table->IsKey(*key)); |
| - bool was_present = false; |
| - Handle<ObjectHashTable> new_table = |
| - ObjectHashTable::Remove(table, key, &was_present); |
| + bool was_present = Runtime::WeakCollectionDelete(weak_collection, key); |
| + return isolate->heap()->ToBoolean(was_present); |
| +} |
| + |
| + |
| +void Runtime::WeakCollectionSet(Handle<JSWeakCollection> weak_collection, |
| + Handle<Object> key, Handle<Object> value) { |
| + DCHECK(key->IsJSReceiver() || key->IsSymbol()); |
| + Handle<ObjectHashTable> table( |
| + ObjectHashTable::cast(weak_collection->table())); |
| + DCHECK(table->IsKey(*key)); |
| + Handle<ObjectHashTable> new_table = ObjectHashTable::Put(table, key, value); |
| weak_collection->set_table(*new_table); |
| if (*table != *new_table) { |
| // Zap the old table since we didn't record slots for its elements. |
| table->FillWithHoles(0, table->length()); |
| } |
| - return isolate->heap()->ToBoolean(was_present); |
| } |
| @@ -372,12 +398,7 @@ RUNTIME_FUNCTION(Runtime_WeakCollectionSet) { |
| Handle<ObjectHashTable> table( |
| ObjectHashTable::cast(weak_collection->table())); |
| RUNTIME_ASSERT(table->IsKey(*key)); |
| - Handle<ObjectHashTable> new_table = ObjectHashTable::Put(table, key, value); |
| - weak_collection->set_table(*new_table); |
| - if (*table != *new_table) { |
| - // Zap the old table since we didn't record slots for its elements. |
| - table->FillWithHoles(0, table->length()); |
| - } |
| + Runtime::WeakCollectionSet(weak_collection, key, value); |
| return *weak_collection; |
| } |
| @@ -414,14 +435,9 @@ RUNTIME_FUNCTION(Runtime_GetWeakSetValues) { |
| RUNTIME_FUNCTION(Runtime_ObservationWeakMapCreate) { |
| HandleScope scope(isolate); |
| DCHECK(args.length() == 0); |
| - // TODO(adamk): Currently this runtime function is only called three times per |
| - // isolate. If it's called more often, the map should be moved into the |
| - // strong root list. |
|
Michael Starzinger
2015/02/03 13:21:54
Can we preserve an adapted version of this TODO wi
yurys
2015/02/03 13:39:07
Done.
|
| - Handle<Map> map = |
| - isolate->factory()->NewMap(JS_WEAK_MAP_TYPE, JSWeakMap::kSize); |
| - Handle<JSWeakMap> weakmap = |
| - Handle<JSWeakMap>::cast(isolate->factory()->NewJSObjectFromMap(map)); |
| - return *WeakCollectionInitialize(isolate, weakmap); |
| + Handle<JSWeakMap> weakmap = isolate->factory()->NewJSWeakMap(); |
| + Runtime::WeakCollectionInitialize(isolate, weakmap); |
| + return *weakmap; |
| } |
| } |
| } // namespace v8::internal |