summaryrefslogtreecommitdiff
path: root/lib/internal/util/inspect.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/internal/util/inspect.js')
-rw-r--r--lib/internal/util/inspect.js57
1 files changed, 35 insertions, 22 deletions
diff --git a/lib/internal/util/inspect.js b/lib/internal/util/inspect.js
index 9677dfb226..d62727fa57 100644
--- a/lib/internal/util/inspect.js
+++ b/lib/internal/util/inspect.js
@@ -1572,6 +1572,31 @@ function reduceToSingleString(
return `${braces[0]}${ln}${join(output, `,\n${indentation} `)} ${braces[1]}`;
}
+function hasBuiltInToString(value) {
+ // Count objects that have no `toString` function as built-in.
+ if (typeof value.toString !== 'function') {
+ return true;
+ }
+
+ // The object has a own `toString` property. Thus it's not not a built-in one.
+ if (ObjectPrototypeHasOwnProperty(value, 'toString')) {
+ return false;
+ }
+
+ // Find the object that has the `toString` property as own property in the
+ // prototype chain.
+ let pointer = value;
+ do {
+ pointer = ObjectGetPrototypeOf(pointer);
+ } while (!ObjectPrototypeHasOwnProperty(pointer, 'toString'));
+
+ // Check closer if the object is a built-in.
+ const descriptor = ObjectGetOwnPropertyDescriptor(pointer, 'constructor');
+ return descriptor !== undefined &&
+ typeof descriptor.value === 'function' &&
+ builtInObjects.has(descriptor.value.name);
+}
+
const firstErrorLine = (error) => error.message.split('\n')[0];
let CIRCULAR_ERROR_MESSAGE;
function tryStringify(arg) {
@@ -1630,29 +1655,17 @@ function formatWithOptionsInternal(inspectOptions, ...args) {
tempStr = formatNumber(stylizeNoColor, tempArg);
} else if (typeof tempArg === 'bigint') {
tempStr = `${tempArg}n`;
+ } else if (typeof tempArg !== 'object' ||
+ tempArg === null ||
+ !hasBuiltInToString(tempArg)) {
+ tempStr = String(tempArg);
} else {
- let constr;
- if (typeof tempArg !== 'object' ||
- tempArg === null ||
- (typeof tempArg.toString === 'function' &&
- // A direct own property.
- (ObjectPrototypeHasOwnProperty(tempArg, 'toString') ||
- // A direct own property on the constructor prototype in
- // case the constructor is not an built-in object.
- ((constr = tempArg.constructor) &&
- !builtInObjects.has(constr.name) &&
- constr.prototype &&
- ObjectPrototypeHasOwnProperty(constr.prototype,
- 'toString'))))) {
- tempStr = String(tempArg);
- } else {
- tempStr = inspect(tempArg, {
- ...inspectOptions,
- compact: 3,
- colors: false,
- depth: 0
- });
- }
+ tempStr = inspect(tempArg, {
+ ...inspectOptions,
+ compact: 3,
+ colors: false,
+ depth: 0
+ });
}
break;
case 106: // 'j'