|  | // Copyright 2014 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('ForOf', [1000], [ | 
|  | new Benchmark('ArrayValues', false, false, 0, | 
|  | ForOf, ForOfArraySetup, ForOfTearDown), | 
|  | new Benchmark('ArrayKeys', false, false, 0, | 
|  | ForOf, ForOfArrayKeysSetup, ForOfTearDown), | 
|  | new Benchmark('ArrayEntries', false, false, 0, | 
|  | ForOf, ForOfArrayEntriesSetup, ForOfTearDown), | 
|  | new Benchmark('Uint8Array', false, false, 0, | 
|  | ForOf, ForOfUint8ArraySetup, ForOfTearDown), | 
|  | new Benchmark('Float64Array', false, false, 0, | 
|  | ForOf, ForOfFloat64ArraySetup, ForOfTearDown), | 
|  | new Benchmark('String', false, false, 0, | 
|  | ForOf, ForOfStringSetup, ForOfTearDown), | 
|  | ]); | 
|  |  | 
|  |  | 
|  | var iterable; | 
|  | var N = 100; | 
|  | var expected, result; | 
|  |  | 
|  |  | 
|  | function ForOfArraySetupHelper(constructor) { | 
|  | iterable = new constructor(N); | 
|  | for (var i = 0; i < N; i++) iterable[i] = i; | 
|  | expected = N - 1; | 
|  | } | 
|  |  | 
|  |  | 
|  | function ForOfArraySetup() { | 
|  | ForOfArraySetupHelper(Array); | 
|  | // Default iterator is values(). | 
|  | } | 
|  |  | 
|  |  | 
|  | function ForOfArrayKeysSetup() { | 
|  | ForOfArraySetupHelper(Array); | 
|  | iterable = iterable.keys(); | 
|  | } | 
|  |  | 
|  |  | 
|  | function ForOfArrayEntriesSetup() { | 
|  | ForOfArraySetupHelper(Array); | 
|  | iterable = iterable.entries(); | 
|  | expected = [N-1, N-1]; | 
|  | } | 
|  |  | 
|  |  | 
|  | function ForOfUint8ArraySetup() { | 
|  | ForOfArraySetupHelper(Uint8Array); | 
|  | } | 
|  |  | 
|  |  | 
|  | function ForOfFloat64ArraySetup() { | 
|  | ForOfArraySetupHelper(Float64Array); | 
|  | } | 
|  |  | 
|  |  | 
|  | function ForOfStringSetup() { | 
|  | iterable = "abcdefhijklmnopqrstuvwxyzABCDEFHIJKLMNOPQRSTUVWXYZ0123456789"; | 
|  | expected = "9"; | 
|  | } | 
|  |  | 
|  |  | 
|  | function Equals(expected, actual) { | 
|  | if (expected === actual) return true; | 
|  | if (typeof expected !== typeof actual) return false; | 
|  | if (typeof expected !== 'object') return false; | 
|  | for (var k of Object.keys(expected)) { | 
|  | if (!(k in actual)) return false; | 
|  | if (!Equals(expected[k], actual[k])) return false; | 
|  | } | 
|  | for (var k of Object.keys(actual)) { | 
|  | if (!(k in expected)) return false; | 
|  | } | 
|  | return true; | 
|  | } | 
|  |  | 
|  | function ForOfTearDown() { | 
|  | iterable = null; | 
|  | if (!Equals(expected, result)) { | 
|  | throw new Error("Bad result: " + result); | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | function ForOf() { | 
|  | for (var x of iterable) { | 
|  | result = x; | 
|  | } | 
|  | } |