Merge pull request #220 from bocoup/for-of-more-control-flow

Additional control flow tests for `for..of` statements
This commit is contained in:
Brian Terlson 2015-04-21 10:55:42 -07:00
commit e9593a3d65
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');