| 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.
|
| - 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
|
|
|