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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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