| Index: webkit/glue/devtools/js/profiler_processor.js
|
| ===================================================================
|
| --- webkit/glue/devtools/js/profiler_processor.js (revision 17069)
|
| +++ webkit/glue/devtools/js/profiler_processor.js (working copy)
|
| @@ -36,14 +36,28 @@
|
|
|
| /**
|
| * Profiler processor. Consumes profiler log and builds profile views.
|
| + *
|
| + * @param {function(devtools.profiler.ProfileView)} newProfileCallback Callback
|
| + * that receives a new processed profile.
|
| * @constructor
|
| */
|
| -devtools.profiler.Processor = function() {
|
| +devtools.profiler.Processor = function(newProfileCallback) {
|
| /**
|
| - * Current profile.
|
| + *
|
| + */
|
| + this.newProfileCallback_ = newProfileCallback;
|
| +
|
| + /**
|
| + * Profiles array.
|
| + * @type {Array<devtools.profiler.JsProfile>}
|
| + */
|
| + this.profiles_ = [];
|
| +
|
| + /**
|
| + * The current profile.
|
| * @type {devtools.profiler.JsProfile}
|
| */
|
| - this.profile_ = new devtools.profiler.JsProfile();
|
| + this.currentProfile_ = null;
|
|
|
| /**
|
| * Builder of profile views.
|
| @@ -65,14 +79,16 @@
|
| */
|
| devtools.profiler.Processor.RecordsDispatch_ = {
|
| 'code-creation': { parsers: [null, parseInt, parseInt, null],
|
| - processor: 'processCodeCreation_' },
|
| + processor: 'processCodeCreation_', needsProfile: true },
|
| 'code-move': { parsers: [parseInt, parseInt],
|
| - processor: 'processCodeMove_' },
|
| - 'code-delete': { parsers: [parseInt], processor: 'processCodeDelete_' },
|
| + processor: 'processCodeMove_', needsProfile: true },
|
| + 'code-delete': { parsers: [parseInt],
|
| + processor: 'processCodeDelete_', needsProfile: true },
|
| 'tick': { parsers: [parseInt, parseInt, parseInt, 'var-args'],
|
| - processor: 'processTick_' },
|
| + processor: 'processTick_', needsProfile: true },
|
| + 'profiler': { parsers: [null], processor: 'processProfiler_',
|
| + needsProfile: false },
|
| // Not used in DevTools Profiler.
|
| - 'profiler': null,
|
| 'shared-library': null,
|
| // Obsolete row types.
|
| 'code-allocate': null,
|
| @@ -129,7 +145,8 @@
|
| }
|
| var dispatch = devtools.profiler.Processor.RecordsDispatch_[command];
|
|
|
| - if (dispatch === null) {
|
| + if (dispatch === null ||
|
| + (dispatch.needsProfile && this.currentProfile_ == null)) {
|
| return;
|
| }
|
|
|
| @@ -153,19 +170,40 @@
|
| };
|
|
|
|
|
| +devtools.profiler.Processor.prototype.processProfiler_ = function(state) {
|
| + switch (state) {
|
| + case "resume":
|
| + this.currentProfile_ = new devtools.profiler.JsProfile();
|
| + this.profiles_.push(this.currentProfile_);
|
| + break;
|
| + case "pause":
|
| + if (this.currentProfile_ != null) {
|
| + this.newProfileCallback_(this.createProfileForView());
|
| + this.currentProfile_ = null;
|
| + }
|
| + break;
|
| + // These events are valid but are not used.
|
| + case "begin": break;
|
| + case "end": break;
|
| + default:
|
| + throw new Error("unknown profiler state: " + state);
|
| + }
|
| +};
|
| +
|
| +
|
| devtools.profiler.Processor.prototype.processCodeCreation_ = function(
|
| type, start, size, name) {
|
| - this.profile_.addCode(type, name, start, size);
|
| + this.currentProfile_.addCode(type, name, start, size);
|
| };
|
|
|
|
|
| devtools.profiler.Processor.prototype.processCodeMove_ = function(from, to) {
|
| - this.profile_.moveCode(from, to);
|
| + this.currentProfile_.moveCode(from, to);
|
| };
|
|
|
|
|
| devtools.profiler.Processor.prototype.processCodeDelete_ = function(start) {
|
| - this.profile_.deleteCode(start);
|
| + this.currentProfile_.deleteCode(start);
|
| };
|
|
|
|
|
| @@ -179,7 +217,7 @@
|
| fullStack.push(parseInt(frame, 16));
|
| }
|
| }
|
| - this.profile_.recordTick(fullStack);
|
| + this.currentProfile_.recordTick(fullStack);
|
| };
|
|
|
|
|
| @@ -194,8 +232,8 @@
|
| // ProfileView.topDownProfileDataGridTree behavior.
|
| profile.head = profile;
|
| profile.heavyProfile = this.viewBuilder_.buildView(
|
| - this.profile_.getBottomUpProfile(), true);
|
| + this.currentProfile_.getBottomUpProfile(), true);
|
| profile.treeProfile = this.viewBuilder_.buildView(
|
| - this.profile_.getTopDownProfile());
|
| + this.currentProfile_.getTopDownProfile());
|
| return profile;
|
| };
|
|
|