Index: third_party/WebKit/Source/devtools/front_end/heap_snapshot_worker/HeapSnapshot.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/heap_snapshot_worker/HeapSnapshot.js b/third_party/WebKit/Source/devtools/front_end/heap_snapshot_worker/HeapSnapshot.js |
index 286a071da499ee19eb340b9faad73aeab855d6c3..de3d6f4bf2d4761d74b15ddd879c89bfe0ce3904 100644 |
--- a/third_party/WebKit/Source/devtools/front_end/heap_snapshot_worker/HeapSnapshot.js |
+++ b/third_party/WebKit/Source/devtools/front_end/heap_snapshot_worker/HeapSnapshot.js |
@@ -1030,7 +1030,7 @@ WebInspector.HeapSnapshot.prototype = { |
this._dominatorsTree = this._buildDominatorTree(result.postOrderIndex2NodeOrdinal, result.nodeOrdinal2PostOrderIndex); |
this._progress.updateStatus("Calculating retained sizes\u2026"); |
this._calculateRetainedSizes(result.postOrderIndex2NodeOrdinal); |
- this._progress.updateStatus("Buiding dominated nodes\u2026"); |
+ this._progress.updateStatus("Building dominated nodes\u2026"); |
this._buildDominatedNodes(); |
this._progress.updateStatus("Calculating statistics\u2026"); |
this._calculateStatistics(); |
@@ -1596,6 +1596,20 @@ WebInspector.HeapSnapshot.prototype = { |
}); |
}, |
+ /** |
+ * The function checks is the edge should be considered during building |
+ * postorder iterator and dominator tree. |
+ * |
+ * @param {number} nodeIndex |
+ * @param {number} edgeType |
+ * @return {boolean} |
+ */ |
+ _isEssentialEdge: function(nodeIndex, edgeType) |
+ { |
+ // Shortcuts at the root node have special meaning of marking user global objects. |
+ return edgeType !== this._edgeWeakType && (edgeType !== this._edgeShortcutType || nodeIndex === this._rootNodeIndex); |
+ }, |
+ |
_buildPostOrderIndex: function() |
{ |
var nodeFieldCount = this._nodeFieldCount; |
@@ -1605,8 +1619,6 @@ WebInspector.HeapSnapshot.prototype = { |
var edgeFieldsCount = this._edgeFieldsCount; |
var edgeTypeOffset = this._edgeTypeOffset; |
var edgeToNodeOffset = this._edgeToNodeOffset; |
- var edgeShortcutType = this._edgeShortcutType; |
- var edgeWeakType = this._edgeWeakType; |
var firstEdgeIndexes = this._firstEdgeIndexes; |
var containmentEdges = this.containmentEdges; |
@@ -1637,7 +1649,7 @@ WebInspector.HeapSnapshot.prototype = { |
if (edgeIndex < edgesEnd) { |
stackCurrentEdge[stackTop] += edgeFieldsCount; |
var edgeType = containmentEdges[edgeIndex + edgeTypeOffset]; |
- if (edgeType === edgeWeakType || edgeType === edgeShortcutType) |
+ if (!this._isEssentialEdge(nodeOrdinal * nodeFieldCount, edgeType)) |
continue; |
var childNodeIndex = containmentEdges[edgeIndex + edgeToNodeOffset]; |
var childNodeOrdinal = childNodeIndex / nodeFieldCount; |
@@ -1751,8 +1763,6 @@ WebInspector.HeapSnapshot.prototype = { |
var edgeFieldsCount = this._edgeFieldsCount; |
var edgeTypeOffset = this._edgeTypeOffset; |
var edgeToNodeOffset = this._edgeToNodeOffset; |
- var edgeShortcutType = this._edgeShortcutType; |
- var edgeWeakType = this._edgeWeakType; |
var firstEdgeIndexes = this._firstEdgeIndexes; |
var containmentEdges = this.containmentEdges; |
var rootNodeIndex = this._rootNodeIndex; |
@@ -1777,11 +1787,9 @@ WebInspector.HeapSnapshot.prototype = { |
{ // Mark the root direct children as affected. |
nodeOrdinal = this._rootNodeIndex / nodeFieldCount; |
var endEdgeIndex = firstEdgeIndexes[nodeOrdinal + 1]; |
- for (var edgeIndex = firstEdgeIndexes[nodeOrdinal]; |
- edgeIndex < endEdgeIndex; |
- edgeIndex += edgeFieldsCount) { |
+ for (var edgeIndex = firstEdgeIndexes[nodeOrdinal]; edgeIndex < endEdgeIndex; edgeIndex += edgeFieldsCount) { |
var edgeType = containmentEdges[edgeIndex + edgeTypeOffset]; |
- if (edgeType === edgeWeakType || edgeType === edgeShortcutType) |
+ if (!this._isEssentialEdge(this._rootNodeIndex, edgeType)) |
continue; |
var childNodeOrdinal = containmentEdges[edgeIndex + edgeToNodeOffset] / nodeFieldCount; |
affected[nodeOrdinal2PostOrderIndex[childNodeOrdinal]] = 1; |
@@ -1808,10 +1816,10 @@ WebInspector.HeapSnapshot.prototype = { |
for (var retainerIndex = beginRetainerIndex; retainerIndex < endRetainerIndex; ++retainerIndex) { |
var retainerEdgeIndex = retainingEdges[retainerIndex]; |
var retainerEdgeType = containmentEdges[retainerEdgeIndex + edgeTypeOffset]; |
- if (retainerEdgeType === edgeWeakType || retainerEdgeType === edgeShortcutType) |
+ var retainerNodeIndex = retainingNodes[retainerIndex]; |
+ if (!this._isEssentialEdge(retainerNodeIndex, retainerEdgeType)) |
continue; |
orphanNode = false; |
- var retainerNodeIndex = retainingNodes[retainerIndex]; |
var retainerNodeOrdinal = retainerNodeIndex / nodeFieldCount; |
var retainerNodeFlag = !flags || (flags[retainerNodeOrdinal] & flag); |
// We are skipping the edges from non-page-owned nodes to page-owned nodes. |