star-rhs-iter-rtrn-rtrn-call-non-obj.js (1680B)
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 TypeError thrown when iterator `return` method returns a non-object value 8 info: | 9 YieldExpression : yield * AssignmentExpression 10 11 1. Let exprRef be the result of evaluating AssignmentExpression. 12 2. Let value be ? GetValue(exprRef). 13 3. Let iterator be ? GetIterator(value). 14 4. Let received be NormalCompletion(undefined). 15 5. Repeat 16 a. If received.[[Type]] is normal, then 17 [...] 18 b. Else if received.[[Type]] is throw, then 19 [...] 20 c. Else, 21 i. Assert: received.[[Type]] is return. 22 ii. Let return be ? GetMethod(iterator, "return"). 23 iii. If return is undefined, return Completion(received). 24 iv. Let innerReturnResult be ? Call(return, iterator, « 25 received.[[Value]] »). 26 v. If Type(innerReturnResult) is not Object, throw a TypeError 27 exception. 28 features: [generators, Symbol.iterator] 29 ---*/ 30 31 var badIter = {}; 32 badIter[Symbol.iterator] = function() { 33 return { 34 next: function() { 35 return { done: false }; 36 }, 37 return: function() { 38 return 23; 39 } 40 }; 41 }; 42 function* g() { 43 try { 44 yield * badIter; 45 } catch (err) { 46 caught = err; 47 } 48 } 49 var iter = g(); 50 var result, caught; 51 52 iter.next(); 53 result = iter.return(); 54 55 assert.sameValue(result.value, undefined); 56 assert.sameValue(result.done, true); 57 assert.sameValue(typeof caught, 'object'); 58 assert.sameValue(caught.constructor, TypeError); 59 60 reportCompare(0, 0);