5b794a389b
Bug: v8:8801, v8:8394 Change-Id: I6bb46ecafe1bd94adbf0409f13c9b2e558da0823 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1594558 Commit-Queue: Ross McIlroy <rmcilroy@chromium.org> Commit-Queue: Mythri Alle <mythria@chromium.org> Auto-Submit: Ross McIlroy <rmcilroy@chromium.org> Reviewed-by: Mythri Alle <mythria@chromium.org> Cr-Commit-Position: refs/heads/master@{#61200}
168 lines
3.2 KiB
JavaScript
168 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;
|
|
}
|
|
|
|
%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));
|
|
})();
|