| Index: test/mjsunit/harmony/collections.js
 | 
| diff --git a/test/mjsunit/harmony/collections.js b/test/mjsunit/harmony/collections.js
 | 
| index b33d08063d711491c1177600df5ac4f691c33ba5..d2e63511d62b32c50f5f4b37a9e51cb6e3c02aa7 100644
 | 
| --- a/test/mjsunit/harmony/collections.js
 | 
| +++ b/test/mjsunit/harmony/collections.js
 | 
| @@ -507,3 +507,314 @@ for (var i = 9; i >= 0; i--) {
 | 
|    assertEquals('minus', m.get(0));
 | 
|    assertEquals('minus', m.get(-0));
 | 
|  })();
 | 
| +
 | 
| +
 | 
| +(function TestSetForEachInvalidTypes() {
 | 
| +  assertThrows(function() {
 | 
| +    Set.prototype.set.forEach.call({});
 | 
| +  }, TypeError);
 | 
| +
 | 
| +  var set = new Set();
 | 
| +  assertThrows(function() {
 | 
| +    set.forEach({});
 | 
| +  }, TypeError);
 | 
| +})();
 | 
| +
 | 
| +
 | 
| +(function TestSetForEach() {
 | 
| +  var set = new Set();
 | 
| +  set.add('a');
 | 
| +  set.add('b');
 | 
| +  set.add('c');
 | 
| +
 | 
| +  var buffer = '';
 | 
| +  var receiver = {};
 | 
| +  set.forEach(function(v, k, s) {
 | 
| +    assertSame(v, k);
 | 
| +    assertSame(set, s);
 | 
| +    assertSame(this, receiver);
 | 
| +    buffer += v;
 | 
| +    if (v === 'a') {
 | 
| +      set.delete('b');
 | 
| +      set.add('d');
 | 
| +      set.add('e');
 | 
| +      set.add('f');
 | 
| +    } else if (v === 'c') {
 | 
| +      set.add('b');
 | 
| +      set.delete('e');
 | 
| +    }
 | 
| +  }, receiver);
 | 
| +
 | 
| +  assertEquals('acdfb', buffer);
 | 
| +})();
 | 
| +
 | 
| +
 | 
| +(function TestSetForEachAddAtEnd() {
 | 
| +  var set = new Set();
 | 
| +  set.add('a');
 | 
| +  set.add('b');
 | 
| +
 | 
| +  var buffer = '';
 | 
| +  set.forEach(function(v) {
 | 
| +    buffer += v;
 | 
| +    if (v === 'b') {
 | 
| +      set.add('c');
 | 
| +    }
 | 
| +  });
 | 
| +
 | 
| +  assertEquals('abc', buffer);
 | 
| +})();
 | 
| +
 | 
| +
 | 
| +(function TestSetForEachDeleteNext() {
 | 
| +  var set = new Set();
 | 
| +  set.add('a');
 | 
| +  set.add('b');
 | 
| +  set.add('c');
 | 
| +
 | 
| +  var buffer = '';
 | 
| +  set.forEach(function(v) {
 | 
| +    buffer += v;
 | 
| +    if (v === 'b') {
 | 
| +      set.delete('c');
 | 
| +    }
 | 
| +  });
 | 
| +
 | 
| +  assertEquals('ab', buffer);
 | 
| +})();
 | 
| +
 | 
| +
 | 
| +(function TestSetForEachDeleteVisitedAndAddAgain() {
 | 
| +  var set = new Set();
 | 
| +  set.add('a');
 | 
| +  set.add('b');
 | 
| +  set.add('c');
 | 
| +
 | 
| +  var buffer = '';
 | 
| +  set.forEach(function(v) {
 | 
| +    buffer += v;
 | 
| +    if (v === 'b') {
 | 
| +      set.delete('a');
 | 
| +    } else if (v === 'c') {
 | 
| +      set.add('a');
 | 
| +    }
 | 
| +  });
 | 
| +
 | 
| +  assertEquals('abca', buffer);
 | 
| +})();
 | 
| +
 | 
| +
 | 
| +(function TestSetForEachClear() {
 | 
| +  var set = new Set();
 | 
| +  set.add('a');
 | 
| +  set.add('b');
 | 
| +  set.add('c');
 | 
| +
 | 
| +  var buffer = '';
 | 
| +  set.forEach(function(v) {
 | 
| +    buffer += v;
 | 
| +    if (v === 'a') {
 | 
| +      set.clear();
 | 
| +      set.add('d');
 | 
| +      set.add('e');
 | 
| +    }
 | 
| +  });
 | 
| +
 | 
| +  assertEquals('ade', buffer);
 | 
| +})();
 | 
| +
 | 
| +
 | 
| +(function TestSetForEachNested() {
 | 
| +  var set = new Set();
 | 
| +  set.add('a');
 | 
| +  set.add('b');
 | 
| +  set.add('c');
 | 
| +
 | 
| +  var buffer = '';
 | 
| +  set.forEach(function(v) {
 | 
| +    buffer += v;
 | 
| +    set.forEach(function(v) {
 | 
| +      buffer += v;
 | 
| +      if (v === 'a') {
 | 
| +        set.delete('b');
 | 
| +      }
 | 
| +    });
 | 
| +  });
 | 
| +
 | 
| +  assertEquals('aaccac', buffer);
 | 
| +})();
 | 
| +
 | 
| +
 | 
| +(function TestSetForEachEarlyExit() {
 | 
| +  var set = new Set();
 | 
| +  set.add('a');
 | 
| +  set.add('b');
 | 
| +  set.add('c');
 | 
| +
 | 
| +  var buffer = '';
 | 
| +  var ex = {};
 | 
| +  try {
 | 
| +    set.forEach(function(v) {
 | 
| +      buffer += v;
 | 
| +      throw ex;
 | 
| +    });
 | 
| +  } catch (e) {
 | 
| +    assertEquals(ex, e);
 | 
| +  }
 | 
| +  assertEquals('a', buffer);
 | 
| +})();
 | 
| +
 | 
| +
 | 
| +(function TestMapForEachInvalidTypes() {
 | 
| +  assertThrows(function() {
 | 
| +    Map.prototype.map.forEach.call({});
 | 
| +  }, TypeError);
 | 
| +
 | 
| +  var map = new Map();
 | 
| +  assertThrows(function() {
 | 
| +    map.forEach({});
 | 
| +  }, TypeError);
 | 
| +})();
 | 
| +
 | 
| +
 | 
| +(function TestMapForEach() {
 | 
| +  var map = new Map();
 | 
| +  map.set(0, 'a');
 | 
| +  map.set(1, 'b');
 | 
| +  map.set(2, 'c');
 | 
| +
 | 
| +  var buffer = [];
 | 
| +  var receiver = {};
 | 
| +  map.forEach(function(v, k, m) {
 | 
| +    assertEquals(map, m);
 | 
| +    assertEquals(this, receiver);
 | 
| +    buffer.push(k, v);
 | 
| +    if (k === 0) {
 | 
| +      map.delete(1);
 | 
| +      map.set(3, 'd');
 | 
| +      map.set(4, 'e');
 | 
| +      map.set(5, 'f');
 | 
| +    } else if (k === 2) {
 | 
| +      map.set(1, 'B');
 | 
| +      map.delete(4);
 | 
| +    }
 | 
| +  }, receiver);
 | 
| +
 | 
| +  assertArrayEquals([0, 'a', 2, 'c', 3, 'd', 5, 'f', 1, 'B'], buffer);
 | 
| +})();
 | 
| +
 | 
| +
 | 
| +(function TestMapForEachAddAtEnd() {
 | 
| +  var map = new Map();
 | 
| +  map.set(0, 'a');
 | 
| +  map.set(1, 'b');
 | 
| +
 | 
| +  var buffer = [];
 | 
| +  map.forEach(function(v, k) {
 | 
| +    buffer.push(k, v);
 | 
| +    if (k === 1) {
 | 
| +      map.set(2, 'c');
 | 
| +    }
 | 
| +  });
 | 
| +
 | 
| +  assertArrayEquals([0, 'a', 1, 'b', 2, 'c'], buffer);
 | 
| +})();
 | 
| +
 | 
| +
 | 
| +(function TestMapForEachDeleteNext() {
 | 
| +  var map = new Map();
 | 
| +  map.set(0, 'a');
 | 
| +  map.set(1, 'b');
 | 
| +  map.set(2, 'c');
 | 
| +
 | 
| +  var buffer = [];
 | 
| +  map.forEach(function(v, k) {
 | 
| +    buffer.push(k, v);
 | 
| +    if (k === 1) {
 | 
| +      map.delete(2);
 | 
| +    }
 | 
| +  });
 | 
| +
 | 
| +  assertArrayEquals([0, 'a', 1, 'b'], buffer);
 | 
| +})();
 | 
| +
 | 
| +
 | 
| +(function TestSetForEachDeleteVisitedAndAddAgain() {
 | 
| +  var map = new Map();
 | 
| +  map.set(0, 'a');
 | 
| +  map.set(1, 'b');
 | 
| +  map.set(2, 'c');
 | 
| +
 | 
| +  var buffer = [];
 | 
| +  map.forEach(function(v, k) {
 | 
| +    buffer.push(k, v);
 | 
| +    if (k === 1) {
 | 
| +      map.delete(0);
 | 
| +    } else if (k === 2) {
 | 
| +      map.set(0, 'a');
 | 
| +    }
 | 
| +  });
 | 
| +
 | 
| +  assertArrayEquals([0, 'a', 1, 'b', 2, 'c', 0, 'a'], buffer);
 | 
| +})();
 | 
| +
 | 
| +
 | 
| +(function TestMapForEachClear() {
 | 
| +  var map = new Map();
 | 
| +  map.set(0, 'a');
 | 
| +  map.set(1, 'b');
 | 
| +  map.set(2, 'c');
 | 
| +
 | 
| +  var buffer = [];
 | 
| +  map.forEach(function(v, k) {
 | 
| +    buffer.push(k, v);
 | 
| +    if (k === 0) {
 | 
| +      map.clear();
 | 
| +      map.set(3, 'd');
 | 
| +      map.set(4, 'e');
 | 
| +    }
 | 
| +  });
 | 
| +
 | 
| +  assertArrayEquals([0, 'a', 3, 'd', 4, 'e'], buffer);
 | 
| +})();
 | 
| +
 | 
| +
 | 
| +(function TestMapForEachNested() {
 | 
| +  var map = new Map();
 | 
| +  map.set(0, 'a');
 | 
| +  map.set(1, 'b');
 | 
| +  map.set(2, 'c');
 | 
| +
 | 
| +  var buffer = [];
 | 
| +  map.forEach(function(v, k) {
 | 
| +    buffer.push(k, v);
 | 
| +    map.forEach(function(v, k) {
 | 
| +      buffer.push(k, v);
 | 
| +      if (k === 0) {
 | 
| +        map.delete(1);
 | 
| +      }
 | 
| +    });
 | 
| +  });
 | 
| +
 | 
| +  assertArrayEquals([0, 'a', 0, 'a', 2, 'c', 2, 'c', 0, 'a', 2, 'c'], buffer);
 | 
| +})();
 | 
| +
 | 
| +
 | 
| +(function TestMapForEachEarlyExit() {
 | 
| +  var map = new Map();
 | 
| +  map.set(0, 'a');
 | 
| +  map.set(1, 'b');
 | 
| +  map.set(2, 'c');
 | 
| +
 | 
| +  var buffer = [];
 | 
| +  var ex = {};
 | 
| +  try {
 | 
| +    map.forEach(function(v, k) {
 | 
| +      buffer.push(k, v);
 | 
| +      throw ex;
 | 
| +    });
 | 
| +  } catch (e) {
 | 
| +    assertEquals(ex, e);
 | 
| +  }
 | 
| +  assertArrayEquals([0, 'a'], buffer);
 | 
| +})();
 | 
| 
 |