]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - tests/stress/raise-error-in-iterator-close.js
JavaScriptCore-7601.1.46.3.tar.gz
[apple/javascriptcore.git] / 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 (file)
index 0000000..88f6e86
--- /dev/null
@@ -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);
+}());
+