v8/test/mjsunit/integrity-level-map-update.js
Ross McIlroy 5b794a389b [Test] Add PrepareForOptimization to some mjsunit tests.
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}
2019-05-03 13:32:32 +00:00

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));
})();