 Chromium Code Reviews
 Chromium Code Reviews Issue 149195:
  Add automatic tests for Tick Processor.  (Closed)
    
  
    Issue 149195:
  Add automatic tests for Tick Processor.  (Closed) 
  | 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 493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 504 WindowsCppEntriesProvider.prototype.unmangleName = function(name) { | 504 WindowsCppEntriesProvider.prototype.unmangleName = function(name) { | 
| 505 // Empty or non-mangled name. | 505 // Empty or non-mangled name. | 
| 506 if (name.length < 1 || name.charAt(0) != '?') return name; | 506 if (name.length < 1 || name.charAt(0) != '?') return name; | 
| 507 var nameEndPos = name.indexOf('@@'); | 507 var nameEndPos = name.indexOf('@@'); | 
| 508 var components = name.substring(1, nameEndPos).split('@'); | 508 var components = name.substring(1, nameEndPos).split('@'); | 
| 509 components.reverse(); | 509 components.reverse(); | 
| 510 return components.join('::'); | 510 return components.join('::'); | 
| 511 }; | 511 }; | 
| 512 | 512 | 
| 513 | 513 | 
| 514 function padRight(s, len) { | 514 function ArgumentsProcessor(args) { | 
| 515 s = s.toString(); | 515 this.args_ = args; | 
| 516 if (s.length < len) { | 516 this.result_ = ArgumentsProcessor.DEFAULTS; | 
| 517 s = s + (new Array(len - s.length + 1).join(' ')); | |
| 518 } | |
| 519 return s; | |
| 520 }; | |
| 521 | 517 | 
| 522 | 518 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, | 519 '-j': ['stateFilter', TickProcessor.VmStates.JS, | 
| 534 'Show only ticks from JS VM state'], | 520 'Show only ticks from JS VM state'], | 
| 
Erik Corry
2009/07/07 11:15:32
It would be better if this was an object with keys
 
Mikhail Naganov
2009/07/07 12:08:10
The downside of using a map here is that the defin
 | |
| 535 '-g': ['stateFilter', TickProcessor.VmStates.GC, | 521 '-g': ['stateFilter', TickProcessor.VmStates.GC, | 
| 536 'Show only ticks from GC VM state'], | 522 'Show only ticks from GC VM state'], | 
| 537 '-c': ['stateFilter', TickProcessor.VmStates.COMPILER, | 523 '-c': ['stateFilter', TickProcessor.VmStates.COMPILER, | 
| 538 'Show only ticks from COMPILER VM state'], | 524 'Show only ticks from COMPILER VM state'], | 
| 539 '-o': ['stateFilter', TickProcessor.VmStates.OTHER, | 525 '-o': ['stateFilter', TickProcessor.VmStates.OTHER, | 
| 540 'Show only ticks from OTHER VM state'], | 526 'Show only ticks from OTHER VM state'], | 
| 541 '-e': ['stateFilter', TickProcessor.VmStates.EXTERNAL, | 527 '-e': ['stateFilter', TickProcessor.VmStates.EXTERNAL, | 
| 542 'Show only ticks from EXTERNAL VM state'], | 528 'Show only ticks from EXTERNAL VM state'], | 
| 543 '--ignore-unknown': ['ignoreUnknown', true, | 529 '--ignore-unknown': ['ignoreUnknown', true, | 
| 544 'Exclude ticks of unknown code entries from processing'], | 530 'Exclude ticks of unknown code entries from processing'], | 
| 545 '--separate-ic': ['separateIc', true, | 531 '--separate-ic': ['separateIc', true, | 
| 546 'Separate IC entries'], | 532 'Separate IC entries'], | 
| 547 '--unix': ['platform', 'unix', | 533 '--unix': ['platform', 'unix', | 
| 548 'Specify that we are running on *nix platform'], | 534 'Specify that we are running on *nix platform'], | 
| 549 '--windows': ['platform', 'windows', | 535 '--windows': ['platform', 'windows', | 
| 550 'Specify that we are running on Windows platform'], | 536 'Specify that we are running on Windows platform'], | 
| 551 '--nm': ['nm', 'nm', | 537 '--nm': ['nm', 'nm', | 
| 552 'Specify the \'nm\' executable to use (e.g. --nm=/my_dir/nm)'] | 538 'Specify the \'nm\' executable to use (e.g. --nm=/my_dir/nm)'] | 
| 553 }; | 539 }; | 
| 554 argsDispatch['--js'] = argsDispatch['-j']; | 540 this.argsDispatch_['--js'] = this.argsDispatch_['-j']; | 
| 555 argsDispatch['--gc'] = argsDispatch['-g']; | 541 this.argsDispatch_['--gc'] = this.argsDispatch_['-g']; | 
| 556 argsDispatch['--compiler'] = argsDispatch['-c']; | 542 this.argsDispatch_['--compiler'] = this.argsDispatch_['-c']; | 
| 557 argsDispatch['--other'] = argsDispatch['-o']; | 543 this.argsDispatch_['--other'] = this.argsDispatch_['-o']; | 
| 558 argsDispatch['--external'] = argsDispatch['-e']; | 544 this.argsDispatch_['--external'] = this.argsDispatch_['-e']; | 
| 545 }; | |
| 559 | 546 | 
| 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 | 547 | 
| 578 while (args.length) { | 548 ArgumentsProcessor.DEFAULTS = { | 
| 579 var arg = args[0]; | 549 logFileName: 'v8.log', | 
| 550 platform: 'unix', | |
| 551 stateFilter: null, | |
| 552 ignoreUnknown: false, | |
| 553 separateIc: false, | |
| 554 nm: 'nm' | |
| 555 }; | |
| 556 | |
| 557 | |
| 558 ArgumentsProcessor.prototype.parse = function() { | |
| 559 while (this.args_.length) { | |
| 560 var arg = this.args_[0]; | |
| 580 if (arg.charAt(0) != '-') { | 561 if (arg.charAt(0) != '-') { | 
| 581 break; | 562 break; | 
| 582 } | 563 } | 
| 583 args.shift(); | 564 this.args_.shift(); | 
| 584 var userValue = null; | 565 var userValue = null; | 
| 585 var eqPos = arg.indexOf('='); | 566 var eqPos = arg.indexOf('='); | 
| 586 if (eqPos != -1) { | 567 if (eqPos != -1) { | 
| 587 userValue = arg.substr(eqPos + 1); | 568 userValue = arg.substr(eqPos + 1); | 
| 588 arg = arg.substr(0, eqPos); | 569 arg = arg.substr(0, eqPos); | 
| 589 } | 570 } | 
| 590 if (arg in argsDispatch) { | 571 if (arg in this.argsDispatch_) { | 
| 591 var dispatch = argsDispatch[arg]; | 572 var dispatch = this.argsDispatch_[arg]; | 
| 592 result[dispatch[0]] = userValue == null ? dispatch[1] : userValue; | 573 this.result_[dispatch[0]] = userValue == null ? dispatch[1] : userValue; | 
| 593 } else { | 574 } else { | 
| 594 printUsageAndExit(); | 575 return false; | 
| 595 } | 576 } | 
| 596 } | 577 } | 
| 597 | 578 | 
| 598 if (args.length >= 1) { | 579 if (this.args_.length >= 1) { | 
| 599 result.logFileName = args.shift(); | 580 this.result_.logFileName = this.args_.shift(); | 
| 600 } | 581 } | 
| 601 return result; | 582 return true; | 
| 602 }; | 583 }; | 
| 603 | 584 | 
| 604 | 585 | 
| 605 var params = processArguments(arguments); | 586 ArgumentsProcessor.prototype.result = function() { | 
| 606 var tickProcessor = new TickProcessor( | 587 return this.result_; | 
| 607 params.platform == 'unix' ? new UnixCppEntriesProvider(params.nm) : | 588 }; | 
| 608 new WindowsCppEntriesProvider(), | 589 | 
| 609 params.separateIc, | 590 | 
| 610 params.ignoreUnknown, | 591 ArgumentsProcessor.prototype.printUsageAndExit = function() { | 
| 611 params.stateFilter); | 592 | 
| 612 tickProcessor.processLogFile(params.logFileName); | 593 function padRight(s, len) { | 
| 613 tickProcessor.printStatistics(); | 594 s = s.toString(); | 
| 595 if (s.length < len) { | |
| 596 s = s + (new Array(len - s.length + 1).join(' ')); | |
| 
Erik Corry
2009/07/07 11:15:32
I hope this part isn't performance critical in any
 
Mikhail Naganov
2009/07/07 12:08:10
No, this is just for printing an usage message.
B
 | |
| 597 } | |
| 598 return s; | |
| 599 } | |
| 600 | |
| 601 print('Cmdline args: [options] [log-file-name]\n' + | |
| 602 'Default log file name is "' + | |
| 603 ArgumentsProcessor.DEFAULTS.logFileName + '".\n'); | |
| 604 print('Options:'); | |
| 605 for (var arg in this.argsDispatch_) { | |
| 606 var synonims = [arg]; | |
| 607 var dispatch = this.argsDispatch_[arg]; | |
| 608 for (var synArg in this.argsDispatch_) { | |
| 609 if (arg !== synArg && dispatch === this.argsDispatch_[synArg]) { | |
| 610 synonims.push(synArg); | |
| 611 delete this.argsDispatch_[synArg]; | |
| 612 } | |
| 613 } | |
| 614 print(' ' + padRight(synonims.join(', '), 20) + dispatch[2]); | |
| 615 } | |
| 616 quit(2); | |
| 617 }; | |
| 618 | |
| OLD | NEW |