 Chromium Code Reviews
 Chromium Code Reviews Issue 1634553002:
  Fix bug where generators got closed prematurely.  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master
    
  
    Issue 1634553002:
  Fix bug where generators got closed prematurely.  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master| OLD | NEW | 
|---|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 // Test generator states. | 5 // Test generator states. | 
| 6 | 6 | 
| 7 function Foo() {} | 7 function Foo() {} | 
| 8 function Bar() {} | 8 function Bar() {} | 
| 9 | 9 | 
| 10 function assertIteratorResult(value, done, result) { | 10 function assertIteratorResult(value, done, result) { | 
| 11 assertEquals({ value: value, done: done}, result); | 11 assertEquals({ value: value, done: done}, result); | 
| 12 } | 12 } | 
| 13 | 13 | 
| 14 function assertIteratorIsClosed(iter) { | 14 function assertIteratorIsClosed(iter) { | 
| 15 assertIteratorResult(undefined, true, iter.next()); | 15 assertIteratorResult(undefined, true, iter.next()); | 
| 16 // Next and throw on a closed iterator. | 16 // Next and throw on a closed iterator. | 
| 17 assertDoesNotThrow(function() { iter.next(); }); | 17 assertDoesNotThrow(function() { iter.next(); }); | 
| 18 assertThrows(function() { iter.throw(new Bar); }, Bar); | 18 assertThrows(function() { iter.throw(new Bar); }, Bar); | 
| 19 } | 19 } | 
| 20 | 20 | 
| 21 var iter; | 21 var iter; | 
| 22 function* nextGenerator() { yield iter.next(); } | 22 function* nextGenerator() { yield iter.next(); } | 
| 23 function* throwGenerator() { yield iter.throw(new Bar); } | 23 function* throwGenerator() { yield iter.throw(new Bar); } | 
| 24 | 24 | 
| 25 // Throw on a suspendedStart iterator. | 25 // Throw on a suspendedStart iterator. | 
| 26 iter = nextGenerator(); | 26 iter = nextGenerator(); | 
| 27 assertThrows(function() { iter.throw(new Foo) }, Foo) | 27 assertThrows(function() { iter.throw(new Foo) }, Foo) | 
| 28 assertIteratorIsClosed(iter); | |
| 28 assertThrows(function() { iter.throw(new Foo) }, Foo) | 29 assertThrows(function() { iter.throw(new Foo) }, Foo) | 
| 29 assertIteratorIsClosed(iter); | 30 assertIteratorIsClosed(iter); | 
| 30 | 31 | 
| 31 // The same. | 32 // The same. | 
| 32 iter = throwGenerator(); | 33 iter = throwGenerator(); | 
| 33 assertThrows(function() { iter.throw(new Foo) }, Foo) | 34 assertThrows(function() { iter.throw(new Foo) }, Foo) | 
| 34 assertThrows(function() { iter.throw(new Foo) }, Foo) | 35 assertThrows(function() { iter.throw(new Foo) }, Foo) | 
| 35 assertIteratorIsClosed(iter); | 36 assertIteratorIsClosed(iter); | 
| 36 | 37 | 
| 37 // Next on an executing iterator raises a TypeError. | 38 // Next on an executing iterator raises a TypeError. | 
| (...skipping 20 matching lines...) Expand all Loading... | |
| 58 yield 2; | 59 yield 2; | 
| 59 } catch (e) { | 60 } catch (e) { | 
| 60 yield 3; | 61 yield 3; | 
| 61 } | 62 } | 
| 62 } | 63 } | 
| 63 yield 4; | 64 yield 4; | 
| 64 })(); | 65 })(); | 
| 65 assertIteratorResult(3, false, iter.next()); | 66 assertIteratorResult(3, false, iter.next()); | 
| 66 assertIteratorResult(4, false, iter.next()); | 67 assertIteratorResult(4, false, iter.next()); | 
| 67 assertIteratorIsClosed(iter); | 68 assertIteratorIsClosed(iter); | 
| 69 | |
| 70 | |
| 71 // return that doesn't close | |
| 
Michael Starzinger
2016/01/25 12:56:05
nit: Please capitalize and punctuate comment.
 | |
| 72 { | |
| 73 let g = function*() { try {return 42} finally {yield 43} }; | |
| 74 | |
| 75 let x = g(); | |
| 76 assertEquals({value: 43, done: false}, x.next()); | |
| 77 assertEquals({value: 42, done: true}, x.next()); | |
| 78 } | |
| 79 { | |
| 80 let x; | |
| 81 let g = function*() { try {return 42} finally {x.throw(666)} }; | |
| 
Michael Starzinger
2016/01/25 12:56:05
As discussed offline, can we add another test case
 | |
| 82 | |
| 83 x = g(); | |
| 84 assertThrows(() => x.next(), TypeError); // still executing | |
| 85 } | |
| OLD | NEW |