summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/web-snapshot/web-snapshot-3.js
blob: d0d0ec81a8449b72d5454cb8a2daa6db4962d6c4 (plain)
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// Copyright 2022 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: --experimental-d8-web-snapshot-api --allow-natives-syntax

'use strict';

d8.file.execute('test/mjsunit/web-snapshot/web-snapshot-helpers.js');

(function TestObjectWithPackedElements() {
  function createObjects() {
    globalThis.foo = {
      '0': 'zero', '1': 'one', '2': 'two', '3': 'three'
    };
  }
  const { foo } = takeAndUseWebSnapshot(createObjects, ['foo']);
  // Objects always get HOLEY_ELEMENTS; no PACKED or SMI_ELEMENTS.
  const elementsKindTest = {0: 0, 1: 1, 2: 2};
  assertFalse(%HasPackedElements(elementsKindTest));
  assertFalse(%HasSmiElements(elementsKindTest));

  assertFalse(%HasPackedElements(foo));
  assertFalse(%HasSmiElements(foo));
  assertEquals('zeroonetwothree', foo[0] + foo[1] + foo[2] + foo[3]);
})();

(function TestObjectWithPackedSmiElements() {
  function createObjects() {
    globalThis.foo = {
      '0': 0, '1': 1, '2': 2, '3': 3
    };
  }
  const { foo } = takeAndUseWebSnapshot(createObjects, ['foo']);
  assertFalse(%HasPackedElements(foo));
  assertFalse(%HasSmiElements(foo));
  assertEquals('0123', '' + foo[0] + foo[1] + foo[2] + foo[3]);
})();

(function TestObjectWithHoleyElements() {
  function createObjects() {
    globalThis.foo = {
      '1': 'a', '11': 'b', '111': 'c'
    };
  }
  const { foo } = takeAndUseWebSnapshot(createObjects, ['foo']);
  assertFalse(%HasPackedElements(foo));
  assertFalse(%HasSmiElements(foo));
  assertEquals('abc', foo[1] + foo[11] + foo[111]);
})();

(function TestObjectWithHoleySmiElements() {
  function createObjects() {
    globalThis.foo = {
      '1': 0, '11': 1, '111': 2
    };
  }
  const { foo } = takeAndUseWebSnapshot(createObjects, ['foo']);
  assertFalse(%HasPackedElements(foo));
  assertFalse(%HasSmiElements(foo));
  assertEquals('012', '' + foo[1] + foo[11] + foo[111]);
})();

(function TestObjectWithPropertiesAndElements() {
  function createObjects() {
    globalThis.foo = {
      'prop1': 'value1', '1': 'a', 'prop2': 'value2', '11': 'b', '111': 'c'
    };
  }
  const { foo } = takeAndUseWebSnapshot(createObjects, ['foo']);
  assertFalse(%HasPackedElements(foo));
  assertFalse(%HasSmiElements(foo));
  assertEquals('abc', foo[1] + foo[11] + foo[111]);
  assertEquals('value1value2', foo.prop1 + foo.prop2);
})();

(function TestObjectsWithSamePropertiesButDifferentElementsKind() {
  function createObjects() {
    globalThis.foo = {
      'prop1': 'value1', 'prop2': 'value2', '1': 'a', '11': 'b', '111': 'c'
    };
    globalThis.bar = {
      'prop1': 'value1', 'prop2': 'value2', '0': 0, '1': 0
    }
  }
  const { foo, bar } = takeAndUseWebSnapshot(createObjects, ['foo', 'bar']);
  assertFalse(%HasPackedElements(foo));
  assertFalse(%HasSmiElements(foo));
  assertEquals('abc', foo[1] + foo[11] + foo[111]);
  assertEquals('value1value2', foo.prop1 + foo.prop2);
  assertFalse(%HasPackedElements(bar));
  assertFalse(%HasSmiElements(bar));
  assertEquals('00', '' + bar[0] + bar[1]);
  assertEquals('value1value2', bar.prop1 + bar.prop2);
})();

(function TestObjectWithEmptyMap() {
  function createObjects() {
    globalThis.foo = [{a:1}, {}, {b: 2}];
  }
  const { foo } = takeAndUseWebSnapshot(createObjects, ['foo']);
  assertEquals(1, foo[0].a);
  assertEquals(2, foo[2].b);
})();