tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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