// 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. (function testDoubleElements() { function f(src) { return {...src}; } var src = [1.5]; src[0] = 1; // Uninitialized assertEquals({ 0: 1 }, f(src)); src[0] = 1.3; // Monomorphic assertEquals({ 0: 1.3 }, f(src)); })(); (function testInObjectProperties() { function f(src) { return {...src}; } function C() { this.foo = "foo"; } var src; for (var i = 0; i < 10; ++i) { src = new C(); } // Uninitialized assertEquals({ foo: "foo" }, f(src)); // Monomorphic assertEquals({ foo: "foo" }, f(src)); })(); (function testInObjectProperties2() { function f(src) { return {...src}; } function C() { this.foo = "foo"; this.p0 = "0"; this.p1 = "1"; this.p2 = "2"; this.p3 = "3"; } var src; for (var i = 0; i < 10; ++i) { src = new C(); } // Uninitialized assertEquals({ foo: "foo", p0: "0", p1: "1", p2: "2", p3: "3" }, f(src)); // Monomorphic assertEquals({ foo: "foo", p0: "0", p1: "1", p2: "2", p3: "3" }, f(src)); })(); (function testPolymorphicToMegamorphic() { function f(src) { return {...src}; } function C1() { this.foo = "foo"; this.p0 = "0"; this.p1 = "1"; this.p2 = "2"; this.p3 = "3"; } function C2() { this.p0 = "0"; this.p1 = "1"; this[0] = 0; } function C3() { this.x = 774; this.y = 663; this.rgb = 0xFF00FF; } function C4() { this.qqq = {}; this.v_1 = []; this.name = "C4"; this.constructor = C4; } // Uninitialized assertEquals({ foo: "foo", p0: "0", p1: "1", p2: "2", p3: "3" }, f(new C1())); // Monomorphic assertEquals({ foo: "foo", p0: "0", p1: "1", p2: "2", p3: "3" }, f(new C1())); // Polymorphic (2) assertEquals({ 0: 0, p0: "0", p1: "1" }, f(new C2())); assertEquals({ 0: 0, p0: "0", p1: "1" }, f(new C2())); // Polymorphic (3) assertEquals({ x: 774, y: 663, rgb: 0xFF00FF }, f(new C3())); assertEquals({ x: 774, y: 663, rgb: 0xFF00FF }, f(new C3())); // Polymorphic (4) assertEquals({ qqq: {}, v_1: [], name: "C4", constructor: C4 }, f(new C4())); assertEquals({ qqq: {}, v_1: [], name: "C4", constructor: C4 }, f(new C4())); // Megamorphic assertEquals({ boop: 1 }, f({ boop: 1 })); })(); // There are 2 paths in CloneObjectIC's handler which need to handle double // fields specially --- in object properties, and copying the property array. function testMutableInlineProperties() { function inobject() { "use strict"; this.x = 1.1; } const src = new inobject(); const x0 = src.x; const clone = { ...src, x: x0 + 1 }; assertEquals(x0, src.x); assertEquals({ x: 2.1 }, clone); } testMutableInlineProperties() function testMutableOutOfLineProperties() { const src = { a: 1, b: 2, c: 3 }; src.x = 2.3; const x0 = src.x; const clone = { ...src, x: x0 + 1 }; assertEquals(x0, src.x); assertEquals({ a: 1, b: 2, c: 3, x: 3.3 }, clone); } testMutableOutOfLineProperties();