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