| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 27 | 27 |
| 28 Array.prototype.top = function() { | 28 Array.prototype.top = function() { |
| 29 if (this.length == 0) return undefined; | 29 if (this.length == 0) return undefined; |
| 30 return this[this.length - 1]; | 30 return this[this.length - 1]; |
| 31 } | 31 } |
| 32 | 32 |
| 33 | 33 |
| 34 function PlotScriptComposer(kResX, kResY) { | 34 function PlotScriptComposer(kResX, kResY, error_output) { |
| 35 // Constants. | 35 // Constants. |
| 36 var kV8BinarySuffixes = ["/d8", "/libv8.so"]; | 36 var kV8BinarySuffixes = ["/d8", "/libv8.so"]; |
| 37 var kStackFrames = 8; // Stack frames to display in the plot. | 37 var kStackFrames = 8; // Stack frames to display in the plot. |
| 38 | 38 |
| 39 var kTimerEventWidth = 0.33; // Width of each timeline. | 39 var kTimerEventWidth = 0.33; // Width of each timeline. |
| 40 var kExecutionFrameWidth = 0.2; // Width of the top stack frame line. | 40 var kExecutionFrameWidth = 0.2; // Width of the top stack frame line. |
| 41 var kStackFrameWidth = 0.1; // Width of the lower stack frame lines. | 41 var kStackFrameWidth = 0.1; // Width of the lower stack frame lines. |
| 42 var kGapWidth = 0.05; // Gap between stack frame lines. | 42 var kGapWidth = 0.05; // Gap between stack frame lines. |
| 43 | 43 |
| 44 var kY1Offset = 11; // Offset for stack frame vs. event lines. | 44 var kY1Offset = 11; // Offset for stack frame vs. event lines. |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 } | 142 } |
| 143 | 143 |
| 144 var range_start = undefined; | 144 var range_start = undefined; |
| 145 var range_end = undefined; | 145 var range_end = undefined; |
| 146 var obj_index = 0; | 146 var obj_index = 0; |
| 147 var pause_tolerance = 0.005; // Milliseconds. | 147 var pause_tolerance = 0.005; // Milliseconds. |
| 148 var distortion = 0; | 148 var distortion = 0; |
| 149 | 149 |
| 150 // Utility functions. | 150 // Utility functions. |
| 151 function assert(something, message) { | 151 function assert(something, message) { |
| 152 if (!something) print(new Error(message).stack); | 152 if (!something) { |
| 153 var error = new Error(message); |
| 154 error_output(error.stack); |
| 155 } |
| 153 } | 156 } |
| 154 | 157 |
| 155 function FindCodeKind(kind) { | 158 function FindCodeKind(kind) { |
| 156 for (name in CodeKinds) { | 159 for (name in CodeKinds) { |
| 157 if (CodeKinds[name].kinds.indexOf(kind) >= 0) { | 160 if (CodeKinds[name].kinds.indexOf(kind) >= 0) { |
| 158 return CodeKinds[name]; | 161 return CodeKinds[name]; |
| 159 } | 162 } |
| 160 } | 163 } |
| 161 } | 164 } |
| 162 | 165 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 result.push(new Range(Math.max(ranges[i].start, start), | 204 result.push(new Range(Math.max(ranges[i].start, start), |
| 202 Math.min(ranges[i].end, end))); | 205 Math.min(ranges[i].end, end))); |
| 203 } | 206 } |
| 204 } | 207 } |
| 205 return result; | 208 return result; |
| 206 } | 209 } |
| 207 | 210 |
| 208 // Public methods. | 211 // Public methods. |
| 209 this.collectData = function(input, distortion_per_entry) { | 212 this.collectData = function(input, distortion_per_entry) { |
| 210 | 213 |
| 214 var last_timestamp = 0; |
| 215 |
| 211 // Parse functions. | 216 // Parse functions. |
| 212 var parseTimeStamp = function(timestamp) { | 217 var parseTimeStamp = function(timestamp) { |
| 218 int_timestamp = parseInt(timestamp); |
| 219 assert(int_timestamp >= last_timestamp, "Inconsistent timestamps."); |
| 220 last_timestamp = int_timestamp; |
| 213 distortion += distortion_per_entry; | 221 distortion += distortion_per_entry; |
| 214 return parseInt(timestamp) / 1000 - distortion; | 222 return int_timestamp / 1000 - distortion; |
| 215 } | 223 } |
| 216 | 224 |
| 217 var processTimerEventStart = function(name, start) { | 225 var processTimerEventStart = function(name, start) { |
| 218 // Find out the thread id. | 226 // Find out the thread id. |
| 219 var new_event = TimerEvents[name]; | 227 var new_event = TimerEvents[name]; |
| 220 if (new_event === undefined) return; | 228 if (new_event === undefined) return; |
| 221 var thread_id = new_event.thread_id; | 229 var thread_id = new_event.thread_id; |
| 222 | 230 |
| 223 start = Math.max(last_time_stamp[thread_id] + kMinRangeLength, start); | 231 start = Math.max(last_time_stamp[thread_id] + kMinRangeLength, start); |
| 224 | 232 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 253 }; | 261 }; |
| 254 | 262 |
| 255 var processCodeMoveEvent = function(from, to) { | 263 var processCodeMoveEvent = function(from, to) { |
| 256 code_map.moveCode(from, to); | 264 code_map.moveCode(from, to); |
| 257 }; | 265 }; |
| 258 | 266 |
| 259 var processCodeDeleteEvent = function(address) { | 267 var processCodeDeleteEvent = function(address) { |
| 260 code_map.deleteCode(address); | 268 code_map.deleteCode(address); |
| 261 }; | 269 }; |
| 262 | 270 |
| 263 var processSharedLibrary = function(name, start, end) { | |
| 264 var code_entry = new CodeMap.CodeEntry(end - start, name); | |
| 265 code_entry.kind = -2; // External code kind. | |
| 266 for (var i = 0; i < kV8BinarySuffixes.length; i++) { | |
| 267 var suffix = kV8BinarySuffixes[i]; | |
| 268 if (name.indexOf(suffix, name.length - suffix.length) >= 0) { | |
| 269 code_entry.kind = -1; // V8 runtime code kind. | |
| 270 break; | |
| 271 } | |
| 272 } | |
| 273 code_map.addLibrary(start, code_entry); | |
| 274 }; | |
| 275 | |
| 276 var processTimerEventStart = function(name, start) { | |
| 277 // Find out the thread id. | |
| 278 var new_event = TimerEvents[name]; | |
| 279 if (new_event === undefined) return; | |
| 280 var thread_id = new_event.thread_id; | |
| 281 | |
| 282 start = Math.max(last_time_stamp[thread_id] + kMinRangeLength, start); | |
| 283 | |
| 284 // Last event on this thread is done with the start of this event. | |
| 285 var last_event = event_stack[thread_id].top(); | |
| 286 if (last_event !== undefined) { | |
| 287 var new_range = new Range(last_time_stamp[thread_id], start); | |
| 288 last_event.ranges.push(new_range); | |
| 289 } | |
| 290 event_stack[thread_id].push(new_event); | |
| 291 last_time_stamp[thread_id] = start; | |
| 292 }; | |
| 293 | |
| 294 var processTimerEventEnd = function(name, end) { | |
| 295 // Find out about the thread_id. | |
| 296 var finished_event = TimerEvents[name]; | |
| 297 var thread_id = finished_event.thread_id; | |
| 298 assert(finished_event === event_stack[thread_id].pop(), | |
| 299 "inconsistent event stack"); | |
| 300 | |
| 301 end = Math.max(last_time_stamp[thread_id] + kMinRangeLength, end); | |
| 302 | |
| 303 var new_range = new Range(last_time_stamp[thread_id], end); | |
| 304 finished_event.ranges.push(new_range); | |
| 305 last_time_stamp[thread_id] = end; | |
| 306 }; | |
| 307 | |
| 308 var processCodeCreateEvent = function(type, kind, address, size, name) { | |
| 309 var code_entry = new CodeMap.CodeEntry(size, name); | |
| 310 code_entry.kind = kind; | |
| 311 code_map.addCode(address, code_entry); | |
| 312 }; | |
| 313 | |
| 314 var processCodeMoveEvent = function(from, to) { | |
| 315 code_map.moveCode(from, to); | |
| 316 }; | |
| 317 | |
| 318 var processCodeDeleteEvent = function(address) { | |
| 319 code_map.deleteCode(address); | |
| 320 }; | |
| 321 | |
| 322 var processCodeDeoptEvent = function(time, size) { | 271 var processCodeDeoptEvent = function(time, size) { |
| 323 deopts.push(new Deopt(time, size)); | 272 deopts.push(new Deopt(time, size)); |
| 324 } | 273 } |
| 325 | 274 |
| 326 var processSharedLibrary = function(name, start, end) { | 275 var processSharedLibrary = function(name, start, end) { |
| 327 var code_entry = new CodeMap.CodeEntry(end - start, name); | 276 var code_entry = new CodeMap.CodeEntry(end - start, name); |
| 328 code_entry.kind = -3; // External code kind. | 277 code_entry.kind = -3; // External code kind. |
| 329 for (var i = 0; i < kV8BinarySuffixes.length; i++) { | 278 for (var i = 0; i < kV8BinarySuffixes.length; i++) { |
| 330 var suffix = kV8BinarySuffixes[i]; | 279 var suffix = kV8BinarySuffixes[i]; |
| 331 if (name.indexOf(suffix, name.length - suffix.length) >= 0) { | 280 if (name.indexOf(suffix, name.length - suffix.length) >= 0) { |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 output("plot '-' using 1:2 axes x1y2 with impulses ls 1"); | 520 output("plot '-' using 1:2 axes x1y2 with impulses ls 1"); |
| 572 for (var i = 0; i < execution_pauses.length; i++) { | 521 for (var i = 0; i < execution_pauses.length; i++) { |
| 573 var pause = execution_pauses[i]; | 522 var pause = execution_pauses[i]; |
| 574 output(pause.end + " " + pause.duration()); | 523 output(pause.end + " " + pause.duration()); |
| 575 obj_index++; | 524 obj_index++; |
| 576 } | 525 } |
| 577 output("e"); | 526 output("e"); |
| 578 return obj_index; | 527 return obj_index; |
| 579 }; | 528 }; |
| 580 } | 529 } |
| OLD | NEW |