Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 WebInspector.TimelineJSProfileProcessor = {}; | 5 WebInspector.TimelineJSProfileProcessor = {}; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * @param {!WebInspector.CPUProfileDataModel} jsProfileModel | 8 * @param {!WebInspector.CPUProfileDataModel} jsProfileModel |
| 9 * @param {!WebInspector.TracingModel.Thread} thread | 9 * @param {!WebInspector.TracingModel.Thread} thread |
| 10 * @return {!Array<!WebInspector.TracingModel.Event>} | 10 * @return {!Array<!WebInspector.TracingModel.Event>} |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 76 case WebInspector.TimelineModel.RecordType.EvaluateScript: | 76 case WebInspector.TimelineModel.RecordType.EvaluateScript: |
| 77 return true; | 77 return true; |
| 78 } | 78 } |
| 79 return false; | 79 return false; |
| 80 } | 80 } |
| 81 | 81 |
| 82 var jsFrameEvents = []; | 82 var jsFrameEvents = []; |
| 83 var jsFramesStack = []; | 83 var jsFramesStack = []; |
| 84 var lockedJsStackDepth = []; | 84 var lockedJsStackDepth = []; |
| 85 var ordinal = 0; | 85 var ordinal = 0; |
| 86 var filterNativeFunctions = !WebInspector.moduleSetting('showNativeFunctionsIn JSProfile').get(); | 86 const showAllEvents = Runtime.experiments.isEnabled('timelineShowAllEvents'); |
| 87 const showRuntimeCallStats = Runtime.experiments.isEnabled('timelineV8RuntimeC allStats'); | |
| 88 const showNativeFunctions = WebInspector.moduleSetting('showNativeFunctionsInJ SProfile').get(); | |
| 89 | |
| 90 const visibleV8RuntimeStatsItems = new Set([ | |
| 91 'Compile', | |
| 92 'CompileCode', | |
| 93 'CompileCodeLazy', | |
| 94 'CompileDeserialize', | |
| 95 'CompileEval', | |
| 96 'CompileFullCode', | |
| 97 'CompileIgnition', | |
| 98 'CompilerDispatcher', | |
| 99 'CompileSerialize', | |
| 100 'DeoptimizeCode', | |
| 101 'OptimizeCode', | |
| 102 'ParseProgram', | |
| 103 'ParseFunction', | |
| 104 'RecompileConcurrent', | |
| 105 'RecompileSynchronous', | |
| 106 'ParseLazy', | |
| 107 'FunctionCallback' | |
| 108 ]); | |
| 87 | 109 |
| 88 /** | 110 /** |
| 89 * @param {!WebInspector.TracingModel.Event} e | 111 * @param {!WebInspector.TracingModel.Event} e |
| 90 */ | 112 */ |
| 91 function onStartEvent(e) { | 113 function onStartEvent(e) { |
| 92 e.ordinal = ++ordinal; | 114 e.ordinal = ++ordinal; |
| 93 extractStackTrace(e); | 115 extractStackTrace(e); |
| 94 // For the duration of the event we cannot go beyond the stack associated wi th it. | 116 // For the duration of the event we cannot go beyond the stack associated wi th it. |
| 95 lockedJsStackDepth.push(jsFramesStack.length); | 117 lockedJsStackDepth.push(jsFramesStack.length); |
| 96 } | 118 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 131 } | 153 } |
| 132 for (var k = 0; k < jsFramesStack.length; ++k) | 154 for (var k = 0; k < jsFramesStack.length; ++k) |
| 133 jsFramesStack[k].setEndTime(time); | 155 jsFramesStack[k].setEndTime(time); |
| 134 jsFramesStack.length = depth; | 156 jsFramesStack.length = depth; |
| 135 } | 157 } |
| 136 | 158 |
| 137 /** | 159 /** |
| 138 * @param {!Array<!RuntimeAgent.CallFrame>} stack | 160 * @param {!Array<!RuntimeAgent.CallFrame>} stack |
| 139 */ | 161 */ |
| 140 function filterStackFrames(stack) { | 162 function filterStackFrames(stack) { |
| 163 if (showAllEvents) | |
| 164 return; | |
| 141 for (var i = 0, j = 0; i < stack.length; ++i) { | 165 for (var i = 0, j = 0; i < stack.length; ++i) { |
| 142 var url = stack[i].url; | 166 const frame = stack[i]; |
| 143 if (url && url.startsWith('native ')) | 167 const url = frame.url; |
| 168 if (!showNativeFunctions && url && url.startsWith('native ')) | |
| 144 continue; | 169 continue; |
| 145 stack[j++] = stack[i]; | 170 if (showRuntimeCallStats && url === 'native V8Runtime' && !visibleV8Runtim eStatsItems.has(frame.functionName)) |
|
caseq
2016/11/02 23:35:09
we shouldn't show the call stats when showRuntimeC
alph
2016/11/03 01:10:24
Done.
| |
| 171 continue; | |
| 172 stack[j++] = frame; | |
| 146 } | 173 } |
| 147 stack.length = j; | 174 stack.length = j; |
| 148 } | 175 } |
| 149 | 176 |
| 150 /** | 177 /** |
| 151 * @param {!WebInspector.TracingModel.Event} e | 178 * @param {!WebInspector.TracingModel.Event} e |
| 152 */ | 179 */ |
| 153 function extractStackTrace(e) { | 180 function extractStackTrace(e) { |
| 154 var recordTypes = WebInspector.TimelineModel.RecordType; | 181 var recordTypes = WebInspector.TimelineModel.RecordType; |
| 155 var callFrames; | 182 var callFrames; |
| 156 if (e.name === recordTypes.JSSample) { | 183 if (e.name === recordTypes.JSSample) { |
| 157 var eventData = e.args['data'] || e.args['beginData']; | 184 var eventData = e.args['data'] || e.args['beginData']; |
| 158 callFrames = /** @type {!Array<!RuntimeAgent.CallFrame>} */ (eventData && eventData['stackTrace']); | 185 callFrames = /** @type {!Array<!RuntimeAgent.CallFrame>} */ (eventData && eventData['stackTrace']); |
| 159 } else { | 186 } else { |
| 160 callFrames = /** @type {!Array<!RuntimeAgent.CallFrame>} */ ( | 187 callFrames = /** @type {!Array<!RuntimeAgent.CallFrame>} */ ( |
| 161 jsFramesStack.map(frameEvent => frameEvent.args['data']).reverse()); | 188 jsFramesStack.map(frameEvent => frameEvent.args['data']).reverse()); |
| 162 } | 189 } |
| 163 if (filterNativeFunctions) | 190 filterStackFrames(callFrames); |
| 164 filterStackFrames(callFrames); | |
| 165 var endTime = eventEndTime(e); | 191 var endTime = eventEndTime(e); |
| 166 var numFrames = callFrames.length; | 192 var numFrames = callFrames.length; |
| 167 var minFrames = Math.min(numFrames, jsFramesStack.length); | 193 var minFrames = Math.min(numFrames, jsFramesStack.length); |
| 168 var i; | 194 var i; |
| 169 for (i = lockedJsStackDepth.peekLast() || 0; i < minFrames; ++i) { | 195 for (i = lockedJsStackDepth.peekLast() || 0; i < minFrames; ++i) { |
| 170 var newFrame = callFrames[numFrames - 1 - i]; | 196 var newFrame = callFrames[numFrames - 1 - i]; |
| 171 var oldFrame = jsFramesStack[i].args['data']; | 197 var oldFrame = jsFramesStack[i].args['data']; |
| 172 if (!equalFrames(newFrame, oldFrame)) | 198 if (!equalFrames(newFrame, oldFrame)) |
| 173 break; | 199 break; |
| 174 jsFramesStack[i].setEndTime(Math.max(jsFramesStack[i].endTime, endTime)); | 200 jsFramesStack[i].setEndTime(Math.max(jsFramesStack[i].endTime, endTime)); |
| 175 } | 201 } |
| 176 truncateJSStack(i, e.startTime); | 202 truncateJSStack(i, e.startTime); |
| 177 for (; i < numFrames; ++i) { | 203 for (; i < numFrames; ++i) { |
| 178 var frame = callFrames[numFrames - 1 - i]; | 204 var frame = callFrames[numFrames - 1 - i]; |
| 179 var jsFrameEvent = new WebInspector.TracingModel.Event( | 205 var jsFrameEvent = new WebInspector.TracingModel.Event( |
| 180 WebInspector.TracingModel.DevToolsTimelineEventCategory, recordTypes.J SFrame, | 206 WebInspector.TracingModel.DevToolsTimelineEventCategory, recordTypes.J SFrame, |
| 181 WebInspector.TracingModel.Phase.Complete, e.startTime, e.thread); | 207 WebInspector.TracingModel.Phase.Complete, e.startTime, e.thread); |
| 182 jsFrameEvent.ordinal = e.ordinal; | 208 jsFrameEvent.ordinal = e.ordinal; |
| 183 jsFrameEvent.addArgs({data: frame}); | 209 jsFrameEvent.addArgs({data: frame}); |
| 184 jsFrameEvent.setEndTime(endTime); | 210 jsFrameEvent.setEndTime(endTime); |
| 185 jsFramesStack.push(jsFrameEvent); | 211 jsFramesStack.push(jsFrameEvent); |
| 186 jsFrameEvents.push(jsFrameEvent); | 212 jsFrameEvents.push(jsFrameEvent); |
| 187 } | 213 } |
| 188 } | 214 } |
| 189 | 215 |
| 190 /** | 216 const firstTopLevelEvent = events.find(WebInspector.TracingModel.isTopLevelEve nt); |
| 191 * @param {!Array<!WebInspector.TracingModel.Event>} events | |
| 192 * @return {?WebInspector.TracingModel.Event} | |
| 193 */ | |
| 194 function findFirstTopLevelEvent(events) { | |
| 195 for (var i = 0; i < events.length; ++i) { | |
| 196 if (WebInspector.TracingModel.isTopLevelEvent(events[i])) | |
| 197 return events[i]; | |
| 198 } | |
| 199 return null; | |
| 200 } | |
| 201 | |
| 202 var firstTopLevelEvent = findFirstTopLevelEvent(events); | |
| 203 if (firstTopLevelEvent) | 217 if (firstTopLevelEvent) |
| 204 WebInspector.TimelineModel.forEachEvent( | 218 WebInspector.TimelineModel.forEachEvent( |
| 205 events, onStartEvent, onEndEvent, onInstantEvent, firstTopLevelEvent.sta rtTime); | 219 events, onStartEvent, onEndEvent, onInstantEvent, firstTopLevelEvent.sta rtTime); |
| 206 return jsFrameEvents; | 220 return jsFrameEvents; |
| 207 }; | 221 }; |
| OLD | NEW |