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