| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 heavyView.sort(function(rec1, rec2) { | 281 heavyView.sort(function(rec1, rec2) { |
| 282 return rec2.totalTime - rec1.totalTime || | 282 return rec2.totalTime - rec1.totalTime || |
| 283 (rec2.internalFuncName < rec1.internalFuncName ? -1 : 1); }); | 283 (rec2.internalFuncName < rec1.internalFuncName ? -1 : 1); }); |
| 284 this.printHeavyProfile(heavyView.head.children); | 284 this.printHeavyProfile(heavyView.head.children); |
| 285 }; | 285 }; |
| 286 | 286 |
| 287 | 287 |
| 288 function padLeft(s, len) { | 288 function padLeft(s, len) { |
| 289 s = s.toString(); | 289 s = s.toString(); |
| 290 if (s.length < len) { | 290 if (s.length < len) { |
| 291 s = (new Array(len - s.length + 1).join(' ')) + s; | 291 var padLength = len - s.length; |
| 292 if (!(padLength in padLeft)) { |
| 293 padLeft[padLength] = new Array(padLength + 1).join(' '); |
| 294 } |
| 295 s = padLeft[padLength] + s; |
| 292 } | 296 } |
| 293 return s; | 297 return s; |
| 294 }; | 298 }; |
| 295 | 299 |
| 296 | 300 |
| 297 TickProcessor.prototype.printHeader = function(headerTitle) { | 301 TickProcessor.prototype.printHeader = function(headerTitle) { |
| 298 print('\n [' + headerTitle + ']:'); | 302 print('\n [' + headerTitle + ']:'); |
| 299 print(' ticks total nonlib name'); | 303 print(' ticks total nonlib name'); |
| 300 }; | 304 }; |
| 301 | 305 |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 WindowsCppEntriesProvider.prototype.unmangleName = function(name) { | 508 WindowsCppEntriesProvider.prototype.unmangleName = function(name) { |
| 505 // Empty or non-mangled name. | 509 // Empty or non-mangled name. |
| 506 if (name.length < 1 || name.charAt(0) != '?') return name; | 510 if (name.length < 1 || name.charAt(0) != '?') return name; |
| 507 var nameEndPos = name.indexOf('@@'); | 511 var nameEndPos = name.indexOf('@@'); |
| 508 var components = name.substring(1, nameEndPos).split('@'); | 512 var components = name.substring(1, nameEndPos).split('@'); |
| 509 components.reverse(); | 513 components.reverse(); |
| 510 return components.join('::'); | 514 return components.join('::'); |
| 511 }; | 515 }; |
| 512 | 516 |
| 513 | 517 |
| 514 function padRight(s, len) { | 518 function ArgumentsProcessor(args) { |
| 515 s = s.toString(); | 519 this.args_ = args; |
| 516 if (s.length < len) { | 520 this.result_ = ArgumentsProcessor.DEFAULTS; |
| 517 s = s + (new Array(len - s.length + 1).join(' ')); | |
| 518 } | |
| 519 return s; | |
| 520 }; | |
| 521 | 521 |
| 522 | 522 this.argsDispatch_ = { |
| 523 function processArguments(args) { | |
| 524 var result = { | |
| 525 logFileName: 'v8.log', | |
| 526 platform: 'unix', | |
| 527 stateFilter: null, | |
| 528 ignoreUnknown: false, | |
| 529 separateIc: false, | |
| 530 nm: 'nm' | |
| 531 }; | |
| 532 var argsDispatch = { | |
| 533 '-j': ['stateFilter', TickProcessor.VmStates.JS, | 523 '-j': ['stateFilter', TickProcessor.VmStates.JS, |
| 534 'Show only ticks from JS VM state'], | 524 'Show only ticks from JS VM state'], |
| 535 '-g': ['stateFilter', TickProcessor.VmStates.GC, | 525 '-g': ['stateFilter', TickProcessor.VmStates.GC, |
| 536 'Show only ticks from GC VM state'], | 526 'Show only ticks from GC VM state'], |
| 537 '-c': ['stateFilter', TickProcessor.VmStates.COMPILER, | 527 '-c': ['stateFilter', TickProcessor.VmStates.COMPILER, |
| 538 'Show only ticks from COMPILER VM state'], | 528 'Show only ticks from COMPILER VM state'], |
| 539 '-o': ['stateFilter', TickProcessor.VmStates.OTHER, | 529 '-o': ['stateFilter', TickProcessor.VmStates.OTHER, |
| 540 'Show only ticks from OTHER VM state'], | 530 'Show only ticks from OTHER VM state'], |
| 541 '-e': ['stateFilter', TickProcessor.VmStates.EXTERNAL, | 531 '-e': ['stateFilter', TickProcessor.VmStates.EXTERNAL, |
| 542 'Show only ticks from EXTERNAL VM state'], | 532 'Show only ticks from EXTERNAL VM state'], |
| 543 '--ignore-unknown': ['ignoreUnknown', true, | 533 '--ignore-unknown': ['ignoreUnknown', true, |
| 544 'Exclude ticks of unknown code entries from processing'], | 534 'Exclude ticks of unknown code entries from processing'], |
| 545 '--separate-ic': ['separateIc', true, | 535 '--separate-ic': ['separateIc', true, |
| 546 'Separate IC entries'], | 536 'Separate IC entries'], |
| 547 '--unix': ['platform', 'unix', | 537 '--unix': ['platform', 'unix', |
| 548 'Specify that we are running on *nix platform'], | 538 'Specify that we are running on *nix platform'], |
| 549 '--windows': ['platform', 'windows', | 539 '--windows': ['platform', 'windows', |
| 550 'Specify that we are running on Windows platform'], | 540 'Specify that we are running on Windows platform'], |
| 551 '--nm': ['nm', 'nm', | 541 '--nm': ['nm', 'nm', |
| 552 'Specify the \'nm\' executable to use (e.g. --nm=/my_dir/nm)'] | 542 'Specify the \'nm\' executable to use (e.g. --nm=/my_dir/nm)'] |
| 553 }; | 543 }; |
| 554 argsDispatch['--js'] = argsDispatch['-j']; | 544 this.argsDispatch_['--js'] = this.argsDispatch_['-j']; |
| 555 argsDispatch['--gc'] = argsDispatch['-g']; | 545 this.argsDispatch_['--gc'] = this.argsDispatch_['-g']; |
| 556 argsDispatch['--compiler'] = argsDispatch['-c']; | 546 this.argsDispatch_['--compiler'] = this.argsDispatch_['-c']; |
| 557 argsDispatch['--other'] = argsDispatch['-o']; | 547 this.argsDispatch_['--other'] = this.argsDispatch_['-o']; |
| 558 argsDispatch['--external'] = argsDispatch['-e']; | 548 this.argsDispatch_['--external'] = this.argsDispatch_['-e']; |
| 549 }; |
| 559 | 550 |
| 560 function printUsageAndExit() { | |
| 561 print('Cmdline args: [options] [log-file-name]\n' + | |
| 562 'Default log file name is "v8.log".\n'); | |
| 563 print('Options:'); | |
| 564 for (var arg in argsDispatch) { | |
| 565 var synonims = [arg]; | |
| 566 var dispatch = argsDispatch[arg]; | |
| 567 for (var synArg in argsDispatch) { | |
| 568 if (arg !== synArg && dispatch === argsDispatch[synArg]) { | |
| 569 synonims.push(synArg); | |
| 570 delete argsDispatch[synArg]; | |
| 571 } | |
| 572 } | |
| 573 print(' ' + padRight(synonims.join(', '), 20) + dispatch[2]); | |
| 574 } | |
| 575 quit(2); | |
| 576 } | |
| 577 | 551 |
| 578 while (args.length) { | 552 ArgumentsProcessor.DEFAULTS = { |
| 579 var arg = args[0]; | 553 logFileName: 'v8.log', |
| 554 platform: 'unix', |
| 555 stateFilter: null, |
| 556 ignoreUnknown: false, |
| 557 separateIc: false, |
| 558 nm: 'nm' |
| 559 }; |
| 560 |
| 561 |
| 562 ArgumentsProcessor.prototype.parse = function() { |
| 563 while (this.args_.length) { |
| 564 var arg = this.args_[0]; |
| 580 if (arg.charAt(0) != '-') { | 565 if (arg.charAt(0) != '-') { |
| 581 break; | 566 break; |
| 582 } | 567 } |
| 583 args.shift(); | 568 this.args_.shift(); |
| 584 var userValue = null; | 569 var userValue = null; |
| 585 var eqPos = arg.indexOf('='); | 570 var eqPos = arg.indexOf('='); |
| 586 if (eqPos != -1) { | 571 if (eqPos != -1) { |
| 587 userValue = arg.substr(eqPos + 1); | 572 userValue = arg.substr(eqPos + 1); |
| 588 arg = arg.substr(0, eqPos); | 573 arg = arg.substr(0, eqPos); |
| 589 } | 574 } |
| 590 if (arg in argsDispatch) { | 575 if (arg in this.argsDispatch_) { |
| 591 var dispatch = argsDispatch[arg]; | 576 var dispatch = this.argsDispatch_[arg]; |
| 592 result[dispatch[0]] = userValue == null ? dispatch[1] : userValue; | 577 this.result_[dispatch[0]] = userValue == null ? dispatch[1] : userValue; |
| 593 } else { | 578 } else { |
| 594 printUsageAndExit(); | 579 return false; |
| 595 } | 580 } |
| 596 } | 581 } |
| 597 | 582 |
| 598 if (args.length >= 1) { | 583 if (this.args_.length >= 1) { |
| 599 result.logFileName = args.shift(); | 584 this.result_.logFileName = this.args_.shift(); |
| 600 } | 585 } |
| 601 return result; | 586 return true; |
| 602 }; | 587 }; |
| 603 | 588 |
| 604 | 589 |
| 605 var params = processArguments(arguments); | 590 ArgumentsProcessor.prototype.result = function() { |
| 606 var tickProcessor = new TickProcessor( | 591 return this.result_; |
| 607 params.platform == 'unix' ? new UnixCppEntriesProvider(params.nm) : | 592 }; |
| 608 new WindowsCppEntriesProvider(), | 593 |
| 609 params.separateIc, | 594 |
| 610 params.ignoreUnknown, | 595 ArgumentsProcessor.prototype.printUsageAndExit = function() { |
| 611 params.stateFilter); | 596 |
| 612 tickProcessor.processLogFile(params.logFileName); | 597 function padRight(s, len) { |
| 613 tickProcessor.printStatistics(); | 598 s = s.toString(); |
| 599 if (s.length < len) { |
| 600 s = s + (new Array(len - s.length + 1).join(' ')); |
| 601 } |
| 602 return s; |
| 603 } |
| 604 |
| 605 print('Cmdline args: [options] [log-file-name]\n' + |
| 606 'Default log file name is "' + |
| 607 ArgumentsProcessor.DEFAULTS.logFileName + '".\n'); |
| 608 print('Options:'); |
| 609 for (var arg in this.argsDispatch_) { |
| 610 var synonims = [arg]; |
| 611 var dispatch = this.argsDispatch_[arg]; |
| 612 for (var synArg in this.argsDispatch_) { |
| 613 if (arg !== synArg && dispatch === this.argsDispatch_[synArg]) { |
| 614 synonims.push(synArg); |
| 615 delete this.argsDispatch_[synArg]; |
| 616 } |
| 617 } |
| 618 print(' ' + padRight(synonims.join(', '), 20) + dispatch[2]); |
| 619 } |
| 620 quit(2); |
| 621 }; |
| 622 |
| OLD | NEW |