| Index: src/weak_collection.js | 
| diff --git a/src/weak_collection.js b/src/weak_collection.js | 
| index d9666ca12850c222e62a930c9f03c64c1098cb37..73dd9de6ba9aa5c48d16596ffde2c015e1764673 100644 | 
| --- a/src/weak_collection.js | 
| +++ b/src/weak_collection.js | 
| @@ -15,12 +15,36 @@ var $WeakSet = global.WeakSet; | 
| // ------------------------------------------------------------------- | 
| // Harmony WeakMap | 
|  | 
| -function WeakMapConstructor() { | 
| -  if (%_IsConstructCall()) { | 
| -    %WeakCollectionInitialize(this); | 
| -  } else { | 
| +function WeakMapConstructor(iterable) { | 
| +  if (!%_IsConstructCall()) { | 
| throw MakeTypeError('constructor_not_function', ['WeakMap']); | 
| } | 
| + | 
| +  var iter, adder; | 
| + | 
| +  if (!IS_NULL_OR_UNDEFINED(iterable)) { | 
| +    iter = GetIterator(iterable); | 
| +    adder = this.set; | 
| +    if (!IS_SPEC_FUNCTION(adder)) { | 
| +      throw MakeTypeError('property_not_function', ['set', this]); | 
| +    } | 
| +  } | 
| + | 
| +  %WeakCollectionInitialize(this); | 
| + | 
| +  if (IS_UNDEFINED(iter)) return; | 
| + | 
| +  var next, done, nextItem; | 
| +  while (!(next = iter.next()).done) { | 
| +    if (!IS_SPEC_OBJECT(next)) { | 
| +      throw MakeTypeError('iterator_result_not_an_object', [next]); | 
| +    } | 
| +    nextItem = next.value; | 
| +    if (!IS_SPEC_OBJECT(nextItem)) { | 
| +      throw MakeTypeError('iterator_value_not_an_object', [nextItem]); | 
| +    } | 
| +    %_CallFunction(this, nextItem[0], nextItem[1], adder); | 
| +  } | 
| } | 
|  | 
|  | 
| @@ -107,12 +131,32 @@ SetUpWeakMap(); | 
| // ------------------------------------------------------------------- | 
| // Harmony WeakSet | 
|  | 
| -function WeakSetConstructor() { | 
| -  if (%_IsConstructCall()) { | 
| -    %WeakCollectionInitialize(this); | 
| -  } else { | 
| +function WeakSetConstructor(iterable) { | 
| +  if (!%_IsConstructCall()) { | 
| throw MakeTypeError('constructor_not_function', ['WeakSet']); | 
| } | 
| + | 
| +  var iter, adder; | 
| + | 
| +  if (!IS_NULL_OR_UNDEFINED(iterable)) { | 
| +    iter = GetIterator(iterable); | 
| +    adder = this.add; | 
| +    if (!IS_SPEC_FUNCTION(adder)) { | 
| +      throw MakeTypeError('property_not_function', ['add', this]); | 
| +    } | 
| +  } | 
| + | 
| +  %WeakCollectionInitialize(this); | 
| + | 
| +  if (IS_UNDEFINED(iter)) return; | 
| + | 
| +  var next, done; | 
| +  while (!(next = iter.next()).done) { | 
| +    if (!IS_SPEC_OBJECT(next)) { | 
| +      throw MakeTypeError('iterator_result_not_an_object', [next]); | 
| +    } | 
| +    %_CallFunction(this, next.value, adder); | 
| +  } | 
| } | 
|  | 
|  | 
|  |