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 |