Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

util: improve format performance #24981

Closed
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 40 additions & 45 deletions lib/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -78,45 +78,32 @@ function format(...args) {
return formatWithOptions(emptyOptions, ...args);
}

function formatValue(val, inspectOptions) {
const inspectTypes = ['object', 'symbol', 'function', 'number'];

if (inspectTypes.includes(typeof val)) {
return inspect(val, inspectOptions);
} else {
return String(val);
}
}

function formatWithOptions(inspectOptions, ...args) {
const first = args[0];
const parts = [];
let a = 0;
let str = '';
let join = '';

const firstIsString = typeof first === 'string';

if (firstIsString && args.length === 1) {
return first;
}

if (firstIsString && /%[sjdOoif%]/.test(first)) {
let i, tempStr;
let str = '';
let a = 1;
if (typeof first === 'string') {
if (args.length === 1) {
return first;
}
let tempStr;
let lastPos = 0;

for (i = 0; i < first.length - 1; i++) {
for (var i = 0; i < first.length - 1; i++) {
if (first.charCodeAt(i) === 37) { // '%'
const nextChar = first.charCodeAt(++i);
if (a !== args.length) {
if (a + 1 !== args.length) {
switch (nextChar) {
case 115: // 's'
tempStr = String(args[a++]);
tempStr = String(args[++a]);
break;
case 106: // 'j'
tempStr = tryStringify(args[a++]);
tempStr = tryStringify(args[++a]);
break;
case 100: // 'd'
const tempNum = args[a++];
const tempNum = args[++a];
// eslint-disable-next-line valid-typeof
if (typeof tempNum === 'bigint') {
tempStr = `${tempNum}n`;
Expand All @@ -127,20 +114,20 @@ function formatWithOptions(inspectOptions, ...args) {
}
break;
case 79: // 'O'
tempStr = inspect(args[a++], inspectOptions);
tempStr = inspect(args[++a], inspectOptions);
break;
case 111: // 'o'
{
const opts = Object.assign({}, inspectOptions, {
tempStr = inspect(args[++a], {
...inspectOptions,
showHidden: true,
showProxy: true,
depth: 4
});
tempStr = inspect(args[a++], opts);
break;
}
case 105: // 'i'
const tempInteger = args[a++];
const tempInteger = args[++a];
// eslint-disable-next-line valid-typeof
if (typeof tempInteger === 'bigint') {
tempStr = `${tempInteger}n`;
Expand All @@ -151,7 +138,7 @@ function formatWithOptions(inspectOptions, ...args) {
}
break;
case 102: // 'f'
const tempFloat = args[a++];
const tempFloat = args[++a];
if (typeof tempFloat === 'symbol') {
tempStr = 'NaN';
} else {
Expand All @@ -176,24 +163,32 @@ function formatWithOptions(inspectOptions, ...args) {
}
}
}
if (lastPos === 0) {
str = first;
} else if (lastPos < first.length) {
str += first.slice(lastPos);
}

parts.push(str);
while (a < args.length) {
parts.push(formatValue(args[a], inspectOptions));
if (lastPos !== 0) {
a++;
}
} else {
for (const arg of args) {
parts.push(formatValue(arg, inspectOptions));
join = ' ';
if (lastPos < first.length) {
str += first.slice(lastPos);
}
}
}

return parts.join(' ');
while (a < args.length) {
const value = args[a];
// TODO(BridgeAR): This should apply for all besides strings. Especially
// BigInt should be properly inspected.
str += join;
if (typeof value !== 'string' &&
typeof value !== 'boolean' &&
// eslint-disable-next-line valid-typeof
typeof value !== 'bigint') {
str += inspect(value, inspectOptions);
} else {
str += value;
}
join = ' ';
a++;
}
return str;
}

const debugs = {};
Expand Down