// Copyright 2019 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: --allow-natives-syntax (function SealAndReconfigure() { function C() { this.x = 1; this.y = 1; Object.seal(this); } let c1 = new C(); c1.x = 0.1; let c2 = new C(); let c3 = new C(); let c4 = new C(); // The objects c2, c3 and c4 should follow the same transition // path that we reconfigured c1 to. assertTrue(%HaveSameMap(c1, c2)); assertTrue(%HaveSameMap(c1, c3)); assertTrue(%HaveSameMap(c1, c4)); c2.x = 0.1; c3.x = 0.1; c4.x = 0.1; assertTrue(%HaveSameMap(c1, c2)); assertTrue(%HaveSameMap(c1, c3)); assertTrue(%HaveSameMap(c1, c4)); })(); (function SealAndReconfigureWithIC() { function C() { this.x = 1; this.y = 1; Object.seal(this); } let c1 = new C(); function g(o) { o.x = 0.1; } g(c1); let c2 = new C(); let c3 = new C(); let c4 = new C(); // The objects c2, c3 and c4 should follow the same transition // path that we reconfigured c1 to. assertTrue(%HaveSameMap(c1, c2)); assertTrue(%HaveSameMap(c1, c3)); assertTrue(%HaveSameMap(c1, c4)); g(c2); g(c3); g(c4); assertTrue(%HaveSameMap(c1, c2)); assertTrue(%HaveSameMap(c1, c3)); assertTrue(%HaveSameMap(c1, c4)); })(); (function SealReconfigureAndMigrateWithIC() { function C() { this.x = 1; this.y = 1; Object.seal(this); } let c1 = new C(); let c2 = new C(); let c3 = new C(); let c4 = new C(); function g(o) { o.x = 0.1; } g(c1); // Now c2, c3 and c4 have deprecated maps. assertFalse(%HaveSameMap(c1, c2)); assertFalse(%HaveSameMap(c1, c3)); assertFalse(%HaveSameMap(c1, c4)); g(c2); g(c3); g(c4); assertTrue(%HaveSameMap(c1, c2)); assertTrue(%HaveSameMap(c1, c3)); assertTrue(%HaveSameMap(c1, c4)); })(); (function SealReconfigureAndMigrateWithOptCode() { function C() { this.x = 1; this.y = 1; Object.seal(this); } let c1 = new C(); let c2 = new C(); let c3 = new C(); let c4 = new C(); function g(o) { o.x = 0.1; } g(c1); g(c2); g(c3); %OptimizeFunctionOnNextCall(g); g(c4); assertTrue(%HaveSameMap(c1, c2)); assertTrue(%HaveSameMap(c1, c3)); assertTrue(%HaveSameMap(c1, c4)); })(); (function PreventExtensionsAndReconfigure() { function C() { this.x = 1; this.y = 1; Object.preventExtensions(this); } let c1 = new C(); function g(o) { o.x = 0.1; } g(c1); let c2 = new C(); let c3 = new C(); let c4 = new C(); c2.x = 0.1; c3.x = 0.1; c4.x = 0.1; assertTrue(%HaveSameMap(c1, c2)); assertTrue(%HaveSameMap(c1, c3)); assertTrue(%HaveSameMap(c1, c4)); })(); (function PreventExtensionsSealAndReconfigure() { function C() { this.x = 1; this.y = 1; Object.preventExtensions(this); Object.seal(this); } let c1 = new C(); function g(o) { o.x = 0.1; } g(c1); let c2 = new C(); let c3 = new C(); let c4 = new C(); c2.x = 0.1; c3.x = 0.1; c4.x = 0.1; // Ideally, all the objects would have the same map, but at the moment // we shortcut the unnecessary integrity level transitions. assertTrue(%HaveSameMap(c2, c3)); assertTrue(%HaveSameMap(c2, c4)); })();