Heap Snapshot should include different Edge types and data (Property, Index, Variable)
[WebKit-https.git] / Source / JavaScriptCore / tests / heapProfiler / property-edge-types.js
1 load("./driver/driver.js");
2
3 let simpleObject = new SimpleObject;
4 setHiddenValue(simpleObject, "hiddenValue"); // Internal
5 simpleObject.propertyName1 = "propertyValue1"; // Property
6 simpleObject["propertyName2"] = "propertyValue2"; // Property
7 simpleObject[100] = "indexedValue"; // Index
8 simpleObject[0xffffffff + 100] = "largeIndexValueBecomingProperty"; // Property
9 simpleObject.point = {x:"x1", y:"y1"}; // Property => object with 2 inline properties.
10
11 // ----------
12
13 function excludeStructure(edges) {
14     return edges.filter((x) => x.to.className !== "Structure");
15 }
16
17 let snapshot = createHeapSnapshot();
18
19 // Internal, Property, and Index edges on an Object.
20 let nodes = snapshot.nodesWithClassName("SimpleObject");
21 assert(nodes.length === 1, "Snapshot should contain 1 'SimpleObject' instance");
22 let simpleObjectNode = nodes[0];
23 let edges = excludeStructure(simpleObjectNode.outgoingEdges);
24 let pointNode = null;
25
26 let seenHiddenValue = false;
27 let seenPropertyName1 = false;
28 let seenPropertyName2 = false;
29 let seenIndex100 = false;
30 let seenLargeIndex = false;
31 let seenObjectWithInlineStorage = false;
32 let largeIndexName = (0xffffffff + 100).toString();
33
34 for (let edge of edges) {
35     switch (edge.type) {
36     case "Internal":
37         assert(!seenHiddenValue);
38         seenHiddenValue = true;
39         break;
40     case "Property":
41         if (edge.data === "propertyName1")
42             seenPropertyName1 = true;
43         else if (edge.data === "propertyName2")
44             seenPropertyName2 = true;
45         else if (edge.data === largeIndexName)
46             seenLargeIndex = true;
47         else if (edge.data === "point") {
48             seenPoint = true;
49             pointNode = edge.to;
50         } else
51             assert(false, "Unexpected property name");
52         break;
53     case "Index":
54         if (edge.data === 100)
55             seenIndex100 = true;
56         break;
57     case "Variable":
58         assert(false, "Should not see a variable edge for SimpleObject instance");
59         break;
60     default:
61         assert(false, "Unexpected edge type");
62         break;
63     }
64 }
65
66 assert(seenHiddenValue, "Should see Internal edge for hidden value");
67 assert(seenPropertyName1, "Should see Property edge for propertyName1");
68 assert(seenPropertyName2, "Should see Property edge for propertyName2");
69 assert(seenIndex100, "Should see Index edge for index 100");
70 assert(seenLargeIndex, "Should see Property edge for index " + largeIndexName);
71
72
73 // Property on an Object's inline storage.
74 let pointEdges = excludeStructure(pointNode.outgoingEdges);
75
76 let seenPropertyX = false;
77 let seenPropertyY = false;
78
79 for (let edge of pointEdges) {
80     switch (edge.type) {
81     case "Property":
82         if (edge.data === "x")
83             seenPropertyX = true;
84         else if (edge.data === "y")
85             seenPropertyY = true;
86         else
87             assert(false, "Unexpected property name");
88         break;
89     case "Index":
90     case "Variable":
91     case "Internal":
92         assert(false, "Unexpected edge type");
93         break;
94     }
95 }
96
97 assert(seenPropertyX, "Should see Property edge for x");
98 assert(seenPropertyY, "Should see Property edge for y");