--- /dev/null
+
+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);
+}());
+