Make Map.set() and Set.add() chainable
authorrossberg@chromium.org <rossberg@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 1 Jul 2014 09:49:25 +0000 (09:49 +0000)
committerrossberg@chromium.org <rossberg@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 1 Jul 2014 09:49:25 +0000 (09:49 +0000)
From the Harmony draft:

https://people.mozilla.org/~jorendorff/es6-draft.html#sec-map.prototype.set
https://people.mozilla.org/~jorendorff/es6-draft.html#sec-weakmap.prototype.set
https://people.mozilla.org/~jorendorff/es6-draft.html#sec-set.prototype.add
https://people.mozilla.org/~jorendorff/es6-draft.html#sec-weakset.prototype.add

BUG=v8:3410
R=arv@chromium.org, rossberg@chromium.org

Review URL: https://codereview.chromium.org/359173002

Patch from caitp <caitpotter88@gmail.com>.

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22111 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/runtime.cc
test/mjsunit/es6/weak_collections.js
test/mjsunit/harmony/collections.js

index 888f665..339c45d 100644 (file)
@@ -1547,7 +1547,7 @@ RUNTIME_FUNCTION(Runtime_SetAdd) {
   Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table()));
   table = OrderedHashSet::Add(table, key);
   holder->set_table(*table);
-  return isolate->heap()->undefined_value();
+  return *holder;
 }
 
 
@@ -1685,7 +1685,7 @@ RUNTIME_FUNCTION(Runtime_MapSet) {
   Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table()));
   Handle<OrderedHashMap> new_table = OrderedHashMap::Put(table, key, value);
   holder->set_table(*new_table);
-  return isolate->heap()->undefined_value();
+  return *holder;
 }
 
 
@@ -1799,7 +1799,7 @@ RUNTIME_FUNCTION(Runtime_WeakCollectionSet) {
   RUNTIME_ASSERT(table->IsKey(*key));
   Handle<ObjectHashTable> new_table = ObjectHashTable::Put(table, key, value);
   weak_collection->set_table(*new_table);
-  return isolate->heap()->undefined_value();
+  return *weak_collection;
 }
 
 
index 74235e7..b3ebd5d 100644 (file)
@@ -68,7 +68,7 @@ TestInvalidCalls(new WeakMap);
 // Test expected behavior for WeakSets
 function TestSet(set, key) {
   assertFalse(set.has(key));
-  assertSame(undefined, set.add(key));
+  assertSame(set, set.add(key));
   assertTrue(set.has(key));
   assertTrue(set.delete(key));
   assertFalse(set.has(key));
@@ -92,7 +92,7 @@ TestSet(new WeakSet, new Object);
 
 // Test expected mapping behavior for WeakMaps
 function TestMapping(map, key, value) {
-  assertSame(undefined, map.set(key, value));
+  assertSame(map, map.set(key, value));
   assertSame(value, map.get(key));
 }
 function TestMapBehavior1(m) {
index 1dd7f0d..a6e3820 100644 (file)
@@ -67,7 +67,7 @@ TestInvalidCalls(new WeakMap);
 // Test expected behavior for Sets and WeakSets
 function TestSet(set, key) {
   assertFalse(set.has(key));
-  assertSame(undefined, set.add(key));
+  assertSame(set, set.add(key));
   assertTrue(set.has(key));
   assertTrue(set.delete(key));
   assertFalse(set.has(key));
@@ -92,7 +92,7 @@ TestSet(new WeakSet, new Object);
 
 // Test expected mapping behavior for Maps and WeakMaps
 function TestMapping(map, key, value) {
-  assertSame(undefined, map.set(key, value));
+  assertSame(map, map.set(key, value));
   assertSame(value, map.get(key));
 }
 function TestMapBehavior1(m) {