star-rhs-iter-rtrn-res-value-err.js (1959B)
1 // Copyright (C) 2016 the V8 project authors. All rights reserved. 2 // This code is governed by the BSD license found in the LICENSE file. 3 /*--- 4 esid: sec-generator-function-definitions-runtime-semantics-evaluation 5 es6id: 14.4.14 6 description: > 7 Abrupt completion returned when accessing `value` property of iteration 8 result 9 info: | 10 YieldExpression : yield * AssignmentExpression 11 12 1. Let exprRef be the result of evaluating AssignmentExpression. 13 2. Let value be ? GetValue(exprRef). 14 3. Let iterator be ? GetIterator(value). 15 4. Let received be NormalCompletion(undefined). 16 5. Repeat 17 a. If received.[[Type]] is normal, then 18 [...] 19 b. Else if received.[[Type]] is throw, then 20 [...] 21 c. Else, 22 i. Assert: received.[[Type]] is return. 23 ii. Let return be ? GetMethod(iterator, "return"). 24 iii. If return is undefined, return Completion(received). 25 iv. Let innerReturnResult be ? Call(return, iterator, « 26 received.[[Value]] »). 27 v. If Type(innerReturnResult) is not Object, throw a TypeError 28 exception. 29 vi. Let done be ? IteratorComplete(innerReturnResult). 30 vii. If done is true, then 31 1. Let value be ? IteratorValue(innerReturnResult). 32 33 7.4.4 IteratorValue 34 35 1. Assert: Type(iterResult) is Object. 36 2. Return ? Get(iterResult, "value"). 37 features: [generators, Symbol.iterator] 38 ---*/ 39 40 var thrown = new Test262Error(); 41 var badIter = {}; 42 var poisonedValue = Object.defineProperty({ done: true }, 'value', { 43 get: function() { 44 throw thrown; 45 } 46 }); 47 badIter[Symbol.iterator] = function() { 48 return { 49 next: function() { 50 return { done: false }; 51 }, 52 return: function() { 53 return poisonedValue; 54 } 55 }; 56 }; 57 function* g() { 58 try { 59 yield * badIter; 60 } catch (err) { 61 caught = err; 62 } 63 } 64 var iter = g(); 65 var caught; 66 67 iter.next(); 68 iter.return(); 69 70 assert.sameValue(caught, thrown); 71 72 reportCompare(0, 0);