Source code

Revision control

Copy as Markdown

Other Tools

var BUGNUMBER = 1184922;
var summary = "iterator.next() should not be called when after iterator completes";
print(BUGNUMBER + ": " + summary);
var log;
function reset() {
log = "";
}
var obj = new Proxy({}, {
set(that, name, value) {
var v;
if (value instanceof Function || value instanceof RegExp)
v = value.toString();
else
v = JSON.stringify(value);
log += "set:" + name + "=" + v + ",";
}
});
function createIterable(n) {
return {
i: 0,
[Symbol.iterator]() {
return this;
},
next() {
log += "next,";
this.i++;
if (this.i <= n)
return {value: this.i, done: false};
return {value: 0, done: true};
}
};
}
// Simple pattern.
reset();
[obj.a, obj.b, obj.c] = createIterable(0);
assertEq(log,
"next," +
"set:a=undefined," +
"set:b=undefined," +
"set:c=undefined,");
reset();
[obj.a, obj.b, obj.c] = createIterable(1);
assertEq(log,
"next," +
"set:a=1," +
"next," +
"set:b=undefined," +
"set:c=undefined,");
reset();
[obj.a, obj.b, obj.c] = createIterable(2);
assertEq(log,
"next," +
"set:a=1," +
"next," +
"set:b=2," +
"next," +
"set:c=undefined,");
reset();
[obj.a, obj.b, obj.c] = createIterable(3);
assertEq(log,
"next," +
"set:a=1," +
"next," +
"set:b=2," +
"next," +
"set:c=3,");
// Elision.
reset();
[obj.a, , obj.b, , , obj.c, ,] = createIterable(0);
assertEq(log,
"next," +
"set:a=undefined," +
"set:b=undefined," +
"set:c=undefined,");
reset();
[obj.a, , obj.b, , , obj.c, ,] = createIterable(1);
assertEq(log,
"next," +
"set:a=1," +
"next," +
"set:b=undefined," +
"set:c=undefined,");
reset();
[obj.a, , obj.b, , , obj.c, ,] = createIterable(2);
assertEq(log,
"next," +
"set:a=1," +
"next," +
"next," +
"set:b=undefined," +
"set:c=undefined,");
reset();
[obj.a, , obj.b, , , obj.c, ,] = createIterable(3);
assertEq(log,
"next," +
"set:a=1," +
"next," +
"next," +
"set:b=3," +
"next," +
"set:c=undefined,");
reset();
[obj.a, , obj.b, , , obj.c, ,] = createIterable(4);
assertEq(log,
"next," +
"set:a=1," +
"next," +
"next," +
"set:b=3," +
"next," +
"next," +
"set:c=undefined,");
reset();
[obj.a, , obj.b, , , obj.c, ,] = createIterable(5);
assertEq(log,
"next," +
"set:a=1," +
"next," +
"next," +
"set:b=3," +
"next," +
"next," +
"next," +
"set:c=undefined,");
reset();
[obj.a, , obj.b, , , obj.c, ,] = createIterable(6);
assertEq(log,
"next," +
"set:a=1," +
"next," +
"next," +
"set:b=3," +
"next," +
"next," +
"next," +
"set:c=6," +
"next,");
reset();
[obj.a, , obj.b, , , obj.c, ,] = createIterable(7);
assertEq(log,
"next," +
"set:a=1," +
"next," +
"next," +
"set:b=3," +
"next," +
"next," +
"next," +
"set:c=6," +
"next,");
// Rest.
reset();
[...obj.r] = createIterable(0);
assertEq(log,
"next," +
"set:r=[],");
reset();
[...obj.r] = createIterable(1);
assertEq(log,
"next," +
"next," +
"set:r=[1],");
reset();
[obj.a, ...obj.r] = createIterable(0);
assertEq(log,
"next," +
"set:a=undefined," +
"set:r=[],");
reset();
[obj.a, ...obj.r] = createIterable(1);
assertEq(log,
"next," +
"set:a=1," +
"next," +
"set:r=[],");
reset();
[obj.a, ...obj.r] = createIterable(2);
assertEq(log,
"next," +
"set:a=1," +
"next," +
"next," +
"set:r=[2],");
reset();
[obj.a, obj.b, ...obj.r] = createIterable(0);
assertEq(log,
"next," +
"set:a=undefined," +
"set:b=undefined," +
"set:r=[],");
reset();
[obj.a, obj.b, ...obj.r] = createIterable(1);
assertEq(log,
"next," +
"set:a=1," +
"next," +
"set:b=undefined," +
"set:r=[],");
reset();
[obj.a, obj.b, ...obj.r] = createIterable(2);
assertEq(log,
"next," +
"set:a=1," +
"next," +
"set:b=2," +
"next," +
"set:r=[],");
reset();
[obj.a, obj.b, ...obj.r] = createIterable(3);
assertEq(log,
"next," +
"set:a=1," +
"next," +
"set:b=2," +
"next," +
"next," +
"set:r=[3],");
// Rest and elision.
reset();
[, ...obj.r] = createIterable(0);
assertEq(log,
"next," +
"set:r=[],");
reset();
[, ...obj.r] = createIterable(1);
assertEq(log,
"next," +
"next," +
"set:r=[],");
reset();
[, ...obj.r] = createIterable(2);
assertEq(log,
"next," +
"next," +
"next," +
"set:r=[2],");
reset();
[obj.a, obj.b, , ...obj.r] = createIterable(0);
assertEq(log,
"next," +
"set:a=undefined," +
"set:b=undefined," +
"set:r=[],");
reset();
[obj.a, obj.b, , ...obj.r] = createIterable(1);
assertEq(log,
"next," +
"set:a=1," +
"next," +
"set:b=undefined," +
"set:r=[],");
reset();
[obj.a, obj.b, , ...obj.r] = createIterable(2);
assertEq(log,
"next," +
"set:a=1," +
"next," +
"set:b=2," +
"next," +
"set:r=[],");
reset();
[obj.a, obj.b, , ...obj.r] = createIterable(3);
assertEq(log,
"next," +
"set:a=1," +
"next," +
"set:b=2," +
"next," +
"next," +
"set:r=[],");
reset();
[obj.a, obj.b, , ...obj.r] = createIterable(4);
assertEq(log,
"next," +
"set:a=1," +
"next," +
"set:b=2," +
"next," +
"next," +
"next," +
"set:r=[4],");
if (typeof reportCompare === "function")
reportCompare(true, true);