v8/tools/system-analyzer/app-model.mjs
Camillo Bruni 4a0921704a [tools][system-analyzer] Display timer events
Add common TimelineTrackStackedBase base class for TimelineTrackTick
and TimelineTrackTimer for visualising stacked time ranges that only
need rescaling when zooming in.

Additional changes:
- Highlight matching registers in disassembly
- Simplify CodeLogEntry summary for script code
- Show event for array items in the property-link-table


Bug: v8:10644
Change-Id: I0b37274e12ba55f1c6251b90d39d996ffae7f37e
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2992716
Reviewed-by: Victor Gomes <victorgomes@chromium.org>
Commit-Queue: Camillo Bruni <cbruni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#75437}
2021-06-29 11:43:02 +00:00

167 lines
3.9 KiB
JavaScript

// Copyright 2020 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
class State {
_timeSelection = {start: 0, end: Infinity};
_map;
_ic;
_selectedMapLogEntries;
_selectedIcLogEntries;
_selectedDeoptLogEntries;
_selecteCodeLogEntries;
_selectedSourcePositions;
_nofChunks;
_chunks;
_icTimeline;
_mapTimeline;
_deoptTimeline;
_codeTimeline;
_apiTimeline;
_tickTimeline;
_timerTimeline;
_minStartTime = Number.POSITIVE_INFINITY;
_maxEndTime = Number.NEGATIVE_INFINITY;
get minStartTime() {
return this._minStartTime;
}
get maxEndTime() {
return this._maxEndTime;
}
selectTimeRange(start, end) {
this.timeSelection.start = start;
this.timeSelection.end = end;
if (start == 0 && end == Infinity) {
this.timelines.forEach(each => each.clearSelection());
} else {
this.timelines.forEach(each => each.selectTimeRange(start, end));
}
}
setTimelines(
mapTimeline, icTimeline, deoptTimeline, codeTimeline, apiTimeline,
tickTimeline, timerTimeline) {
this._mapTimeline = mapTimeline;
this._icTimeline = icTimeline;
this._deoptTimeline = deoptTimeline;
this._codeTimeline = codeTimeline;
this._apiTimeline = apiTimeline;
this._tickTimeline = tickTimeline;
this._timerTimeline = timerTimeline;
for (let timeline of arguments) {
if (timeline === undefined) return;
this._minStartTime = Math.min(this._minStartTime, timeline.startTime);
this._maxEndTime = Math.max(this._maxEndTime, timeline.endTime);
}
for (let timeline of arguments) {
timeline.startTime = this._minStartTime;
timeline.endTime = this._maxEndTime;
}
}
get mapTimeline() {
return this._mapTimeline;
}
get icTimeline() {
return this._icTimeline;
}
get deoptTimeline() {
return this._deoptTimeline;
}
get codeTimeline() {
return this._codeTimeline;
}
get apiTimeline() {
return this._apiTimeline;
}
get tickTimeline() {
return this._tickTimeline;
}
get timerTimeline() {
return this._timerTimeline;
}
get timelines() {
return [
this._mapTimeline, this._icTimeline, this._deoptTimeline,
this._codeTimeline, this._apiTimeline, this._tickTimeline,
this._timerTimeline
];
}
set chunks(value) {
// TODO(zcankara) split up between maps and ics, and every timeline track
this._chunks = value;
}
get chunks() {
// TODO(zcankara) split up between maps and ics, and every timeline track
return this._chunks;
}
get nofChunks() {
return this._nofChunks;
}
set nofChunks(count) {
this._nofChunks = count;
}
get map() {
// TODO(zcankara) rename as selectedMapEvents, array of selected events
return this._map;
}
set map(value) {
// TODO(zcankara) rename as selectedMapEvents, array of selected events
if (!value) return;
this._map = value;
}
get ic() {
// TODO(zcankara) rename selectedICEvents, array of selected events
return this._ic;
}
set ic(value) {
// TODO(zcankara) rename selectedIcEvents, array of selected events
if (!value) return;
this._ic = value;
}
get selectedMapLogEntries() {
return this._selectedMapLogEntries;
}
set selectedMapLogEntries(value) {
if (!value) return;
this._selectedMapLogEntries = value;
}
get selectedSourcePositions() {
return this._selectedSourcePositions;
}
set selectedSourcePositions(value) {
this._selectedSourcePositions = value;
}
get selectedIcLogEntries() {
return this._selectedIcLogEntries;
}
set selectedIcLogEntries(value) {
if (!value) return;
this._selectedIcLogEntries = value;
}
get timeSelection() {
return this._timeSelection;
}
get entries() {
if (!this.map) return {};
return {
map: this.map.id, time: this.map.time
}
}
}
export {State};