blob: a7c71b82ad3765828c9a80def7379070198886ec (
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
|
// Test that the onGarbageCollection reentrancy guard is on a per Debugger
// basis. That is if our first Debugger is observing our second Debugger's
// compartment, and this second Debugger triggers a GC inside its
// onGarbageCollection hook, the first Debugger's onGarbageCollection hook is
// still called.
//
// This is the scenario we are setting up: top level debugging the `debuggeree`
// global, which is debugging the `debuggee` global. Then, we trigger the
// following events:
//
// debuggee gc
// |
// V
// debuggeree's onGarbageCollection
// |
// V
// debuggeree gc
// |
// V
// top level onGarbageCollection
//
// Note that the top level's onGarbageCollection hook should be fired, at the
// same time that we are preventing reentrancy into debuggeree's
// onGarbageCollection hook.
function run_test() {
do_test_pending();
const debuggeree = newGlobal();
const debuggee = debuggeree.debuggee = newGlobal();
debuggeree.eval(
`
var dbg = new Debugger(this.debuggee);
var fired = 0;
dbg.memory.onGarbageCollection = _ => {
fired++;
gc(this);
};
`
);
const dbg = new Debugger(debuggeree);
let fired = 0;
dbg.memory.onGarbageCollection = _ => {
fired++;
};
debuggee.eval(`gc(this)`);
// Let first onGarbageCollection runnable get run.
executeSoon(() => {
// Let second onGarbageCollection runnable get run.
executeSoon(() => {
// Even though we request GC'ing a single zone, we can't rely on that
// behavior and both zones could have been scheduled for gc for both
// gc(this) calls.
ok(debuggeree.fired >= 1);
ok(fired >= 1);
debuggeree.dbg.enabled = dbg.enabled = false;
do_test_finished();
});
});
}
|