util: fix check for Array constructor

In the event an Array is created in a Debug context, the constructor
will be Array, but !== Array. This adds a check
constructor.name === 'Array' to handle edge cases like that.

PR-URL: https://github.com/nodejs/node/pull/3119
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
This commit is contained in:
Evan Lucas 2015-10-05 16:29:27 -05:00
parent 77a10ed05f
commit 089d688617
2 changed files with 17 additions and 1 deletions

View File

@ -292,7 +292,10 @@ function formatValue(ctx, value, recurseTimes) {
var base = '', empty = false, braces, formatter;
if (Array.isArray(value)) {
if (constructor === Array)
// We can't use `constructor === Array` because this could
// have come from a Debug context.
// Otherwise, an Array will print "Array [...]".
if (constructor && constructor.name === 'Array')
constructor = null;
braces = ['[', ']'];
empty = value.length === 0;

View File

@ -23,6 +23,19 @@ assert.equal(util.inspect(a), '[ \'foo\', , \'baz\' ]');
assert.equal(util.inspect(a, true), '[ \'foo\', , \'baz\', [length]: 3 ]');
assert.equal(util.inspect(new Array(5)), '[ , , , , ]');
// test for Array constructor in different context
const Debug = require('vm').runInDebugContext('Debug');
var map = new Map();
map.set(1, 2);
var mirror = Debug.MakeMirror(map.entries(), true);
var vals = mirror.preview();
var valsOutput = [];
for (let o of vals) {
valsOutput.push(o);
}
assert.strictEqual(util.inspect(valsOutput), '[ [ 1, 2 ] ]');
// test for property descriptors
var getter = Object.create(null, {
a: {