| 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 | 5 |
| 6 WebInspector.TimelineJSProfileProcessor = { }; | 6 WebInspector.TimelineJSProfileProcessor = { }; |
| 7 | 7 |
| 8 /** | 8 /** |
| 9 * @param {!ProfilerAgent.CPUProfile} jsProfile | 9 * @param {!ProfilerAgent.CPUProfile} jsProfile |
| 10 * @param {!WebInspector.TracingModel.Thread} thread | 10 * @param {!WebInspector.TracingModel.Thread} thread |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 if (depth < lockedDepth) { | 147 if (depth < lockedDepth) { |
| 148 console.error("Child stack is shallower (" + depth + ") than the
parent stack (" + lockedDepth + ") at " + time); | 148 console.error("Child stack is shallower (" + depth + ") than the
parent stack (" + lockedDepth + ") at " + time); |
| 149 depth = lockedDepth; | 149 depth = lockedDepth; |
| 150 } | 150 } |
| 151 } | 151 } |
| 152 if (jsFramesStack.length < depth) { | 152 if (jsFramesStack.length < depth) { |
| 153 console.error("Trying to truncate higher than the current stack size
at " + time); | 153 console.error("Trying to truncate higher than the current stack size
at " + time); |
| 154 depth = jsFramesStack.length; | 154 depth = jsFramesStack.length; |
| 155 } | 155 } |
| 156 var minFrameDurationMs = currentSamplingIntervalMs / 2; | 156 var minFrameDurationMs = currentSamplingIntervalMs / 2; |
| 157 for (var k = 0; k < depth; ++k) |
| 158 jsFramesStack[k].setEndTime(time); |
| 157 for (var k = depth; k < jsFramesStack.length; ++k) | 159 for (var k = depth; k < jsFramesStack.length; ++k) |
| 158 jsFramesStack[k].setEndTime(Math.min(eventEndTime(jsFramesStack[k])
+ minFrameDurationMs, time)); | 160 jsFramesStack[k].setEndTime(Math.min(eventEndTime(jsFramesStack[k])
+ minFrameDurationMs, time)); |
| 159 jsFramesStack.length = depth; | 161 jsFramesStack.length = depth; |
| 160 } | 162 } |
| 161 | 163 |
| 162 /** | 164 /** |
| 163 * @param {!Array<!ConsoleAgent.CallFrame>} stack | 165 * @param {!Array<!ConsoleAgent.CallFrame>} stack |
| 164 */ | 166 */ |
| 165 function filterStackFrames(stack) | 167 function filterStackFrames(stack) |
| 166 { | 168 { |
| 167 for (var i = 0, j = 0; i < stack.length; ++i) { | 169 for (var i = 0, j = 0; i < stack.length; ++i) { |
| 168 var url = stack[i].url; | 170 var url = stack[i].url; |
| 169 if (url && url.startsWith("native ")) | 171 if (url && url.startsWith("native ")) |
| 170 continue; | 172 continue; |
| 171 stack[j++] = stack[i]; | 173 stack[j++] = stack[i]; |
| 172 } | 174 } |
| 173 stack.length = j; | 175 stack.length = j; |
| 174 } | 176 } |
| 175 | 177 |
| 176 /** | 178 /** |
| 177 * @param {!WebInspector.TracingModel.Event} e | 179 * @param {!WebInspector.TracingModel.Event} e |
| 178 */ | 180 */ |
| 179 function extractStackTrace(e) | 181 function extractStackTrace(e) |
| 180 { | 182 { |
| 181 var eventData = e.args["data"] || e.args["beginData"]; | |
| 182 var stackTrace = eventData && eventData["stackTrace"]; | |
| 183 var recordTypes = WebInspector.TimelineModel.RecordType; | 183 var recordTypes = WebInspector.TimelineModel.RecordType; |
| 184 // GC events do not hold call stack, so make a copy of the current stack
. | 184 var stackTrace; |
| 185 if (e.name === recordTypes.GCEvent || e.name === recordTypes.MajorGC ||
e.name === recordTypes.MinorGC) | 185 if (e.name === recordTypes.JSSample) { |
| 186 stackTrace = jsFramesStack.map(function(frameEvent) { return frameEv
ent.args["data"]; }).reverse(); | 186 var eventData = e.args["data"] || e.args["beginData"]; |
| 187 if (!stackTrace) | 187 stackTrace = eventData && eventData["stackTrace"]; |
| 188 return; | 188 } else { |
| 189 stackTrace = jsFramesStack.map(frameEvent => frameEvent.args["data"]
).reverse(); |
| 190 } |
| 189 if (filterNativeFunctions) | 191 if (filterNativeFunctions) |
| 190 filterStackFrames(stackTrace); | 192 filterStackFrames(stackTrace); |
| 191 var endTime = eventEndTime(e); | 193 var endTime = eventEndTime(e); |
| 192 var numFrames = stackTrace.length; | 194 var numFrames = stackTrace.length; |
| 193 var minFrames = Math.min(numFrames, jsFramesStack.length); | 195 var minFrames = Math.min(numFrames, jsFramesStack.length); |
| 194 var i; | 196 var i; |
| 195 for (i = lockedJsStackDepth.peekLast() || 0; i < minFrames; ++i) { | 197 for (i = lockedJsStackDepth.peekLast() || 0; i < minFrames; ++i) { |
| 196 var newFrame = stackTrace[numFrames - 1 - i]; | 198 var newFrame = stackTrace[numFrames - 1 - i]; |
| 197 var oldFrame = jsFramesStack[i].args["data"]; | 199 var oldFrame = jsFramesStack[i].args["data"]; |
| 198 if (!equalFrames(newFrame, oldFrame)) | 200 if (!equalFrames(newFrame, oldFrame)) |
| 199 break; | 201 break; |
| 200 jsFramesStack[i].setEndTime(Math.max(jsFramesStack[i].endTime, endTi
me)); | 202 jsFramesStack[i].setEndTime(Math.max(jsFramesStack[i].endTime, endTi
me)); |
| 201 } | 203 } |
| 202 truncateJSStack(i, e.startTime); | 204 truncateJSStack(i, e.startTime); |
| 203 for (; i < numFrames; ++i) { | 205 for (; i < numFrames; ++i) { |
| 204 var frame = stackTrace[numFrames - 1 - i]; | 206 var frame = stackTrace[numFrames - 1 - i]; |
| 205 var jsFrameEvent = new WebInspector.TracingModel.Event(WebInspector.
TracingModel.DevToolsTimelineEventCategory, WebInspector.TimelineModel.RecordTyp
e.JSFrame, | 207 var jsFrameEvent = new WebInspector.TracingModel.Event(WebInspector.
TracingModel.DevToolsTimelineEventCategory, recordTypes.JSFrame, |
| 206 WebInspector.TracingModel.Phase.Complete, e.startTime, e.thread)
; | 208 WebInspector.TracingModel.Phase.Complete, e.startTime, e.thread)
; |
| 207 jsFrameEvent.ordinal = e.ordinal; | 209 jsFrameEvent.ordinal = e.ordinal; |
| 208 jsFrameEvent.addArgs({ data: frame }); | 210 jsFrameEvent.addArgs({ data: frame }); |
| 209 jsFrameEvent.setEndTime(endTime); | 211 jsFrameEvent.setEndTime(endTime); |
| 210 jsFramesStack.push(jsFrameEvent); | 212 jsFramesStack.push(jsFrameEvent); |
| 211 jsFrameEvents.push(jsFrameEvent); | 213 jsFrameEvents.push(jsFrameEvent); |
| 212 } | 214 } |
| 213 } | 215 } |
| 214 | 216 |
| 215 /** | 217 /** |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 505 WebInspector.TracingModel.Phase.Instant, e.startTime, e.thread); | 507 WebInspector.TracingModel.Phase.Instant, e.startTime, e.thread); |
| 506 sampleEvent.ordinal = e.ordinal; | 508 sampleEvent.ordinal = e.ordinal; |
| 507 sampleEvent.args = {"data": {"stackTrace": stack }}; | 509 sampleEvent.args = {"data": {"stackTrace": stack }}; |
| 508 samples.push(sampleEvent); | 510 samples.push(sampleEvent); |
| 509 break; | 511 break; |
| 510 } | 512 } |
| 511 } | 513 } |
| 512 | 514 |
| 513 return samples; | 515 return samples; |
| 514 } | 516 } |
| OLD | NEW |