Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Side by Side Diff: Source/devtools/front_end/HeapSnapshot.js

Issue 205993003: Simplify HeapSnapshotFilteredOrderedIterator implementation (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « LayoutTests/inspector/profiler/heap-snapshot.html ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 636 matching lines...) Expand 10 before | Expand all | Expand 10 after
647 }, 647 },
648 648
649 next: function() 649 next: function()
650 { 650 {
651 this.node.nodeIndex = this.node._nextNodeIndex(); 651 this.node.nodeIndex = this.node._nextNodeIndex();
652 } 652 }
653 } 653 }
654 654
655 655
656 /** 656 /**
657 * @constructor
658 */
659 WebInspector.HeapSnapshotIndexRangeIterator = function(iterator, indexes)
alph 2014/03/20 09:58:04 annotate plz
yurys 2014/03/20 11:47:42 Done.
660 {
661 this._iterator = iterator;
662 this._indexes = indexes;
663 this._position = 0;
664 this._forcedIndex = -1;
665 }
666
667 WebInspector.HeapSnapshotIndexRangeIterator.prototype = {
668 /**
669 * @return {boolean}
670 */
671 hasNext: function()
672 {
673 return this._position < this._indexes.length
alph 2014/03/20 09:58:04 ; missing
yurys 2014/03/20 11:47:42 Done.
674 },
675
676 /**
677 * @return {number}
678 */
679 index: function()
loislo 2014/03/20 09:58:26 Can we just use a free function for converting ind
yurys 2014/03/20 11:47:42 We will need to pass it as a separate object as it
680 {
681 if (this._forcedIndex !== -1)
682 return this._forcedIndex;
683 return this._indexes[this._position];
684 },
685
686 /**
687 * @param {number} newIndex
688 */
689 setIndex: function(newIndex)
690 {
691 this._forcedIndex = newIndex;
692 },
693
694 /**
695 * @return {!WebInspector.HeapSnapshotNode}
696 */
697 item: function()
698 {
699 this._iterator.setIndex(this.index());
700 return this._iterator.item();
701 },
702
703 next: function()
704 {
705 ++this._position;
706 }
707 }
708
709
710 /**
711 * @constructor
712 */
713 WebInspector.HeapSnapshotFilteredIterator = function(iterator, filter)
714 {
715 this._iterator = iterator;
716 this._filter = filter;
717 this._skipFilteredItems();
718 }
719
720 WebInspector.HeapSnapshotFilteredIterator.prototype = {
721 /**
722 * @return {boolean}
723 */
724 hasNext: function()
725 {
726 return this._iterator.hasNext();
727 },
728
729 /**
730 * @return {number}
731 */
732 index: function()
733 {
734 return this._iterator.index();
735 },
736
737 /**
738 * @param {number} newIndex
739 */
740 setIndex: function(newIndex)
741 {
742 this._iterator.setIndex(newIndex);
743 },
744
745 /**
746 * @return {!WebInspector.HeapSnapshotNode}
747 */
748 item: function()
749 {
750 return this._iterator.item();
751 },
752
753 next: function()
754 {
755 this._iterator.next();
756 this._skipFilteredItems();
757 },
758
759 _skipFilteredItems: function()
760 {
761 while (this._iterator.hasNext() && !this._filter(this._iterator.item())) {
762 this._iterator.next();
763 }
764 }
765 }
766
767
768 /**
657 * @param {!WebInspector.HeapSnapshotWorkerDispatcher=} dispatcher 769 * @param {!WebInspector.HeapSnapshotWorkerDispatcher=} dispatcher
658 * @constructor 770 * @constructor
659 */ 771 */
660 WebInspector.HeapSnapshotProgress = function(dispatcher) 772 WebInspector.HeapSnapshotProgress = function(dispatcher)
661 { 773 {
662 this._dispatcher = dispatcher; 774 this._dispatcher = dispatcher;
663 } 775 }
664 776
665 WebInspector.HeapSnapshotProgress.prototype = { 777 WebInspector.HeapSnapshotProgress.prototype = {
666 /** 778 /**
(...skipping 1218 matching lines...) Expand 10 before | Expand all | Expand 10 after
1885 * @return {!WebInspector.HeapSnapshotCommon.StaticData} 1997 * @return {!WebInspector.HeapSnapshotCommon.StaticData}
1886 */ 1998 */
1887 updateStaticData: function() 1999 updateStaticData: function()
1888 { 2000 {
1889 return new WebInspector.HeapSnapshotCommon.StaticData(this.nodeCount, th is._rootNodeIndex, this.totalSize, this._maxJsNodeId()); 2001 return new WebInspector.HeapSnapshotCommon.StaticData(this.nodeCount, th is._rootNodeIndex, this.totalSize, this._maxJsNodeId());
1890 } 2002 }
1891 }; 2003 };
1892 2004
1893 /** 2005 /**
1894 * @constructor 2006 * @constructor
1895 * @param {(!Array.<number>|!Uint32Array)=} unfilteredIterationOrder
1896 */ 2007 */
1897 WebInspector.HeapSnapshotFilteredOrderedIterator = function(iterator, filter, un filteredIterationOrder) 2008 WebInspector.HeapSnapshotFilteredOrderedIterator = function(iterator)
alph 2014/03/20 09:58:04 I'd suggest drop "Filtered" from the class name.
yurys 2014/03/20 11:47:42 Done.
1898 { 2009 {
1899 this._filter = filter;
1900 this._iterator = iterator; 2010 this._iterator = iterator;
1901 this._unfilteredIterationOrder = unfilteredIterationOrder; 2011 this._isEmpty = !iterator.hasNext();
1902 /** @type {?Array.<number>|?Uint32Array} */ 2012 /** @type {?Array.<number>} */
1903 this._iterationOrder = null; 2013 this._iterationOrder = null;
1904 this._position = 0;
1905 this._currentComparator = null; 2014 this._currentComparator = null;
1906 this._sortedPrefixLength = 0; 2015 this._sortedPrefixLength = 0;
1907 this._sortedSuffixLength = 0; 2016 this._sortedSuffixLength = 0;
1908 } 2017 }
1909 2018
1910 WebInspector.HeapSnapshotFilteredOrderedIterator.prototype = { 2019 WebInspector.HeapSnapshotFilteredOrderedIterator.prototype = {
1911 _createIterationOrder: function() 2020 _createIterationOrder: function()
1912 { 2021 {
1913 if (this._iterationOrder) 2022 if (this._iterationOrder)
1914 return; 2023 return;
1915 if (this._unfilteredIterationOrder && !this._filter) {
1916 this._iterationOrder = this._unfilteredIterationOrder;
1917 this._unfilteredIterationOrder = null;
1918 return;
1919 }
1920 this._iterationOrder = []; 2024 this._iterationOrder = [];
1921 var iterator = this._iterator; 2025 for (var iterator = this._iterator; iterator.hasNext(); iterator.next())
1922 if (!this._unfilteredIterationOrder && !this._filter) { 2026 this._iterationOrder.push(iterator.index());
1923 for (iterator.rewind(); iterator.hasNext(); iterator.next())
1924 this._iterationOrder.push(iterator.index());
1925 } else if (!this._unfilteredIterationOrder) {
1926 for (iterator.rewind(); iterator.hasNext(); iterator.next()) {
1927 if (this._filter(iterator.item()))
1928 this._iterationOrder.push(iterator.index());
1929 }
1930 } else {
1931 var order = this._unfilteredIterationOrder;
1932 for (var i = 0, l = order.length; i < l; ++i) {
1933 iterator.setIndex(order[i]);
1934 if (this._filter(iterator.item()))
1935 this._iterationOrder.push(iterator.index());
1936 }
1937 this._unfilteredIterationOrder = null;
1938 }
1939 },
1940
1941 rewind: function()
1942 {
1943 this._position = 0;
1944 }, 2027 },
1945 2028
1946 /** 2029 /**
1947 * @return {boolean}
1948 */
1949 hasNext: function()
1950 {
1951 return this._position < this._iterationOrder.length;
1952 },
1953
1954 /**
1955 * @return {boolean} 2030 * @return {boolean}
1956 */ 2031 */
1957 isEmpty: function() 2032 isEmpty: function()
1958 { 2033 {
1959 if (this._iterationOrder) 2034 return this._isEmpty;
1960 return !this._iterationOrder.length;
1961 if (this._unfilteredIterationOrder && !this._filter)
1962 return !this._unfilteredIterationOrder.length;
1963 var iterator = this._iterator;
1964 if (!this._unfilteredIterationOrder && !this._filter) {
1965 iterator.rewind();
1966 return !iterator.hasNext();
1967 } else if (!this._unfilteredIterationOrder) {
1968 for (iterator.rewind(); iterator.hasNext(); iterator.next())
1969 if (this._filter(iterator.item()))
1970 return false;
1971 } else {
1972 var order = this._unfilteredIterationOrder;
1973 for (var i = 0, l = order.length; i < l; ++i) {
1974 iterator.setIndex(order[i]);
1975 if (this._filter(iterator.item()))
1976 return false;
1977 }
1978 }
1979 return true;
1980 }, 2035 },
1981 2036
1982 /** 2037 /**
1983 * @return {*}
1984 */
1985 item: function()
1986 {
1987 this._iterator.setIndex(this._iterationOrder[this._position]);
1988 return this._iterator.item();
1989 },
1990
1991 /**
1992 * @type {number}
1993 */
1994 get length()
1995 {
1996 this._createIterationOrder();
1997 return this._iterationOrder.length;
1998 },
1999
2000 next: function()
2001 {
2002 ++this._position;
2003 },
2004
2005 /**
2006 * @param {number} begin 2038 * @param {number} begin
2007 * @param {number} end 2039 * @param {number} end
2008 * @return {!WebInspector.HeapSnapshotCommon.ItemsRange} 2040 * @return {!WebInspector.HeapSnapshotCommon.ItemsRange}
2009 */ 2041 */
2010 serializeItemsRange: function(begin, end) 2042 serializeItemsRange: function(begin, end)
2011 { 2043 {
2012 this._createIterationOrder(); 2044 this._createIterationOrder();
2013 if (begin > end) 2045 if (begin > end)
2014 throw new Error("Start position > end position: " + begin + " > " + end); 2046 throw new Error("Start position > end position: " + begin + " > " + end);
2015 if (end > this._iterationOrder.length) 2047 if (end > this._iterationOrder.length)
2016 end = this._iterationOrder.length; 2048 end = this._iterationOrder.length;
2017 if (this._sortedPrefixLength < end && begin < this._iterationOrder.lengt h - this._sortedSuffixLength) { 2049 if (this._sortedPrefixLength < end && begin < this._iterationOrder.lengt h - this._sortedSuffixLength) {
2018 this.sort(this._currentComparator, this._sortedPrefixLength, this._i terationOrder.length - 1 - this._sortedSuffixLength, begin, end - 1); 2050 this.sort(this._currentComparator, this._sortedPrefixLength, this._i terationOrder.length - 1 - this._sortedSuffixLength, begin, end - 1);
2019 if (begin <= this._sortedPrefixLength) 2051 if (begin <= this._sortedPrefixLength)
2020 this._sortedPrefixLength = end; 2052 this._sortedPrefixLength = end;
2021 if (end >= this._iterationOrder.length - this._sortedSuffixLength) 2053 if (end >= this._iterationOrder.length - this._sortedSuffixLength)
2022 this._sortedSuffixLength = this._iterationOrder.length - begin; 2054 this._sortedSuffixLength = this._iterationOrder.length - begin;
2023 } 2055 }
2024 2056 var position = begin;
2025 this._position = begin;
2026 var startPosition = this._position;
2027 var count = end - begin; 2057 var count = end - begin;
2028 var result = new Array(count); 2058 var result = new Array(count);
2029 for (var i = 0 ; i < count && this.hasNext(); ++i, this.next()) 2059 var iterator = this._iterator;
2030 result[i] = this.item().serialize(); 2060 for (var i = 0 ; i < count; ++i) {
2031 return new WebInspector.HeapSnapshotCommon.ItemsRange(startPosition, thi s._position, this._iterationOrder.length, result); 2061 iterator.setIndex(this._iterationOrder[position++]);
2062 result[i] = iterator.item().serialize();
alph 2014/03/20 09:58:04 Consider joining setIndex+item into itemByIndex
yurys 2014/03/20 11:47:42 Let me address this in a separate patch.
2063 }
2064 return new WebInspector.HeapSnapshotCommon.ItemsRange(begin, end, this._ iterationOrder.length, result);
2032 }, 2065 },
2033 2066
2034 sortAndRewind: function(comparator) 2067 sortAndRewind: function(comparator)
2035 { 2068 {
2036 this._currentComparator = comparator; 2069 this._currentComparator = comparator;
2037 this._sortedPrefixLength = 0; 2070 this._sortedPrefixLength = 0;
2038 this._sortedSuffixLength = 0; 2071 this._sortedSuffixLength = 0;
2039 this.rewind();
2040 } 2072 }
2041 } 2073 }
2042 2074
2043 /** 2075 /**
2044 * @constructor 2076 * @constructor
2045 * @extends {WebInspector.HeapSnapshotFilteredOrderedIterator} 2077 * @extends {WebInspector.HeapSnapshotFilteredOrderedIterator}
2046 */ 2078 */
2047 WebInspector.HeapSnapshotEdgesProvider = function(snapshot, filter, edgesIter) 2079 WebInspector.HeapSnapshotEdgesProvider = function(snapshot, filter, edgesIter)
2048 { 2080 {
2049 this.snapshot = snapshot; 2081 this.snapshot = snapshot;
2050 WebInspector.HeapSnapshotFilteredOrderedIterator.call(this, edgesIter, filte r); 2082 if (filter)
2083 edgesIter = new WebInspector.HeapSnapshotFilteredIterator(edgesIter, fil ter);
2084 WebInspector.HeapSnapshotFilteredOrderedIterator.call(this, edgesIter);
2051 } 2085 }
2052 2086
2053 WebInspector.HeapSnapshotEdgesProvider.prototype = { 2087 WebInspector.HeapSnapshotEdgesProvider.prototype = {
2054 /** 2088 /**
2055 * @param {!WebInspector.HeapSnapshotCommon.ComparatorConfig} comparator 2089 * @param {!WebInspector.HeapSnapshotCommon.ComparatorConfig} comparator
2056 * @param {number} leftBound 2090 * @param {number} leftBound
2057 * @param {number} rightBound 2091 * @param {number} rightBound
2058 * @param {number} windowLeft 2092 * @param {number} windowLeft
2059 * @param {number} windowRight 2093 * @param {number} windowRight
2060 */ 2094 */
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
2132 this._iterationOrder.sortRange(compareNodeAndNode, leftBound, rightB ound, windowLeft, windowRight); 2166 this._iterationOrder.sortRange(compareNodeAndNode, leftBound, rightB ound, windowLeft, windowRight);
2133 }, 2167 },
2134 2168
2135 __proto__: WebInspector.HeapSnapshotFilteredOrderedIterator.prototype 2169 __proto__: WebInspector.HeapSnapshotFilteredOrderedIterator.prototype
2136 } 2170 }
2137 2171
2138 2172
2139 /** 2173 /**
2140 * @constructor 2174 * @constructor
2141 * @extends {WebInspector.HeapSnapshotFilteredOrderedIterator} 2175 * @extends {WebInspector.HeapSnapshotFilteredOrderedIterator}
2142 * @param {(!Array.<number>|!Uint32Array)=} nodeIndexes 2176 * @param {?function(!WebInspector.HeapSnapshotNode):boolean} filter
2177 * @param {(!Array.<number>|!Uint32Array)} nodeIndexes
2143 */ 2178 */
2144 WebInspector.HeapSnapshotNodesProvider = function(snapshot, filter, nodeIndexes) 2179 WebInspector.HeapSnapshotNodesProvider = function(snapshot, filter, nodeIndexes)
2145 { 2180 {
2146 this.snapshot = snapshot; 2181 this.snapshot = snapshot;
2147 WebInspector.HeapSnapshotFilteredOrderedIterator.call(this, snapshot._allNod es(), filter, nodeIndexes); 2182 var it = new WebInspector.HeapSnapshotIndexRangeIterator(snapshot._allNodes( ), nodeIndexes);
2183 if (filter)
2184 it = new WebInspector.HeapSnapshotFilteredIterator(it, filter);
2185 WebInspector.HeapSnapshotFilteredOrderedIterator.call(this, it);
2148 } 2186 }
2149 2187
2150 WebInspector.HeapSnapshotNodesProvider.prototype = { 2188 WebInspector.HeapSnapshotNodesProvider.prototype = {
2151 /** 2189 /**
2152 * @param {string} snapshotObjectId 2190 * @param {string} snapshotObjectId
2153 * @return {number} 2191 * @return {number}
2154 */ 2192 */
2155 nodePosition: function(snapshotObjectId) 2193 nodePosition: function(snapshotObjectId)
2156 { 2194 {
2157 this._createIterationOrder(); 2195 this._createIterationOrder();
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2222 * @param {number} windowRight 2260 * @param {number} windowRight
2223 */ 2261 */
2224 sort: function(comparator, leftBound, rightBound, windowLeft, windowRight) 2262 sort: function(comparator, leftBound, rightBound, windowLeft, windowRight)
2225 { 2263 {
2226 this._iterationOrder.sortRange(this._buildCompareFunction(comparator), l eftBound, rightBound, windowLeft, windowRight); 2264 this._iterationOrder.sortRange(this._buildCompareFunction(comparator), l eftBound, rightBound, windowLeft, windowRight);
2227 }, 2265 },
2228 2266
2229 __proto__: WebInspector.HeapSnapshotFilteredOrderedIterator.prototype 2267 __proto__: WebInspector.HeapSnapshotFilteredOrderedIterator.prototype
2230 } 2268 }
2231 2269
OLDNEW
« no previous file with comments | « LayoutTests/inspector/profiler/heap-snapshot.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698