Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(605)

Unified Diff: test/mjsunit/es6/array-iterator-turbo.js

Issue 2484003002: [builtins] implement JSBuiltinReducer for ArrayIteratorNext() (Closed)
Patch Set: fix tests when ignition is used Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/runtime/runtime-object.cc ('k') | test/mjsunit/mjsunit.status » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
+}
« no previous file with comments | « src/runtime/runtime-object.cc ('k') | test/mjsunit/mjsunit.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698