// Copyright 2018 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. (() => { createSuite('MixedFrom', 1000, MixedFrom, MixedFromSetup); createSuite( 'MixedCowNoMapFrom', 1000, MixedCowNoMapFrom, MixedCowNoMapFromSetup); createSuite('MixedNonCowNoMapFrom', 1000, MixedNonCowNoMapFrom, MixedNonCowNoMapFromSetup); createSuite('SmiFrom', 1000, SmiFrom, SmiFromSetup); createSuite('SmallSmiFrom', 1000, SmallSmiFrom, SmallSmiFromSetup); createSuite('SmiCowNoMapFrom', 1000, SmiCowNoMapFrom, SmiCowNoMapFromSetup); createSuite( 'SmiNonCowNoMapFrom', 1000, SmiNonCowNoMapFrom, SmiNonCowNoMapFromSetup); createSuite( 'SmiNoIteratorFrom', 1000, SmiNoIteratorFrom, SmiNoIteratorFromSetup); createSuite( 'TransplantedFrom', 1000, TransplantedFrom, TransplantedFromSetup); createSuite('DoubleFrom', 1000, DoubleFrom, DoubleFromSetup); createSuite('DoubleNoMapFrom', 1000, DoubleNoMapFrom, DoubleNoMapFromSetup); createSuite('StringFrom', 1000, StringFrom, StringFromSetup); createSuite( 'StringCowNoMapFrom', 1000, StringCowNoMapFrom, StringCowNoMapFromSetup); createSuite('StringNonCowNoMapFrom', 1000, StringNonCowNoMapFrom, StringNonCowNoMapFromSetup); function ArrayLike() {} ArrayLike.from = Array.from; var arg var result; var func // This creates a COW array of smis. COWness does not affect the performance // of Array.from calls with a callback function. var smi_array_Cow = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ]; // This creates a non-COW array. var smi_array = Array.from(smi_array_Cow); smi_array[0] = 1; // This creates an array of doubles. There is no COW array for doubles. var double_array = [ 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, // 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, // 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, // 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, // 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, // 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, ]; // This creates a COW array of objects. var string_array_Cow = [ 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', ]; // This creates a non-COW array. var string_array = Array.from(string_array_Cow); string_array[0] = 'a'; // This creates a COW array of objects. var mixed_array_Cow = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, // 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, // 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', ]; // This creates a non-COW array. var mixed_array = Array.from(mixed_array_Cow); mixed_array[0] = 1; // Although these functions have the same code, they are separated for // clean IC feedback. function SmallSmiFrom() { result = Array.from(arg, func); } function SmiCowNoMapFrom() { result = Array.from(arg); } function SmiNonCowNoMapFrom() { result = Array.from(arg); } function SmiFrom() { result = Array.from(arg, func); } function SmiNoIteratorFrom() { result = Array.from(arg, func); } function TransplantedFrom() { result = ArrayLike.from(arg, func); } function DoubleFrom() { result = Array.from(arg, func); } function DoubleNoMapFrom() { result = Array.from(arg); } function StringFrom() { result = Array.from(arg, func); } function StringCowNoMapFrom() { result = Array.from(arg); } function StringNonCowNoMapFrom() { result = Array.from(arg); } function MixedFrom() { result = Array.from(arg, func); } function MixedCowNoMapFrom() { result = Array.from(arg); } function MixedNonCowNoMapFrom() { result = Array.from(arg); } function SmallSmiFromSetup() { func = (v, i) => v + i; arg = [1, 2, 3]; } function SmiCowNoMapFromSetup() { func = undefined; arg = smi_array_Cow; } function SmiNonCowNoMapFromSetup() { func = undefined; arg = smi_array; } function SmiFromSetup() { func = (v, i) => v + i; arg = smi_array_Cow; } function SmiNoIteratorFromSetup() { func = (v, i) => v + i; array = smi_array_Cow; arg = {length: array.length}; Object.assign(arg, array); } function TransplantedFromSetup() { func = (v, i) => v + i; arg = smi_array_Cow; } function DoubleFromSetup() { func = (v, i) => v + i; arg = double_array; } function DoubleNoMapFromSetup() { func = undefined; arg = double_array; } function StringFromSetup() { func = (v, i) => v + i; arg = string_array_Cow; } function StringCowNoMapFromSetup() { func = undefined; arg = string_array_Cow; } function StringNonCowNoMapFromSetup() { func = undefined; arg = string_array; } function MixedFromSetup() { func = (v, i) => v + i; arg = mixed_array_Cow; } function MixedCowNoMapFromSetup() { func = undefined; arg = mixed_array_Cow; } function MixedNonCowNoMapFromSetup() { func = undefined; arg = mixed_array; } })();