Skip to content

Commit

Permalink
perf_hooks: load internal/errors eagerly
Browse files Browse the repository at this point in the history
Since `internal/errors` is loaded by many builtin modules and is
currently the first module loaded during bootstrap, it is
fine to load it eagerly. We just need to make sure
that `internal/errors` itself load other modules lazily.

PR-URL: nodejs#26771
Reviewed-By: Yongsheng Zhang <[email protected]>
Reviewed-By: Ruben Bridgewater <[email protected]>
  • Loading branch information
joyeecheung authored and targos committed Mar 27, 2019
1 parent 8c30c09 commit 3ec0196
Showing 1 changed file with 22 additions and 30 deletions.
52 changes: 22 additions & 30 deletions lib/perf_hooks.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,15 @@ const L = require('internal/linkedlist');
const kInspect = require('internal/util').customInspectSymbol;
const { inherits } = require('util');

const {
ERR_INVALID_CALLBACK,
ERR_INVALID_ARG_VALUE,
ERR_INVALID_ARG_TYPE,
ERR_INVALID_OPT_VALUE,
ERR_VALID_PERFORMANCE_ENTRY_TYPE,
ERR_INVALID_PERFORMANCE_MARK
} = require('internal/errors').codes;

const kHandle = Symbol('handle');
const kMap = Symbol('map');
const kCallback = Symbol('callback');
Expand Down Expand Up @@ -126,14 +135,6 @@ function collectHttp2Stats(entry) {
}
}


let errors;
function lazyErrors() {
if (errors === undefined)
errors = require('internal/errors').codes;
return errors;
}

function now() {
const hr = process.hrtime();
return hr[0] * 1000 + hr[1] / 1e6;
Expand Down Expand Up @@ -284,8 +285,7 @@ let gcTrackingIsEnabled = false;
class PerformanceObserver extends AsyncResource {
constructor(callback) {
if (typeof callback !== 'function') {
const errors = lazyErrors();
throw new errors.ERR_INVALID_CALLBACK();
throw new ERR_INVALID_CALLBACK();
}
super('PerformanceObserver');
Object.defineProperties(this, {
Expand Down Expand Up @@ -331,16 +331,15 @@ class PerformanceObserver extends AsyncResource {
}

observe(options) {
const errors = lazyErrors();
if (typeof options !== 'object' || options == null) {
throw new errors.ERR_INVALID_ARG_TYPE('options', 'Object', options);
throw new ERR_INVALID_ARG_TYPE('options', 'Object', options);
}
if (!Array.isArray(options.entryTypes)) {
throw new errors.ERR_INVALID_OPT_VALUE('entryTypes', options);
throw new ERR_INVALID_OPT_VALUE('entryTypes', options);
}
const entryTypes = options.entryTypes.filter(filterTypes).map(mapTypes);
if (entryTypes.length === 0) {
throw new errors.ERR_VALID_PERFORMANCE_ENTRY_TYPE();
throw new ERR_VALID_PERFORMANCE_ENTRY_TYPE();
}
if (entryTypes.includes(NODE_PERFORMANCE_ENTRY_TYPE_GC) &&
!gcTrackingIsEnabled) {
Expand Down Expand Up @@ -393,8 +392,7 @@ class Performance {
startMark = startMark !== undefined ? `${startMark}` : '';
const marks = this[kIndex][kMarks];
if (!marks.has(endMark) && !(endMark in nodeTiming)) {
const errors = lazyErrors();
throw new errors.ERR_INVALID_PERFORMANCE_MARK(endMark);
throw new ERR_INVALID_PERFORMANCE_MARK(endMark);
}
_measure(name, startMark, endMark);
}
Expand All @@ -412,8 +410,7 @@ class Performance {

timerify(fn) {
if (typeof fn !== 'function') {
const errors = lazyErrors();
throw new errors.ERR_INVALID_ARG_TYPE('fn', 'Function', fn);
throw new ERR_INVALID_ARG_TYPE('fn', 'Function', fn);
}
if (fn[kTimerified])
return fn[kTimerified];
Expand Down Expand Up @@ -567,13 +564,11 @@ class ELDHistogram {
get stddev() { return this[kHandle].stddev(); }
percentile(percentile) {
if (typeof percentile !== 'number') {
const errors = lazyErrors();
throw new errors.ERR_INVALID_ARG_TYPE('percentile', 'number', percentile);
throw new ERR_INVALID_ARG_TYPE('percentile', 'number', percentile);
}
if (percentile <= 0 || percentile > 100) {
const errors = lazyErrors();
throw new errors.ERR_INVALID_ARG_VALUE.RangeError('percentile',
percentile);
throw new ERR_INVALID_ARG_VALUE.RangeError('percentile',
percentile);
}
return this[kHandle].percentile(percentile);
}
Expand All @@ -597,18 +592,15 @@ class ELDHistogram {

function monitorEventLoopDelay(options = {}) {
if (typeof options !== 'object' || options === null) {
const errors = lazyErrors();
throw new errors.ERR_INVALID_ARG_TYPE('options', 'Object', options);
throw new ERR_INVALID_ARG_TYPE('options', 'Object', options);
}
const { resolution = 10 } = options;
if (typeof resolution !== 'number') {
const errors = lazyErrors();
throw new errors.ERR_INVALID_ARG_TYPE('options.resolution',
'number', resolution);
throw new ERR_INVALID_ARG_TYPE('options.resolution',
'number', resolution);
}
if (resolution <= 0 || !Number.isSafeInteger(resolution)) {
const errors = lazyErrors();
throw new errors.ERR_INVALID_OPT_VALUE.RangeError('resolution', resolution);
throw new ERR_INVALID_OPT_VALUE.RangeError('resolution', resolution);
}
return new ELDHistogram(new _ELDHistogram(resolution));
}
Expand Down

0 comments on commit 3ec0196

Please sign in to comment.