Use for-of loops in collection constructors

This is to reduce code duplication but also to get the correct
behavior when we make for-of handle abrupt completion correctly.

BUG=None
LOG=N
R=adamk

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

Cr-Commit-Position: refs/heads/master@{#26834}
This commit is contained in:
arv 2015-02-24 11:12:35 -08:00 committed by Commit bot
parent bf3691ae88
commit 8ad35cb288
2 changed files with 22 additions and 62 deletions

View File

@ -20,26 +20,17 @@ function SetConstructor(iterable) {
throw MakeTypeError('constructor_not_function', ['Set']);
}
var iter, adder;
%_SetInitialize(this);
if (!IS_NULL_OR_UNDEFINED(iterable)) {
adder = this.add;
var adder = this.add;
if (!IS_SPEC_FUNCTION(adder)) {
throw MakeTypeError('property_not_function', ['add', this]);
}
iter = GetIterator(iterable);
}
%_SetInitialize(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]);
for (var value of iterable) {
%_CallFunction(this, value, adder);
}
%_CallFunction(this, next.value, adder);
}
}
@ -160,30 +151,20 @@ function MapConstructor(iterable) {
throw MakeTypeError('constructor_not_function', ['Map']);
}
var iter, adder;
%_MapInitialize(this);
if (!IS_NULL_OR_UNDEFINED(iterable)) {
adder = this.set;
var adder = this.set;
if (!IS_SPEC_FUNCTION(adder)) {
throw MakeTypeError('property_not_function', ['set', this]);
}
iter = GetIterator(iterable);
}
%_MapInitialize(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]);
for (var nextItem of iterable) {
if (!IS_SPEC_OBJECT(nextItem)) {
throw MakeTypeError('iterator_value_not_an_object', [nextItem]);
}
%_CallFunction(this, nextItem[0], nextItem[1], adder);
}
nextItem = next.value;
if (!IS_SPEC_OBJECT(nextItem)) {
throw MakeTypeError('iterator_value_not_an_object', [nextItem]);
}
%_CallFunction(this, nextItem[0], nextItem[1], adder);
}
}

View File

@ -20,30 +20,19 @@ function WeakMapConstructor(iterable) {
throw MakeTypeError('constructor_not_function', ['WeakMap']);
}
var iter, adder;
%WeakCollectionInitialize(this);
if (!IS_NULL_OR_UNDEFINED(iterable)) {
adder = this.set;
var adder = this.set;
if (!IS_SPEC_FUNCTION(adder)) {
throw MakeTypeError('property_not_function', ['set', this]);
}
iter = GetIterator(iterable);
}
%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]);
for (var nextItem of iterable) {
if (!IS_SPEC_OBJECT(nextItem)) {
throw MakeTypeError('iterator_value_not_an_object', [nextItem]);
}
%_CallFunction(this, nextItem[0], nextItem[1], adder);
}
nextItem = next.value;
if (!IS_SPEC_OBJECT(nextItem)) {
throw MakeTypeError('iterator_value_not_an_object', [nextItem]);
}
%_CallFunction(this, nextItem[0], nextItem[1], adder);
}
}
@ -127,26 +116,16 @@ function WeakSetConstructor(iterable) {
throw MakeTypeError('constructor_not_function', ['WeakSet']);
}
var iter, adder;
%WeakCollectionInitialize(this);
if (!IS_NULL_OR_UNDEFINED(iterable)) {
adder = this.add;
var adder = this.add;
if (!IS_SPEC_FUNCTION(adder)) {
throw MakeTypeError('property_not_function', ['add', this]);
}
iter = GetIterator(iterable);
}
%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]);
for (var value of iterable) {
%_CallFunction(this, value, adder);
}
%_CallFunction(this, next.value, adder);
}
}