| Index: Source/devtools/front_end/HeapSnapshot.js
|
| diff --git a/Source/devtools/front_end/HeapSnapshot.js b/Source/devtools/front_end/HeapSnapshot.js
|
| index cd14851869902b933350082ae9a1d4981a77f7ae..f37c747715bd2a4bd94d73f27cc0604556348e33 100644
|
| --- a/Source/devtools/front_end/HeapSnapshot.js
|
| +++ b/Source/devtools/front_end/HeapSnapshot.js
|
| @@ -1512,51 +1512,51 @@ WebInspector.HeapSnapshot.prototype = {
|
| var edgeShortcutType = this._edgeShortcutType;
|
| var firstEdgeIndexes = this._firstEdgeIndexes;
|
| var containmentEdges = this._containmentEdges;
|
| - var containmentEdgesLength = this._containmentEdges.length;
|
|
|
| var mapAndFlag = this.userObjectsMapAndFlag();
|
| var flags = mapAndFlag ? mapAndFlag.map : null;
|
| var flag = mapAndFlag ? mapAndFlag.flag : 0;
|
|
|
| - var nodesToVisit = new Uint32Array(nodeCount);
|
| + var stackNodes = new Uint32Array(nodeCount);
|
| + var stackCurrentEdge = new Uint32Array(nodeCount);
|
| var postOrderIndex2NodeOrdinal = new Uint32Array(nodeCount);
|
| var nodeOrdinal2PostOrderIndex = new Uint32Array(nodeCount);
|
| - var painted = new Uint8Array(nodeCount);
|
| - var nodesToVisitLength = 0;
|
| + var visited = new Uint8Array(nodeCount);
|
| var postOrderIndex = 0;
|
| - var grey = 1;
|
| - var black = 2;
|
|
|
| - nodesToVisit[nodesToVisitLength++] = rootNodeOrdinal;
|
| - painted[rootNodeOrdinal] = grey;
|
| + var stackTop = 0;
|
| + stackNodes[0] = rootNodeOrdinal;
|
| + stackCurrentEdge[0] = firstEdgeIndexes[rootNodeOrdinal];
|
| + visited[rootNodeOrdinal] = 1;
|
|
|
| - while (nodesToVisitLength) {
|
| - var nodeOrdinal = nodesToVisit[nodesToVisitLength - 1];
|
| + while (stackTop >= 0) {
|
| + var nodeOrdinal = stackNodes[stackTop];
|
| + var edgeIndex = stackCurrentEdge[stackTop];
|
| + var edgesEnd = firstEdgeIndexes[nodeOrdinal + 1];
|
|
|
| - if (painted[nodeOrdinal] === grey) {
|
| - painted[nodeOrdinal] = black;
|
| + if (edgeIndex < edgesEnd) {
|
| + stackCurrentEdge[stackTop] += edgeFieldsCount;
|
| + if (nodeOrdinal !== rootNodeOrdinal && containmentEdges[edgeIndex + edgeTypeOffset] === edgeShortcutType)
|
| + continue;
|
| + var childNodeIndex = containmentEdges[edgeIndex + edgeToNodeOffset];
|
| + var childNodeOrdinal = childNodeIndex / nodeFieldCount;
|
| + if (visited[childNodeOrdinal])
|
| + continue;
|
| var nodeFlag = !flags || (flags[nodeOrdinal] & flag);
|
| - var beginEdgeIndex = firstEdgeIndexes[nodeOrdinal];
|
| - var endEdgeIndex = firstEdgeIndexes[nodeOrdinal + 1];
|
| - for (var edgeIndex = beginEdgeIndex; edgeIndex < endEdgeIndex; edgeIndex += edgeFieldsCount) {
|
| - if (nodeOrdinal !== rootNodeOrdinal && containmentEdges[edgeIndex + edgeTypeOffset] === edgeShortcutType)
|
| - continue;
|
| - var childNodeIndex = containmentEdges[edgeIndex + edgeToNodeOffset];
|
| - var childNodeOrdinal = childNodeIndex / nodeFieldCount;
|
| - var childNodeFlag = !flags || (flags[childNodeOrdinal] & flag);
|
| - // We are skipping the edges from non-page-owned nodes to page-owned nodes.
|
| - // Otherwise the dominators for the objects that also were retained by debugger would be affected.
|
| - if (nodeOrdinal !== rootNodeOrdinal && childNodeFlag && !nodeFlag)
|
| - continue;
|
| - if (!painted[childNodeOrdinal]) {
|
| - painted[childNodeOrdinal] = grey;
|
| - nodesToVisit[nodesToVisitLength++] = childNodeOrdinal;
|
| - }
|
| - }
|
| + var childNodeFlag = !flags || (flags[childNodeOrdinal] & flag);
|
| + // We are skipping the edges from non-page-owned nodes to page-owned nodes.
|
| + // Otherwise the dominators for the objects that also were retained by debugger would be affected.
|
| + if (nodeOrdinal !== rootNodeOrdinal && childNodeFlag && !nodeFlag)
|
| + continue;
|
| + ++stackTop;
|
| + stackNodes[stackTop] = childNodeOrdinal;
|
| + stackCurrentEdge[stackTop] = firstEdgeIndexes[childNodeOrdinal];
|
| + visited[childNodeOrdinal] = 1;
|
| } else {
|
| + // Done with all the node children
|
| nodeOrdinal2PostOrderIndex[nodeOrdinal] = postOrderIndex;
|
| postOrderIndex2NodeOrdinal[postOrderIndex++] = nodeOrdinal;
|
| - --nodesToVisitLength;
|
| + --stackTop;
|
| }
|
| }
|
|
|
| @@ -1564,7 +1564,7 @@ WebInspector.HeapSnapshot.prototype = {
|
| console.log("Error: Corrupted snapshot. " + (nodeCount - postOrderIndex) + " nodes are unreachable from the root:");
|
| var dumpNode = this.rootNode();
|
| for (var i = 0; i < nodeCount; ++i) {
|
| - if (painted[i] !== black) {
|
| + if (!visited[i]) {
|
| // Fix it by giving the node a postorder index anyway.
|
| nodeOrdinal2PostOrderIndex[i] = postOrderIndex;
|
| postOrderIndex2NodeOrdinal[postOrderIndex++] = i;
|
|
|