Skip to content

Commit

Permalink
util: improve inspect's customInspect performance
Browse files Browse the repository at this point in the history
This improves the performance to copy user options that are then
passed through to the custom inspect function.

The performance improvement depends on the complexity of the custom
inspect function. For very basic cases this is 100% faster than
before.

PR-URL: #30659
Reviewed-By: James M Snell <[email protected]>
Reviewed-By: Michaël Zasso <[email protected]>
Reviewed-By: Anto Aravinth <[email protected]>
  • Loading branch information
BridgeAR authored and targos committed Jan 14, 2020
1 parent d4b41f6 commit 1fbd7ac
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 9 deletions.
23 changes: 16 additions & 7 deletions lib/internal/util/inspect.js
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,8 @@ const builtInObjects = new Set(
ObjectGetOwnPropertyNames(global).filter((e) => /^([A-Z][a-z]+)+$/.test(e))
);

// These options must stay in sync with `getUserOptions`. So if any option will
// be added or removed, `getUserOptions` must also be updated accordingly.
const inspectDefaultOptions = ObjectSeal({
showHidden: false,
depth: 2,
Expand Down Expand Up @@ -176,13 +178,20 @@ const meta = [
];

function getUserOptions(ctx) {
const obj = { stylize: ctx.stylize };
for (const key of ObjectKeys(inspectDefaultOptions)) {
obj[key] = ctx[key];
}
if (ctx.userOptions === undefined)
return obj;
return { ...obj, ...ctx.userOptions };
return {
stylize: ctx.stylize,
showHidden: ctx.showHidden,
depth: ctx.depth,
colors: ctx.colors,
customInspect: ctx.customInspect,
showProxy: ctx.showProxy,
maxArrayLength: ctx.maxArrayLength,
breakLength: ctx.breakLength,
compact: ctx.compact,
sorted: ctx.sorted,
getters: ctx.getters,
...ctx.userOptions
};
}

/**
Expand Down
9 changes: 7 additions & 2 deletions test/parallel/test-util-inspect.js
Original file line number Diff line number Diff line change
Expand Up @@ -883,6 +883,10 @@ util.inspect({ hasOwnProperty: null });
assert.strictEqual(opts.budget, undefined);
assert.strictEqual(opts.indentationLvl, undefined);
assert.strictEqual(opts.showHidden, false);
assert.deepStrictEqual(
new Set(Object.keys(util.inspect.defaultOptions).concat(['stylize'])),
new Set(Object.keys(opts))
);
opts.showHidden = true;
return { [util.inspect.custom]: common.mustCall((depth, opts2) => {
assert.deepStrictEqual(clone, opts2);
Expand All @@ -909,10 +913,11 @@ util.inspect({ hasOwnProperty: null });
}

{
const subject = { [util.inspect.custom]: common.mustCall((depth) => {
const subject = { [util.inspect.custom]: common.mustCall((depth, opts) => {
assert.strictEqual(depth, null);
assert.strictEqual(opts.compact, true);
}) };
util.inspect(subject, { depth: null });
util.inspect(subject, { depth: null, compact: true });
}

{
Expand Down

0 comments on commit 1fbd7ac

Please sign in to comment.