Chromium Code Reviews| Index: Source/devtools/front_end/timeline/TimelineJSProfile.js |
| diff --git a/Source/devtools/front_end/timeline/TimelineJSProfile.js b/Source/devtools/front_end/timeline/TimelineJSProfile.js |
| index c49f7f5d7619d555c980bd1eba433e22fd96af48..4a48943432d154b566943a56e180fb61e38639d8 100644 |
| --- a/Source/devtools/front_end/timeline/TimelineJSProfile.js |
| +++ b/Source/devtools/front_end/timeline/TimelineJSProfile.js |
| @@ -312,27 +312,48 @@ WebInspector.TimelineJSProfileProcessor.CodeMap.prototype = { |
| */ |
| WebInspector.TimelineJSProfileProcessor.processRawV8Samples = function(events) |
| { |
| - var unknownFrame = { |
| - functionName: "(unknown)", |
| - url: "", |
| - scriptId: "0", |
| - lineNumber: 0, |
| - columnNumber: 0 |
| - }; |
| + var missingAddesses = new Set(); |
| + |
| + /** |
| + * @param {string} functionName |
| + * @param {string=} url |
| + * @param {string=} scriptId |
| + * @param {number=} line |
| + * @param {number=} column |
| + * @return {!ConsoleAgent.CallFrame} |
| + */ |
| + function createFrame(functionName, url, scriptId, line, column) |
| + { |
| + return /** @type {!ConsoleAgent.CallFrame} */ ({ |
| + "functionName": functionName, |
| + "url": url || "", |
| + "scriptId": scriptId || "0", |
| + "lineNumber": line || 0, |
| + "columnNumber": column || 0 |
| + }); |
| + } |
| + |
| /** |
| * @param {string} address |
| * @return {!ConsoleAgent.CallFrame} |
| */ |
| function convertRawFrame(address) |
| { |
| - return codeMap.lookupEntry(address) || unknownFrame; |
| + var entry = codeMap.lookupEntry(address); |
| + if (entry) |
| + return entry; |
| + if (!missingAddesses.has(address)) { |
| + missingAddesses.add(address); |
| + console.error("Address " + address + " has missing code entry"); |
| + } |
| + return createFrame(address); |
| } |
| // Code states: |
| // (empty) -> compiled |
| // ~ -> optimizable |
| // * -> optimized |
| - var reName = /^(\S*:)?[*~]?(\S*)(?: (\S*))?$/; |
| + var rePrefix = /^(\w*:)?[*~]?(.*)$/m; |
| /** |
| * @param {string} name |
| @@ -341,22 +362,29 @@ WebInspector.TimelineJSProfileProcessor.processRawV8Samples = function(events) |
| */ |
| function buildCallFrame(name, scriptId) |
| { |
| - var parsed = reName.exec(name); |
| - if (!parsed) |
| - return unknownFrame; |
| - var functionName = parsed[2] || ""; |
| - var urlData = WebInspector.ParsedURL.splitLineAndColumn(parsed[3] || ""); |
| - var url = urlData && urlData.url || ""; |
| - var line = urlData && urlData.lineNumber || 0; |
| - var column = urlData && urlData.columnNumber || 0; |
| - var frame = { |
| - "functionName": functionName, |
| - "url": url, |
| - "scriptId": String(scriptId), |
| - "lineNumber": line, |
| - "columnNumber": column |
| - }; |
| - return frame; |
| + var tokens = rePrefix.exec(name); |
| + if (!tokens || tokens.length < 3) { |
|
yurys
2015/06/23 17:09:56
This condition seems to always be false.
alph
2015/06/23 17:38:13
Done.
|
| + console.error("Cannot parse function name " + name); |
| + return createFrame(name); |
| + } |
| + var prefix = tokens[1]; |
| + var body = tokens[2]; |
| + var rawName; |
| + var rawUrl; |
| + if (prefix === "Script:") { |
| + rawName = ""; |
| + rawUrl = body; |
| + } else { |
| + var spacePos = body.lastIndexOf(" "); |
| + rawName = spacePos !== -1 ? body.substr(0, spacePos) : body; |
| + rawUrl = spacePos !== -1 ? body.substr(spacePos + 1) : ""; |
| + } |
| + var functionName = rawName; |
| + var urlData = WebInspector.ParsedURL.splitLineAndColumn(rawUrl); |
| + var url = urlData.url || ""; |
| + var line = urlData.lineNumber || 0; |
| + var column = urlData.columnNumber || 0; |
| + return createFrame(functionName, url, String(scriptId), line, column); |
| } |
| var recordTypes = WebInspector.TimelineModel.RecordType; |