diff --git a/lib/internal/util/inspect.js b/lib/internal/util/inspect.js index 2b321002c2bee9..7ad94600b7b771 100644 --- a/lib/internal/util/inspect.js +++ b/lib/internal/util/inspect.js @@ -351,7 +351,7 @@ function getEmptyFormatArray() { return []; } -function getConstructorName(obj, ctx) { +function getConstructorName(obj, ctx, recurseTimes) { let firstProto; const tmp = obj; while (obj) { @@ -372,10 +372,23 @@ function getConstructorName(obj, ctx) { return null; } - return `${internalGetConstructorName(tmp)} <${inspect(firstProto, { - ...ctx, - customInspect: false - })}>`; + const res = internalGetConstructorName(tmp); + + if (recurseTimes > ctx.depth && ctx.depth !== null) { + return `${res} `; + } + + const protoConstr = getConstructorName(firstProto, ctx, recurseTimes + 1); + + if (protoConstr === null) { + return `${res} <${inspect(firstProto, { + ...ctx, + customInspect: false, + depth: -1 + })}>`; + } + + return `${res} <${protoConstr}>`; } function getPrefix(constructor, tag, fallback) { @@ -570,7 +583,7 @@ function formatValue(ctx, value, recurseTimes, typedArray) { function formatRaw(ctx, value, recurseTimes, typedArray) { let keys; - const constructor = getConstructorName(value, ctx); + const constructor = getConstructorName(value, ctx, recurseTimes); let tag = value[Symbol.toStringTag]; // Only list the tag in case it's non-enumerable / not an own property. // Otherwise we'd print this twice. diff --git a/test/parallel/test-util-inspect.js b/test/parallel/test-util-inspect.js index 4cb8224c541f45..27179cf51cb1a7 100644 --- a/test/parallel/test-util-inspect.js +++ b/test/parallel/test-util-inspect.js @@ -2092,6 +2092,21 @@ assert.strictEqual( inspect(obj), "Array <[Object: null prototype] {}> { '0': 1, '1': 2, '2': 3 }" ); + + StorageObject.prototype = Object.create(null); + Object.setPrototypeOf(StorageObject.prototype, Object.create(null)); + Object.setPrototypeOf( + Object.getPrototypeOf(StorageObject.prototype), + Object.create(null) + ); + assert.strictEqual( + util.inspect(new StorageObject()), + 'StorageObject >> {}' + ); + assert.strictEqual( + util.inspect(new StorageObject(), { depth: 1 }), + 'StorageObject >> {}' + ); } // Check that the fallback always works.