Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

util: Fix inspection for sparse array

Fixes #1651.
  • Loading branch information...
commit a39c639c0601b26e502cb79c328436f2192fb18a 1 parent b86210f
@koichik authored
Showing with 36 additions and 4 deletions.
  1. +28 −4 lib/util.js
  2. +8 −0 test/simple/test-util-inspect.js
View
32 lib/util.js
@@ -207,7 +207,7 @@ function formatValue(ctx, value, recurseTimes) {
base = ' ' + value.toUTCString();
}
- if (keys.length === 0) {
+ if (keys.length === 0 && (!array || value.length == 0)) {
return braces[0] + base + braces[1];
}
@@ -221,9 +221,14 @@ function formatValue(ctx, value, recurseTimes) {
ctx.seen.push(value);
- var output = keys.map(function(key) {
- return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
- });
+ var output;
+ if (array) {
+ output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
+ } else {
+ output = keys.map(function(key) {
+ return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
+ });
+ }
ctx.seen.pop();
@@ -253,6 +258,25 @@ function formatPrimitive(ctx, value) {
}
}
+function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
+ var output = [];
+ for (var i = 0, l = value.length; i < l; ++i) {
+ if (Object.prototype.hasOwnProperty.call(value, String(i))) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ String(i), true));
+ } else {
+ output.push('');
+ }
+ }
+ keys.forEach(function(key) {
+ if (!key.match(/^\d+$/)) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ key, true));
+ }
+ });
+ return output;
+}
+
function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
var name, str;
if (value.__lookupGetter__) {
View
8 test/simple/test-util-inspect.js
@@ -33,3 +33,11 @@ var orig = util.inspect(d);
Date2.prototype.foo = 'bar';
var after = util.inspect(d);
assert.equal(orig, after);
+
+// test for sparse array
+var a = [ 'foo', 'bar', 'baz' ];
+assert.equal(util.inspect(a), "[ 'foo', 'bar', 'baz' ]");
+delete a[1];
+assert.equal(util.inspect(a), "[ 'foo', , 'baz' ]");
+assert.equal(util.inspect(a, true), "[ 'foo', , 'baz', [length]: 3 ]");
+assert.equal(util.inspect(new Array(5)), '[ , , , , ]');
Please sign in to comment.
Something went wrong with that request. Please try again.