|  | // 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. | 
|  |  | 
|  | load('../base.js'); | 
|  |  | 
|  | let array; | 
|  | // Initialize func variable to ensure the first test doesn't benefit from | 
|  | // global object property tracking. | 
|  | let func = 0; | 
|  | let this_arg; | 
|  | let result; | 
|  | const array_size = 100; | 
|  | const max_index = array_size - 1; | 
|  |  | 
|  | // newClosure is a handy function to get a fresh | 
|  | // closure unpolluted by IC feedback for a 2nd-order array builtin | 
|  | // test. | 
|  | function newClosure(name, generic = false) { | 
|  | if (generic) { | 
|  | return new Function( | 
|  | `result = Array.prototype.${name}.call(array, func, this_arg);`); | 
|  | } | 
|  | return new Function(`result = array.${name}(func, this_arg);`); | 
|  | } | 
|  |  | 
|  | function MakeHoley(array) { | 
|  | for (let i =0; i < array.length; i+=2) { | 
|  | delete array[i]; | 
|  | } | 
|  | assert(%HasHoleyElements(array)); | 
|  | } | 
|  |  | 
|  | function SmiSetup() { | 
|  | array = Array.from({ length: array_size }, (_, i) => i); | 
|  | assert(%HasSmiElements(array)); | 
|  | } | 
|  |  | 
|  | function HoleySmiSetup() { | 
|  | SmiSetup(); | 
|  | MakeHoley(array); | 
|  | assert(%HasSmiElements(array)); | 
|  | } | 
|  |  | 
|  | function DoubleSetup() { | 
|  | array = Array.from({ length: array_size }, (_, i) => i + 0.5); | 
|  | assert(%HasDoubleElements(array)); | 
|  | } | 
|  |  | 
|  | function HoleyDoubleSetup() { | 
|  | DoubleSetup(); | 
|  | MakeHoley(array); | 
|  | assert(%HasDoubleElements(array)); | 
|  | } | 
|  |  | 
|  | function FastSetup() { | 
|  | array = Array.from({ length: array_size }, (_, i) => `value ${i}`); | 
|  | assert(%HasObjectElements(array)); | 
|  | } | 
|  |  | 
|  | function HoleyFastSetup() { | 
|  | FastSetup(); | 
|  | MakeHoley(array); | 
|  | assert(%HasObjectElements(array)); | 
|  | } | 
|  |  | 
|  | function DictionarySetup() { | 
|  | array = []; | 
|  | // Add a large index to force dictionary elements. | 
|  | array[2**30] = 10; | 
|  | // Spread out {array_size} elements. | 
|  | for (var i = 0; i < array_size-1; i++) { | 
|  | array[i*101] = i; | 
|  | } | 
|  | assert(%HasDictionaryElements(array)); | 
|  | } | 
|  |  | 
|  | function ObjectSetup() { | 
|  | array = { length: array_size }; | 
|  | for (var i = 0; i < array_size; i++) { | 
|  | array[i] = i; | 
|  | } | 
|  | assert(%HasObjectElements(array)); | 
|  | assert(%HasHoleyElements(array)); | 
|  | } | 
|  |  | 
|  |  | 
|  | const ARRAY_SETUP = { | 
|  | PACKED_SMI: SmiSetup, | 
|  | HOLEY_SMI: HoleySmiSetup, | 
|  | PACKED_DOUBLE: DoubleSetup, | 
|  | HOLEY_DOUBLE: HoleyDoubleSetup, | 
|  | PACKED: FastSetup, | 
|  | HOLEY: HoleyFastSetup, | 
|  | DICTIONARY: DictionarySetup, | 
|  | } | 
|  |  | 
|  | function DefineHigherOrderTests(tests) { | 
|  | let i = 0; | 
|  | while (i < tests.length) { | 
|  | const [name, testFunc, setupFunc, callback] = tests[i++]; | 
|  |  | 
|  | let setupFuncWrapper = () => { | 
|  | func = callback; | 
|  | this_arg = undefined; | 
|  | setupFunc(); | 
|  | }; | 
|  | createSuite(name, 1000, testFunc, setupFuncWrapper); | 
|  | } | 
|  | } | 
|  |  | 
|  | // Higher-order Array builtins. | 
|  | load('filter.js'); | 
|  | load('map.js'); | 
|  | load('every.js'); | 
|  | load('some.js'); | 
|  | load('for-each.js'); | 
|  | load('reduce.js'); | 
|  | load('reduce-right.js'); | 
|  | load('find.js'); | 
|  | load('find-index.js'); | 
|  |  | 
|  | // Other Array builtins. | 
|  | load('from.js'); | 
|  | load('of.js'); | 
|  | load('join.js'); | 
|  | load('to-string.js'); | 
|  | load('slice.js'); | 
|  | load('copy-within.js'); | 
|  |  | 
|  | var success = true; | 
|  |  | 
|  | function PrintResult(name, result) { | 
|  | print(name + '-Array(Score): ' + result); | 
|  | } | 
|  |  | 
|  | function PrintStep(name) {} | 
|  |  | 
|  | function PrintError(name, error) { | 
|  | PrintResult(name, error); | 
|  | success = false; | 
|  | } | 
|  |  | 
|  |  | 
|  | BenchmarkSuite.config.doWarmup = undefined; | 
|  | BenchmarkSuite.config.doDeterministic = undefined; | 
|  |  | 
|  | BenchmarkSuite.RunSuites({ NotifyResult: PrintResult, | 
|  | NotifyError: PrintError, | 
|  | NotifyStep: PrintStep }); |