167 lines
3.2 KiB
JavaScript
167 lines
3.2 KiB
JavaScript
|
// 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));
|
||
|
})();
|