blob: 9c02470158da1b654c36e5db90312b98fdef099e [file] [log] [blame]
// 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;
}
%PrepareFunctionForOptimization(g);
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));
})();