regress-1143772.js 1.73 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
// 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));
})();