| Index: test/mjsunit/es6/array-iterator-turbo.js
|
| diff --git a/test/mjsunit/es6/array-iterator-turbo.js b/test/mjsunit/es6/array-iterator-turbo.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c1b8d3207228887bf47249688ca3614ec8694923
|
| --- /dev/null
|
| +++ b/test/mjsunit/es6/array-iterator-turbo.js
|
| @@ -0,0 +1,243 @@
|
| +// 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.
|
| +
|
| +// Flags: --turbo --turbo-escape --allow-natives-syntax
|
| +
|
| +"use strict";
|
| +
|
| +const kDeoptimized = 2;
|
| +const kTurbofanned = 7;
|
| +const kInterpreted = 8;
|
| +
|
| +function GetOptimizationStatus(fn) {
|
| + let status = %GetOptimizationStatus(fn);
|
| + switch (status) {
|
| + case kInterpreted: // Treat interpreted frames as unoptimized
|
| + status = kDeoptimized;
|
| + break;
|
| + }
|
| +
|
| + return status;
|
| +}
|
| +
|
| +let global = this;
|
| +let tests = {
|
| + FastElementsKind() {
|
| + let runners = {
|
| + FAST_SMI_ELEMENTS(array) {
|
| + let sum = 0;
|
| + for (let x of array) sum += x;
|
| + return sum;
|
| + },
|
| +
|
| + FAST_HOLEY_SMI_ELEMENTS(array) {
|
| + let sum = 0;
|
| + for (let x of array) {
|
| + if (x) sum += x;
|
| + }
|
| + return sum;
|
| + },
|
| +
|
| + FAST_ELEMENTS(array) {
|
| + let ret = "";
|
| + for (let str of array) ret += `> ${str}`;
|
| + return ret;
|
| + },
|
| +
|
| + FAST_HOLEY_ELEMENTS(array) {
|
| + let ret = "";
|
| + for (let str of array) ret += `> ${str}`;
|
| + return ret;
|
| + },
|
| +
|
| + FAST_DOUBLE_ELEMENTS(array) {
|
| + let sum = 0.0;
|
| + for (let x of array) sum += x;
|
| + return sum;
|
| + },
|
| +
|
| + FAST_HOLEY_DOUBLE_ELEMENTS(array) {
|
| + let sum = 0.0;
|
| + for (let x of array) {
|
| + if (x) sum += x;
|
| + }
|
| + return sum;
|
| + }
|
| + };
|
| +
|
| + let tests = {
|
| + FAST_SMI_ELEMENTS: {
|
| + array: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
|
| + expected: 55,
|
| + array2: [1, 2, 3],
|
| + expected2: 6
|
| + },
|
| + FAST_HOLEY_SMI_ELEMENTS: {
|
| + array: [1, , 3, , 5, , 7, , 9, ,],
|
| + expected: 25,
|
| + array2: [1, , 3],
|
| + expected2: 4
|
| + },
|
| + FAST_ELEMENTS: {
|
| + array: ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
|
| + expected: "> a> b> c> d> e> f> g> h> i> j",
|
| + array2: ["a", "b", "c"],
|
| + expected2: "> a> b> c"
|
| + },
|
| + FAST_HOLEY_ELEMENTS: {
|
| + array: ["a", , "c", , "e", , "g", , "i", ,],
|
| + expected: "> a> undefined> c> undefined> e> undefined> g" +
|
| + "> undefined> i> undefined",
|
| + array2: ["a", , "c"],
|
| + expected2: "> a> undefined> c"
|
| + },
|
| + FAST_DOUBLE_ELEMENTS: {
|
| + array: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
|
| + expected: 5.5,
|
| + array2: [0.6, 0.4, 0.2],
|
| + expected2: 1.2
|
| + },
|
| + FAST_HOLEY_DOUBLE_ELEMENTS: {
|
| + array: [0.1, , 0.3, , 0.5, , 0.7, , 0.9, ,],
|
| + expected: 2.5,
|
| + array2: [0.1, , 0.3],
|
| + expected2: 0.4
|
| + }
|
| + };
|
| +
|
| + for (let key of Object.keys(runners)) {
|
| + let fn = runners[key];
|
| + let { array, expected, array2, expected2 } = tests[key];
|
| +
|
| + // Warmup:
|
| + fn(array);
|
| + fn(array);
|
| + %OptimizeFunctionOnNextCall(fn);
|
| + fn(array);
|
| +
|
| + // TODO(bmeurer): FAST_HOLEY_DOUBLE_ELEMENTS maps generally deopt when
|
| + // a hole is encountered. Test should be fixed once that is corrected.
|
| + let status = /HOLEY_DOUBLE/.test(key) ? kDeoptimized : kTurbofanned;
|
| +
|
| + assertEquals(status, GetOptimizationStatus(fn), key);
|
| + assertEquals(expected, fn(array), key);
|
| + assertEquals(status, GetOptimizationStatus(fn), key);
|
| +
|
| + // Check no deopt when another arra with the same map is used
|
| + assertTrue(%HaveSameMap(array, array2), key);
|
| + assertEquals(status, GetOptimizationStatus(fn), key);
|
| + assertEquals(expected2, fn(array2), key);
|
| +
|
| + // CheckMaps bailout
|
| + let newArray = Object.defineProperty(
|
| + [1, 2, 3], 2, { enumerable: false, configurable: false,
|
| + get() { return 7; } });
|
| + fn(newArray);
|
| + assertEquals(kDeoptimized, GetOptimizationStatus(fn), key);
|
| + }
|
| + },
|
| +
|
| + TypedArrays() {
|
| + let tests = {
|
| + Uint8Array: {
|
| + array: new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, -1, 256]),
|
| + expected: 291,
|
| + array2: new Uint8Array([1, 2, 3]),
|
| + expected2: 6
|
| + },
|
| +
|
| + Int8Array: {
|
| + array: new Int8Array([1, 2, 3, 4, 5, 6, 7, 8, -129, 128]),
|
| + expected: 35,
|
| + array2: new Int8Array([1, 2, 3]),
|
| + expected2: 6
|
| + },
|
| +
|
| + Uint16Array: {
|
| + array: new Uint16Array([1, 2, 3, 4, 5, 6, 7, 8, -1, 0x10000]),
|
| + expected: 65571,
|
| + array2: new Uint16Array([1, 2, 3]),
|
| + expected2: 6
|
| + },
|
| +
|
| + Int16Array: {
|
| + array: new Int16Array([1, 2, 3, 4, 5, 6, 7, 8, -32769, 0x7FFF]),
|
| + expected: 65570,
|
| + array2: new Int16Array([1, 2, 3]),
|
| + expected2: 6
|
| + },
|
| +
|
| + Uint32Array: {
|
| + array: new Uint32Array([1, 2, 3, 4, 5, 6, 7, 8, -1, 0x100000000]),
|
| + expected: 4294967331,
|
| + array2: new Uint32Array([1, 2, 3]),
|
| + expected2: 6
|
| + },
|
| +
|
| + Int32Array: {
|
| + array: new Int32Array([1, 2, 3, 4, 5, 6, 7, 8,
|
| + -2147483649, 0x7FFFFFFF]),
|
| + expected: 4294967330,
|
| + array2: new Int32Array([1, 2, 3]),
|
| + expected2: 6
|
| + },
|
| +
|
| + Float32Array: {
|
| + array: new Float32Array([9.5, 8.0, 7.0, 7.0, 5.0, 4.0, 3.0, 2.0]),
|
| + expected: 45.5,
|
| + array2: new Float32Array([10.5, 5.5, 1.5]),
|
| + expected2: 17.5
|
| + },
|
| +
|
| + Float64Array: {
|
| + array: new Float64Array([9.5, 8.0, 7.0, 7.0, 5.0, 4.0, 3.0, 2.0]),
|
| + expected: 45.5,
|
| + array2: new Float64Array([10.5, 5.5, 1.5]),
|
| + expected2: 17.5
|
| + },
|
| +
|
| + Uint8ClampedArray: {
|
| + array: new Uint8ClampedArray([4.3, 7.45632, 3.14, 4.61, 5.0004, 6.493,
|
| + 7.12, 8, 1.7, 3.6]),
|
| + expected: 51,
|
| + array2: new Uint8ClampedArray([1, 2, 3]),
|
| + expected2: 6
|
| + }
|
| + };
|
| +
|
| + for (let key of Object.keys(tests)) {
|
| + let test = tests[key];
|
| + let { array, expected, array2, expected2 } = test;
|
| +
|
| + let sum = function(array) {
|
| + let ret = 0;
|
| + for (let x of array) ret += x;
|
| + return ret;
|
| + };
|
| +
|
| + // Warmup
|
| + sum(array);
|
| + sum(array);
|
| + %OptimizeFunctionOnNextCall(sum);
|
| + assertEquals(expected, sum(array), key);
|
| +
|
| + assertEquals(kTurbofanned, GetOptimizationStatus(sum), key);
|
| +
|
| + // Not deoptimized when called on typed array of same type / map
|
| + assertTrue(%HaveSameMap(array, array2));
|
| + assertEquals(expected2, sum(array2), key);
|
| + assertEquals(kTurbofanned, GetOptimizationStatus(sum), key);
|
| +
|
| + // Throw when detached
|
| + let clone = new array.constructor(array);
|
| + %ArrayBufferNeuter(clone.buffer);
|
| + assertThrows(() => sum(clone), TypeError);
|
| + }
|
| + }
|
| +};
|
| +
|
| +for (let name of Object.keys(tests)) {
|
| + let test = tests[name];
|
| + test();
|
| +}
|
|
|