From 68f6841ca19aa75469f88f949b38013beffbf60d Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Thu, 21 Nov 2019 15:12:58 +0100 Subject: [PATCH] util: improve inspect's customInspect performance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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: https://github.com/nodejs/node/pull/30659 Reviewed-By: James M Snell Reviewed-By: Michaƫl Zasso Reviewed-By: Anto Aravinth --- lib/internal/util/inspect.js | 23 ++++++++++++++++------- test/parallel/test-util-inspect.js | 9 +++++++-- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/lib/internal/util/inspect.js b/lib/internal/util/inspect.js index d4ac786401e57e..addc8b6e5b6682 100644 --- a/lib/internal/util/inspect.js +++ b/lib/internal/util/inspect.js @@ -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, @@ -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 + }; } /** diff --git a/test/parallel/test-util-inspect.js b/test/parallel/test-util-inspect.js index fac05f72e2eecc..3ddf77c457ea12 100644 --- a/test/parallel/test-util-inspect.js +++ b/test/parallel/test-util-inspect.js @@ -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); @@ -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 }); } {