1926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/*
2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved.
3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
4926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
5926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * modification, are permitted provided that the following conditions are
6926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * met:
7926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
8926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     * Redistributions of source code must retain the above copyright
9926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * notice, this list of conditions and the following disclaimer.
10926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     * Redistributions in binary form must reproduce the above
11926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
12926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * in the documentation and/or other materials provided with the
13926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * distribution.
14926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
15926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * contributors may be used to endorse or promote products derived from
16926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * this software without specific prior written permission.
17926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
18926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
30926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
31926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
32926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @constructor
33f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) * @extends {WebInspector.HeapSnapshot}
34f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) * @param {!Object} profile
35a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.HeapSnapshotProgress} progress
3607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * @param {boolean} showHiddenData
37926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
3807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochWebInspector.JSHeapSnapshot = function(profile, progress, showHiddenData)
39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
40926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._nodeFlags = { // bit flags
41926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        canBeQueried: 1,
42926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        detachedDOMTreeNode: 2,
43926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        pageObject: 4, // The idea is to track separately the objects owned by the page and the objects owned by debugger.
44926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        visitedMarkerMask: 0x0ffff,
46197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        visitedMarker:     0x10000
47926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    };
489bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    this._lazyStringCache = { };
49197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this._showHiddenData = showHiddenData;
50197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.HeapSnapshot.call(this, profile, progress);
51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.JSHeapSnapshot.prototype = {
5409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {number} nodeIndex
5609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {!WebInspector.JSHeapSnapshotNode}
5709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    createNode: function(nodeIndex)
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return new WebInspector.JSHeapSnapshotNode(this, nodeIndex);
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
6407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch     * @override
6509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {number} edgeIndex
6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {!WebInspector.JSHeapSnapshotEdge}
6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
6807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    createEdge: function(edgeIndex)
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
7007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return new WebInspector.JSHeapSnapshotEdge(this, edgeIndex);
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
7407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch     * @override
7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {number} retainerIndex
7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {!WebInspector.JSHeapSnapshotRetainerEdge}
7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
7807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    createRetainingEdge: function(retainerIndex)
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
8007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return new WebInspector.JSHeapSnapshotRetainerEdge(this, retainerIndex);
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
8309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
8407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch     * @override
8507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch     * @return {?function(!WebInspector.JSHeapSnapshotNode):boolean}
8609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    classNodesFilter: function()
88926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
89197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var mapAndFlag = this.userObjectsMapAndFlag();
90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (!mapAndFlag)
91197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return null;
92197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var map = mapAndFlag.map;
93197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var flag = mapAndFlag.flag;
9407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        /**
9507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         * @param {!WebInspector.JSHeapSnapshotNode} node
9607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         * @return {boolean}
9707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         */
98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function filter(node)
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
100197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return !!(map[node.ordinal()] & flag);
101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
102197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return filter;
103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
10509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
10609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {function(!WebInspector.HeapSnapshotEdge):boolean}
10709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
10807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    containmentEdgesFilter: function()
109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
11007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        var showHiddenData = this._showHiddenData;
111197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        function filter(edge)
112197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        {
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (edge.isInvisible())
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                return false;
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (showHiddenData)
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                return true;
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return !edge.isHidden() && !edge.node().isHidden();
118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return filter;
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
12209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
12309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {function(!WebInspector.HeapSnapshotEdge):boolean}
12409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
12507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    retainingEdgesFilter: function()
126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
12707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        var containmentEdgesFilter = this.containmentEdgesFilter();
1287757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        function filter(edge)
1297757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        {
1307757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            return containmentEdgesFilter(edge) && !edge.node().isRoot() && !edge.isWeak();
131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return filter;
133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _calculateFlags: function()
136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._flags = new Uint32Array(this.nodeCount);
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._markDetachedDOMTreeNodes();
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._markQueriableHeapObjects();
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._markPageOwnedNodes();
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    calculateDistances: function()
1447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {
1457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        /**
1467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci         * @param {!WebInspector.HeapSnapshotNode} node
1477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci         * @param {!WebInspector.HeapSnapshotEdge} edge
1487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci         * @return {boolean}
1497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci         */
1507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        function filter(node, edge)
1517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        {
1527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            if (node.isHidden())
1537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                return edge.name() !== "sloppy_function_map" || node.rawName() !== "system / NativeContext";
1547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            if (node.isArray()) {
1557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                // DescriptorArrays are fixed arrays used to hold instance descriptors.
1567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                // The format of the these objects is:
1577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                //   [0]: Number of descriptors
1587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                //   [1]: Either Smi(0) if uninitialized, or a pointer to small fixed array:
1597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                //          [0]: pointer to fixed array with enum cache
1607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                //          [1]: either Smi(0) or pointer to fixed array with indices
1617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                //   [i*3+2]: i-th key
1627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                //   [i*3+3]: i-th type
1637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                //   [i*3+4]: i-th descriptor
1647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                // As long as maps may share descriptor arrays some of the descriptor
1657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                // links may not be valid for all the maps. We just skip
1667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                // all the descriptor links when calculating distances.
1677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                // For more details see http://crbug.com/413608
1687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                if (node.rawName() !== "(map descriptors)")
1697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                    return true;
1707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                var index = edge.name();
1717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                return index < 2 || (index % 3) !== 1;
1727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            }
1737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            return true;
1747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
1757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        WebInspector.HeapSnapshot.prototype.calculateDistances.call(this, filter);
1767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    },
1777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
178e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    /**
179e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch     * @param {!WebInspector.HeapSnapshotNode} node
180e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch     * @return {!boolean}
181e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch     */
182e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    _isUserRoot: function(node)
183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
184e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return node.isUserRoot() || node.isDocumentDOMTreesRoot();
185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
186926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
18783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    /**
18883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch     * @param {function(!WebInspector.HeapSnapshotNode)} action
18983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch     * @param {boolean=} userRootsOnly
19083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch     */
19183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    forEachRoot: function(action, userRootsOnly)
19283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    {
19383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        /**
19483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch         * @param {!WebInspector.HeapSnapshotNode} node
1955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)         * @param {string} name
196a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)         * @return {?WebInspector.HeapSnapshotNode}
19783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch         */
19883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        function getChildNodeByName(node, name)
19983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        {
20083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch            for (var iter = node.edges(); iter.hasNext(); iter.next()) {
20183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch                var child = iter.edge.node();
20283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch                if (child.name() === name)
20383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch                    return child;
20483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch            }
20583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch            return null;
20683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        }
20783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch
20883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        var visitedNodes = {};
20983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        /**
21083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch         * @param {!WebInspector.HeapSnapshotNode} node
21183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch         */
21283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        function doAction(node)
21383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        {
214197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            var ordinal = node.ordinal();
21583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch            if (!visitedNodes[ordinal]) {
21683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch                action(node);
21783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch                visitedNodes[ordinal] = true;
21883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch            }
21983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        }
22083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch
22183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        var gcRoots = getChildNodeByName(this.rootNode(), "(GC roots)");
22283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        if (!gcRoots)
22383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch            return;
22483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch
22583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        if (userRootsOnly) {
22683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch            for (var iter = this.rootNode().edges(); iter.hasNext(); iter.next()) {
22783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch                var node = iter.edge.node();
22807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                if (this._isUserRoot(node))
22983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch                    doAction(node);
23083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch            }
23183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        } else {
23283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch            for (var iter = gcRoots.edges(); iter.hasNext(); iter.next()) {
23383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch                var subRoot = iter.edge.node();
23483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch                for (var iter2 = subRoot.edges(); iter2.hasNext(); iter2.next())
23583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch                    doAction(iter2.edge.node());
23683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch                doAction(subRoot);
23783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch            }
23883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch            for (var iter = this.rootNode().edges(); iter.hasNext(); iter.next())
23983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch                doAction(iter.edge.node())
24083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        }
24183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    },
24283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch
24309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
24407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch     * @return {?{map: !Uint32Array, flag: number}}
24509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
246926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    userObjectsMapAndFlag: function()
247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
24807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return this._showHiddenData ? null : {
249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            map: this._flags,
250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            flag: this._nodeFlags.pageObject
251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        };
252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _flagsOfNode: function(node)
255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
256926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._flags[node.nodeIndex / this._nodeFieldCount];
257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
258926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
259926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _markDetachedDOMTreeNodes: function()
260926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
261926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var flag = this._nodeFlags.detachedDOMTreeNode;
262926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var detachedDOMTreesRoot;
263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var iter = this.rootNode().edges(); iter.hasNext(); iter.next()) {
264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var node = iter.edge.node();
265926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (node.name() === "(Detached DOM trees)") {
266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                detachedDOMTreesRoot = node;
267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                break;
268926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            }
269926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
270926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
271926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!detachedDOMTreesRoot)
272926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
273926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
274926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var detachedDOMTreeRE = /^Detached DOM tree/;
275926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var iter = detachedDOMTreesRoot.edges(); iter.hasNext(); iter.next()) {
276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var node = iter.edge.node();
277926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (detachedDOMTreeRE.test(node.className())) {
278926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                for (var edgesIter = node.edges(); edgesIter.hasNext(); edgesIter.next())
279926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    this._flags[edgesIter.edge.node().nodeIndex / this._nodeFieldCount] |= flag;
280926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            }
281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
283926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _markQueriableHeapObjects: function()
285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
286926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Allow runtime properties query for objects accessible from Window objects
287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // via regular properties, and for DOM wrappers. Trying to access random objects
288926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // can cause a crash due to insonsistent state of internal properties of wrappers.
289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var flag = this._nodeFlags.canBeQueried;
290926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var hiddenEdgeType = this._edgeHiddenType;
291926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var internalEdgeType = this._edgeInternalType;
292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var invisibleEdgeType = this._edgeInvisibleType;
293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var weakEdgeType = this._edgeWeakType;
294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var edgeToNodeOffset = this._edgeToNodeOffset;
295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var edgeTypeOffset = this._edgeTypeOffset;
296926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var edgeFieldsCount = this._edgeFieldsCount;
297197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var containmentEdges = this.containmentEdges;
298197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var nodes = this.nodes;
299926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var nodeCount = this.nodeCount;
300926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var nodeFieldCount = this._nodeFieldCount;
301926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var firstEdgeIndexes = this._firstEdgeIndexes;
302926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
303926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var flags = this._flags;
304926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var list = [];
305926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
306926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var iter = this.rootNode().edges(); iter.hasNext(); iter.next()) {
307591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            if (iter.edge.node().isUserRoot())
308926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                list.push(iter.edge.node().nodeIndex / nodeFieldCount);
309926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
310926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
311926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        while (list.length) {
312926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var nodeOrdinal = list.pop();
313926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (flags[nodeOrdinal] & flag)
314926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                continue;
315926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            flags[nodeOrdinal] |= flag;
316926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var beginEdgeIndex = firstEdgeIndexes[nodeOrdinal];
317926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var endEdgeIndex = firstEdgeIndexes[nodeOrdinal + 1];
318926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            for (var edgeIndex = beginEdgeIndex; edgeIndex < endEdgeIndex; edgeIndex += edgeFieldsCount) {
319926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                var childNodeIndex = containmentEdges[edgeIndex + edgeToNodeOffset];
320926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                var childNodeOrdinal = childNodeIndex / nodeFieldCount;
321926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                if (flags[childNodeOrdinal] & flag)
322926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    continue;
323926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                var type = containmentEdges[edgeIndex + edgeTypeOffset];
324926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                if (type === hiddenEdgeType || type === invisibleEdgeType || type === internalEdgeType || type === weakEdgeType)
325926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    continue;
326926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                list.push(childNodeOrdinal);
327926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            }
328926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
329926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
330926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _markPageOwnedNodes: function()
332926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
333926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var edgeShortcutType = this._edgeShortcutType;
334926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var edgeElementType = this._edgeElementType;
335926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var edgeToNodeOffset = this._edgeToNodeOffset;
336926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var edgeTypeOffset = this._edgeTypeOffset;
337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var edgeFieldsCount = this._edgeFieldsCount;
338926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var edgeWeakType = this._edgeWeakType;
339926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var firstEdgeIndexes = this._firstEdgeIndexes;
340197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var containmentEdges = this.containmentEdges;
341926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var containmentEdgesLength = containmentEdges.length;
342197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var nodes = this.nodes;
343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var nodeFieldCount = this._nodeFieldCount;
344926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var nodesCount = this.nodeCount;
345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
346926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var flags = this._flags;
347926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var flag = this._nodeFlags.pageObject;
348926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var visitedMarker = this._nodeFlags.visitedMarker;
349926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var visitedMarkerMask = this._nodeFlags.visitedMarkerMask;
350926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var markerAndFlag = visitedMarker | flag;
351926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
352926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var nodesToVisit = new Uint32Array(nodesCount);
353926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var nodesToVisitLength = 0;
354926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
355926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var rootNodeOrdinal = this._rootNodeIndex / nodeFieldCount;
356926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var node = this.rootNode();
357926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var edgeIndex = firstEdgeIndexes[rootNodeOrdinal], endEdgeIndex = firstEdgeIndexes[rootNodeOrdinal + 1];
358926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)             edgeIndex < endEdgeIndex;
359926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)             edgeIndex += edgeFieldsCount) {
360926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var edgeType = containmentEdges[edgeIndex + edgeTypeOffset];
361926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var nodeIndex = containmentEdges[edgeIndex + edgeToNodeOffset];
362926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (edgeType === edgeElementType) {
363926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                node.nodeIndex = nodeIndex;
364926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                if (!node.isDocumentDOMTreesRoot())
365926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    continue;
366926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            } else if (edgeType !== edgeShortcutType)
367926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                continue;
368926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var nodeOrdinal = nodeIndex / nodeFieldCount;
369926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            nodesToVisit[nodesToVisitLength++] = nodeOrdinal;
370926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            flags[nodeOrdinal] |= visitedMarker;
371926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
372926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
373926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        while (nodesToVisitLength) {
374926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var nodeOrdinal = nodesToVisit[--nodesToVisitLength];
375926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            flags[nodeOrdinal] |= flag;
376926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            flags[nodeOrdinal] &= visitedMarkerMask;
377926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var beginEdgeIndex = firstEdgeIndexes[nodeOrdinal];
378926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var endEdgeIndex = firstEdgeIndexes[nodeOrdinal + 1];
379926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            for (var edgeIndex = beginEdgeIndex; edgeIndex < endEdgeIndex; edgeIndex += edgeFieldsCount) {
380926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                var childNodeIndex = containmentEdges[edgeIndex + edgeToNodeOffset];
381926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                var childNodeOrdinal = childNodeIndex / nodeFieldCount;
382926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                if (flags[childNodeOrdinal] & markerAndFlag)
383926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    continue;
384926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                var type = containmentEdges[edgeIndex + edgeTypeOffset];
385926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                if (type === edgeWeakType)
386926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    continue;
387926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                nodesToVisit[nodesToVisitLength++] = childNodeOrdinal;
388926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                flags[childNodeOrdinal] |= visitedMarker;
389926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            }
390926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
391926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
392926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
393d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    _calculateStatistics: function()
394d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
395d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var nodeFieldCount = this._nodeFieldCount;
396197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var nodes = this.nodes;
397d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var nodesLength = nodes.length;
398d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var nodeTypeOffset = this._nodeTypeOffset;
399d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var nodeSizeOffset = this._nodeSelfSizeOffset;;
400d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var nodeNativeType = this._nodeNativeType;
401d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var nodeCodeType = this._nodeCodeType;
402d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var nodeConsStringType = this._nodeConsStringType;
403d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var nodeSlicedStringType = this._nodeSlicedStringType;
404d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var sizeNative = 0;
405d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var sizeCode = 0;
406d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var sizeStrings = 0;
407d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var sizeJSArrays = 0;
408d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var node = this.rootNode();
409d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        for (var nodeIndex = 0; nodeIndex < nodesLength; nodeIndex += nodeFieldCount) {
410d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            node.nodeIndex = nodeIndex;
411d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            var nodeType = nodes[nodeIndex + nodeTypeOffset];
412d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            var nodeSize = nodes[nodeIndex + nodeSizeOffset];
413d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (nodeType === nodeNativeType)
414d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                sizeNative += nodeSize;
415d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            else if (nodeType === nodeCodeType)
416d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                sizeCode += nodeSize;
417d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            else if (nodeType === nodeConsStringType || nodeType === nodeSlicedStringType || node.type() === "string")
418d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                sizeStrings += nodeSize;
419d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            else if (node.name() === "Array")
420d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                sizeJSArrays += this._calculateArraySize(node);
421d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
422d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._statistics = new WebInspector.HeapSnapshotCommon.Statistics();
423d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._statistics.total = this.totalSize;
424d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._statistics.v8heap = this.totalSize - sizeNative;
425d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._statistics.native = sizeNative;
426d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._statistics.code = sizeCode;
427d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._statistics.jsArrays = sizeJSArrays;
428d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._statistics.strings = sizeStrings;
429d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
430d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
431d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
432d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @param {!WebInspector.HeapSnapshotNode} node
433d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @return {number}
434d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
435d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    _calculateArraySize: function(node)
436d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
437d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var size = node.selfSize();
438197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var beginEdgeIndex = node.edgeIndexesStart();
439197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var endEdgeIndex = node.edgeIndexesEnd();
440197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var containmentEdges = this.containmentEdges;
441197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var strings = this.strings;
442d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var edgeToNodeOffset = this._edgeToNodeOffset;
443d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var edgeTypeOffset = this._edgeTypeOffset;
444d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var edgeNameOffset = this._edgeNameOffset;
445d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var edgeFieldsCount = this._edgeFieldsCount;
446d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var edgeInternalType = this._edgeInternalType;
447d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        for (var edgeIndex = beginEdgeIndex; edgeIndex < endEdgeIndex; edgeIndex += edgeFieldsCount) {
448d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            var edgeType = containmentEdges[edgeIndex + edgeTypeOffset];
449d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (edgeType !== edgeInternalType)
450d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                continue;
451d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            var edgeName = strings[containmentEdges[edgeIndex + edgeNameOffset]];
452d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (edgeName !== "elements")
453d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                continue;
454d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            var elementsNodeIndex = containmentEdges[edgeIndex + edgeToNodeOffset];
455d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            node.nodeIndex = elementsNodeIndex;
456d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (node.retainersCount() === 1)
457d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                size += node.selfSize();
458d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            break;
459d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
460d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return size;
461d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
462d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
463d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
464d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @return {!WebInspector.HeapSnapshotCommon.Statistics}
465d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
466d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    getStatistics: function()
467d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
468d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return this._statistics;
469d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
470d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
471926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    __proto__: WebInspector.HeapSnapshot.prototype
472926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
473926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
474926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
475926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @constructor
476926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @extends {WebInspector.HeapSnapshotNode}
477a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.JSHeapSnapshot} snapshot
478926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {number=} nodeIndex
479926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
480926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.JSHeapSnapshotNode = function(snapshot, nodeIndex)
481926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
482926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebInspector.HeapSnapshotNode.call(this, snapshot, nodeIndex)
483926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
484926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
485926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.JSHeapSnapshotNode.prototype = {
48609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
48709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
48809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
489926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    canBeQueried: function()
490926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
491926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var flags = this._snapshot._flagsOfNode(this);
492926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return !!(flags & this._snapshot._nodeFlags.canBeQueried);
493926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
494926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
49509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
49609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {string}
49709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
4987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    rawName: WebInspector.HeapSnapshotNode.prototype.name,
4997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
5007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /**
5017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @return {string}
5027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     */
503197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    name: function()
504197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
5059bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        var snapshot = this._snapshot;
5069bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        if (this._type() === snapshot._nodeConsStringType) {
5079bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            var string = snapshot._lazyStringCache[this.nodeIndex];
5089bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            if (typeof string === "undefined") {
5099bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                string = this._consStringName();
5109bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                snapshot._lazyStringCache[this.nodeIndex] = string;
5119bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            }
5129bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            return string;
5139bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        }
5147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return this.rawName();
5159bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    },
5169bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
5177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /**
5187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @return {string}
5197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     */
5209bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    _consStringName: function()
5219bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    {
5229bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        var snapshot = this._snapshot;
5239bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        var consStringType = snapshot._nodeConsStringType;
5249bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        var edgeInternalType = snapshot._edgeInternalType;
5259bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        var edgeFieldsCount = snapshot._edgeFieldsCount;
5269bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        var edgeToNodeOffset = snapshot._edgeToNodeOffset;
5279bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        var edgeTypeOffset = snapshot._edgeTypeOffset;
5289bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        var edgeNameOffset = snapshot._edgeNameOffset;
529197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var strings = snapshot.strings;
530197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var edges = snapshot.containmentEdges;
5319bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        var firstEdgeIndexes = snapshot._firstEdgeIndexes;
5329bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        var nodeFieldCount = snapshot._nodeFieldCount;
5339bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        var nodeTypeOffset = snapshot._nodeTypeOffset;
5349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        var nodeNameOffset = snapshot._nodeNameOffset;
535197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var nodes = snapshot.nodes;
5369bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        var nodesStack = [];
5379bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        nodesStack.push(this.nodeIndex);
5389bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        var name = "";
5399bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
5409bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        while (nodesStack.length && name.length < 1024) {
5419bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            var nodeIndex = nodesStack.pop();
5429bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            if (nodes[nodeIndex + nodeTypeOffset] !== consStringType) {
5439bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                name += strings[nodes[nodeIndex + nodeNameOffset]];
5449bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                continue;
5459bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            }
5469bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            var nodeOrdinal = nodeIndex / nodeFieldCount;
5479bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            var beginEdgeIndex = firstEdgeIndexes[nodeOrdinal];
5489bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            var endEdgeIndex = firstEdgeIndexes[nodeOrdinal + 1];
5499bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            var firstNodeIndex = 0;
5509bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            var secondNodeIndex = 0;
5519bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            for (var edgeIndex = beginEdgeIndex; edgeIndex < endEdgeIndex && (!firstNodeIndex || !secondNodeIndex); edgeIndex += edgeFieldsCount) {
5529bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                var edgeType = edges[edgeIndex + edgeTypeOffset];
5539bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                if (edgeType === edgeInternalType) {
5549bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                    var edgeName = strings[edges[edgeIndex + edgeNameOffset]];
5559bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                    if (edgeName === "first")
5569bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                        firstNodeIndex = edges[edgeIndex + edgeToNodeOffset];
5579bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                    else if (edgeName === "second")
5589bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                        secondNodeIndex = edges[edgeIndex + edgeToNodeOffset];
5599bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                }
5609bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            }
5619bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            nodesStack.push(secondNodeIndex);
5629bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            nodesStack.push(firstNodeIndex);
5639bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        }
5649bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return name;
5659bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    },
5669bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
56709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
56809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {string}
56909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
570926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    className: function()
571926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
572926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var type = this.type();
573926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        switch (type) {
574926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case "hidden":
575926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return "(system)";
576926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case "object":
577926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case "native":
578926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return this.name();
579926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case "code":
580926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return "(compiled code)";
581926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        default:
582926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return "(" + type + ")";
583926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
584926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
585926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
58609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
58709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {number}
58809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
589926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    classIndex: function()
590926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
591926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var snapshot = this._snapshot;
592197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var nodes = snapshot.nodes;
593926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var type = nodes[this.nodeIndex + snapshot._nodeTypeOffset];;
594926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (type === snapshot._nodeObjectType || type === snapshot._nodeNativeType)
595926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return nodes[this.nodeIndex + snapshot._nodeNameOffset];
596926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return -1 - type;
597926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
598926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
59909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
600a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     * @return {number}
60109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
602926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    id: function()
603926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
604926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var snapshot = this._snapshot;
605197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return snapshot.nodes[this.nodeIndex + snapshot._nodeIdOffset];
606926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
607926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
60809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
60909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
61009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
611926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    isHidden: function()
612926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
613926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._type() === this._snapshot._nodeHiddenType;
614926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
615926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
61609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
61709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
61809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
6197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    isArray: function()
6207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {
6217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return this._type() === this._snapshot._nodeArrayType;
6227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    },
6237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
6247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /**
6257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @return {boolean}
6267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     */
627926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    isSynthetic: function()
628926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
629926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._type() === this._snapshot._nodeSyntheticType;
630926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
631926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
632e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    /**
633e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch     * @return {!boolean}
634e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch     */
635591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    isUserRoot: function()
636926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
63783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        return !this.isSynthetic();
638926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
639926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
640e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    /**
641e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch     * @return {!boolean}
642e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch     */
643926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    isDocumentDOMTreesRoot: function()
644926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
645926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this.isSynthetic() && this.name() === "(Document DOM trees)";
646926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
647926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
64809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
649a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     * @return {!WebInspector.HeapSnapshotCommon.Node}
65009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
651926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    serialize: function()
652926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
653926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var result = WebInspector.HeapSnapshotNode.prototype.serialize.call(this);
654926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var flags = this._snapshot._flagsOfNode(this);
655926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (flags & this._snapshot._nodeFlags.canBeQueried)
656926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            result.canBeQueried = true;
657926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (flags & this._snapshot._nodeFlags.detachedDOMTreeNode)
658926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            result.detachedDOMTreeNode = true;
659926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return result;
660926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
661926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
662926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    __proto__: WebInspector.HeapSnapshotNode.prototype
663926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
664926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
665926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
666926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @constructor
667926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @extends {WebInspector.HeapSnapshotEdge}
668a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.JSHeapSnapshot} snapshot
669926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {number=} edgeIndex
670926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
67107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochWebInspector.JSHeapSnapshotEdge = function(snapshot, edgeIndex)
672926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
67307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    WebInspector.HeapSnapshotEdge.call(this, snapshot, edgeIndex);
674926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
675926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
676926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.JSHeapSnapshotEdge.prototype = {
67709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
67809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {!WebInspector.JSHeapSnapshotEdge}
67909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
680926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    clone: function()
681926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
68207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        var snapshot = /** @type {!WebInspector.JSHeapSnapshot} */ (this._snapshot);
68307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return new WebInspector.JSHeapSnapshotEdge(snapshot, this.edgeIndex);
684926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
685926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
68609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
68709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
68809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
689926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    hasStringName: function()
690926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
691926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!this.isShortcut())
692926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return this._hasStringName();
693926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return isNaN(parseInt(this._name(), 10));
694926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
695926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
69609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
69709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
69809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
699926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    isElement: function()
700926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
701926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._type() === this._snapshot._edgeElementType;
702926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
703926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
70409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
70509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
70609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
707926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    isHidden: function()
708926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
709926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._type() === this._snapshot._edgeHiddenType;
710926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
711926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
71209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
71309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
71409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
715926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    isWeak: function()
716926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
717926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._type() === this._snapshot._edgeWeakType;
718926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
719926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
72009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
72109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
72209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
723926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    isInternal: function()
724926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
725926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._type() === this._snapshot._edgeInternalType;
726926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
727926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
72809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
72909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
73009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
731926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    isInvisible: function()
732926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
733926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._type() === this._snapshot._edgeInvisibleType;
734926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
735926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
73609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
73709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
73809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
739926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    isShortcut: function()
740926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
741926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._type() === this._snapshot._edgeShortcutType;
742926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
743926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
74409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
7457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @return {string|number}
74609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
747926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    name: function()
748926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
749926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!this.isShortcut())
750926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return this._name();
751926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var numName = parseInt(this._name(), 10);
752926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return isNaN(numName) ? this._name() : numName;
753926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
754926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
75509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
75609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {string}
75709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
758926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    toString: function()
759926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
760926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var name = this.name();
761926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        switch (this.type()) {
762926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case "context": return "->" + name;
763926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case "element": return "[" + name + "]";
764926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case "weak": return "[[" + name + "]]";
765926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case "property":
766926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return name.indexOf(" ") === -1 ? "." + name : "[\"" + name + "\"]";
767926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case "shortcut":
768926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (typeof name === "string")
769926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                return name.indexOf(" ") === -1 ? "." + name : "[\"" + name + "\"]";
770926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            else
771926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                return "[" + name + "]";
772926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case "internal":
773926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case "hidden":
774926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case "invisible":
775926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return "{" + name + "}";
776926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        };
777926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return "?" + name + "?";
778926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
779926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /**
7817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @return {boolean}
7827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     */
783926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _hasStringName: function()
784926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
7857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var type = this._type();
7867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var snapshot = this._snapshot;
7877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return type !== snapshot._edgeElementType && type !== snapshot._edgeHiddenType;
788926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
789926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /**
7917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @return {string|number}
7927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     */
793926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _name: function()
794926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
795197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return this._hasStringName() ? this._snapshot.strings[this._nameOrIndex()] : this._nameOrIndex();
796926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
797926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /**
7997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @return {number}
8007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     */
801926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _nameOrIndex: function()
802926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
80307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return this._edges[this.edgeIndex + this._snapshot._edgeNameOffset];
804926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
805926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
8067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /**
8077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @return {number}
8087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     */
809926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _type: function()
810926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
81107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return this._edges[this.edgeIndex + this._snapshot._edgeTypeOffset];
812926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
813926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
814926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    __proto__: WebInspector.HeapSnapshotEdge.prototype
815926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
816926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
817926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
818926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
819926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @constructor
820926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @extends {WebInspector.HeapSnapshotRetainerEdge}
821a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.JSHeapSnapshot} snapshot
82207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * @param {number} retainerIndex
823926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
82407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochWebInspector.JSHeapSnapshotRetainerEdge = function(snapshot, retainerIndex)
825926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
82607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    WebInspector.HeapSnapshotRetainerEdge.call(this, snapshot, retainerIndex);
827926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
828926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
829926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.JSHeapSnapshotRetainerEdge.prototype = {
83009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
83109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {!WebInspector.JSHeapSnapshotRetainerEdge}
83209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
833926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    clone: function()
834926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
83507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        var snapshot = /** @type {!WebInspector.JSHeapSnapshot} */ (this._snapshot);
83607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return new WebInspector.JSHeapSnapshotRetainerEdge(snapshot, this.retainerIndex());
837926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
838926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
83909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
84009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
84109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
842926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    isHidden: function()
843926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
844926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._edge().isHidden();
845926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
846926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
84709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
84809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
84909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
850926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    isInternal: function()
851926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
852926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._edge().isInternal();
853926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
854926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
85509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
85609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
85709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
858926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    isInvisible: function()
859926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
860926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._edge().isInvisible();
861926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
862926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
86309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
86409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
86509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
866926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    isShortcut: function()
867926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
868926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._edge().isShortcut();
869926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
870926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
87109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
87209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
87309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
874926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    isWeak: function()
875926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
876926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._edge().isWeak();
877926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
878926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
879926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    __proto__: WebInspector.HeapSnapshotRetainerEdge.prototype
880926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
881926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
882