8e3ae62d29
When searching for a target map during map update, attempt to update field representations in-place to the more general representation, where possible. Bug: chromium:1143772 Change-Id: I6a43c94910a1d2d8f8b0ad89048f94b51461f76c Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2507715 Commit-Queue: Leszek Swirski <leszeks@chromium.org> Commit-Queue: Igor Sheludko <ishell@chromium.org> Reviewed-by: Igor Sheludko <ishell@chromium.org> Auto-Submit: Leszek Swirski <leszeks@chromium.org> Cr-Commit-Position: refs/heads/master@{#70887}
72 lines
1.7 KiB
JavaScript
72 lines
1.7 KiB
JavaScript
// Copyright 2020 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() {
|
|
// Only run this test if doubles are transitioned in-place to tagged.
|
|
let x = {};
|
|
x.a = 0.1;
|
|
let y = {};
|
|
y.a = {};
|
|
if (!%HaveSameMap(x, y)) return;
|
|
|
|
// m1: {}
|
|
let m1 = {};
|
|
|
|
// m2: {a:d}
|
|
let m2 = {};
|
|
assertTrue(%HaveSameMap(m2, m1));
|
|
m2.a = 13.37;
|
|
|
|
// m3: {a:d, b:s}
|
|
let m3 = {};
|
|
m3.a = 13.37;
|
|
assertTrue(%HaveSameMap(m3, m2));
|
|
m3.b = 1;
|
|
|
|
// m4: {a:d, b:s, c:h}
|
|
let m4 = {};
|
|
m4.a = 13.37;
|
|
m4.b = 1;
|
|
assertTrue(%HaveSameMap(m4, m3));
|
|
m4.c = {};
|
|
|
|
// m4_2 == m4
|
|
let m4_2 = {};
|
|
m4_2.a = 13.37;
|
|
m4_2.b = 1;
|
|
m4_2.c = {};
|
|
assertTrue(%HaveSameMap(m4_2, m4));
|
|
|
|
// m5: {a:d, b:d}
|
|
let m5 = {};
|
|
m5.a = 13.37;
|
|
assertTrue(%HaveSameMap(m5, m2));
|
|
m5.b = 13.37;
|
|
assertFalse(%HaveSameMap(m5, m3));
|
|
|
|
// At this point, Map3 and Map4 are both deprecated. Map2 transitions to
|
|
// Map5. Map5 is the migration target for Map3.
|
|
assertFalse(%HaveSameMap(m5, m3));
|
|
|
|
// m6: {a:d, b:d, c:d}
|
|
let m6 = {};
|
|
m6.a = 13.37;
|
|
assertTrue(%HaveSameMap(m6, m2));
|
|
m6.b = 13.37;
|
|
assertTrue(%HaveSameMap(m6, m5));
|
|
m6.c = 13.37
|
|
|
|
// Make m7: {a:d, b:d, c:t}
|
|
let m7 = m4_2;
|
|
assertTrue(%HaveSameMap(m7, m4));
|
|
// Map4 is deprecated, so this property access triggers a Map migration.
|
|
// With in-place map updates and no double unboxing, this should end up
|
|
// migrating to Map6, and updating it in-place.
|
|
m7.c;
|
|
assertFalse(%HaveSameMap(m7, m4));
|
|
assertTrue(%HaveSameMap(m6, m7));
|
|
})();
|