| // 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 |