summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/gc/weakmap-nursery-value.js
blob: 9c61b56632c1edb34bdb03a477d6a5fad211b67e (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
// Bug 1715471

// This test relies on triggering GC at precise points. GC zeal modes
// interfere with this.
gczeal(0);

// This test requires enqueueMark, which is only available in a debugging
// build.
if (!this.enqueueMark) quit(0);

var wm = new WeakMap();

// Force materialization of the map struct. Otherwise it would be allocated
// black during the incremental GC when we do wm.set.
wm.set({}, {});

var tenuredKey = Object.create(null);
gc(); // Tenure the WeakMap and key.

// Enter the GC, since otherwise the minor GC at the beginning would tenure our
// value before it had a chance to be entered into the ephemeron edge list.
startgc(1);
while (gcstate() === "Prepare") gcslice(1);

// Create a WeakMap entry with a value in the nursery.
var nurseryValue = Object.create(null);
wm.set(tenuredKey, nurseryValue);

// We want to mark the weakmap first, before the key or value are marked, so
// that the tenuredKey -> nurseryValue edge will be added to the ephemeron edge
// table.
enqueueMark(wm);

gcslice(1000);
minorgc();