tor-browser

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

star-rhs-iter-rtrn-no-rtrn.js (1995B)


      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  "Return" completion returned when `return` method is not defined
      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 features: [generators, Symbol.iterator]
     25 ---*/
     26 
     27 var badIter = {};
     28 var throwCount = 0;
     29 var returnCount = 0;
     30 var hitNextStatement = false;
     31 var hitCatch = false;
     32 var hitFinally = false;
     33 var spyResult = {
     34  next: function() {
     35    return { done: false };
     36  }
     37 };
     38 Object.defineProperty(spyResult, 'throw', {
     39  get: function() {
     40    throwCount += 1;
     41  }
     42 });
     43 Object.defineProperty(spyResult, 'return', {
     44  get: function() {
     45    returnCount += 1;
     46  }
     47 });
     48 badIter[Symbol.iterator] = function() {
     49  return spyResult;
     50 };
     51 function* g() {
     52  try {
     53    yield * badIter;
     54    hitNextStatement = true;
     55  } catch (_) {
     56    hitCatch = true;
     57  } finally {
     58    hitFinally = true;
     59  }
     60 }
     61 var iter = g();
     62 
     63 iter.next();
     64 iter.return();
     65 
     66 assert.sameValue(throwCount, 0, '`throw` property access');
     67 assert.sameValue(returnCount, 1, '`return` property access');
     68 assert.sameValue(
     69  hitFinally, true, 'Generator execution was resumed'
     70 );
     71 assert.sameValue(
     72  hitNextStatement, false, 'Abrupt completion interrupted control flow'
     73 );
     74 assert.sameValue(
     75  hitCatch, false, 'Abrupt completion not interpreted as "throw"'
     76 );
     77 
     78 reportCompare(0, 0);