| |
| function createIterator(callback) { |
| var array = [0,1,2,3,4,5]; |
| var iterator = array[Symbol.iterator](); |
| iterator.return = function () { |
| ++iterator.returned; |
| if (callback) |
| return callback(this); |
| return { done: true, value: undefined }; |
| }; |
| iterator.returned = 0; |
| return iterator; |
| } |
| |
| (function test() { |
| var outerIterator = createIterator(); |
| var innerIterator = createIterator(); |
| outer: for (var e1 of outerIterator) { |
| inner: for (var e2 of innerIterator) { |
| break outer; |
| } |
| } |
| if (innerIterator.returned !== 1) |
| throw new Error("bad value: " + innerIterator.returned); |
| if (outerIterator.returned !== 1) |
| throw new Error("bad value: " + outerIterator.returned); |
| }()); |
| |
| (function test() { |
| var outerIterator = createIterator(); |
| var innerIterator = createIterator(); |
| outer: for (var e1 of outerIterator) { |
| inner: for (var e2 of innerIterator) { |
| break inner; |
| } |
| } |
| if (innerIterator.returned !== 6) |
| throw new Error("bad value: " + innerIterator.returned); |
| if (outerIterator.returned !== 0) |
| throw new Error("bad value: " + outerIterator.returned); |
| }()); |
| |
| (function test() { |
| var outerIterator = createIterator(); |
| var innerIterator = createIterator(); |
| outer: for (var e1 of outerIterator) { |
| inner: for (var e2 of innerIterator) { |
| break; |
| } |
| } |
| if (innerIterator.returned !== 6) |
| throw new Error("bad value: " + innerIterator.returned); |
| if (outerIterator.returned !== 0) |
| throw new Error("bad value: " + outerIterator.returned); |
| }()); |
| |
| (function test() { |
| var outerIterator = createIterator(); |
| var innerIterator = createIterator(); |
| outer: for (var e1 of outerIterator) { |
| inner: for (var e2 of innerIterator) { |
| break; |
| } |
| } |
| if (innerIterator.returned !== 6) |
| throw new Error("bad value: " + innerIterator.returned); |
| if (outerIterator.returned !== 0) |
| throw new Error("bad value: " + outerIterator.returned); |
| }()); |
| |
| (function test() { |
| var outerIterator = createIterator(); |
| var innerIterator = createIterator(); |
| outer: for (var e1 of outerIterator) { |
| inner: for (var e2 of innerIterator) { |
| continue; |
| } |
| } |
| if (innerIterator.returned !== 0) |
| throw new Error("bad value: " + innerIterator.returned); |
| if (outerIterator.returned !== 0) |
| throw new Error("bad value: " + outerIterator.returned); |
| }()); |
| |
| (function test() { |
| var outerIterator = createIterator(); |
| var innerIterator = createIterator(); |
| outer: for (var e1 of outerIterator) { |
| inner: for (var e2 of innerIterator) { |
| continue inner; |
| } |
| } |
| if (innerIterator.returned !== 0) |
| throw new Error("bad value: " + innerIterator.returned); |
| if (outerIterator.returned !== 0) |
| throw new Error("bad value: " + outerIterator.returned); |
| }()); |
| |
| (function test() { |
| var outerIterator = createIterator(); |
| var innerIterator = createIterator(); |
| outer: for (var e1 of outerIterator) { |
| inner: for (var e2 of innerIterator) { |
| continue outer; |
| } |
| } |
| if (innerIterator.returned !== 6) |
| throw new Error("bad value: " + innerIterator.returned); |
| if (outerIterator.returned !== 0) |
| throw new Error("bad value: " + outerIterator.returned); |
| }()); |
| |
| (function test() { |
| var outerIterator = createIterator(); |
| var innerIterator = createIterator(); |
| (function () { |
| outer: for (var e1 of outerIterator) { |
| inner: for (var e2 of innerIterator) { |
| return; |
| } |
| } |
| }()); |
| if (innerIterator.returned !== 1) |
| throw new Error("bad value: " + innerIterator.returned); |
| if (outerIterator.returned !== 1) |
| throw new Error("bad value: " + outerIterator.returned); |
| }()); |
| |
| (function test() { |
| var outerIterator = createIterator(); |
| var innerIterator = createIterator(); |
| (function () { |
| outer: for (var e1 of outerIterator) { |
| inner: for (var e2 of innerIterator) { |
| } |
| return; |
| } |
| }()); |
| if (innerIterator.returned !== 0) |
| throw new Error("bad value: " + innerIterator.returned); |
| if (outerIterator.returned !== 1) |
| throw new Error("bad value: " + outerIterator.returned); |
| }()); |
| |
| |
| (function test() { |
| function raiseError() { |
| throw new Error("Cocoa"); |
| } |
| var outerIterator = createIterator(); |
| var innerIterator = createIterator(); |
| (function () { |
| var error = null; |
| try { |
| outer: for (var e1 of outerIterator) { |
| inner: for (var e2 of innerIterator) { |
| raiseError(); |
| } |
| } |
| } catch (e) { |
| error = e; |
| } |
| if (innerIterator.returned !== 1) |
| throw new Error("bad value: " + innerIterator.returned); |
| if (outerIterator.returned !== 1) |
| throw new Error("bad value: " + outerIterator.returned); |
| if (!error) |
| throw new Error("not thrown"); |
| if (String(error) !== "Error: Cocoa") |
| throw new Error("bad error: " + String(error)); |
| }()); |
| }()); |