Changeset 119498 in webkit
- Timestamp:
- Jun 5, 2012 10:08:19 AM (12 years ago)
- Location:
- trunk
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r119492 r119498 1 2012-06-05 Alexei Filippov <alexeif@chromium.org> 2 3 Web Inspector: serialize edge counts instead of indexes in heap snapshot 4 https://bugs.webkit.org/show_bug.cgi?id=88324 5 6 The serialized node structure currently holds an index 7 of its first containment edge in the edges array. 8 The index can be quite big (up to 7 digits for large snapshots). 9 The patch changes the serialization format to pass 10 node containment edge count instead. For most nodes the count 11 is just a single digit number. 12 This reduces serialized snapshot size and therefore its transfer time. 13 14 Reviewed by Yury Semikhatsky. 15 16 * inspector/profiler/heap-snapshot-expected.txt: 17 * inspector/profiler/heap-snapshot-test.js: 18 (initialize_HeapSnapshotTest.InspectorTest.createHeapSnapshotMockObject): 19 (initialize_HeapSnapshotTest.InspectorTest.createHeapSnapshotMockRaw): 20 (initialize_HeapSnapshotTest.InspectorTest.createHeapSnapshotMockWithDOM): 21 (initialize_HeapSnapshotTest.): 22 * inspector/profiler/heap-snapshot.html: 23 1 24 2012-06-05 Arpita Bahuguna <arpitabahuguna@gmail.com> 2 25 -
trunk/LayoutTests/inspector/profiler/heap-snapshot-expected.txt
r117953 r119498 13 13 14 14 Running: heapSnapshotSimpleTest 15 16 Running: heapSnapshotContainmentEdgeIndexesTest 15 17 16 18 Running: heapSnapshotPostOrderIndexTest -
trunk/LayoutTests/inspector/profiler/heap-snapshot-test.js
r118793 r119498 7 7 _nodeTypeOffset: 0, 8 8 _nodeNameOffset: 1, 9 _edgesCountOffset: 2, 10 _firstEdgeIndexOffset: 2, 11 _firstEdgeOffset: 3, 9 _nodeEdgeCountOffset: 2, 12 10 _nodeFieldCount: 3, 13 11 _edgeFieldsCount: 3, … … 31 29 // 32 30 _nodes: [ 33 0, 0, 0, // 0: root 34 1, 1, 6, // 3: A 35 1, 2, 12, // 6: B 36 1, 3, 18, // 9: C 37 1, 4, 21, // 12: D 38 1, 5, 21, // 15: E 39 0, 0, 21], // 18: (extra node) 31 0, 0, 2, // 0: root 32 1, 1, 2, // 3: A 33 1, 2, 2, // 6: B 34 1, 3, 1, // 9: C 35 1, 4, 0, // 12: D 36 1, 5, 0], // 15: E 40 37 _containmentEdges: [ 41 38 2, 6, 3, // 0: shortcut 'a' to node 'A' … … 46 43 1, 10, 12, // 15: property 'bd' to node 'D' 47 44 1, 11, 15], // 18: property 'ce' to node 'E' 48 _strings: ["", "A", "B", "C", "D", "E", "a", "b", "ac", "bc", "bd", "ce"] 45 _strings: ["", "A", "B", "C", "D", "E", "a", "b", "ac", "bc", "bd", "ce"], 46 _firstEdgeIndexes: [0, 6, 12, 18, 21, 21, 21] 49 47 }; 50 48 }; … … 67 65 snapshot: { 68 66 meta: { 69 node_fields: ["type", "name", "id", "self_size", "retained_size", "dominator", "edge s_index"],67 node_fields: ["type", "name", "id", "self_size", "retained_size", "dominator", "edge_count"], 70 68 node_types: [["hidden", "object"], "", "", "", "", "", ""], 71 69 edge_fields: ["type", "name_or_index", "to_node"], … … 75 73 edge_count: 7}, 76 74 nodes: [ 77 0, 0, 1, 0, 20, 0, 0,// root (0)78 1, 1, 2, 2, 2, 0, 6,// A (7)79 1, 2, 3, 3, 8, 0, 12,// B (14)80 1, 3, 4, 4, 10, 0, 1 8,// C (21)81 1, 4, 5, 5, 5, 14, 21,// D (28)82 1, 5, 6, 6, 6, 21, 21],// E (35)75 0, 0, 1, 0, 20, 0, 2, // root (0) 76 1, 1, 2, 2, 2, 0, 2, // A (7) 77 1, 2, 3, 3, 8, 0, 2, // B (14) 78 1, 3, 4, 4, 10, 0, 1, // C (21) 79 1, 4, 5, 5, 5, 14, 0, // D (28) 80 1, 5, 6, 6, 6, 21, 0], // E (35) 83 81 edges: [ 84 82 // root node edges … … 117 115 snapshot: { 118 116 meta: { 119 node_fields: ["type", "name", "id", "edge s_index"],117 node_fields: ["type", "name", "id", "edge_count"], 120 118 node_types: [["hidden", "object"], "", "", ""], 121 119 edge_fields: ["type", "name_or_index", "to_node"], … … 138 136 // |----->F--->G M 139 137 // 140 /* (root) */ 0, 0, 1, 0,141 /* Window */ 1, 11, 2, 12,142 /* Window */ 1, 11, 3, 18,143 /* E */ 1, 5, 4, 27,144 /* F */ 1, 6, 5, 27,145 /* A */ 1, 1, 6, 30,146 /* B */ 1, 2, 7, 30,147 /* D */ 1, 4, 8, 33,148 /* H */ 1, 8, 9, 39,149 /* G */ 1, 7, 10, 39,150 /* C */ 1, 3, 11, 39,151 /* N */ 1, 10, 12, 39,152 /* M */ 1, 9, 13, 39138 /* (root) */ 0, 0, 1, 4, 139 /* Window */ 1, 11, 2, 2, 140 /* Window */ 1, 11, 3, 3, 141 /* E */ 1, 5, 4, 0, 142 /* F */ 1, 6, 5, 1, 143 /* A */ 1, 1, 6, 0, 144 /* B */ 1, 2, 7, 1, 145 /* D */ 1, 4, 8, 2, 146 /* H */ 1, 8, 9, 0, 147 /* G */ 1, 7, 10, 0, 148 /* C */ 1, 3, 11, 0, 149 /* N */ 1, 10, 12, 0, 150 /* M */ 1, 9, 13, 0 153 151 ], 154 152 edges: [ … … 461 459 rawSnapshot.nodes.push(this._id || this._ordinal * 2 + 1); 462 460 rawSnapshot.nodes.push(this._selfSize); 463 rawSnapshot.nodes.push(0); // retained_size464 rawSnapshot.nodes.push(0); // dominator465 rawSnapshot.nodes.push( rawSnapshot.edges.length); // edges_index461 rawSnapshot.nodes.push(0); // retained_size 462 rawSnapshot.nodes.push(0); // dominator 463 rawSnapshot.nodes.push(Object.keys(this._edges).length); // edge_count 466 464 467 465 for (var i in this._edges) … … 529 527 "snapshot": { 530 528 "meta": { 531 "node_fields": ["type","name","id","self_size","retained_size","dominator","edge s_index"],529 "node_fields": ["type","name","id","self_size","retained_size","dominator","edge_count"], 532 530 "node_types": [ 533 531 this._nodeTypesArray, -
trunk/LayoutTests/inspector/profiler/heap-snapshot.html
r118182 r119498 93 93 InspectorTest.assertEquals(6, snapshot.nodeCount, "node count"); 94 94 InspectorTest.assertEquals(20, snapshot.totalSize, "total size"); 95 next(); 96 }, 97 98 function heapSnapshotContainmentEdgeIndexesTest(next) 99 { 100 var snapshot = new WebInspector.HeapSnapshot(InspectorTest.createHeapSnapshotMock()); 101 var actual = snapshot._firstEdgeIndexes; 102 var expected = [0, 6, 12, 18, 21, 21, 21]; 103 InspectorTest.assertEquals(expected.length, actual.length, "Edge indexes size"); 104 for (var i = 0; i < expected.length; ++i) 105 InspectorTest.assertEquals(expected[i], actual[i], "Edge indexes"); 95 106 next(); 96 107 }, -
trunk/PerformanceTests/ChangeLog
r119389 r119498 1 2012-06-05 Alexei Filippov <alexeif@chromium.org> 2 3 Web Inspector: serialize edge counts instead of indexes in heap snapshot 4 https://bugs.webkit.org/show_bug.cgi?id=88324 5 6 The serialized node structure currently holds an index 7 of its first containment edge in the edges array. 8 The index can be quite big (up to 7 digits for large snapshots). 9 The patch changes the serialization format to pass 10 node containment edge count instead. For most nodes the count 11 is just a single digit number. 12 This reduces serialized snapshot size and therefore its transfer time. 13 14 Reviewed by Yury Semikhatsky. 15 16 * inspector/heap-snapshot-performance-test.js: 17 1 18 2012-06-04 Alexei Filippov <alexeif@chromium.org> 2 19 -
trunk/PerformanceTests/inspector/heap-snapshot-performance-test.js
r119389 r119498 1 1 function test() 2 2 { 3 InspectorTest.measureFunction(WebInspector.HeapSnapshot.prototype, "_buildEdgeIndexes"); 3 4 InspectorTest.measureFunction(WebInspector.HeapSnapshot.prototype, "_buildRetainers"); 4 5 InspectorTest.measureFunction(WebInspector.HeapSnapshot.prototype, "_buildDominatedNodes"); -
trunk/Source/WebCore/ChangeLog
r119492 r119498 1 2012-06-05 Alexei Filippov <alexeif@chromium.org> 2 3 Web Inspector: serialize edge counts instead of indexes in heap snapshot 4 https://bugs.webkit.org/show_bug.cgi?id=88324 5 6 The serialized node structure currently holds an index 7 of its first containment edge in the edges array. 8 The index can be quite big (up to 7 digits for large snapshots). 9 The patch changes the serialization format to pass 10 node containment edge count instead. For most nodes the count 11 is just a single digit number. 12 This reduces serialized snapshot size and therefore its transfer time. 13 14 Reviewed by Yury Semikhatsky. 15 16 * inspector/front-end/HeapSnapshot.js: 17 (WebInspector.HeapSnapshotNode.prototype._edgeIndexesStart): 18 (WebInspector.HeapSnapshotNode.prototype._edgeIndexesEnd): 19 (WebInspector.HeapSnapshotNode.prototype._ordinal): 20 (WebInspector.HeapSnapshotNodeIterator): 21 (WebInspector.HeapSnapshot.prototype._init): 22 (WebInspector.HeapSnapshot.prototype._buildEdgeIndexes): 23 (WebInspector.HeapSnapshot.prototype._buildRetainers): 24 (WebInspector.HeapSnapshot.prototype._bfs): 25 (WebInspector.HeapSnapshot.prototype._buildAggregates): 26 (WebInspector.HeapSnapshot.prototype._buildPostOrderIndex): 27 (WebInspector.HeapSnapshot.prototype._buildDominatorTree): 28 (WebInspector.HeapSnapshot.prototype._markPageOwnedNodes): 29 (WebInspector.HeapSnapshot.prototype._markQueriableHeapObjects): 30 1 31 2012-06-05 Arpita Bahuguna <arpitabahuguna@gmail.com> 2 32 -
trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js
r119389 r119498 536 536 _edgeIndexesStart: function() 537 537 { 538 var snapshot = this._snapshot; 539 return snapshot._nodes[this.nodeIndex + snapshot._firstEdgeIndexOffset]; 538 return this._snapshot._firstEdgeIndexes[this._ordinal()]; 540 539 }, 541 540 542 541 _edgeIndexesEnd: function() 543 542 { 544 var snapshot = this._snapshot; 545 return snapshot._nodes[this._nextNodeIndex() + snapshot._firstEdgeIndexOffset] 543 return this._snapshot._firstEdgeIndexes[this._ordinal() + 1]; 544 }, 545 546 _ordinal: function() 547 { 548 return this.nodeIndex / this._snapshot._nodeFieldCount; 546 549 }, 547 550 … … 564 567 { 565 568 this.node = node; 566 this._nodesLength = node._snapshot._ realNodesLength;569 this._nodesLength = node._snapshot._nodes.length; 567 570 } 568 571 … … 656 659 this._nodeIdOffset = meta.node_fields.indexOf("id"); 657 660 this._nodeSelfSizeOffset = meta.node_fields.indexOf("self_size"); 658 this._ firstEdgeIndexOffset = meta.node_fields.indexOf("edges_index");661 this._nodeEdgeCountOffset = meta.node_fields.indexOf("edge_count"); 659 662 this._nodeFieldCount = meta.node_fields.length; 660 663 … … 689 692 }; 690 693 691 this._realNodesLength = this._nodes.length; 692 this.nodeCount = this._realNodesLength / this._nodeFieldCount; 694 this.nodeCount = this._nodes.length / this._nodeFieldCount; 693 695 this._edgeCount = this._containmentEdges.length / this._edgeFieldsCount; 694 696 695 // Add an extra node and make its first edge field point to the end of edges array. 696 var nodes = this._nodes; 697 this._nodes = new Uint32Array(this._realNodesLength + this._nodeFieldCount); 698 this._nodes.set(nodes); 699 this._nodes[this._realNodesLength + this._firstEdgeIndexOffset] = this._containmentEdges.length; 700 697 this._buildEdgeIndexes(); 701 698 this._markInvisibleEdges(); 702 699 this._buildRetainers(); … … 710 707 }, 711 708 709 _buildEdgeIndexes: function() 710 { 711 // Support for old serialization. 712 if (this._nodeEdgeCountOffset === -1) { 713 var nodes = this._nodes; 714 var nodeCount = this.nodeCount; 715 var firstEdgeIndexes = this._firstEdgeIndexes = new Uint32Array(nodeCount + 1); 716 var nodeFieldCount = this._nodeFieldCount; 717 var nodeEdgesIndexOffset = this._metaNode.node_fields.indexOf("edges_index"); 718 firstEdgeIndexes[nodeCount] = this._containmentEdges.length; 719 for (var nodeOrdinal = 0; nodeOrdinal < nodeCount; ++nodeOrdinal) { 720 firstEdgeIndexes[nodeOrdinal] = nodes[nodeOrdinal * nodeFieldCount + nodeEdgesIndexOffset]; 721 } 722 return; 723 } 724 725 var nodes = this._nodes; 726 var nodeCount = this.nodeCount; 727 var firstEdgeIndexes = this._firstEdgeIndexes = new Uint32Array(nodeCount + 1); 728 var nodeFieldCount = this._nodeFieldCount; 729 var edgeFieldsCount = this._edgeFieldsCount; 730 var nodeEdgeCountOffset = this._nodeEdgeCountOffset; 731 firstEdgeIndexes[nodeCount] = this._containmentEdges.length; 732 for (var nodeOrdinal = 0, edgeIndex = 0; nodeOrdinal < nodeCount; ++nodeOrdinal) { 733 firstEdgeIndexes[nodeOrdinal] = edgeIndex; 734 edgeIndex += nodes[nodeOrdinal * nodeFieldCount + nodeEdgeCountOffset] * edgeFieldsCount; 735 } 736 }, 737 712 738 _buildRetainers: function() 713 739 { … … 723 749 var edgeToNodeOffset = this._edgeToNodeOffset; 724 750 var nodes = this._nodes; 725 var firstEdgeIndexOffset = this._firstEdgeIndexOffset; 751 var firstEdgeIndexes = this._firstEdgeIndexes; 752 var nodeCount = this.nodeCount; 726 753 727 754 for (var toNodeFieldIndex = edgeToNodeOffset, l = containmentEdges.length; toNodeFieldIndex < l; toNodeFieldIndex += edgeFieldsCount) { … … 731 758 ++firstRetainerIndex[toNodeIndex / nodeFieldCount]; 732 759 } 733 for (var i = 0, firstUnusedRetainerSlot = 0 , l = this.nodeCount; i < l; i++) {760 for (var i = 0, firstUnusedRetainerSlot = 0; i < nodeCount; i++) { 734 761 var retainersCount = firstRetainerIndex[i]; 735 762 firstRetainerIndex[i] = firstUnusedRetainerSlot; … … 737 764 firstUnusedRetainerSlot += retainersCount; 738 765 } 739 firstRetainerIndex[this.nodeCount] = retainingNodes.length; 740 741 var srcNodeIndex = 0; 742 var nextNodeFirstEdgeIndex = nodes[firstEdgeIndexOffset]; 743 var nodesLength = this._realNodesLength; 744 while (srcNodeIndex < nodesLength) { 766 firstRetainerIndex[nodeCount] = retainingNodes.length; 767 768 var nextNodeFirstEdgeIndex = firstEdgeIndexes[0]; 769 for (var srcNodeOrdinal = 0; srcNodeOrdinal < nodeCount; ++srcNodeOrdinal) { 745 770 var firstEdgeIndex = nextNodeFirstEdgeIndex; 746 var nextNodeIndex = srcNodeIndex + nodeFieldCount;747 nextNodeFirstEdgeIndex = nodes[nextNodeIndex + firstEdgeIndexOffset];771 nextNodeFirstEdgeIndex = firstEdgeIndexes[srcNodeOrdinal + 1]; 772 var srcNodeIndex = srcNodeOrdinal * nodeFieldCount; 748 773 for (var edgeIndex = firstEdgeIndex; edgeIndex < nextNodeFirstEdgeIndex; edgeIndex += edgeFieldsCount) { 749 774 var toNodeIndex = containmentEdges[edgeIndex + edgeToNodeOffset]; … … 755 780 retainingEdges[nextUnusedRetainerSlotIndex] = edgeIndex; 756 781 } 757 srcNodeIndex = nextNodeIndex;758 782 } 759 783 }, … … 912 936 // Peload fields into local variables for better performance. 913 937 var edgeFieldsCount = this._edgeFieldsCount; 938 var nodeFieldCount = this._nodeFieldCount; 914 939 var containmentEdges = this._containmentEdges; 915 var nodeFieldCount = this._nodeFieldCount; 916 var firstEdgeIndexOffset = this._firstEdgeIndexOffset; 940 var firstEdgeIndexes = this._firstEdgeIndexes; 917 941 var edgeToNodeOffset = this._edgeToNodeOffset; 918 942 var nodes = this._nodes; … … 925 949 var nodeOrdinal = nodeIndex / nodeFieldCount; 926 950 var distance = distances[nodeOrdinal] + 1; 927 var firstEdgeIndex = nodes[nodeIndex + firstEdgeIndexOffset];928 var edgesEnd = nodes[nodeIndex + firstEdgeIndexOffset + nodeFieldCount];951 var firstEdgeIndex = firstEdgeIndexes[nodeOrdinal]; 952 var edgesEnd = firstEdgeIndexes[nodeOrdinal + 1]; 929 953 for (var edgeToNodeIndex = firstEdgeIndex + edgeToNodeOffset; edgeToNodeIndex < edgesEnd; edgeToNodeIndex += edgeFieldsCount) { 930 954 var childNodeIndex = containmentEdges[edgeToNodeIndex]; … … 947 971 var nodes = this._nodes; 948 972 var flags = this._flags; 949 var nodesLength = this._realNodesLength;973 var nodesLength = nodes.length; 950 974 var nodeNativeType = this._nodeNativeType; 951 975 var nodeFieldCount = this._nodeFieldCount; … … 1067 1091 var nodes = this._nodes; 1068 1092 var nodeCount = this.nodeCount; 1069 var rootNode Index = this._rootNodeIndex;1093 var rootNodeOrdinal = this._rootNodeIndex / nodeFieldCount; 1070 1094 1071 1095 var edgeFieldsCount = this._edgeFieldsCount; 1096 var edgeTypeOffset = this._edgeTypeOffset; 1072 1097 var edgeToNodeOffset = this._edgeToNodeOffset; 1073 var edgeTypeOffset = this._edgeTypeOffset;1074 1098 var edgeShortcutType = this._edgeShortcutType; 1075 var firstEdgeIndex Offset = this._firstEdgeIndexOffset;1099 var firstEdgeIndexes = this._firstEdgeIndexes; 1076 1100 var containmentEdges = this._containmentEdges; 1077 1101 var containmentEdgesLength = this._containmentEdges.length; … … 1089 1113 var black = 2; 1090 1114 1091 nodesToVisit[nodesToVisitLength++] = this._rootNodeIndex;1092 painted[ this._rootNodeIndex / nodeFieldCount] = grey;1115 nodesToVisit[nodesToVisitLength++] = rootNodeOrdinal; 1116 painted[rootNodeOrdinal] = grey; 1093 1117 1094 1118 while (nodesToVisitLength) { 1095 var nodeIndex = nodesToVisit[nodesToVisitLength - 1]; 1096 var nodeOrdinal = nodeIndex / nodeFieldCount; 1119 var nodeOrdinal = nodesToVisit[nodesToVisitLength - 1]; 1097 1120 if (painted[nodeOrdinal] === grey) { 1098 1121 painted[nodeOrdinal] = black; 1099 1122 var nodeFlag = flags[nodeOrdinal] & flag; 1100 var beginEdgeIndex = nodes[nodeIndex + firstEdgeIndexOffset];1101 var endEdgeIndex = nodes[nodeIndex + firstEdgeIndexOffset + nodeFieldCount];1123 var beginEdgeIndex = firstEdgeIndexes[nodeOrdinal]; 1124 var endEdgeIndex = firstEdgeIndexes[nodeOrdinal + 1]; 1102 1125 for (var edgeIndex = beginEdgeIndex; edgeIndex < endEdgeIndex; edgeIndex += edgeFieldsCount) { 1103 if (node Index !== rootNodeIndex&& containmentEdges[edgeIndex + edgeTypeOffset] === edgeShortcutType)1126 if (nodeOrdinal !== rootNodeOrdinal && containmentEdges[edgeIndex + edgeTypeOffset] === edgeShortcutType) 1104 1127 continue; 1105 1128 var childNodeIndex = containmentEdges[edgeIndex + edgeToNodeOffset]; … … 1108 1131 // We are skipping the edges from non-page-owned nodes to page-owned nodes. 1109 1132 // Otherwise the dominators for the objects that also were retained by debugger would be affected. 1110 if (node Index !== rootNodeIndex&& childNodeFlag && !nodeFlag)1133 if (nodeOrdinal !== rootNodeOrdinal && childNodeFlag && !nodeFlag) 1111 1134 continue; 1112 1135 if (!painted[childNodeOrdinal]) { 1113 1136 painted[childNodeOrdinal] = grey; 1114 nodesToVisit[nodesToVisitLength++] = childNode Index;1137 nodesToVisit[nodesToVisitLength++] = childNodeOrdinal; 1115 1138 } 1116 1139 } … … 1143 1166 var retainingEdges = this._retainingEdges; 1144 1167 var edgeFieldsCount = this._edgeFieldsCount; 1168 var edgeTypeOffset = this._edgeTypeOffset; 1145 1169 var edgeToNodeOffset = this._edgeToNodeOffset; 1146 var edgeTypeOffset = this._edgeTypeOffset;1147 1170 var edgeShortcutType = this._edgeShortcutType; 1148 var firstEdgeIndex Offset = this._firstEdgeIndexOffset;1171 var firstEdgeIndexes = this._firstEdgeIndexes; 1149 1172 var containmentEdges = this._containmentEdges; 1150 1173 var containmentEdgesLength = this._containmentEdges.length; … … 1167 1190 1168 1191 { // Mark the root direct children as affected. 1169 var node Index = this._rootNodeIndex;1170 var beginEdgeToNodeFieldIndex = nodes[nodeIndex + firstEdgeIndexOffset] + edgeToNodeOffset;1171 var endEdgeToNodeFieldIndex = nodes[nodeIndex + nodeFieldCount + firstEdgeIndexOffset];1192 var nodeOrdinal = this._rootNodeIndex / nodeFieldCount; 1193 var beginEdgeToNodeFieldIndex = firstEdgeIndexes[nodeOrdinal] + edgeToNodeOffset; 1194 var endEdgeToNodeFieldIndex = firstEdgeIndexes[nodeOrdinal + 1]; 1172 1195 for (var toNodeFieldIndex = beginEdgeToNodeFieldIndex; 1173 1196 toNodeFieldIndex < endEdgeToNodeFieldIndex; … … 1228 1251 changed = true; 1229 1252 nodeOrdinal = postOrderIndex2NodeOrdinal[postOrderIndex]; 1230 nodeIndex = nodeOrdinal * nodeFieldCount; 1231 beginEdgeToNodeFieldIndex = nodes[nodeIndex + firstEdgeIndexOffset] + edgeToNodeOffset; 1232 endEdgeToNodeFieldIndex = nodes[nodeIndex + firstEdgeIndexOffset + nodeFieldCount]; 1253 beginEdgeToNodeFieldIndex = firstEdgeIndexes[nodeOrdinal] + edgeToNodeOffset; 1254 endEdgeToNodeFieldIndex = firstEdgeIndexes[nodeOrdinal + 1]; 1233 1255 for (var toNodeFieldIndex = beginEdgeToNodeFieldIndex; 1234 1256 toNodeFieldIndex < endEdgeToNodeFieldIndex; … … 1368 1390 var edgeFieldsCount = this._edgeFieldsCount; 1369 1391 var edgeWeakType = this._edgeWeakType; 1370 var firstEdgeIndex Offset = this._firstEdgeIndexOffset;1392 var firstEdgeIndexes = this._firstEdgeIndexes; 1371 1393 var containmentEdges = this._containmentEdges; 1372 1394 var containmentEdgesLength = containmentEdges.length; … … 1384 1406 var nodesToVisitLength = 0; 1385 1407 1386 for (var edgeIndex = nodes[this._rootNodeIndex + firstEdgeIndexOffset], endEdgeIndex = nodes[this._rootNodeIndex + nodeFieldCount + firstEdgeIndexOffset]; 1408 var rootNodeOrdinal = this._rootNodeIndex / nodeFieldCount; 1409 for (var edgeIndex = firstEdgeIndexes[rootNodeOrdinal], endEdgeIndex = firstEdgeIndexes[rootNodeOrdinal + 1]; 1387 1410 edgeIndex < endEdgeIndex; 1388 1411 edgeIndex += edgeFieldsCount) { 1389 1412 if (containmentEdges[edgeIndex + edgeTypeOffset] === edgeShortcutType) { 1390 var node Index = containmentEdges[edgeIndex + edgeToNodeOffset];1391 nodesToVisit[nodesToVisitLength++] = node Index;1392 flags[node Index / nodeFieldCount] |= visitedMarker;1413 var nodeOrdinal = containmentEdges[edgeIndex + edgeToNodeOffset] / nodeFieldCount; 1414 nodesToVisit[nodesToVisitLength++] = nodeOrdinal; 1415 flags[nodeOrdinal] |= visitedMarker; 1393 1416 } 1394 1417 } 1395 1418 1396 1419 while (nodesToVisitLength) { 1397 var nodeIndex = nodesToVisit[--nodesToVisitLength]; 1398 var nodeOrdinal = nodeIndex / nodeFieldCount; 1420 var nodeOrdinal = nodesToVisit[--nodesToVisitLength]; 1399 1421 flags[nodeOrdinal] |= flag; 1400 1422 flags[nodeOrdinal] &= visitedMarkerMask; 1401 var beginEdgeIndex = nodes[nodeIndex + firstEdgeIndexOffset]; 1402 var endEdgeIndex = nodeOrdinal < nodesCount - 1 1403 ? nodes[nodeIndex + firstEdgeIndexOffset + nodeFieldCount] 1404 : containmentEdgesLength; 1423 var beginEdgeIndex = firstEdgeIndexes[nodeOrdinal]; 1424 var endEdgeIndex = firstEdgeIndexes[nodeOrdinal + 1]; 1405 1425 for (var edgeIndex = beginEdgeIndex; edgeIndex < endEdgeIndex; edgeIndex += edgeFieldsCount) { 1406 1426 var childNodeIndex = containmentEdges[edgeIndex + edgeToNodeOffset]; … … 1411 1431 if (type === edgeWeakType) 1412 1432 continue; 1413 nodesToVisit[nodesToVisitLength++] = childNode Index;1433 nodesToVisit[nodesToVisitLength++] = childNodeOrdinal; 1414 1434 flags[childNodeOrdinal] |= visitedMarker; 1415 1435 } … … 1433 1453 var nodeCount = this.nodeCount; 1434 1454 var nodeFieldCount = this._nodeFieldCount; 1435 var firstEdgeIndex Offset = this._firstEdgeIndexOffset;1455 var firstEdgeIndexes = this._firstEdgeIndexes; 1436 1456 1437 1457 var flags = this._flags; … … 1440 1460 for (var iter = this.rootNode().edges(); iter.hasNext(); iter.next()) { 1441 1461 if (iter.edge.node().isWindow()) 1442 list.push(iter.edge.node().nodeIndex );1462 list.push(iter.edge.node().nodeIndex / nodeFieldCount); 1443 1463 } 1444 1464 1445 1465 while (list.length) { 1446 var nodeIndex = list.pop(); 1447 var nodeOrdinal = nodeIndex / nodeFieldCount; 1466 var nodeOrdinal = list.pop(); 1448 1467 if (flags[nodeOrdinal] & flag) 1449 1468 continue; 1450 1469 flags[nodeOrdinal] |= flag; 1451 var beginEdgeIndex = nodes[nodeIndex + firstEdgeIndexOffset];1452 var endEdgeIndex = nodes[nodeIndex + firstEdgeIndexOffset + nodeFieldCount];1470 var beginEdgeIndex = firstEdgeIndexes[nodeOrdinal]; 1471 var endEdgeIndex = firstEdgeIndexes[nodeOrdinal + 1]; 1453 1472 for (var edgeIndex = beginEdgeIndex; edgeIndex < endEdgeIndex; edgeIndex += edgeFieldsCount) { 1454 1473 var childNodeIndex = containmentEdges[edgeIndex + edgeToNodeOffset]; 1455 if (flags[childNodeIndex / nodeFieldCount] & flag) 1474 var childNodeOrdinal = childNodeIndex / nodeFieldCount; 1475 if (flags[childNodeOrdinal] & flag) 1456 1476 continue; 1457 1477 var type = containmentEdges[edgeIndex + edgeTypeOffset]; 1458 1478 if (type === hiddenEdgeType || type === invisibleEdgeType || type === internalEdgeType) 1459 1479 continue; 1460 list.push(childNode Index);1480 list.push(childNodeOrdinal); 1461 1481 } 1462 1482 }
Note: See TracChangeset
for help on using the changeset viewer.