| // 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. |
| |
| // Flags: --expose-gc --allow-natives-syntax |
| |
| "use strict"; |
| { |
| |
| |
| // We use g(a, b, c) instead of [a, b, c] when we care about Sminess being |
| // preserved. |
| function* g(...args) { for (const x of args) yield x; } |
| // G is like g but triggers GC to avoid allocation-site updates. |
| function* G(...args) { gc(); for (const x of args) { gc(); yield x; }; gc(); } |
| |
| |
| assertEquals([], [...[]]); |
| assertEquals([], [...[], ]); |
| assertEquals([1], [1, ...[]]); |
| assertEquals([1, 2], [1, ...[], 2]); |
| assertEquals([, ], [, ...[]]); |
| assertEquals([, ], [, ...[], ]); |
| assertEquals([, ], [, ...[],...[]]); |
| assertEquals([, ], [, ...[],...[], ]); |
| assertEquals([1, 2, 3], [...[1, 2, 3]]); |
| assertEquals([1, 1.5], [...g(1, 1.5)]); |
| assertEquals([, 1, 1.5], [, ...g(1, 1.5)]); |
| assertEquals([1, 2, 2.5, 3.5], [...g(1, 2, 2.5, 3.5)]); |
| assertEquals([2.5, 1, 3.5, 4], [...g(2.5, 1, 3.5, 4)]); |
| assertEquals([2.5, 3.5, 1, 4], [...g(2.5, 3.5, 1, 4)]); |
| assertEquals([{a: 1}, {b: 2}], [...[{a: 1}, {b: 2}]]); |
| assertEquals([0, {a: 1}, {b: 2}], [...g(0, {a: 1}, {b: 2})]); |
| assertEquals([1, 1.5, "2"], [...g(1, 1.5, "2")]); |
| |
| |
| function f1(x) { |
| return [...[x, x, x]]; |
| } |
| assertEquals([1, 1, 1], f1(1)); |
| assertEquals([0.1, 0.1, 0.1], f1(0.1)); |
| assertEquals([{}, {}, {}], f1({})); |
| assertEquals([1, 1, 1], f1(1)); |
| |
| function f1_(x) { |
| return [...[x, x, x]]; |
| } |
| %PrepareFunctionForOptimization(f1_); |
| assertEquals([1, 1, 1], f1_(1)); |
| %OptimizeFunctionOnNextCall(f1_); |
| assertEquals([1, 1, 1], f1_(1)); |
| assertEquals([0.1, 0.1, 0.1], f1_(0.1)); |
| assertEquals([{}, {}, {}], f1_({})); |
| assertEquals([1, 1, 1], f1_(1)); |
| |
| |
| function f2(x) { |
| return [...[x, x, x], ,]; |
| } |
| assertEquals([1, 1, 1, ,], f2(1)); |
| assertEquals([0.1, 0.1, 0.1, ,], f2(0.1)); |
| assertEquals([{}, {}, {}, ,], f2({})); |
| assertEquals([1, 1, 1, ,], f2(1)); |
| |
| function f2_(x) { |
| return [...[x, x, x], ,]; |
| } |
| %PrepareFunctionForOptimization(f2_); |
| assertEquals([1, 1, 1, ,], f2_(1)); |
| %OptimizeFunctionOnNextCall(f2_); |
| assertEquals([1, 1, 1, ,], f2_(1)); |
| assertEquals([0.1, 0.1, 0.1, ,], f2_(0.1)); |
| assertEquals([{}, {}, {}, ,], f2_({})); |
| assertEquals([1, 1, 1, ,], f2_(1)); |
| |
| |
| function f3(it) { |
| return [...it, ,]; |
| } |
| assertEquals([1, 0.1, "1", , ], f3(g(1, 0.1, "1"))); |
| assertEquals([{}, 0.1, "1", , ], f3(g({}, 0.1, "1"))); |
| assertEquals([0, 0, 0, , ], f3(g(0, 0, 0))); |
| assertEquals([1, 0.1, "1", , ], f3(g(1, 0.1, "1"))); |
| |
| function f3_(it) { |
| return [...it, ,]; |
| } |
| %PrepareFunctionForOptimization(f3_); |
| assertEquals([1, 0.1, "1", , ], f3_(g(1, 0.1, "1"))); |
| %OptimizeFunctionOnNextCall(f3_); |
| assertEquals([1, 0.1, "1", , ], f3_(g(1, 0.1, "1"))); |
| assertEquals([{}, 0.1, "1", , ], f3_(g({}, 0.1, "1"))); |
| assertEquals([0, 0, 0, , ], f3_(g(0, 0, 0))); |
| assertEquals([1, 0.1, "1", , ], f3_(g(1, 0.1, "1"))); |
| |
| |
| function f4(x) { |
| return [...[x, x, x]]; |
| } |
| assertEquals([1, 1, 1], f4(1)); |
| assertEquals([0.1, 0.1, 0.1], f4(0.1)); |
| assertEquals([{}, {}, {}], f4({})); |
| assertEquals([1, 1, 1], f4(1)); |
| |
| function f4_(x) { |
| return [...[x, x, x]]; |
| } |
| %PrepareFunctionForOptimization(f4_); |
| assertEquals([1, 1, 1], f4_(1)); |
| %OptimizeFunctionOnNextCall(f4_); |
| assertEquals([1, 1, 1], f4_(1)); |
| assertEquals([0.1, 0.1, 0.1], f4_(0.1)); |
| assertEquals([{}, {}, {}], f4_({})); |
| assertEquals([1, 1, 1], f4_(1)); |
| |
| |
| function f5(x) { |
| return [...[x, x, x], ,]; |
| } |
| assertEquals([1, 1, 1, ,], f5(1)); |
| assertEquals([0.1, 0.1, 0.1, ,], f5(0.1)); |
| assertEquals([{}, {}, {}, ,], f5({})); |
| assertEquals([1, 1, 1, ,], f5(1)); |
| |
| function f5_(x) { |
| return [...[x, x, x], ,]; |
| } |
| %PrepareFunctionForOptimization(f5_); |
| assertEquals([1, 1, 1, ,], f5_(1)); |
| %OptimizeFunctionOnNextCall(f5_); |
| assertEquals([1, 1, 1, ,], f5_(1)); |
| assertEquals([0.1, 0.1, 0.1, ,], f5_(0.1)); |
| assertEquals([{}, {}, {}, ,], f5_({})); |
| assertEquals([1, 1, 1, ,], f5_(1)); |
| |
| |
| function f6(it) { |
| return [...it, ,]; |
| } |
| assertEquals([1, 0.1, "1", , ], f6(g(1, 0.1, "1"))); |
| assertEquals([{}, 0.1, "1", , ], f6(g({}, 0.1, "1"))); |
| assertEquals([0, 0, 0, , ], f6(g(0, 0, 0))); |
| assertEquals([1, 0.1, "1", , ], f6(g(1, 0.1, "1"))); |
| |
| function f6_(it) { |
| return [...it, ,]; |
| } |
| %PrepareFunctionForOptimization(f6_); |
| assertEquals([1, 0.1, "1", , ], f6_(g(1, 0.1, "1"))); |
| %OptimizeFunctionOnNextCall(f6_); |
| assertEquals([1, 0.1, "1", , ], f6_(g(1, 0.1, "1"))); |
| assertEquals([{}, 0.1, "1", , ], f6_(g({}, 0.1, "1"))); |
| assertEquals([0, 0, 0, , ], f6_(g(0, 0, 0))); |
| assertEquals([1, 0.1, "1", , ], f6_(g(1, 0.1, "1"))); |
| |
| |
| function f7(it) { |
| return [...it]; |
| } |
| assertEquals([1, 0.1, "1"], f7(G(1, 0.1, "1"))); |
| assertEquals([{}, 0.1, "1"], f7(G({}, 0.1, "1"))); |
| assertEquals([0, 0, 0], f7(G(0, 0, 0))); |
| assertEquals([1, 0.1, "1"], f7(G(1, 0.1, "1"))); |
| |
| function f7_(it) { |
| return [...it]; |
| } |
| %PrepareFunctionForOptimization(f7_); |
| assertEquals([1, 0.1, "1"], f7_(G(1, 0.1, "1"))); |
| %OptimizeFunctionOnNextCall(f7_); |
| assertEquals([1, 0.1, "1"], f7_(G(1, 0.1, "1"))); |
| assertEquals([{}, 0.1, "1"], f7_(G({}, 0.1, "1"))); |
| assertEquals([0, 0, 0], f7_(G(0, 0, 0))); |
| assertEquals([1, 0.1, "1"], f7_(G(1, 0.1, "1"))); |
| |
| |
| function f8(it) { |
| return [...it, ,]; |
| } |
| assertEquals([1, 0.1, "1", , ], f8(G(1, 0.1, "1"))); |
| assertEquals([{}, 0.1, "1", , ], f8(G({}, 0.1, "1"))); |
| assertEquals([0, 0, 0, , ], f8(G(0, 0, 0))); |
| assertEquals([1, 0.1, "1", , ], f8(G(1, 0.1, "1"))); |
| |
| function f8_(it) { |
| return [...it, ,]; |
| } |
| %PrepareFunctionForOptimization(f8_); |
| assertEquals([1, 0.1, "1", , ], f8_(G(1, 0.1, "1"))); |
| %OptimizeFunctionOnNextCall(f8_); |
| assertEquals([1, 0.1, "1", , ], f8_(G(1, 0.1, "1"))); |
| assertEquals([{}, 0.1, "1", , ], f8_(G({}, 0.1, "1"))); |
| assertEquals([0, 0, 0, , ], f8_(G(0, 0, 0))); |
| assertEquals([1, 0.1, "1", , ], f8_(G(1, 0.1, "1"))); |
| |
| |
| // Megamorphic |
| function* f9() { |
| for (let i = 0; i < 160000; ++i) yield i; |
| } |
| %PrepareFunctionForOptimization(f9); |
| let a = [...f9()]; |
| assertEquals(160000, a.length); |
| assertEquals(0, a[0]); |
| assertEquals(159999, a[159999]); |
| %OptimizeFunctionOnNextCall(f9); |
| a = [...f9()]; |
| assertEquals(160000, a.length); |
| assertEquals(0, a[0]); |
| assertEquals(159999, a[159999]); |
| |
| // Slow stub |
| function f10(b) { |
| let x = [ |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |
| ...b]; |
| return x.length; |
| } |
| %PrepareFunctionForOptimization(f10); |
| assertEquals(4335, f10([3.3, 3.3, 3.3])); |
| assertEquals(4335, f10([{}, "", 3.3])); |
| %OptimizeFunctionOnNextCall(f10); |
| assertEquals(4335, f10([{}, "", 3.3])); |
| assertEquals(4332, f10([])); |
| |
| |
| } // top-level scope |