PR-URL: https://github.com/nodejs/node/pull/47251 Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com> Reviewed-By: Richard Lau <rlau@redhat.com>
63 lines
1.6 KiB
JavaScript
63 lines
1.6 KiB
JavaScript
// 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';
|
|
}
|
|
}
|