diff options
author | Ruben Bridgewater <ruben@bridgewater.de> | 2018-05-25 12:05:39 +0200 |
---|---|---|
committer | Ruben Bridgewater <ruben@bridgewater.de> | 2018-07-18 17:21:14 +0200 |
commit | 81bc23fe61994784de270d5fc01bc5315dfa62f3 (patch) | |
tree | 9779397ab7a26019bd44844d5cf11e023a00ea32 /lib | |
parent | caf2335a47db089a1e1b2c5a90d85cf644f6c355 (diff) | |
download | android-node-v8-81bc23fe61994784de270d5fc01bc5315dfa62f3.tar.gz android-node-v8-81bc23fe61994784de270d5fc01bc5315dfa62f3.tar.bz2 android-node-v8-81bc23fe61994784de270d5fc01bc5315dfa62f3.zip |
util: improve display of iterators and weak entries
This adds the number of not visible elements when inspecting iterators
while exceeding `maxArrayLength`.
It also fixes a edge case with `maxArrayLength` and the map.entries()
iterator. Now the whole entry will be visible instead of only the key
but not the value of the first entry.
Besides that it uses a slighly better algorithm that improves the
performance by skipping unnecessary steps.
PR-URL: https://github.com/nodejs/node/pull/20961
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/console.js | 9 | ||||
-rw-r--r-- | lib/util.js | 98 |
2 files changed, 60 insertions, 47 deletions
diff --git a/lib/console.js b/lib/console.js index 665a2a6a23..a5b2265f58 100644 --- a/lib/console.js +++ b/lib/console.js @@ -367,8 +367,11 @@ Console.prototype.table = function(tabularData, properties) { const mapIter = isMapIterator(tabularData); let isKeyValue = false; let i = 0; - if (mapIter) - [ tabularData, isKeyValue ] = previewEntries(tabularData); + if (mapIter) { + const res = previewEntries(tabularData, true); + tabularData = res[0]; + isKeyValue = res[1]; + } if (isKeyValue || isMap(tabularData)) { const keys = []; @@ -398,7 +401,7 @@ Console.prototype.table = function(tabularData, properties) { const setIter = isSetIterator(tabularData); if (setIter) - [ tabularData ] = previewEntries(tabularData); + tabularData = previewEntries(tabularData); const setlike = setIter || (mapIter && !isKeyValue) || isSet(tabularData); if (setlike) { diff --git a/lib/util.js b/lib/util.js index c56b8429f4..3c4fdbb128 100644 --- a/lib/util.js +++ b/lib/util.js @@ -118,6 +118,10 @@ const meta = [ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '\\\\' ]; +// Constants to map the iterator state. +const kWeak = 0; +const kIterator = 1; +const kMapEntries = 2; function addQuotes(str, quotes) { if (quotes === -1) { @@ -1017,77 +1021,83 @@ function formatMap(ctx, value, recurseTimes, keys) { return output; } -function formatWeakSet(ctx, value, recurseTimes, keys) { +function formatSetIterInner(ctx, value, recurseTimes, keys, entries, state) { const maxArrayLength = Math.max(ctx.maxArrayLength, 0); - const [ entries ] = previewEntries(value).slice(0, maxArrayLength + 1); const maxLength = Math.min(maxArrayLength, entries.length); let output = new Array(maxLength); for (var i = 0; i < maxLength; ++i) output[i] = formatValue(ctx, entries[i], recurseTimes); - // Sort all entries to have a halfway reliable output (if more entries than - // retrieved ones exist, we can not reliably return the same output). - output = output.sort(); - if (entries.length > maxArrayLength) - output.push('... more items'); + if (state === kWeak) { + // Sort all entries to have a halfway reliable output (if more entries than + // retrieved ones exist, we can not reliably return the same output). + output = output.sort(); + } + const remaining = entries.length - maxLength; + if (remaining > 0) { + output.push(`... ${remaining} more item${remaining > 1 ? 's' : ''}`); + } for (i = 0; i < keys.length; i++) output.push(formatProperty(ctx, value, recurseTimes, keys[i], 0)); return output; } -function formatWeakMap(ctx, value, recurseTimes, keys) { +function formatMapIterInner(ctx, value, recurseTimes, keys, entries, state) { const maxArrayLength = Math.max(ctx.maxArrayLength, 0); - const [ entries ] = previewEntries(value).slice(0, (maxArrayLength + 1) * 2); // Entries exist as [key1, val1, key2, val2, ...] - const remainder = entries.length / 2 > maxArrayLength; - const len = entries.length / 2 - (remainder ? 1 : 0); + const len = entries.length / 2; + const remaining = len - maxArrayLength; const maxLength = Math.min(maxArrayLength, len); let output = new Array(maxLength); - for (var i = 0; i < maxLength; i++) { + let start = ''; + let end = ''; + let middle = ' => '; + let i = 0; + if (state === kMapEntries) { + start = '[ '; + end = ' ]'; + middle = ', '; + } + for (; i < maxLength; i++) { const pos = i * 2; - output[i] = `${formatValue(ctx, entries[pos], recurseTimes)} => ` + - formatValue(ctx, entries[pos + 1], recurseTimes); + output[i] = `${start}${formatValue(ctx, entries[pos], recurseTimes)}` + + `${middle}${formatValue(ctx, entries[pos + 1], recurseTimes)}${end}`; + } + if (state === kWeak) { + // Sort all entries to have a halfway reliable output (if more entries + // than retrieved ones exist, we can not reliably return the same output). + output = output.sort(); + } + if (remaining > 0) { + output.push(`... ${remaining} more item${remaining > 1 ? 's' : ''}`); } - // Sort all entries to have a halfway reliable output (if more entries than - // retrieved ones exist, we can not reliably return the same output). - output = output.sort(); - if (remainder > 0) - output.push('... more items'); for (i = 0; i < keys.length; i++) output.push(formatProperty(ctx, value, recurseTimes, keys[i], 0)); return output; } -function zip2(list) { - const ret = Array(list.length / 2); - for (var i = 0; i < ret.length; ++i) - ret[i] = [list[2 * i], list[2 * i + 1]]; - return ret; +function formatWeakSet(ctx, value, recurseTimes, keys) { + const entries = previewEntries(value); + return formatSetIterInner(ctx, value, recurseTimes, keys, entries, kWeak); } -function formatCollectionIterator(ctx, value, recurseTimes, keys) { - const output = []; - var [ entries, isKeyValue ] = previewEntries(value); - if (isKeyValue) - entries = zip2(entries); - for (const entry of entries) { - if (ctx.maxArrayLength === output.length) { - output.push('... more items'); - break; - } - output.push(formatValue(ctx, entry, recurseTimes)); - } - for (var n = 0; n < keys.length; n++) { - output.push(formatProperty(ctx, value, recurseTimes, keys[n], 0)); - } - return output; +function formatWeakMap(ctx, value, recurseTimes, keys) { + const entries = previewEntries(value); + return formatMapIterInner(ctx, value, recurseTimes, keys, entries, kWeak); } -function formatMapIterator(ctx, value, recurseTimes, keys) { - return formatCollectionIterator(ctx, value, recurseTimes, keys); +function formatSetIterator(ctx, value, recurseTimes, keys) { + const entries = previewEntries(value); + return formatSetIterInner(ctx, value, recurseTimes, keys, entries, kIterator); } -function formatSetIterator(ctx, value, recurseTimes, keys) { - return formatCollectionIterator(ctx, value, recurseTimes, keys); +function formatMapIterator(ctx, value, recurseTimes, keys) { + const [entries, isKeyValue] = previewEntries(value, true); + if (isKeyValue) { + return formatMapIterInner( + ctx, value, recurseTimes, keys, entries, kMapEntries); + } + + return formatSetIterInner(ctx, value, recurseTimes, keys, entries, kIterator); } function formatPromise(ctx, value, recurseTimes, keys) { |