63 lines
1.6 KiB
JavaScript
Raw Permalink Normal View History

// Copyright 2021 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.
import {Profile} from '../../profile.mjs'
import {LogEntry} from './log.mjs';
export class TickLogEntry extends LogEntry {
constructor(time, vmState, processedStack) {
super(TickLogEntry.extractType(vmState, processedStack), time);
/** @type {string} */
this.state = vmState;
/** @type {CodeEntry[]} */
this.stack = processedStack;
/** @type {number} */
this._endTime = time;
}
end(time) {
if (this.isInitialized) throw new Error('Invalid timer change');
this._endTime = time;
}
get isInitialized() {
return this._endTime !== this._time;
}
get startTime() {
return this._time;
}
get endTime() {
return this._endTime;
}
get duration() {
return this._endTime - this._time;
}
static extractType(vmState, processedStack) {
if (processedStack.length == 0 || vmState == Profile.VMState.IDLE) {
return 'Idle';
}
const topOfStack = processedStack[0];
if (typeof topOfStack === 'number' || typeof topOfStack === 'bigint') {
// TODO(cbruni): Handle VmStack and native ticks better.
return 'Other';
}
if (vmState != Profile.VMState.JS) {
topOfStack.vmState = vmState;
}
return this.extractCodeEntryType(topOfStack);
}
static extractCodeEntryType(entry) {
if (entry?.state !== undefined) {
return 'JS ' + Profile.getKindFromState(entry.state);
}
if (entry?.vmState) return Profile.vmStateString(entry.vmState);
return 'Other';
}
}