summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRuben Bridgewater <ruben@bridgewater.de>2018-05-25 12:05:39 +0200
committerRuben Bridgewater <ruben@bridgewater.de>2018-07-18 17:21:14 +0200
commit81bc23fe61994784de270d5fc01bc5315dfa62f3 (patch)
tree9779397ab7a26019bd44844d5cf11e023a00ea32 /lib
parentcaf2335a47db089a1e1b2c5a90d85cf644f6c355 (diff)
downloadandroid-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.js9
-rw-r--r--lib/util.js98
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) {