X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/2d39b0e377c0896910ee49ae70082ba665faf986..ed1e77d3adeb83d26fd1dfb16dd84cabdcefd250:/tests/stress/raise-error-in-iterator-close.js diff --git a/tests/stress/raise-error-in-iterator-close.js b/tests/stress/raise-error-in-iterator-close.js new file mode 100644 index 0000000..88f6e86 --- /dev/null +++ b/tests/stress/raise-error-in-iterator-close.js @@ -0,0 +1,118 @@ + +function createIterator(callback) { + var array = [0,1,2,3,4,5]; + var iterator = array[Symbol.iterator](); + iterator.return = function () { + iterator.returned = true; + if (callback) + return callback(this); + return { done: true, value: undefined }; + }; + iterator.returned = false; + return iterator; +} + +(function test() { + var outerIterator = createIterator(); + var innerIterator = createIterator(function () { + throw new Error("Inner return called."); + }); + var error = null; + try { + outer: for (var e1 of outerIterator) { + inner: for (var e2 of innerIterator) { + break; + } + } + } catch (e) { + error = e; + } + if (!error) + throw new Error("no error"); + if (String(error) !== "Error: Inner return called.") + throw new Error("bad error: " + String(error)); + if (!innerIterator.returned) + throw new Error("bad value: " + innerIterator.returned); + if (!outerIterator.returned) + throw new Error("bad value: " + outerIterator.returned); +}()); + +(function test() { + var outerIterator = createIterator(function () { + throw new Error("Outer return called."); + }); + var innerIterator = createIterator(function () { + throw new Error("Inner return called."); + }); + var error = null; + try { + outer: for (var e1 of outerIterator) { + inner: for (var e2 of innerIterator) { + break; + } + } + } catch (e) { + error = e; + } + if (!error) + throw new Error("no error"); + if (String(error) !== "Error: Inner return called.") + throw new Error("bad error: " + String(error)); + if (!innerIterator.returned) + throw new Error("bad value: " + innerIterator.returned); + if (!outerIterator.returned) + throw new Error("bad value: " + outerIterator.returned); +}()); + +(function test() { + var outerIterator = createIterator(function () { + throw new Error("Outer return called."); + }); + var innerIterator = createIterator(); + var error = null; + try { + outer: for (var e1 of outerIterator) { + inner: for (var e2 of innerIterator) { + break outer; + } + } + } catch (e) { + error = e; + } + if (!error) + throw new Error("no error"); + if (String(error) !== "Error: Outer return called.") + throw new Error("bad error: " + String(error)); + if (!innerIterator.returned) + throw new Error("bad value: " + innerIterator.returned); + if (!outerIterator.returned) + throw new Error("bad value: " + outerIterator.returned); +}()); + +(function test() { + var outerIterator = createIterator(function () { + throw new Error("Outer return called."); + }); + var innerIterator = createIterator(function () { + throw new Error("Inner return called."); + }); + var error = null; + try { + outer: for (var e1 of outerIterator) { + inner: for (var e2 of innerIterator) { + throw new Error("Loop raises error."); + } + } + } catch (e) { + error = e; + } + if (!error) + throw new Error("no error"); + if (String(error) !== "Error: Loop raises error.") + throw new Error("bad error: " + String(error)); + if (!innerIterator.returned) + throw new Error("bad value: " + innerIterator.returned); + if (!outerIterator.returned) + throw new Error("bad value: " + outerIterator.returned); +}()); +