From 3bf565277426cf9fa3d99b21bfbf53500122749d Mon Sep 17 00:00:00 2001
From: Mike Pennisi <mike@mikepennisi.com>
Date: Tue, 7 Apr 2015 14:50:43 -0400
Subject: [PATCH] Improve `for..of` control flow tests

- Expand ambiguous assertion messages and assert execution paths more
  finely.
- Improve variable names in `for..of` tests
  While the object created by a GeneratorFunction may be considered an
  "iterable", it is being used as an iterator in these tests. Naming the
  variable according to the way it is used improves the readability of
  the test body.
- Add 'features' attribute to test frontmatter
- Move tests
- Introduce additional `for..of` control flow tests
---
 .../for-of/Array.prototype.Symbol.iterator.js |  0
 .../for-of/Array.prototype.entries.js         |  0
 .../for-of/Array.prototype.keys.js            |  0
 .../language/{ => statements}/for-of/array.js |  0
 .../for-of/break-from-catch.js                | 12 ++--
 .../statements/for-of/break-from-finally.js   | 30 +++++++++
 .../{ => statements}/for-of/break-from-try.js | 15 +++--
 .../for-of/break-label-from-catch.js          | 35 ++++++++++
 .../for-of/break-label-from-finally.js        | 34 ++++++++++
 .../statements/for-of/break-label-from-try.js | 33 ++++++++++
 .../{ => statements}/for-of/break-label.js    | 11 ++--
 .../language/{ => statements}/for-of/break.js |  7 +-
 .../for-of/continue-from-catch.js             | 11 ++--
 .../for-of/continue-from-finally.js           | 32 ++++++++++
 .../for-of/continue-from-try.js               | 12 ++--
 .../for-of/continue-label-from-catch.js       | 38 +++++++++++
 .../for-of/continue-label-from-finally.js     | 40 ++++++++++++
 .../for-of/continue-label-from-try.js         | 35 ++++++++++
 .../{ => statements}/for-of/continue-label.js |  5 +-
 .../{ => statements}/for-of/continue.js       |  5 +-
 .../{ => statements}/for-of/generator.js      |  0
 .../for-of/generic-iterable.js                |  0
 .../for-of/head-expr-obj-iterator-method.js   |  0
 .../head-expr-primitive-iterator-method.js    |  0
 .../for-of/head-expr-to-obj.js                |  0
 .../for-of/iterator-as-proxy.js               |  0
 .../for-of/iterator-next-reference.js         |  0
 .../for-of/iterator-next-result-done-attr.js  |  0
 .../for-of/iterator-next-result-type.js       |  0
 .../for-of/iterator-next-result-value-attr.js |  0
 .../{ => statements}/for-of/nested.js         |  0
 .../statements/for-of/return-from-catch.js    | 36 +++++++++++
 .../statements/for-of/return-from-finally.js  | 35 ++++++++++
 .../statements/for-of/return-from-try.js      | 36 +++++++++++
 .../{ => statements}/for-of/return.js         | 11 ++--
 .../statements/for-of/throw-from-catch.js     | 37 +++++++++++
 .../statements/for-of/throw-from-finally.js   | 36 +++++++++++
 test/language/statements/for-of/throw.js      | 30 +++++++++
 .../statements/for-of/yield-from-catch.js     | 52 +++++++++++++++
 .../statements/for-of/yield-from-finally.js   | 50 +++++++++++++++
 .../statements/for-of/yield-from-try.js       | 49 ++++++++++++++
 .../for-of/yield-star-from-catch.js           | 64 +++++++++++++++++++
 .../for-of/yield-star-from-finally.js         | 62 ++++++++++++++++++
 .../statements/for-of/yield-star-from-try.js  | 61 ++++++++++++++++++
 test/language/statements/for-of/yield-star.js | 51 +++++++++++++++
 test/language/statements/for-of/yield.js      | 41 ++++++++++++
 46 files changed, 968 insertions(+), 38 deletions(-)
 rename test/language/{ => statements}/for-of/Array.prototype.Symbol.iterator.js (100%)
 rename test/language/{ => statements}/for-of/Array.prototype.entries.js (100%)
 rename test/language/{ => statements}/for-of/Array.prototype.keys.js (100%)
 rename test/language/{ => statements}/for-of/array.js (100%)
 rename test/language/{ => statements}/for-of/break-from-catch.js (60%)
 create mode 100644 test/language/statements/for-of/break-from-finally.js
 rename test/language/{ => statements}/for-of/break-from-try.js (57%)
 create mode 100644 test/language/statements/for-of/break-label-from-catch.js
 create mode 100644 test/language/statements/for-of/break-label-from-finally.js
 create mode 100644 test/language/statements/for-of/break-label-from-try.js
 rename test/language/{ => statements}/for-of/break-label.js (58%)
 rename test/language/{ => statements}/for-of/break.js (73%)
 rename test/language/{ => statements}/for-of/continue-from-catch.js (67%)
 create mode 100644 test/language/statements/for-of/continue-from-finally.js
 rename test/language/{ => statements}/for-of/continue-from-try.js (64%)
 create mode 100644 test/language/statements/for-of/continue-label-from-catch.js
 create mode 100644 test/language/statements/for-of/continue-label-from-finally.js
 create mode 100644 test/language/statements/for-of/continue-label-from-try.js
 rename test/language/{ => statements}/for-of/continue-label.js (87%)
 rename test/language/{ => statements}/for-of/continue.js (84%)
 rename test/language/{ => statements}/for-of/generator.js (100%)
 rename test/language/{ => statements}/for-of/generic-iterable.js (100%)
 rename test/language/{ => statements}/for-of/head-expr-obj-iterator-method.js (100%)
 rename test/language/{ => statements}/for-of/head-expr-primitive-iterator-method.js (100%)
 rename test/language/{ => statements}/for-of/head-expr-to-obj.js (100%)
 rename test/language/{ => statements}/for-of/iterator-as-proxy.js (100%)
 rename test/language/{ => statements}/for-of/iterator-next-reference.js (100%)
 rename test/language/{ => statements}/for-of/iterator-next-result-done-attr.js (100%)
 rename test/language/{ => statements}/for-of/iterator-next-result-type.js (100%)
 rename test/language/{ => statements}/for-of/iterator-next-result-value-attr.js (100%)
 rename test/language/{ => statements}/for-of/nested.js (100%)
 create mode 100644 test/language/statements/for-of/return-from-catch.js
 create mode 100644 test/language/statements/for-of/return-from-finally.js
 create mode 100644 test/language/statements/for-of/return-from-try.js
 rename test/language/{ => statements}/for-of/return.js (59%)
 create mode 100644 test/language/statements/for-of/throw-from-catch.js
 create mode 100644 test/language/statements/for-of/throw-from-finally.js
 create mode 100644 test/language/statements/for-of/throw.js
 create mode 100644 test/language/statements/for-of/yield-from-catch.js
 create mode 100644 test/language/statements/for-of/yield-from-finally.js
 create mode 100644 test/language/statements/for-of/yield-from-try.js
 create mode 100644 test/language/statements/for-of/yield-star-from-catch.js
 create mode 100644 test/language/statements/for-of/yield-star-from-finally.js
 create mode 100644 test/language/statements/for-of/yield-star-from-try.js
 create mode 100644 test/language/statements/for-of/yield-star.js
 create mode 100644 test/language/statements/for-of/yield.js

diff --git a/test/language/for-of/Array.prototype.Symbol.iterator.js b/test/language/statements/for-of/Array.prototype.Symbol.iterator.js
similarity index 100%
rename from test/language/for-of/Array.prototype.Symbol.iterator.js
rename to test/language/statements/for-of/Array.prototype.Symbol.iterator.js
diff --git a/test/language/for-of/Array.prototype.entries.js b/test/language/statements/for-of/Array.prototype.entries.js
similarity index 100%
rename from test/language/for-of/Array.prototype.entries.js
rename to test/language/statements/for-of/Array.prototype.entries.js
diff --git a/test/language/for-of/Array.prototype.keys.js b/test/language/statements/for-of/Array.prototype.keys.js
similarity index 100%
rename from test/language/for-of/Array.prototype.keys.js
rename to test/language/statements/for-of/Array.prototype.keys.js
diff --git a/test/language/for-of/array.js b/test/language/statements/for-of/array.js
similarity index 100%
rename from test/language/for-of/array.js
rename to test/language/statements/for-of/array.js
diff --git a/test/language/for-of/break-from-catch.js b/test/language/statements/for-of/break-from-catch.js
similarity index 60%
rename from test/language/for-of/break-from-catch.js
rename to test/language/statements/for-of/break-from-catch.js
index 0e30fe7525..e1a3a2ab30 100644
--- a/test/language/for-of/break-from-catch.js
+++ b/test/language/statements/for-of/break-from-catch.js
@@ -5,25 +5,27 @@ es6id: 13.6.4.13 S5.n
 description: >
     Control flow during body evaluation should honor `break` statements within
     the `catch` block of `try` statements.
+features: [generators]
 ---*/
 
 function* values() {
   yield 1;
-  yield 1;
+  $ERROR('This code is unreachable (following `yield` statement).');
 }
-var iterable = values();
+var iterator = values();
 var i = 0;
 
-for (var x of iterable) {
-  i++;
+for (var x of iterator) {
 
   try {
     throw new Error();
   } catch (err) {
+    i++;
     break;
+    $ERROR('This code is unreachable (following `break` statement).');
   }
 
-  $ERROR('This code is unreachable.');
+  $ERROR('This code is unreachable (following `try` statement).');
 }
 
 assert.sameValue(i, 1);
diff --git a/test/language/statements/for-of/break-from-finally.js b/test/language/statements/for-of/break-from-finally.js
new file mode 100644
index 0000000000..27cbe5e515
--- /dev/null
+++ b/test/language/statements/for-of/break-from-finally.js
@@ -0,0 +1,30 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13 S5.n
+description: >
+    Control flow during body evaluation should honor `break` statements within
+    `finally` blocks.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  $ERROR('This code is unreachable (following `yield` statement).');
+}
+var iterator = values();
+var i = 0;
+
+for (var x of iterator) {
+  try {
+  } finally {
+    i++;
+    break;
+
+    $ERROR('This code is unreachable (following `break` statement).');
+  }
+
+  $ERROR('This code is unreachable (following `try` statement).');
+}
+
+assert.sameValue(i, 1);
diff --git a/test/language/for-of/break-from-try.js b/test/language/statements/for-of/break-from-try.js
similarity index 57%
rename from test/language/for-of/break-from-try.js
rename to test/language/statements/for-of/break-from-try.js
index aafe709b92..7ea701d701 100644
--- a/test/language/for-of/break-from-try.js
+++ b/test/language/statements/for-of/break-from-try.js
@@ -5,24 +5,25 @@ es6id: 13.6.4.13 S5.n
 description: >
     Control flow during body evaluation should honor `break` statements within
     `try` blocks.
+features: [generators]
 ---*/
 
 function* values() {
   yield 1;
-  yield 1;
+  $ERROR('This code is unreachable (following `yield` statement).');
 }
-var iterable = values();
+var iterator = values();
 var i = 0;
 
-for (var x of iterable) {
-  i++;
-
+for (var x of iterator) {
   try {
+    i++;
     break;
-    $ERROR('This code is unreachable.');
+
+    $ERROR('This code is unreachable (following `break` statement).');
   } catch (err) {}
 
-  $ERROR('This code is unreachable.');
+  $ERROR('This code is unreachable (following `try` statement).');
 }
 
 assert.sameValue(i, 1);
diff --git a/test/language/statements/for-of/break-label-from-catch.js b/test/language/statements/for-of/break-label-from-catch.js
new file mode 100644
index 0000000000..caa28f59f4
--- /dev/null
+++ b/test/language/statements/for-of/break-label-from-catch.js
@@ -0,0 +1,35 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13 S5.n
+description: >
+    Control flow during body evaluation should honor `break` statements within
+    `try` blocks.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  $ERROR('This code is unreachable (following `yield` statement).');
+}
+var iterator = values();
+var i = 0;
+
+outer:
+while (true) {
+  for (var x of iterator) {
+    try {
+      throw new Error();
+    } catch (err) {
+      i++;
+      break outer;
+      $ERROR('This code is unreachable (following `break` statement).');
+    }
+
+    $ERROR('This code is unreachable (following `try` statement).');
+  }
+
+  $ERROR('This code is unreachable (following `for..of` statement).');
+}
+
+assert.sameValue(i, 1);
diff --git a/test/language/statements/for-of/break-label-from-finally.js b/test/language/statements/for-of/break-label-from-finally.js
new file mode 100644
index 0000000000..1309775392
--- /dev/null
+++ b/test/language/statements/for-of/break-label-from-finally.js
@@ -0,0 +1,34 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13 S5.n
+description: >
+    Control flow during body evaluation should honor `break` statements within
+    `try` blocks.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  $ERROR('This code is unreachable (following `yield` statement).');
+}
+var iterator = values();
+var i = 0;
+
+outer:
+while (true) {
+  for (var x of iterator) {
+    try {
+    } finally {
+      i++;
+      break outer;
+      $ERROR('This code is unreachable (following `break` statement).');
+    }
+
+    $ERROR('This code is unreachable (following `try` statement).');
+  }
+
+  $ERROR('This code is unreachable (following `for..of` statement).');
+}
+
+assert.sameValue(i, 1);
diff --git a/test/language/statements/for-of/break-label-from-try.js b/test/language/statements/for-of/break-label-from-try.js
new file mode 100644
index 0000000000..9add8abfa4
--- /dev/null
+++ b/test/language/statements/for-of/break-label-from-try.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13 S5.n
+description: >
+    Control flow during body evaluation should honor `break` statements within
+    `try` blocks.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  $ERROR('This code is unreachable (following `yield` statement).');
+}
+var iterator = values();
+var i = 0;
+
+outer:
+while (true) {
+  for (var x of iterator) {
+    try {
+      i++;
+      break outer;
+      $ERROR('This code is unreachable (following `break` statement).');
+    } catch (err) {}
+
+    $ERROR('This code is unreachable (following `try` statement).');
+  }
+
+  $ERROR('This code is unreachable (following `for..of` statement).');
+}
+
+assert.sameValue(i, 1);
diff --git a/test/language/for-of/break-label.js b/test/language/statements/for-of/break-label.js
similarity index 58%
rename from test/language/for-of/break-label.js
rename to test/language/statements/for-of/break-label.js
index f68e9e6a64..931477837f 100644
--- a/test/language/for-of/break-label.js
+++ b/test/language/statements/for-of/break-label.js
@@ -5,24 +5,25 @@ es6id: 13.6.4.13 S5.n
 description: >
     Control flow during body evaluation should honor labeled `break`
     statements.
+features: [generators]
 ---*/
 
 function* values() {
   yield 1;
-  yield 1;
+  $ERROR('This code is unreachable (following `yield` statement).');
 }
-var iterable = values();
+var iterator = values();
 var i = 0;
 
 outer:
 while (true) {
-  for (var x of iterable) {
+  for (var x of iterator) {
     i++;
     break outer;
 
-    $ERROR('This code is unreachable.');
+    $ERROR('This code is unreachable (following `break` statement).');
   }
-  $ERROR('This code is unreachable.');
+  $ERROR('This code is unreachable (following `for..of` statement).');
 }
 
 assert.sameValue(i, 1);
diff --git a/test/language/for-of/break.js b/test/language/statements/for-of/break.js
similarity index 73%
rename from test/language/for-of/break.js
rename to test/language/statements/for-of/break.js
index bf3b1733fd..e986efa59e 100644
--- a/test/language/for-of/break.js
+++ b/test/language/statements/for-of/break.js
@@ -4,16 +4,17 @@
 es6id: 13.6.4.13 S5.n
 description: >
     Control flow during body evaluation should honor `break` statements.
+features: [generators]
 ---*/
 
 function* values() {
   yield 1;
-  yield 1;
+  $ERROR('This code is unreachable (following `yield` statement).');
 }
-var iterable = values();
+var iterator = values();
 var i = 0;
 
-for (var x of iterable) {
+for (var x of iterator) {
   i++;
   break;
 
diff --git a/test/language/for-of/continue-from-catch.js b/test/language/statements/for-of/continue-from-catch.js
similarity index 67%
rename from test/language/for-of/continue-from-catch.js
rename to test/language/statements/for-of/continue-from-catch.js
index 6db37d781b..287a28786b 100644
--- a/test/language/for-of/continue-from-catch.js
+++ b/test/language/statements/for-of/continue-from-catch.js
@@ -5,24 +5,27 @@ es6id: 13.6.4.13 S5.n
 description: >
     Control flow during body evaluation should honor `continue` statements
     within the `catch` block of `try` statements.
+features: [generators]
 ---*/
 
 function* values() {
   yield 1;
   yield 1;
 }
-var iterable = values();
+var iterator = values();
 var i = 0;
 
-for (var x of iterable) {
-  i++;
+for (var x of iterator) {
   try {
     throw new Error();
   } catch (err) {
+    i++;
     continue;
+
+    $ERROR('This code is unreachable (following `continue` statement).');
   }
 
-  $ERROR('This code is unreachable.');
+  $ERROR('This code is unreachable (following `try` statement).');
 }
 
 assert.sameValue(i, 2);
diff --git a/test/language/statements/for-of/continue-from-finally.js b/test/language/statements/for-of/continue-from-finally.js
new file mode 100644
index 0000000000..c998b1f714
--- /dev/null
+++ b/test/language/statements/for-of/continue-from-finally.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13 S5.n
+description: >
+    Control flow during body evaluation should honor `continue` statements
+    within the `finally` block of `try` statements.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  yield 1;
+}
+var iterator = values();
+var i = 0;
+
+for (var x of iterator) {
+  try {
+    throw new Error();
+  } catch (err) {
+  } finally {
+    i++;
+    continue;
+
+    $ERROR('This code is unreachable (following `continue` statement).');
+  }
+
+  $ERROR('This code is unreachable (following `try` statement).');
+}
+
+assert.sameValue(i, 2);
diff --git a/test/language/for-of/continue-from-try.js b/test/language/statements/for-of/continue-from-try.js
similarity index 64%
rename from test/language/for-of/continue-from-try.js
rename to test/language/statements/for-of/continue-from-try.js
index 1bde5899dc..17b465b70e 100644
--- a/test/language/for-of/continue-from-try.js
+++ b/test/language/statements/for-of/continue-from-try.js
@@ -5,23 +5,25 @@ es6id: 13.6.4.13 S5.n
 description: >
     Control flow during body evaluation should honor `continue` statements
     within `try` blocks.
+features: [generators]
 ---*/
 
 function* values() {
   yield 1;
   yield 1;
 }
-var iterable = values();
+var iterator = values();
 var i = 0;
 
-for (var x of iterable) {
-  i++;
+for (var x of iterator) {
   try {
+    i++;
     continue;
-    $ERROR('This code is unreachable.');
+
+    $ERROR('This code is unreachable (following `continue` statement).');
   } catch (err) {}
 
-  $ERROR('This code is unreachable.');
+  $ERROR('This code is unreachable (following `try` statement).');
 }
 
 assert.sameValue(i, 2);
diff --git a/test/language/statements/for-of/continue-label-from-catch.js b/test/language/statements/for-of/continue-label-from-catch.js
new file mode 100644
index 0000000000..431e86bc30
--- /dev/null
+++ b/test/language/statements/for-of/continue-label-from-catch.js
@@ -0,0 +1,38 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13 S5.n
+description: >
+    Control flow during body evaluation should honor `continue` statements
+    within the `catch` block of `try` statements.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  yield 1;
+}
+var iterator = values();
+var loop = true;
+var i = 0;
+
+outer:
+while (loop) {
+  loop = false;
+
+  for (var x of iterator) {
+    try {
+      throw new Error();
+    } catch (err) {
+      i++;
+      continue outer;
+      $ERROR('This code is unreachable (following `continue` statement).');
+    }
+
+    $ERROR('This code is unreachable (following `try` statement).');
+  }
+
+  $ERROR('This code is unreachable (following `for..of` statement).');
+}
+
+assert.sameValue(i, 1);
diff --git a/test/language/statements/for-of/continue-label-from-finally.js b/test/language/statements/for-of/continue-label-from-finally.js
new file mode 100644
index 0000000000..d3cad05021
--- /dev/null
+++ b/test/language/statements/for-of/continue-label-from-finally.js
@@ -0,0 +1,40 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13 S5.n
+description: >
+    Control flow during body evaluation should honor `continue` statements
+    within the `finally` block of `try` statements.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  yield 1;
+}
+var iterator = values();
+var loop = true;
+var i = 0;
+
+outer:
+while (loop) {
+  loop = false;
+
+  for (var x of iterator) {
+    try {
+      throw new Error();
+    } catch (err) {
+    } finally {
+      i++;
+      continue outer;
+
+      $ERROR('This code is unreachable (following `continue` statement).');
+    }
+
+    $ERROR('This code is unreachable (following `try` statement).');
+  }
+
+  $ERROR('This code is unreachable (following `for..of` statement).');
+}
+
+assert.sameValue(i, 1);
diff --git a/test/language/statements/for-of/continue-label-from-try.js b/test/language/statements/for-of/continue-label-from-try.js
new file mode 100644
index 0000000000..e34e45114f
--- /dev/null
+++ b/test/language/statements/for-of/continue-label-from-try.js
@@ -0,0 +1,35 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13 S5.n
+description: >
+    Control flow during body evaluation should honor `continue` statements
+    within `try` blocks.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  yield 1;
+}
+var iterator = values();
+var loop = true;
+var i = 0;
+
+outer:
+while (loop) {
+  loop = false;
+  for (var x of iterator) {
+    try {
+      i++;
+      continue outer;
+      $ERROR('This code is unreachable (following `continue` statement).');
+    } catch (err) {}
+
+    $ERROR('This code is unreachable (following `try` statment).');
+  }
+
+  $ERROR('This code is unreachable (following `for..of` statement).');
+}
+
+assert.sameValue(i, 1);
diff --git a/test/language/for-of/continue-label.js b/test/language/statements/for-of/continue-label.js
similarity index 87%
rename from test/language/for-of/continue-label.js
rename to test/language/statements/for-of/continue-label.js
index 157c6fd4e3..2b17757b3f 100644
--- a/test/language/for-of/continue-label.js
+++ b/test/language/statements/for-of/continue-label.js
@@ -5,12 +5,13 @@ es6id: 13.6.4.13 S5.n
 description: >
     Control flow during body evaluation should honor labeled `continue`
     statements.
+features: [generators]
 ---*/
 
 function* values() {
   yield 1;
 }
-var iterable = values();
+var iterator = values();
 var i = 0;
 var loop = true;
 
@@ -18,7 +19,7 @@ outer:
 while (loop) {
   loop = false;
 
-  for (var x of iterable) {
+  for (var x of iterator) {
     i++;
     continue outer;
 
diff --git a/test/language/for-of/continue.js b/test/language/statements/for-of/continue.js
similarity index 84%
rename from test/language/for-of/continue.js
rename to test/language/statements/for-of/continue.js
index f7be48eb89..4ac01b87ef 100644
--- a/test/language/for-of/continue.js
+++ b/test/language/statements/for-of/continue.js
@@ -4,16 +4,17 @@
 es6id: 13.6.4.13 S5.n
 description: >
     Control flow during body evaluation should honor `continue` statements.
+features: [generators]
 ---*/
 
 function* values() {
   yield 1;
   yield 1;
 }
-var iterable = values();
+var iterator = values();
 var i = 0;
 
-for (var x of iterable) {
+for (var x of iterator) {
   i++;
   continue;
 
diff --git a/test/language/for-of/generator.js b/test/language/statements/for-of/generator.js
similarity index 100%
rename from test/language/for-of/generator.js
rename to test/language/statements/for-of/generator.js
diff --git a/test/language/for-of/generic-iterable.js b/test/language/statements/for-of/generic-iterable.js
similarity index 100%
rename from test/language/for-of/generic-iterable.js
rename to test/language/statements/for-of/generic-iterable.js
diff --git a/test/language/for-of/head-expr-obj-iterator-method.js b/test/language/statements/for-of/head-expr-obj-iterator-method.js
similarity index 100%
rename from test/language/for-of/head-expr-obj-iterator-method.js
rename to test/language/statements/for-of/head-expr-obj-iterator-method.js
diff --git a/test/language/for-of/head-expr-primitive-iterator-method.js b/test/language/statements/for-of/head-expr-primitive-iterator-method.js
similarity index 100%
rename from test/language/for-of/head-expr-primitive-iterator-method.js
rename to test/language/statements/for-of/head-expr-primitive-iterator-method.js
diff --git a/test/language/for-of/head-expr-to-obj.js b/test/language/statements/for-of/head-expr-to-obj.js
similarity index 100%
rename from test/language/for-of/head-expr-to-obj.js
rename to test/language/statements/for-of/head-expr-to-obj.js
diff --git a/test/language/for-of/iterator-as-proxy.js b/test/language/statements/for-of/iterator-as-proxy.js
similarity index 100%
rename from test/language/for-of/iterator-as-proxy.js
rename to test/language/statements/for-of/iterator-as-proxy.js
diff --git a/test/language/for-of/iterator-next-reference.js b/test/language/statements/for-of/iterator-next-reference.js
similarity index 100%
rename from test/language/for-of/iterator-next-reference.js
rename to test/language/statements/for-of/iterator-next-reference.js
diff --git a/test/language/for-of/iterator-next-result-done-attr.js b/test/language/statements/for-of/iterator-next-result-done-attr.js
similarity index 100%
rename from test/language/for-of/iterator-next-result-done-attr.js
rename to test/language/statements/for-of/iterator-next-result-done-attr.js
diff --git a/test/language/for-of/iterator-next-result-type.js b/test/language/statements/for-of/iterator-next-result-type.js
similarity index 100%
rename from test/language/for-of/iterator-next-result-type.js
rename to test/language/statements/for-of/iterator-next-result-type.js
diff --git a/test/language/for-of/iterator-next-result-value-attr.js b/test/language/statements/for-of/iterator-next-result-value-attr.js
similarity index 100%
rename from test/language/for-of/iterator-next-result-value-attr.js
rename to test/language/statements/for-of/iterator-next-result-value-attr.js
diff --git a/test/language/for-of/nested.js b/test/language/statements/for-of/nested.js
similarity index 100%
rename from test/language/for-of/nested.js
rename to test/language/statements/for-of/nested.js
diff --git a/test/language/statements/for-of/return-from-catch.js b/test/language/statements/for-of/return-from-catch.js
new file mode 100644
index 0000000000..4e301aaa84
--- /dev/null
+++ b/test/language/statements/for-of/return-from-catch.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13
+description: >
+    Control flow during body evaluation should honor `return` statements within
+    the `catch` block of `try` statements.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  $ERROR('This code is unreachable (following `yield` statement).');
+}
+var iterator = values();
+var i = 0;
+
+var result = (function() {
+  for (var x of iterator) {
+    try {
+      throw new Error();
+    } catch(err) {
+      i++;
+      return 34;
+
+      $ERROR('This code is unreachable (following `return` statement).');
+    }
+
+    $ERROR('This code is unreachable (following `try` statement).');
+  }
+
+  $ERROR('This code is unreachable (following `for..in` statement).');
+})();
+
+assert.sameValue(result, 34);
+assert.sameValue(i, 1);
diff --git a/test/language/statements/for-of/return-from-finally.js b/test/language/statements/for-of/return-from-finally.js
new file mode 100644
index 0000000000..6825662c36
--- /dev/null
+++ b/test/language/statements/for-of/return-from-finally.js
@@ -0,0 +1,35 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13
+description: >
+    Control flow during body evaluation should honor `return` statements within
+    the `finally` block of `try` statements.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  $ERROR('This code is unreachable (following `yield` statement).');
+}
+var iterator = values();
+var i = 0;
+
+var result = (function() {
+  for (var x of iterator) {
+    try {
+    } finally {
+      i++;
+      return 34;
+
+      $ERROR('This code is unreachable (following `return` statement).');
+    }
+
+    $ERROR('This code is unreachable (following `try` statement).');
+  }
+
+  $ERROR('This code is unreachable (following `for..in` statement).');
+})();
+
+assert.sameValue(result, 34);
+assert.sameValue(i, 1);
diff --git a/test/language/statements/for-of/return-from-try.js b/test/language/statements/for-of/return-from-try.js
new file mode 100644
index 0000000000..7d6cef0a6c
--- /dev/null
+++ b/test/language/statements/for-of/return-from-try.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13
+description: >
+    Control flow during body evaluation should honor `return` statements within
+    `try` blocks.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  $ERROR('This code is unreachable (following `yield` statement).');
+}
+var iterator = values();
+var i = 0;
+
+var result = (function() {
+  for (var x of iterator) {
+    try {
+      i++;
+      return 34;
+
+      $ERROR('This code is unreachable (following `return` statement).');
+    } catch(err) {
+      $ERROR('This code is unreachable (within `catch` block).');
+    }
+
+    $ERROR('This code is unreachable (following `try` statement).');
+  }
+
+  $ERROR('This code is unreachable (following `for..in` statement).');
+})();
+
+assert.sameValue(result, 34);
+assert.sameValue(i, 1);
diff --git a/test/language/for-of/return.js b/test/language/statements/for-of/return.js
similarity index 59%
rename from test/language/for-of/return.js
rename to test/language/statements/for-of/return.js
index 2d79589019..e2e52448a3 100644
--- a/test/language/for-of/return.js
+++ b/test/language/statements/for-of/return.js
@@ -4,24 +4,25 @@
 es6id: 13.6.4.13
 description: >
     Control flow during body evaluation should honor `return` statements.
+features: [generators]
 ---*/
 
 function* values() {
   yield 1;
-  yield 1;
+  $ERROR('This code is unreachable (following `yield` statement).');
 }
-var iterable = values();
+var iterator = values();
 var i = 0;
 
 var result = (function() {
-  for (var x of iterable) {
+  for (var x of iterator) {
     i++;
     return 34;
 
-    $ERROR('This code is unreachable.');
+    $ERROR('This code is unreachable (following `return` statement).');
   }
 
-  $ERROR('This code is unreachable.');
+  $ERROR('This code is unreachable (following `for..of` statement).');
 })();
 
 assert.sameValue(result, 34);
diff --git a/test/language/statements/for-of/throw-from-catch.js b/test/language/statements/for-of/throw-from-catch.js
new file mode 100644
index 0000000000..50e3c5de53
--- /dev/null
+++ b/test/language/statements/for-of/throw-from-catch.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13
+description: >
+    Control flow during body evaluation should honor `throw` statements within
+    the `catch` block of `try` statements.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  $ERROR('This code is unreachable (following `yield` statement).');
+}
+var CustomError = function() {};
+var iterator = values();
+var i = 0;
+var error = new CustomError();
+
+assert.throws(CustomError, function() {
+  for (var x of iterator) {
+    try {
+      throw new Error();
+    } catch (err) {
+      i++;
+      throw error;
+
+      $ERROR('This code is unreachable (following `throw` statement).');
+    }
+
+    $ERROR('This code is unreachable (following `try` statement).');
+  }
+
+  $ERROR('This code is unreachable (following `for..in` statement).');
+});
+
+assert.sameValue(i, 1);
diff --git a/test/language/statements/for-of/throw-from-finally.js b/test/language/statements/for-of/throw-from-finally.js
new file mode 100644
index 0000000000..9351b12c3b
--- /dev/null
+++ b/test/language/statements/for-of/throw-from-finally.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13
+description: >
+    Control flow during body evaluation should honor `throw` statements within
+    the `finally` block of `try` statements.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  $ERROR('This code is unreachable (following `yield` statement).');
+}
+var CustomError = function() {};
+var iterator = values();
+var i = 0;
+var error = new CustomError();
+
+assert.throws(CustomError, function() {
+  for (var x of iterator) {
+    try {
+    } finally {
+      i++;
+      throw error;
+
+      $ERROR('This code is unreachable (following `throw` statement).');
+    }
+
+    $ERROR('This code is unreachable (following `try` statement).');
+  }
+
+  $ERROR('This code is unreachable (following `for..in` statement).');
+});
+
+assert.sameValue(i, 1);
diff --git a/test/language/statements/for-of/throw.js b/test/language/statements/for-of/throw.js
new file mode 100644
index 0000000000..1f088bc695
--- /dev/null
+++ b/test/language/statements/for-of/throw.js
@@ -0,0 +1,30 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13
+description: >
+    Control flow during body evaluation should honor `throw` statements.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  $ERROR('This code is unreachable (following `yield` statement).');
+}
+var CustomError = function() {};
+var iterator = values();
+var i = 0;
+var error = new CustomError();
+
+assert.throws(CustomError, function() {
+  for (var x of iterator) {
+    i++;
+    throw error;
+
+    $ERROR('This code is unreachable (following `throw` statement).');
+  }
+
+  $ERROR('This code is unreachable (following `for..in` statement).');
+});
+
+assert.sameValue(i, 1);
diff --git a/test/language/statements/for-of/yield-from-catch.js b/test/language/statements/for-of/yield-from-catch.js
new file mode 100644
index 0000000000..84c723d0f6
--- /dev/null
+++ b/test/language/statements/for-of/yield-from-catch.js
@@ -0,0 +1,52 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13
+description: >
+    Control flow during body evaluation should honor `yield` statements within
+    the `catch` block of `try` statements.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  yield 1;
+}
+var dataIterator = values();
+var controlIterator = (function*() {
+  for (var x of dataIterator) {
+    try {
+      throw new Error();
+      $ERROR('This code is unreachable.');
+    } catch (err) {
+      i++;
+      yield;
+      j++;
+    }
+    k++;
+  }
+
+  l++;
+})();
+var i = 0;
+var j = 0;
+var k = 0;
+var l = 0;
+
+controlIterator.next();
+assert.sameValue(i, 1, 'First iteration: pre-yield');
+assert.sameValue(j, 0, 'First iteration: post-yield');
+assert.sameValue(k, 0, 'First iteration: post-try');
+assert.sameValue(l, 0, 'First iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Second iteration: pre-yield');
+assert.sameValue(j, 1, 'Second iteration: post-yield');
+assert.sameValue(k, 1, 'Second iteration: post-try');
+assert.sameValue(l, 0, 'Second iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Third iteration: pre-yield');
+assert.sameValue(j, 2, 'Third iteration: post-yield');
+assert.sameValue(k, 2, 'Third iteration: post-try');
+assert.sameValue(l, 1, 'Third iteration: post-for-of');
diff --git a/test/language/statements/for-of/yield-from-finally.js b/test/language/statements/for-of/yield-from-finally.js
new file mode 100644
index 0000000000..90f2f9d504
--- /dev/null
+++ b/test/language/statements/for-of/yield-from-finally.js
@@ -0,0 +1,50 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13
+description: >
+    Control flow during body evaluation should honor `yield` statements within
+    the `finally` block of `try` statements.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  yield 1;
+}
+var dataIterator = values();
+var controlIterator = (function*() {
+  for (var x of dataIterator) {
+    try {
+    } finally {
+      i++;
+      yield;
+      j++;
+    }
+    k++;
+  }
+
+  l++;
+})();
+var i = 0;
+var j = 0;
+var k = 0;
+var l = 0;
+
+controlIterator.next();
+assert.sameValue(i, 1, 'First iteration: pre-yield');
+assert.sameValue(j, 0, 'First iteration: post-yield');
+assert.sameValue(k, 0, 'First iteration: post-try');
+assert.sameValue(l, 0, 'First iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Second iteration: pre-yield');
+assert.sameValue(j, 1, 'Second iteration: post-yield');
+assert.sameValue(k, 1, 'Second iteration: post-try');
+assert.sameValue(l, 0, 'Second iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Third iteration: pre-yield');
+assert.sameValue(j, 2, 'Third iteration: post-yield');
+assert.sameValue(k, 2, 'Third iteration: post-try');
+assert.sameValue(l, 1, 'Third iteration: post-for-of');
diff --git a/test/language/statements/for-of/yield-from-try.js b/test/language/statements/for-of/yield-from-try.js
new file mode 100644
index 0000000000..051dc53677
--- /dev/null
+++ b/test/language/statements/for-of/yield-from-try.js
@@ -0,0 +1,49 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13
+description: >
+    Control flow during body evaluation should honor `yield` statements within
+    `try` blocks.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  yield 1;
+}
+var dataIterator = values();
+var controlIterator = (function*() {
+  for (var x of dataIterator) {
+    try {
+      i++;
+      yield;
+      j++;
+    } catch (err) {}
+    k++;
+  }
+
+  l++;
+})();
+var i = 0;
+var j = 0;
+var k = 0;
+var l = 0;
+
+controlIterator.next();
+assert.sameValue(i, 1, 'First iteration: pre-yield');
+assert.sameValue(j, 0, 'First iteration: post-yield');
+assert.sameValue(k, 0, 'First iteration: post-try');
+assert.sameValue(l, 0, 'First iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Second iteration: pre-yield');
+assert.sameValue(j, 1, 'Second iteration: post-yield');
+assert.sameValue(k, 1, 'Second iteration: post-try');
+assert.sameValue(l, 0, 'Second iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Third iteration: pre-yield');
+assert.sameValue(j, 2, 'Third iteration: post-yield');
+assert.sameValue(k, 2, 'Third iteration: post-try');
+assert.sameValue(l, 1, 'Third iteration: post-for-of');
diff --git a/test/language/statements/for-of/yield-star-from-catch.js b/test/language/statements/for-of/yield-star-from-catch.js
new file mode 100644
index 0000000000..6fe33b7f6e
--- /dev/null
+++ b/test/language/statements/for-of/yield-star-from-catch.js
@@ -0,0 +1,64 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13
+description: >
+    Control flow during body evaluation should honor `yield *` statements
+    within the `catch` block of `try` statements.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  yield 1;
+}
+var dataIterator = values();
+var controlIterator = (function*() {
+  for (var x of dataIterator) {
+    try {
+      throw new Error();
+      $ERROR('This code is unreachable.');
+    } catch (err) {
+      i++;
+      yield * values();
+      j++;
+    }
+    k++;
+  }
+
+  l++;
+})();
+var i = 0;
+var j = 0;
+var k = 0;
+var l = 0;
+
+controlIterator.next();
+assert.sameValue(i, 1, 'First iteration: pre-yield');
+assert.sameValue(j, 0, 'First iteration: post-yield');
+assert.sameValue(k, 0, 'First iteration: post-try');
+assert.sameValue(l, 0, 'First iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 1, 'Second iteration: pre-yield');
+assert.sameValue(j, 0, 'Second iteration: post-yield');
+assert.sameValue(k, 0, 'Second iteration: post-try');
+assert.sameValue(l, 0, 'Second iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Third iteration: pre-yield');
+assert.sameValue(j, 1, 'Third iteration: post-yield');
+assert.sameValue(k, 1, 'Third iteration: post-try');
+assert.sameValue(l, 0, 'Third iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Fourth iteration: pre-yield');
+assert.sameValue(j, 1, 'Fourth iteration: post-yield');
+assert.sameValue(k, 1, 'Fourth iteration: post-try');
+assert.sameValue(l, 0, 'Fourth iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Fifth iteration: pre-yield');
+assert.sameValue(j, 2, 'Fifth iteration: post-yield');
+assert.sameValue(k, 2, 'Fifth iteration: post-try');
+assert.sameValue(l, 1, 'Fifth iteration: post-for-of');
diff --git a/test/language/statements/for-of/yield-star-from-finally.js b/test/language/statements/for-of/yield-star-from-finally.js
new file mode 100644
index 0000000000..1b7439b178
--- /dev/null
+++ b/test/language/statements/for-of/yield-star-from-finally.js
@@ -0,0 +1,62 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13
+description: >
+    Control flow during body evaluation should honor `yield *` statements
+    within the `finally` block of `try` statements.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  yield 1;
+}
+var dataIterator = values();
+var controlIterator = (function*() {
+  for (var x of dataIterator) {
+    try {
+    } finally {
+      i++;
+      yield * values();
+      j++;
+    }
+    k++;
+  }
+
+  l++;
+})();
+var i = 0;
+var j = 0;
+var k = 0;
+var l = 0;
+
+controlIterator.next();
+assert.sameValue(i, 1, 'First iteration: pre-yield');
+assert.sameValue(j, 0, 'First iteration: post-yield');
+assert.sameValue(k, 0, 'First iteration: post-try');
+assert.sameValue(l, 0, 'First iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 1, 'Second iteration: pre-yield');
+assert.sameValue(j, 0, 'Second iteration: post-yield');
+assert.sameValue(k, 0, 'Second iteration: post-try');
+assert.sameValue(l, 0, 'Second iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Third iteration: pre-yield');
+assert.sameValue(j, 1, 'Third iteration: post-yield');
+assert.sameValue(k, 1, 'Third iteration: post-try');
+assert.sameValue(l, 0, 'Third iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Fourth iteration: pre-yield');
+assert.sameValue(j, 1, 'Fourth iteration: post-yield');
+assert.sameValue(k, 1, 'Fourth iteration: post-try');
+assert.sameValue(l, 0, 'Fourth iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Fifth iteration: pre-yield');
+assert.sameValue(j, 2, 'Fifth iteration: post-yield');
+assert.sameValue(k, 2, 'Fifth iteration: post-try');
+assert.sameValue(l, 1, 'Fifth iteration: post-for-of');
diff --git a/test/language/statements/for-of/yield-star-from-try.js b/test/language/statements/for-of/yield-star-from-try.js
new file mode 100644
index 0000000000..b2b72d23a3
--- /dev/null
+++ b/test/language/statements/for-of/yield-star-from-try.js
@@ -0,0 +1,61 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13
+description: >
+    Control flow during body evaluation should honor `yield *` statements
+    within `try` blocks.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  yield 1;
+}
+var dataIterator = values();
+var controlIterator = (function*() {
+  for (var x of dataIterator) {
+    try {
+      i++;
+      yield * values();
+      j++;
+    } catch (err) {}
+    k++;
+  }
+
+  l++;
+})();
+var i = 0;
+var j = 0;
+var k = 0;
+var l = 0;
+
+controlIterator.next();
+assert.sameValue(i, 1, 'First iteration: pre-yield');
+assert.sameValue(j, 0, 'First iteration: post-yield');
+assert.sameValue(k, 0, 'First iteration: post-try');
+assert.sameValue(l, 0, 'First iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 1, 'Second iteration: pre-yield');
+assert.sameValue(j, 0, 'Second iteration: post-yield');
+assert.sameValue(k, 0, 'Second iteration: post-try');
+assert.sameValue(l, 0, 'Second iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Third iteration: pre-yield');
+assert.sameValue(j, 1, 'Third iteration: post-yield');
+assert.sameValue(k, 1, 'Third iteration: post-try');
+assert.sameValue(l, 0, 'Third iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Fourth iteration: pre-yield');
+assert.sameValue(j, 1, 'Fourth iteration: post-yield');
+assert.sameValue(k, 1, 'Fourth iteration: post-try');
+assert.sameValue(l, 0, 'Fourth iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Fifth iteration: pre-yield');
+assert.sameValue(j, 2, 'Fifth iteration: post-yield');
+assert.sameValue(k, 2, 'Fifth iteration: post-try');
+assert.sameValue(l, 1, 'Fifth iteration: post-for-of');
diff --git a/test/language/statements/for-of/yield-star.js b/test/language/statements/for-of/yield-star.js
new file mode 100644
index 0000000000..78004e4325
--- /dev/null
+++ b/test/language/statements/for-of/yield-star.js
@@ -0,0 +1,51 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13
+description: >
+    Control flow during body evaluation should honor `yield *` statements.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  yield 1;
+}
+var dataIterator = values();
+var controlIterator = (function*() {
+  for (var x of dataIterator) {
+    i++;
+    yield * values();
+    j++;
+  }
+
+  k++;
+})();
+var i = 0;
+var j = 0;
+var k = 0;
+
+controlIterator.next();
+assert.sameValue(i, 1, 'First iteration: pre-yield');
+assert.sameValue(j, 0, 'First iteration: post-yield');
+assert.sameValue(k, 0, 'First iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 1, 'Second iteration: pre-yield');
+assert.sameValue(j, 0, 'Second iteration: post-yield');
+assert.sameValue(k, 0, 'Second iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Third iteration: pre-yield');
+assert.sameValue(j, 1, 'Third iteration: post-yield');
+assert.sameValue(k, 0, 'Third iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Fourth iteration: pre-yield');
+assert.sameValue(j, 1, 'Fourth iteration: post-yield');
+assert.sameValue(k, 0, 'Fourth iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Fifth iteration: pre-yield');
+assert.sameValue(j, 2, 'Fifth iteration: post-yield');
+assert.sameValue(k, 1, 'Fifth iteration: post-for-of');
diff --git a/test/language/statements/for-of/yield.js b/test/language/statements/for-of/yield.js
new file mode 100644
index 0000000000..91fcbe1fa3
--- /dev/null
+++ b/test/language/statements/for-of/yield.js
@@ -0,0 +1,41 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 13.6.4.13
+description: >
+    Control flow during body evaluation should honor `yield` statements.
+features: [generators]
+---*/
+
+function* values() {
+  yield 1;
+  yield 1;
+}
+var dataIterator = values();
+var controlIterator = (function*() {
+  for (var x of dataIterator) {
+    i++;
+    yield;
+    j++;
+  }
+
+  k++;
+})();
+var i = 0;
+var j = 0;
+var k = 0;
+
+controlIterator.next();
+assert.sameValue(i, 1, 'First iteration: pre-yield');
+assert.sameValue(j, 0, 'First iteration: post-yield');
+assert.sameValue(k, 0, 'First iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Second iteration: pre-yield');
+assert.sameValue(j, 1, 'Second iteration: post-yield');
+assert.sameValue(k, 0, 'Second iteration: post-for-of');
+
+controlIterator.next();
+assert.sameValue(i, 2, 'Third iteration: pre-yield');
+assert.sameValue(j, 2, 'Third iteration: post-yield');
+assert.sameValue(k, 1, 'Third iteration: post-for-of');
-- 
GitLab