diff --git a/lib/util.js b/lib/util.js index ef4d52ca30dc5f..3e71c8c619b566 100644 --- a/lib/util.js +++ b/lib/util.js @@ -9,39 +9,48 @@ const isError = internalUtil.isError; var Debug; +function tryStringify(arg) { + try { + return JSON.stringify(arg); + } catch (_) { + return '[Circular]'; + } +} + const formatRegExp = /%[sdj%]/g; exports.format = function(f) { if (typeof f !== 'string') { - var objects = []; + const objects = new Array(arguments.length); for (var index = 0; index < arguments.length; index++) { - objects.push(inspect(arguments[index])); + objects[index] = inspect(arguments[index]); } return objects.join(' '); } if (arguments.length === 1) return f; - var i = 1; - var args = arguments; - var len = args.length; - var str = String(f).replace(formatRegExp, function(x) { + const len = arguments.length; + const args = new Array(len); + var i; + for (i = 0; i < len; i++) { + args[i] = arguments[i]; + } + + i = 1; + var str = f.replace(formatRegExp, function(x) { if (x === '%%') return '%'; if (i >= len) return x; switch (x) { case '%s': return String(args[i++]); case '%d': return Number(args[i++]); - case '%j': - try { - return JSON.stringify(args[i++]); - } catch (_) { - return '[Circular]'; - } + case '%j': return tryStringify(args[i++]); // falls through default: return x; } }); - for (var x = args[i]; i < len; x = args[++i]) { + while (i < len) { + const x = args[i++]; if (x === null || (typeof x !== 'object' && typeof x !== 'symbol')) { str += ' ' + x; } else {