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

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

Issue 356843008: Fix private member access violations in profiler module (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Addressed apavlov's comments Created 6 years, 5 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
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 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 47
48 /** 48 /**
49 * @constructor 49 * @constructor
50 * @implements {WebInspector.HeapSnapshotItem} 50 * @implements {WebInspector.HeapSnapshotItem}
51 * @param {!WebInspector.HeapSnapshot} snapshot 51 * @param {!WebInspector.HeapSnapshot} snapshot
52 * @param {number=} edgeIndex 52 * @param {number=} edgeIndex
53 */ 53 */
54 WebInspector.HeapSnapshotEdge = function(snapshot, edgeIndex) 54 WebInspector.HeapSnapshotEdge = function(snapshot, edgeIndex)
55 { 55 {
56 this._snapshot = snapshot; 56 this._snapshot = snapshot;
57 this._edges = snapshot._containmentEdges; 57 this._edges = snapshot.containmentEdges;
58 this.edgeIndex = edgeIndex || 0; 58 this.edgeIndex = edgeIndex || 0;
59 } 59 }
60 60
61 WebInspector.HeapSnapshotEdge.prototype = { 61 WebInspector.HeapSnapshotEdge.prototype = {
62 /** 62 /**
63 * @return {!WebInspector.HeapSnapshotEdge} 63 * @return {!WebInspector.HeapSnapshotEdge}
64 */ 64 */
65 clone: function() 65 clone: function()
66 { 66 {
67 return new WebInspector.HeapSnapshotEdge(this._snapshot, this.edgeIndex) ; 67 return new WebInspector.HeapSnapshotEdge(this._snapshot, this.edgeIndex) ;
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 243
244 244
245 /** 245 /**
246 * @constructor 246 * @constructor
247 * @implements {WebInspector.HeapSnapshotItemIterator} 247 * @implements {WebInspector.HeapSnapshotItemIterator}
248 * @param {!WebInspector.HeapSnapshotNode} node 248 * @param {!WebInspector.HeapSnapshotNode} node
249 */ 249 */
250 WebInspector.HeapSnapshotEdgeIterator = function(node) 250 WebInspector.HeapSnapshotEdgeIterator = function(node)
251 { 251 {
252 this._sourceNode = node; 252 this._sourceNode = node;
253 this.edge = node._snapshot.createEdge(node._edgeIndexesStart()); 253 this.edge = node._snapshot.createEdge(node.edgeIndexesStart());
254 } 254 }
255 255
256 WebInspector.HeapSnapshotEdgeIterator.prototype = { 256 WebInspector.HeapSnapshotEdgeIterator.prototype = {
257 /** 257 /**
258 * @return {boolean} 258 * @return {boolean}
259 */ 259 */
260 hasNext: function() 260 hasNext: function()
261 { 261 {
262 return this.edge.edgeIndex < this._sourceNode._edgeIndexesEnd(); 262 return this.edge.edgeIndex < this._sourceNode.edgeIndexesEnd();
263 }, 263 },
264 264
265 /** 265 /**
266 * @return {!WebInspector.HeapSnapshotEdge} 266 * @return {!WebInspector.HeapSnapshotEdge}
267 */ 267 */
268 item: function() 268 item: function()
269 { 269 {
270 return this.edge; 270 return this.edge;
271 }, 271 },
272 272
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 } 409 }
410 410
411 /** 411 /**
412 * @constructor 412 * @constructor
413 * @implements {WebInspector.HeapSnapshotItemIterator} 413 * @implements {WebInspector.HeapSnapshotItemIterator}
414 * @param {!WebInspector.HeapSnapshotNode} retainedNode 414 * @param {!WebInspector.HeapSnapshotNode} retainedNode
415 */ 415 */
416 WebInspector.HeapSnapshotRetainerEdgeIterator = function(retainedNode) 416 WebInspector.HeapSnapshotRetainerEdgeIterator = function(retainedNode)
417 { 417 {
418 var snapshot = retainedNode._snapshot; 418 var snapshot = retainedNode._snapshot;
419 var retainedNodeOrdinal = retainedNode._ordinal(); 419 var retainedNodeOrdinal = retainedNode.ordinal();
420 var retainerIndex = snapshot._firstRetainerIndex[retainedNodeOrdinal]; 420 var retainerIndex = snapshot._firstRetainerIndex[retainedNodeOrdinal];
421 this._retainersEnd = snapshot._firstRetainerIndex[retainedNodeOrdinal + 1]; 421 this._retainersEnd = snapshot._firstRetainerIndex[retainedNodeOrdinal + 1];
422 this.retainer = snapshot.createRetainingEdge(retainerIndex); 422 this.retainer = snapshot.createRetainingEdge(retainerIndex);
423 } 423 }
424 424
425 WebInspector.HeapSnapshotRetainerEdgeIterator.prototype = { 425 WebInspector.HeapSnapshotRetainerEdgeIterator.prototype = {
426 /** 426 /**
427 * @return {boolean} 427 * @return {boolean}
428 */ 428 */
429 hasNext: function() 429 hasNext: function()
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
497 edges: function() 497 edges: function()
498 { 498 {
499 return new WebInspector.HeapSnapshotEdgeIterator(this); 499 return new WebInspector.HeapSnapshotEdgeIterator(this);
500 }, 500 },
501 501
502 /** 502 /**
503 * @return {number} 503 * @return {number}
504 */ 504 */
505 edgesCount: function() 505 edgesCount: function()
506 { 506 {
507 return (this._edgeIndexesEnd() - this._edgeIndexesStart()) / this._snaps hot._edgeFieldsCount; 507 return (this.edgeIndexesEnd() - this.edgeIndexesStart()) / this._snapsho t._edgeFieldsCount;
508 }, 508 },
509 509
510 /** 510 /**
511 * @return {number} 511 * @return {number}
512 */ 512 */
513 id: function() 513 id: function()
514 { 514 {
515 throw new Error("Not implemented"); 515 throw new Error("Not implemented");
516 }, 516 },
517 517
518 /** 518 /**
519 * @return {boolean} 519 * @return {boolean}
520 */ 520 */
521 isRoot: function() 521 isRoot: function()
522 { 522 {
523 return this.nodeIndex === this._snapshot._rootNodeIndex; 523 return this.nodeIndex === this._snapshot._rootNodeIndex;
524 }, 524 },
525 525
526 /** 526 /**
527 * @return {string} 527 * @return {string}
528 */ 528 */
529 name: function() 529 name: function()
530 { 530 {
531 return this._snapshot._strings[this._name()]; 531 return this._snapshot.strings[this._name()];
532 }, 532 },
533 533
534 /** 534 /**
535 * @return {number} 535 * @return {number}
536 */ 536 */
537 retainedSize: function() 537 retainedSize: function()
538 { 538 {
539 return this._snapshot._retainedSizes[this._ordinal()]; 539 return this._snapshot._retainedSizes[this.ordinal()];
540 }, 540 },
541 541
542 /** 542 /**
543 * @return {!WebInspector.HeapSnapshotRetainerEdgeIterator} 543 * @return {!WebInspector.HeapSnapshotRetainerEdgeIterator}
544 */ 544 */
545 retainers: function() 545 retainers: function()
546 { 546 {
547 return new WebInspector.HeapSnapshotRetainerEdgeIterator(this); 547 return new WebInspector.HeapSnapshotRetainerEdgeIterator(this);
548 }, 548 },
549 549
550 /** 550 /**
551 * @return {number} 551 * @return {number}
552 */ 552 */
553 retainersCount: function() 553 retainersCount: function()
554 { 554 {
555 var snapshot = this._snapshot; 555 var snapshot = this._snapshot;
556 var ordinal = this._ordinal(); 556 var ordinal = this.ordinal();
557 return snapshot._firstRetainerIndex[ordinal + 1] - snapshot._firstRetain erIndex[ordinal]; 557 return snapshot._firstRetainerIndex[ordinal + 1] - snapshot._firstRetain erIndex[ordinal];
558 }, 558 },
559 559
560 /** 560 /**
561 * @return {number} 561 * @return {number}
562 */ 562 */
563 selfSize: function() 563 selfSize: function()
564 { 564 {
565 var snapshot = this._snapshot; 565 var snapshot = this._snapshot;
566 return snapshot._nodes[this.nodeIndex + snapshot._nodeSelfSizeOffset]; 566 return snapshot.nodes[this.nodeIndex + snapshot._nodeSelfSizeOffset];
567 }, 567 },
568 568
569 /** 569 /**
570 * @return {string} 570 * @return {string}
571 */ 571 */
572 type: function() 572 type: function()
573 { 573 {
574 return this._snapshot._nodeTypes[this._type()]; 574 return this._snapshot._nodeTypes[this._type()];
575 }, 575 },
576 576
577 /** 577 /**
578 * @return {number} 578 * @return {number}
579 */ 579 */
580 traceNodeId: function() 580 traceNodeId: function()
581 { 581 {
582 var snapshot = this._snapshot; 582 var snapshot = this._snapshot;
583 return snapshot._nodes[this.nodeIndex + snapshot._nodeTraceNodeIdOffset] ; 583 return snapshot.nodes[this.nodeIndex + snapshot._nodeTraceNodeIdOffset];
584 }, 584 },
585 585
586 /** 586 /**
587 * @override 587 * @override
588 * @return {number} 588 * @return {number}
589 */ 589 */
590 itemIndex: function() 590 itemIndex: function()
591 { 591 {
592 return this.nodeIndex; 592 return this.nodeIndex;
593 }, 593 },
594 594
595 /** 595 /**
596 * @override 596 * @override
597 * @return {!WebInspector.HeapSnapshotCommon.Node} 597 * @return {!WebInspector.HeapSnapshotCommon.Node}
598 */ 598 */
599 serialize: function() 599 serialize: function()
600 { 600 {
601 return new WebInspector.HeapSnapshotCommon.Node(this.id(), this.name(), this.distance(), this.nodeIndex, this.retainedSize(), this.selfSize(), this.type ()); 601 return new WebInspector.HeapSnapshotCommon.Node(this.id(), this.name(), this.distance(), this.nodeIndex, this.retainedSize(), this.selfSize(), this.type ());
602 }, 602 },
603 603
604 /** 604 /**
605 * @return {number} 605 * @return {number}
606 */ 606 */
607 _name: function() 607 _name: function()
608 { 608 {
609 var snapshot = this._snapshot; 609 var snapshot = this._snapshot;
610 return snapshot._nodes[this.nodeIndex + snapshot._nodeNameOffset]; 610 return snapshot.nodes[this.nodeIndex + snapshot._nodeNameOffset];
611 }, 611 },
612 612
613 /** 613 /**
614 * @return {number} 614 * @return {number}
615 */ 615 */
616 _edgeIndexesStart: function() 616 edgeIndexesStart: function()
617 { 617 {
618 return this._snapshot._firstEdgeIndexes[this._ordinal()]; 618 return this._snapshot._firstEdgeIndexes[this.ordinal()];
619 }, 619 },
620 620
621 /** 621 /**
622 * @return {number} 622 * @return {number}
623 */ 623 */
624 _edgeIndexesEnd: function() 624 edgeIndexesEnd: function()
625 { 625 {
626 return this._snapshot._firstEdgeIndexes[this._ordinal() + 1]; 626 return this._snapshot._firstEdgeIndexes[this.ordinal() + 1];
627 }, 627 },
628 628
629 /** 629 /**
630 * @return {number} 630 * @return {number}
631 */ 631 */
632 _ordinal: function() 632 ordinal: function()
633 { 633 {
634 return this.nodeIndex / this._snapshot._nodeFieldCount; 634 return this.nodeIndex / this._snapshot._nodeFieldCount;
635 }, 635 },
636 636
637 /** 637 /**
638 * @return {number} 638 * @return {number}
639 */ 639 */
640 _nextNodeIndex: function() 640 _nextNodeIndex: function()
641 { 641 {
642 return this.nodeIndex + this._snapshot._nodeFieldCount; 642 return this.nodeIndex + this._snapshot._nodeFieldCount;
643 }, 643 },
644 644
645 /** 645 /**
646 * @return {number} 646 * @return {number}
647 */ 647 */
648 _type: function() 648 _type: function()
649 { 649 {
650 var snapshot = this._snapshot; 650 var snapshot = this._snapshot;
651 return snapshot._nodes[this.nodeIndex + snapshot._nodeTypeOffset]; 651 return snapshot.nodes[this.nodeIndex + snapshot._nodeTypeOffset];
652 } 652 }
653 }; 653 };
654 654
655 /** 655 /**
656 * @constructor 656 * @constructor
657 * @implements {WebInspector.HeapSnapshotItemIterator} 657 * @implements {WebInspector.HeapSnapshotItemIterator}
658 * @param {!WebInspector.HeapSnapshotNode} node 658 * @param {!WebInspector.HeapSnapshotNode} node
659 */ 659 */
660 WebInspector.HeapSnapshotNodeIterator = function(node) 660 WebInspector.HeapSnapshotNodeIterator = function(node)
661 { 661 {
662 this.node = node; 662 this.node = node;
663 this._nodesLength = node._snapshot._nodes.length; 663 this._nodesLength = node._snapshot.nodes.length;
664 } 664 }
665 665
666 WebInspector.HeapSnapshotNodeIterator.prototype = { 666 WebInspector.HeapSnapshotNodeIterator.prototype = {
667 /** 667 /**
668 * @return {boolean} 668 * @return {boolean}
669 */ 669 */
670 hasNext: function() 670 hasNext: function()
671 { 671 {
672 return this.node.nodeIndex < this._nodesLength; 672 return this.node.nodeIndex < this._nodesLength;
673 }, 673 },
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
811 } 811 }
812 812
813 813
814 /** 814 /**
815 * @param {!Object} profile 815 * @param {!Object} profile
816 * @param {!WebInspector.HeapSnapshotProgress} progress 816 * @param {!WebInspector.HeapSnapshotProgress} progress
817 * @constructor 817 * @constructor
818 */ 818 */
819 WebInspector.HeapSnapshot = function(profile, progress) 819 WebInspector.HeapSnapshot = function(profile, progress)
820 { 820 {
821 this._nodes = profile.nodes; 821 /** @type {!Uint32Array} */
822 this._containmentEdges = profile.edges; 822 this.nodes = profile.nodes;
823 /** @type {!Uint32Array} */
824 this.containmentEdges = profile.edges;
823 /** @type {!HeapSnapshotMetainfo} */ 825 /** @type {!HeapSnapshotMetainfo} */
824 this._metaNode = profile.snapshot.meta; 826 this._metaNode = profile.snapshot.meta;
825 this._strings = profile.strings; 827 /** @type {!Array.<string>} */
828 this.strings = profile.strings;
826 this._progress = progress; 829 this._progress = progress;
827 830
828 this._noDistance = -5; 831 this._noDistance = -5;
829 this._rootNodeIndex = 0; 832 this._rootNodeIndex = 0;
830 if (profile.snapshot.root_index) 833 if (profile.snapshot.root_index)
831 this._rootNodeIndex = profile.snapshot.root_index; 834 this._rootNodeIndex = profile.snapshot.root_index;
832 835
833 this._snapshotDiffs = {}; 836 this._snapshotDiffs = {};
834 this._aggregatesForDiff = null; 837 this._aggregatesForDiff = null;
835 this._aggregates = {}; 838 this._aggregates = {};
836 this._aggregatesSortedFlags = {}; 839 this._aggregatesSortedFlags = {};
837 840
838 this._init(); 841 this._init();
839 842
840 if (profile.snapshot.trace_function_count) { 843 if (profile.snapshot.trace_function_count) {
841 this._progress.updateStatus("Buiding allocation statistics\u2026"); 844 this._progress.updateStatus("Buiding allocation statistics\u2026");
842 var nodes = this._nodes; 845 var nodes = this.nodes;
843 var nodesLength = nodes.length; 846 var nodesLength = nodes.length;
844 var nodeFieldCount = this._nodeFieldCount; 847 var nodeFieldCount = this._nodeFieldCount;
845 var node = this.rootNode(); 848 var node = this.rootNode();
846 var liveObjects = {}; 849 var liveObjects = {};
847 for (var nodeIndex = 0; nodeIndex < nodesLength; nodeIndex += nodeFieldC ount) { 850 for (var nodeIndex = 0; nodeIndex < nodesLength; nodeIndex += nodeFieldC ount) {
848 node.nodeIndex = nodeIndex; 851 node.nodeIndex = nodeIndex;
849 var traceNodeId = node.traceNodeId(); 852 var traceNodeId = node.traceNodeId();
850 var stats = liveObjects[traceNodeId]; 853 var stats = liveObjects[traceNodeId];
851 if (!stats) { 854 if (!stats) {
852 liveObjects[traceNodeId] = stats = { count: 0, size: 0, ids: []} ; 855 liveObjects[traceNodeId] = stats = { count: 0, size: 0, ids: []} ;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
916 919
917 this._edgeTypes = meta.edge_types[this._edgeTypeOffset]; 920 this._edgeTypes = meta.edge_types[this._edgeTypeOffset];
918 this._edgeTypes.push("invisible"); 921 this._edgeTypes.push("invisible");
919 this._edgeElementType = this._edgeTypes.indexOf("element"); 922 this._edgeElementType = this._edgeTypes.indexOf("element");
920 this._edgeHiddenType = this._edgeTypes.indexOf("hidden"); 923 this._edgeHiddenType = this._edgeTypes.indexOf("hidden");
921 this._edgeInternalType = this._edgeTypes.indexOf("internal"); 924 this._edgeInternalType = this._edgeTypes.indexOf("internal");
922 this._edgeShortcutType = this._edgeTypes.indexOf("shortcut"); 925 this._edgeShortcutType = this._edgeTypes.indexOf("shortcut");
923 this._edgeWeakType = this._edgeTypes.indexOf("weak"); 926 this._edgeWeakType = this._edgeTypes.indexOf("weak");
924 this._edgeInvisibleType = this._edgeTypes.indexOf("invisible"); 927 this._edgeInvisibleType = this._edgeTypes.indexOf("invisible");
925 928
926 this.nodeCount = this._nodes.length / this._nodeFieldCount; 929 this.nodeCount = this.nodes.length / this._nodeFieldCount;
927 this._edgeCount = this._containmentEdges.length / this._edgeFieldsCount; 930 this._edgeCount = this.containmentEdges.length / this._edgeFieldsCount;
928 931
929 this._progress.updateStatus("Building edge indexes\u2026"); 932 this._progress.updateStatus("Building edge indexes\u2026");
930 this._buildEdgeIndexes(); 933 this._buildEdgeIndexes();
931 this._progress.updateStatus("Building retainers\u2026"); 934 this._progress.updateStatus("Building retainers\u2026");
932 this._buildRetainers(); 935 this._buildRetainers();
933 this._progress.updateStatus("Calculating node flags\u2026"); 936 this._progress.updateStatus("Calculating node flags\u2026");
934 this._calculateFlags(); 937 this._calculateFlags();
935 this._progress.updateStatus("Calculating distances\u2026"); 938 this._progress.updateStatus("Calculating distances\u2026");
936 this._calculateDistances(); 939 this._calculateDistances();
937 this._progress.updateStatus("Building postorder index\u2026"); 940 this._progress.updateStatus("Building postorder index\u2026");
938 var result = this._buildPostOrderIndex(); 941 var result = this._buildPostOrderIndex();
939 // Actually it is array that maps node ordinal number to dominator node ordinal number. 942 // Actually it is array that maps node ordinal number to dominator node ordinal number.
940 this._progress.updateStatus("Building dominator tree\u2026"); 943 this._progress.updateStatus("Building dominator tree\u2026");
941 this._dominatorsTree = this._buildDominatorTree(result.postOrderIndex2No deOrdinal, result.nodeOrdinal2PostOrderIndex); 944 this._dominatorsTree = this._buildDominatorTree(result.postOrderIndex2No deOrdinal, result.nodeOrdinal2PostOrderIndex);
942 this._progress.updateStatus("Calculating retained sizes\u2026"); 945 this._progress.updateStatus("Calculating retained sizes\u2026");
943 this._calculateRetainedSizes(result.postOrderIndex2NodeOrdinal); 946 this._calculateRetainedSizes(result.postOrderIndex2NodeOrdinal);
944 this._progress.updateStatus("Buiding dominated nodes\u2026"); 947 this._progress.updateStatus("Buiding dominated nodes\u2026");
945 this._buildDominatedNodes(); 948 this._buildDominatedNodes();
946 this._progress.updateStatus("Calculating statistics\u2026"); 949 this._progress.updateStatus("Calculating statistics\u2026");
947 this._calculateStatistics(); 950 this._calculateStatistics();
948 this._progress.updateStatus("Finished processing."); 951 this._progress.updateStatus("Finished processing.");
949 }, 952 },
950 953
951 _buildEdgeIndexes: function() 954 _buildEdgeIndexes: function()
952 { 955 {
953 var nodes = this._nodes; 956 var nodes = this.nodes;
954 var nodeCount = this.nodeCount; 957 var nodeCount = this.nodeCount;
955 var firstEdgeIndexes = this._firstEdgeIndexes = new Uint32Array(nodeCoun t + 1); 958 var firstEdgeIndexes = this._firstEdgeIndexes = new Uint32Array(nodeCoun t + 1);
956 var nodeFieldCount = this._nodeFieldCount; 959 var nodeFieldCount = this._nodeFieldCount;
957 var edgeFieldsCount = this._edgeFieldsCount; 960 var edgeFieldsCount = this._edgeFieldsCount;
958 var nodeEdgeCountOffset = this._nodeEdgeCountOffset; 961 var nodeEdgeCountOffset = this._nodeEdgeCountOffset;
959 firstEdgeIndexes[nodeCount] = this._containmentEdges.length; 962 firstEdgeIndexes[nodeCount] = this.containmentEdges.length;
960 for (var nodeOrdinal = 0, edgeIndex = 0; nodeOrdinal < nodeCount; ++node Ordinal) { 963 for (var nodeOrdinal = 0, edgeIndex = 0; nodeOrdinal < nodeCount; ++node Ordinal) {
961 firstEdgeIndexes[nodeOrdinal] = edgeIndex; 964 firstEdgeIndexes[nodeOrdinal] = edgeIndex;
962 edgeIndex += nodes[nodeOrdinal * nodeFieldCount + nodeEdgeCountOffse t] * edgeFieldsCount; 965 edgeIndex += nodes[nodeOrdinal * nodeFieldCount + nodeEdgeCountOffse t] * edgeFieldsCount;
963 } 966 }
964 }, 967 },
965 968
966 _buildRetainers: function() 969 _buildRetainers: function()
967 { 970 {
968 var retainingNodes = this._retainingNodes = new Uint32Array(this._edgeCo unt); 971 var retainingNodes = this._retainingNodes = new Uint32Array(this._edgeCo unt);
969 var retainingEdges = this._retainingEdges = new Uint32Array(this._edgeCo unt); 972 var retainingEdges = this._retainingEdges = new Uint32Array(this._edgeCo unt);
970 // Index of the first retainer in the _retainingNodes and _retainingEdge s 973 // Index of the first retainer in the _retainingNodes and _retainingEdge s
971 // arrays. Addressed by retained node index. 974 // arrays. Addressed by retained node index.
972 var firstRetainerIndex = this._firstRetainerIndex = new Uint32Array(this .nodeCount + 1); 975 var firstRetainerIndex = this._firstRetainerIndex = new Uint32Array(this .nodeCount + 1);
973 976
974 var containmentEdges = this._containmentEdges; 977 var containmentEdges = this.containmentEdges;
975 var edgeFieldsCount = this._edgeFieldsCount; 978 var edgeFieldsCount = this._edgeFieldsCount;
976 var nodeFieldCount = this._nodeFieldCount; 979 var nodeFieldCount = this._nodeFieldCount;
977 var edgeToNodeOffset = this._edgeToNodeOffset; 980 var edgeToNodeOffset = this._edgeToNodeOffset;
978 var firstEdgeIndexes = this._firstEdgeIndexes; 981 var firstEdgeIndexes = this._firstEdgeIndexes;
979 var nodeCount = this.nodeCount; 982 var nodeCount = this.nodeCount;
980 983
981 for (var toNodeFieldIndex = edgeToNodeOffset, l = containmentEdges.lengt h; toNodeFieldIndex < l; toNodeFieldIndex += edgeFieldsCount) { 984 for (var toNodeFieldIndex = edgeToNodeOffset, l = containmentEdges.lengt h; toNodeFieldIndex < l; toNodeFieldIndex += edgeFieldsCount) {
982 var toNodeIndex = containmentEdges[toNodeFieldIndex]; 985 var toNodeIndex = containmentEdges[toNodeFieldIndex];
983 if (toNodeIndex % nodeFieldCount) 986 if (toNodeIndex % nodeFieldCount)
984 throw new Error("Invalid toNodeIndex " + toNodeIndex); 987 throw new Error("Invalid toNodeIndex " + toNodeIndex);
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
1249 1252
1250 var nodesToVisit = new Uint32Array(this.nodeCount); 1253 var nodesToVisit = new Uint32Array(this.nodeCount);
1251 var nodesToVisitLength = 0; 1254 var nodesToVisitLength = 0;
1252 1255
1253 /** 1256 /**
1254 * @param {number} distance 1257 * @param {number} distance
1255 * @param {!WebInspector.HeapSnapshotNode} node 1258 * @param {!WebInspector.HeapSnapshotNode} node
1256 */ 1259 */
1257 function enqueueNode(distance, node) 1260 function enqueueNode(distance, node)
1258 { 1261 {
1259 var ordinal = node._ordinal(); 1262 var ordinal = node.ordinal();
1260 if (distances[ordinal] !== noDistance) 1263 if (distances[ordinal] !== noDistance)
1261 return; 1264 return;
1262 distances[ordinal] = distance; 1265 distances[ordinal] = distance;
1263 nodesToVisit[nodesToVisitLength++] = node.nodeIndex; 1266 nodesToVisit[nodesToVisitLength++] = node.nodeIndex;
1264 } 1267 }
1265 1268
1266 this.forEachRoot(enqueueNode.bind(null, 1), true); 1269 this.forEachRoot(enqueueNode.bind(null, 1), true);
1267 this._bfs(nodesToVisit, nodesToVisitLength, distances); 1270 this._bfs(nodesToVisit, nodesToVisitLength, distances);
1268 1271
1269 // bfs for the rest of objects 1272 // bfs for the rest of objects
1270 nodesToVisitLength = 0; 1273 nodesToVisitLength = 0;
1271 this.forEachRoot(enqueueNode.bind(null, WebInspector.HeapSnapshotCommon. baseSystemDistance), false); 1274 this.forEachRoot(enqueueNode.bind(null, WebInspector.HeapSnapshotCommon. baseSystemDistance), false);
1272 this._bfs(nodesToVisit, nodesToVisitLength, distances); 1275 this._bfs(nodesToVisit, nodesToVisitLength, distances);
1273 }, 1276 },
1274 1277
1275 /** 1278 /**
1276 * @param {!Uint32Array} nodesToVisit 1279 * @param {!Uint32Array} nodesToVisit
1277 * @param {!number} nodesToVisitLength 1280 * @param {!number} nodesToVisitLength
1278 * @param {!Int32Array} distances 1281 * @param {!Int32Array} distances
1279 */ 1282 */
1280 _bfs: function(nodesToVisit, nodesToVisitLength, distances) 1283 _bfs: function(nodesToVisit, nodesToVisitLength, distances)
1281 { 1284 {
1282 // Preload fields into local variables for better performance. 1285 // Preload fields into local variables for better performance.
1283 var edgeFieldsCount = this._edgeFieldsCount; 1286 var edgeFieldsCount = this._edgeFieldsCount;
1284 var nodeFieldCount = this._nodeFieldCount; 1287 var nodeFieldCount = this._nodeFieldCount;
1285 var containmentEdges = this._containmentEdges; 1288 var containmentEdges = this.containmentEdges;
1286 var firstEdgeIndexes = this._firstEdgeIndexes; 1289 var firstEdgeIndexes = this._firstEdgeIndexes;
1287 var edgeToNodeOffset = this._edgeToNodeOffset; 1290 var edgeToNodeOffset = this._edgeToNodeOffset;
1288 var edgeTypeOffset = this._edgeTypeOffset; 1291 var edgeTypeOffset = this._edgeTypeOffset;
1289 var nodeCount = this.nodeCount; 1292 var nodeCount = this.nodeCount;
1290 var containmentEdgesLength = containmentEdges.length; 1293 var containmentEdgesLength = containmentEdges.length;
1291 var edgeWeakType = this._edgeWeakType; 1294 var edgeWeakType = this._edgeWeakType;
1292 var noDistance = this._noDistance; 1295 var noDistance = this._noDistance;
1293 1296
1294 var index = 0; 1297 var index = 0;
1295 while (index < nodesToVisitLength) { 1298 while (index < nodesToVisitLength) {
(...skipping 16 matching lines...) Expand all
1312 } 1315 }
1313 if (nodesToVisitLength > nodeCount) 1316 if (nodesToVisitLength > nodeCount)
1314 throw new Error("BFS failed. Nodes to visit (" + nodesToVisitLength + ") is more than nodes count (" + nodeCount + ")"); 1317 throw new Error("BFS failed. Nodes to visit (" + nodesToVisitLength + ") is more than nodes count (" + nodeCount + ")");
1315 }, 1318 },
1316 1319
1317 _buildAggregates: function(filter) 1320 _buildAggregates: function(filter)
1318 { 1321 {
1319 var aggregates = {}; 1322 var aggregates = {};
1320 var aggregatesByClassName = {}; 1323 var aggregatesByClassName = {};
1321 var classIndexes = []; 1324 var classIndexes = [];
1322 var nodes = this._nodes; 1325 var nodes = this.nodes;
1323 var mapAndFlag = this.userObjectsMapAndFlag(); 1326 var mapAndFlag = this.userObjectsMapAndFlag();
1324 var flags = mapAndFlag ? mapAndFlag.map : null; 1327 var flags = mapAndFlag ? mapAndFlag.map : null;
1325 var flag = mapAndFlag ? mapAndFlag.flag : 0; 1328 var flag = mapAndFlag ? mapAndFlag.flag : 0;
1326 var nodesLength = nodes.length; 1329 var nodesLength = nodes.length;
1327 var nodeNativeType = this._nodeNativeType; 1330 var nodeNativeType = this._nodeNativeType;
1328 var nodeFieldCount = this._nodeFieldCount; 1331 var nodeFieldCount = this._nodeFieldCount;
1329 var selfSizeOffset = this._nodeSelfSizeOffset; 1332 var selfSizeOffset = this._nodeSelfSizeOffset;
1330 var nodeTypeOffset = this._nodeTypeOffset; 1333 var nodeTypeOffset = this._nodeTypeOffset;
1331 var node = this.rootNode(); 1334 var node = this.rootNode();
1332 var nodeDistances = this._nodeDistances; 1335 var nodeDistances = this._nodeDistances;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1379 var rootNodeIndex = this._rootNodeIndex; 1382 var rootNodeIndex = this._rootNodeIndex;
1380 var node = this.createNode(rootNodeIndex); 1383 var node = this.createNode(rootNodeIndex);
1381 var list = [rootNodeIndex]; 1384 var list = [rootNodeIndex];
1382 var sizes = [-1]; 1385 var sizes = [-1];
1383 var classes = []; 1386 var classes = [];
1384 var seenClassNameIndexes = {}; 1387 var seenClassNameIndexes = {};
1385 var nodeFieldCount = this._nodeFieldCount; 1388 var nodeFieldCount = this._nodeFieldCount;
1386 var nodeTypeOffset = this._nodeTypeOffset; 1389 var nodeTypeOffset = this._nodeTypeOffset;
1387 var nodeNativeType = this._nodeNativeType; 1390 var nodeNativeType = this._nodeNativeType;
1388 var dominatedNodes = this._dominatedNodes; 1391 var dominatedNodes = this._dominatedNodes;
1389 var nodes = this._nodes; 1392 var nodes = this.nodes;
1390 var mapAndFlag = this.userObjectsMapAndFlag(); 1393 var mapAndFlag = this.userObjectsMapAndFlag();
1391 var flags = mapAndFlag ? mapAndFlag.map : null; 1394 var flags = mapAndFlag ? mapAndFlag.map : null;
1392 var flag = mapAndFlag ? mapAndFlag.flag : 0; 1395 var flag = mapAndFlag ? mapAndFlag.flag : 0;
1393 var firstDominatedNodeIndex = this._firstDominatedNodeIndex; 1396 var firstDominatedNodeIndex = this._firstDominatedNodeIndex;
1394 1397
1395 while (list.length) { 1398 while (list.length) {
1396 var nodeIndex = list.pop(); 1399 var nodeIndex = list.pop();
1397 node.nodeIndex = nodeIndex; 1400 node.nodeIndex = nodeIndex;
1398 var classIndex = node.classIndex(); 1401 var classIndex = node.classIndex();
1399 var seen = !!seenClassNameIndexes[classIndex]; 1402 var seen = !!seenClassNameIndexes[classIndex];
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1434 function(idxA, idxB) { 1437 function(idxA, idxB) {
1435 nodeA.nodeIndex = idxA; 1438 nodeA.nodeIndex = idxA;
1436 nodeB.nodeIndex = idxB; 1439 nodeB.nodeIndex = idxB;
1437 return nodeA.id() < nodeB.id() ? -1 : 1; 1440 return nodeA.id() < nodeB.id() ? -1 : 1;
1438 }); 1441 });
1439 }, 1442 },
1440 1443
1441 _buildPostOrderIndex: function() 1444 _buildPostOrderIndex: function()
1442 { 1445 {
1443 var nodeFieldCount = this._nodeFieldCount; 1446 var nodeFieldCount = this._nodeFieldCount;
1444 var nodes = this._nodes; 1447 var nodes = this.nodes;
1445 var nodeCount = this.nodeCount; 1448 var nodeCount = this.nodeCount;
1446 var rootNodeOrdinal = this._rootNodeIndex / nodeFieldCount; 1449 var rootNodeOrdinal = this._rootNodeIndex / nodeFieldCount;
1447 1450
1448 var edgeFieldsCount = this._edgeFieldsCount; 1451 var edgeFieldsCount = this._edgeFieldsCount;
1449 var edgeTypeOffset = this._edgeTypeOffset; 1452 var edgeTypeOffset = this._edgeTypeOffset;
1450 var edgeToNodeOffset = this._edgeToNodeOffset; 1453 var edgeToNodeOffset = this._edgeToNodeOffset;
1451 var edgeShortcutType = this._edgeShortcutType; 1454 var edgeShortcutType = this._edgeShortcutType;
1452 var firstEdgeIndexes = this._firstEdgeIndexes; 1455 var firstEdgeIndexes = this._firstEdgeIndexes;
1453 var containmentEdges = this._containmentEdges; 1456 var containmentEdges = this.containmentEdges;
1454 1457
1455 var mapAndFlag = this.userObjectsMapAndFlag(); 1458 var mapAndFlag = this.userObjectsMapAndFlag();
1456 var flags = mapAndFlag ? mapAndFlag.map : null; 1459 var flags = mapAndFlag ? mapAndFlag.map : null;
1457 var flag = mapAndFlag ? mapAndFlag.flag : 0; 1460 var flag = mapAndFlag ? mapAndFlag.flag : 0;
1458 1461
1459 var stackNodes = new Uint32Array(nodeCount); 1462 var stackNodes = new Uint32Array(nodeCount);
1460 var stackCurrentEdge = new Uint32Array(nodeCount); 1463 var stackCurrentEdge = new Uint32Array(nodeCount);
1461 var postOrderIndex2NodeOrdinal = new Uint32Array(nodeCount); 1464 var postOrderIndex2NodeOrdinal = new Uint32Array(nodeCount);
1462 var nodeOrdinal2PostOrderIndex = new Uint32Array(nodeCount); 1465 var nodeOrdinal2PostOrderIndex = new Uint32Array(nodeCount);
1463 var visited = new Uint8Array(nodeCount); 1466 var visited = new Uint8Array(nodeCount);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1521 // The algorithm is based on the article: 1524 // The algorithm is based on the article:
1522 // K. Cooper, T. Harvey and K. Kennedy "A Simple, Fast Dominance Algorithm" 1525 // K. Cooper, T. Harvey and K. Kennedy "A Simple, Fast Dominance Algorithm"
1523 // Softw. Pract. Exper. 4 (2001), pp. 1-10. 1526 // Softw. Pract. Exper. 4 (2001), pp. 1-10.
1524 /** 1527 /**
1525 * @param {!Array.<number>} postOrderIndex2NodeOrdinal 1528 * @param {!Array.<number>} postOrderIndex2NodeOrdinal
1526 * @param {!Array.<number>} nodeOrdinal2PostOrderIndex 1529 * @param {!Array.<number>} nodeOrdinal2PostOrderIndex
1527 */ 1530 */
1528 _buildDominatorTree: function(postOrderIndex2NodeOrdinal, nodeOrdinal2PostOr derIndex) 1531 _buildDominatorTree: function(postOrderIndex2NodeOrdinal, nodeOrdinal2PostOr derIndex)
1529 { 1532 {
1530 var nodeFieldCount = this._nodeFieldCount; 1533 var nodeFieldCount = this._nodeFieldCount;
1531 var nodes = this._nodes; 1534 var nodes = this.nodes;
1532 var firstRetainerIndex = this._firstRetainerIndex; 1535 var firstRetainerIndex = this._firstRetainerIndex;
1533 var retainingNodes = this._retainingNodes; 1536 var retainingNodes = this._retainingNodes;
1534 var retainingEdges = this._retainingEdges; 1537 var retainingEdges = this._retainingEdges;
1535 var edgeFieldsCount = this._edgeFieldsCount; 1538 var edgeFieldsCount = this._edgeFieldsCount;
1536 var edgeTypeOffset = this._edgeTypeOffset; 1539 var edgeTypeOffset = this._edgeTypeOffset;
1537 var edgeToNodeOffset = this._edgeToNodeOffset; 1540 var edgeToNodeOffset = this._edgeToNodeOffset;
1538 var edgeShortcutType = this._edgeShortcutType; 1541 var edgeShortcutType = this._edgeShortcutType;
1539 var firstEdgeIndexes = this._firstEdgeIndexes; 1542 var firstEdgeIndexes = this._firstEdgeIndexes;
1540 var containmentEdges = this._containmentEdges; 1543 var containmentEdges = this.containmentEdges;
1541 var containmentEdgesLength = this._containmentEdges.length; 1544 var containmentEdgesLength = this.containmentEdges.length;
1542 var rootNodeIndex = this._rootNodeIndex; 1545 var rootNodeIndex = this._rootNodeIndex;
1543 1546
1544 var mapAndFlag = this.userObjectsMapAndFlag(); 1547 var mapAndFlag = this.userObjectsMapAndFlag();
1545 var flags = mapAndFlag ? mapAndFlag.map : null; 1548 var flags = mapAndFlag ? mapAndFlag.map : null;
1546 var flag = mapAndFlag ? mapAndFlag.flag : 0; 1549 var flag = mapAndFlag ? mapAndFlag.flag : 0;
1547 1550
1548 var nodesCount = postOrderIndex2NodeOrdinal.length; 1551 var nodesCount = postOrderIndex2NodeOrdinal.length;
1549 var rootPostOrderedIndex = nodesCount - 1; 1552 var rootPostOrderedIndex = nodesCount - 1;
1550 var noEntry = nodesCount; 1553 var noEntry = nodesCount;
1551 var dominators = new Uint32Array(nodesCount); 1554 var dominators = new Uint32Array(nodesCount);
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
1636 for (var postOrderIndex = 0, l = dominators.length; postOrderIndex < l; ++postOrderIndex) { 1639 for (var postOrderIndex = 0, l = dominators.length; postOrderIndex < l; ++postOrderIndex) {
1637 nodeOrdinal = postOrderIndex2NodeOrdinal[postOrderIndex]; 1640 nodeOrdinal = postOrderIndex2NodeOrdinal[postOrderIndex];
1638 dominatorsTree[nodeOrdinal] = postOrderIndex2NodeOrdinal[dominators[ postOrderIndex]]; 1641 dominatorsTree[nodeOrdinal] = postOrderIndex2NodeOrdinal[dominators[ postOrderIndex]];
1639 } 1642 }
1640 return dominatorsTree; 1643 return dominatorsTree;
1641 }, 1644 },
1642 1645
1643 _calculateRetainedSizes: function(postOrderIndex2NodeOrdinal) 1646 _calculateRetainedSizes: function(postOrderIndex2NodeOrdinal)
1644 { 1647 {
1645 var nodeCount = this.nodeCount; 1648 var nodeCount = this.nodeCount;
1646 var nodes = this._nodes; 1649 var nodes = this.nodes;
1647 var nodeSelfSizeOffset = this._nodeSelfSizeOffset; 1650 var nodeSelfSizeOffset = this._nodeSelfSizeOffset;
1648 var nodeFieldCount = this._nodeFieldCount; 1651 var nodeFieldCount = this._nodeFieldCount;
1649 var dominatorsTree = this._dominatorsTree; 1652 var dominatorsTree = this._dominatorsTree;
1650 var retainedSizes = this._retainedSizes = new Float64Array(nodeCount); 1653 var retainedSizes = this._retainedSizes = new Float64Array(nodeCount);
1651 1654
1652 for (var nodeOrdinal = 0; nodeOrdinal < nodeCount; ++nodeOrdinal) 1655 for (var nodeOrdinal = 0; nodeOrdinal < nodeCount; ++nodeOrdinal)
1653 retainedSizes[nodeOrdinal] = nodes[nodeOrdinal * nodeFieldCount + no deSelfSizeOffset]; 1656 retainedSizes[nodeOrdinal] = nodes[nodeOrdinal * nodeFieldCount + no deSelfSizeOffset];
1654 1657
1655 // Propagate retained sizes for each node excluding root. 1658 // Propagate retained sizes for each node excluding root.
1656 for (var postOrderIndex = 0; postOrderIndex < nodeCount - 1; ++postOrder Index) { 1659 for (var postOrderIndex = 0; postOrderIndex < nodeCount - 1; ++postOrder Index) {
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
1930 { 1933 {
1931 return new WebInspector.HeapSnapshotNodesProvider(this, this.classNodesF ilter(), this.aggregatesWithFilter(nodeFilter)[className].idxs); 1934 return new WebInspector.HeapSnapshotNodesProvider(this, this.classNodesF ilter(), this.aggregatesWithFilter(nodeFilter)[className].idxs);
1932 }, 1935 },
1933 1936
1934 /** 1937 /**
1935 * @return {number} 1938 * @return {number}
1936 */ 1939 */
1937 _maxJsNodeId: function() 1940 _maxJsNodeId: function()
1938 { 1941 {
1939 var nodeFieldCount = this._nodeFieldCount; 1942 var nodeFieldCount = this._nodeFieldCount;
1940 var nodes = this._nodes; 1943 var nodes = this.nodes;
1941 var nodesLength = nodes.length; 1944 var nodesLength = nodes.length;
1942 var id = 0; 1945 var id = 0;
1943 for (var nodeIndex = this._nodeIdOffset; nodeIndex < nodesLength; nodeIn dex += nodeFieldCount) { 1946 for (var nodeIndex = this._nodeIdOffset; nodeIndex < nodesLength; nodeIn dex += nodeFieldCount) {
1944 var nextId = nodes[nodeIndex]; 1947 var nextId = nodes[nodeIndex];
1945 // JS objects have odd ids, skip native objects. 1948 // JS objects have odd ids, skip native objects.
1946 if (nextId % 2 === 0) 1949 if (nextId % 2 === 0)
1947 continue; 1950 continue;
1948 if (id < nextId) 1951 if (id < nextId)
1949 id = nextId; 1952 id = nextId;
1950 } 1953 }
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
2229 * @param {number} windowRight 2232 * @param {number} windowRight
2230 */ 2233 */
2231 sort: function(comparator, leftBound, rightBound, windowLeft, windowRight) 2234 sort: function(comparator, leftBound, rightBound, windowLeft, windowRight)
2232 { 2235 {
2233 this._iterationOrder.sortRange(this._buildCompareFunction(comparator), l eftBound, rightBound, windowLeft, windowRight); 2236 this._iterationOrder.sortRange(this._buildCompareFunction(comparator), l eftBound, rightBound, windowLeft, windowRight);
2234 }, 2237 },
2235 2238
2236 __proto__: WebInspector.HeapSnapshotItemProvider.prototype 2239 __proto__: WebInspector.HeapSnapshotItemProvider.prototype
2237 } 2240 }
2238 2241
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698