util: fix check for Array constructor
authorEvan Lucas <evanlucas@me.com>
Mon, 5 Oct 2015 21:29:27 +0000 (16:29 -0500)
committerJames M Snell <jasnell@gmail.com>
Thu, 8 Oct 2015 03:39:15 +0000 (20:39 -0700)
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>
lib/util.js
test/parallel/test-util-inspect.js

index 7b2bfd2..401a0ed 100644 (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;
index 58a4c8a..aa6c764 100644 (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: {