Header parsing for experimental and internal debug features
[WebKit-https.git] / JSTests / heapProfiler / variable-edge-types.js
1 load("./driver/driver.js");
2
3 let globalScopeVariable = "globalScopeVariableValue";
4 let simpleObject = new SimpleObject;
5
6 (function() {
7     let closureVariable = {};
8     simpleObject.f = function() { closureVariable.x = 0; }
9 })();
10
11 // ----------
12
13 let snapshot = createHeapSnapshot();
14
15 // Global Scope => "globalScopeVariable"
16 let nodes = snapshot.nodesWithClassName("JSGlobalLexicalEnvironment");
17 assert(nodes.length === 1, "Should be only 1 'JSGlobalLexicalEnvironment' instance");
18 let globalScopeNode = nodes[0];
19
20 let seenGlobalScopeVariable = false;
21 let seenSimpleObjectVariable = false;
22
23 for (let edge of globalScopeNode.outgoingEdges) {
24     switch (edge.type) {
25     case "Variable":
26         if (edge.data === "globalScopeVariable")
27             seenGlobalScopeVariable = true;
28         else if (edge.data === "simpleObject")
29             seenSimpleObjectVariable = true;
30         else
31             assert(false, "Unexpected variable name: " + edge.data);
32         break;
33     case "Index":
34     case "Property":
35         assert(false, "Unexpected edge type");
36         break;
37     case "Internal":
38         break;
39     }
40 }
41
42 assert(seenGlobalScopeVariable, "Should see Variable edge for variable 'globalScopeVariable'");
43 assert(seenSimpleObjectVariable, "Should see Variable edge for variable 'simpleObject'");
44
45 // Function Scope => "closureVariable"
46 nodes = snapshot.nodesWithClassName("SimpleObject");
47 assert(nodes.length === 1, "Should be only 1 'SimpleObject' instance");
48 let scopeNode = followPath(nodes[0], [{edge: "f"}, {node: "JSLexicalEnvironment"}]);
49
50 let seenClosureVariable = false;
51
52 for (let edge of scopeNode.outgoingEdges) {
53     switch (edge.type) {
54     case "Variable":
55         if (edge.data === "closureVariable")
56             seenClosureVariable = true;
57         else
58             assert(false, "Unexpected variable name: " + edge.data);
59         break;
60     case "Index":
61     case "Property":
62         assert(false, "Unexpected edge type");
63         break;
64     case "Internal":
65         break;
66     }
67 }
68
69 assert(seenClosureVariable, "Should see Variable edge for closure variable 'closureVariable'");