| // Copyright 2016 the V8 project authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 |  | 
 | new BenchmarkSuite('Generators', [1000], [ | 
 |   new Benchmark('Basic', false, false, 0, Basic), | 
 |   new Benchmark('Loop', false, false, 0, Loop), | 
 |   new Benchmark('Input', false, false, 0, Input), | 
 |   new Benchmark('YieldStar', false, false, 0, YieldStar), | 
 | ]); | 
 |  | 
 |  | 
 | // ---------------------------------------------------------------------------- | 
 | // Benchmark: Basic | 
 | // ---------------------------------------------------------------------------- | 
 |  | 
 | function* five() { | 
 |   yield 1; | 
 |   yield 2; | 
 |   yield 3; | 
 |   yield 4; | 
 |   yield 5; | 
 | } | 
 |  | 
 | function Basic() { | 
 |   let g = five(); | 
 |   let sum = 0; | 
 |   sum += g.next().value; | 
 |   sum += g.next().value; | 
 |   sum += g.next().value; | 
 |   sum += g.next().value; | 
 |   sum += g.next().value; | 
 |   if (sum != 15 || !g.next().done) throw "wrong"; | 
 | } | 
 |  | 
 |  | 
 | // ---------------------------------------------------------------------------- | 
 | // Benchmark: Loop | 
 | // ---------------------------------------------------------------------------- | 
 |  | 
 | function* fibonacci() { | 
 |   let x = 0; | 
 |   let y = 1; | 
 |   yield x; | 
 |   while (true) { | 
 |     yield y; | 
 |     let tmp = x; | 
 |     x = y; | 
 |     y += tmp; | 
 |   } | 
 | } | 
 |  | 
 | function Loop() { | 
 |   let n = 0; | 
 |   let x; | 
 |   for (x of fibonacci()) { | 
 |     if (++n === 42) break; | 
 |   } | 
 |   if (x != 165580141) throw "wrong"; | 
 | } | 
 |  | 
 |  | 
 |  | 
 | // ---------------------------------------------------------------------------- | 
 | // Benchmark: Input | 
 | // ---------------------------------------------------------------------------- | 
 |  | 
 | function* multiples(x) { | 
 |   let skip = function.sent || 0; | 
 |   let next = 0; | 
 |   while (true) { | 
 |     if (skip === 0) { | 
 |       skip = yield next; | 
 |     } else { | 
 |       skip--; | 
 |     } | 
 |     next += x; | 
 |   } | 
 | } | 
 |  | 
 | function Input() { | 
 |   let g = multiples(3); | 
 |   results = [g.next(2), g.next(0), g.next(5), g.next(10)]; | 
 |   if (results.slice(-1)[0].value != 60) throw "wrong"; | 
 | } | 
 |  | 
 |  | 
 | // ---------------------------------------------------------------------------- | 
 | // Benchmark: YieldStar | 
 | // ---------------------------------------------------------------------------- | 
 |  | 
 | function* infix(node) { | 
 |   if (node) { | 
 |     yield* infix(node.left); | 
 |     yield node.label; | 
 |     yield* infix(node.right); | 
 |   } | 
 | } | 
 |  | 
 | class Node { | 
 |   constructor(label, left, right) { | 
 |     this.label = label; | 
 |     this.left = left; | 
 |     this.right = right; | 
 |   } | 
 | } | 
 |  | 
 | function YieldStar() { | 
 |   let tree = new Node(1, | 
 |       new Node(2, | 
 |           new Node(3, | 
 |               new Node(4, | 
 |                   new Node(16, | 
 |                       new Node(5, | 
 |                           new Node(23, | 
 |                               new Node(0), | 
 |                               new Node(17)), | 
 |                           new Node(44, new Node(20)))), | 
 |                   new Node(7, | 
 |                       undefined, | 
 |                       new Node(23, | 
 |                           new Node(0), | 
 |                           new Node(41, undefined, new Node(11))))), | 
 |               new Node(8)), | 
 |           new Node(5)), | 
 |       new Node(6, undefined, new Node(7))); | 
 |   let labels = [...(infix(tree))]; | 
 |   // 0,23,17,5,20,44,16,4,7,0,23,41,11,3,8,2,5,1,6,7 | 
 |   if (labels[0] != 0) throw "wrong"; | 
 | } |