1
0
mirror of https://github.com/tc39/test262.git synced 2025-04-08 19:35:28 +02:00

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
This commit is contained in:
Mike Pennisi 2015-04-07 14:50:43 -04:00
parent 8af82000ed
commit 3bf5652774
46 changed files with 968 additions and 38 deletions

@ -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);

@ -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);

@ -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);

@ -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);

@ -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);

@ -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);

@ -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);

@ -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;

@ -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);

@ -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);

@ -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);

@ -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);

@ -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);

@ -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);

@ -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;

@ -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;

@ -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);

@ -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);

@ -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);

@ -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);

@ -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);

@ -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);

@ -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);

@ -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');

@ -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');

@ -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');

@ -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');

@ -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');

@ -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');

@ -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');

@ -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');