Skip to content

Commit

Permalink
console: allow Object.prototype fields as labels
Browse files Browse the repository at this point in the history
Console.prototype.timeEnd() returns NaN if the timer label
corresponds to a property on Object.prototype. This commit
uses Object.create(null) to construct the _times object.

Fixes: nodejs/node-v0.x-archive#9069
PR-URL: nodejs/node-v0.x-archive#9116
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
  • Loading branch information
cjihrig committed Feb 13, 2015
1 parent b8604fa commit 6c3647c
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 10 deletions.
2 changes: 1 addition & 1 deletion lib/console.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ function Console(stdout, stderr) {
Object.defineProperty(this, '_stdout', prop);
prop.value = stderr;
Object.defineProperty(this, '_stderr', prop);
prop.value = {};
prop.value = Object.create(null);
Object.defineProperty(this, '_times', prop);

// bind the prototype functions to this Console instance
Expand Down
34 changes: 25 additions & 9 deletions test/simple/test-console.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,15 @@ assert.ok(process.stderr.writable);
assert.equal('number', typeof process.stdout.fd);
assert.equal('number', typeof process.stderr.fd);

assert.throws(function () {
console.timeEnd('no such label');
});

assert.doesNotThrow(function () {
console.time('label');
console.timeEnd('label');
});

// an Object with a custom .inspect() function
var custom_inspect = { foo: 'bar', inspect: function () { return 'inspect'; } };

Expand All @@ -57,6 +66,17 @@ console.dir({ foo : { bar : { baz : true } } }, { depth: 1 });
// test console.trace()
console.trace('This is a %j %d', { formatted: 'trace' }, 10, 'foo');

// test console.time() and console.timeEnd() output
console.time('label');
console.timeEnd('label');

// verify that Object.prototype properties can be used as labels
console.time('__proto__');
console.timeEnd('__proto__');
console.time('constructor');
console.timeEnd('constructor');
console.time('hasOwnProperty');
console.timeEnd('hasOwnProperty');

global.process.stdout.write = stdout_write;

Expand All @@ -71,12 +91,8 @@ assert.notEqual(-1, strings.shift().indexOf('foo: [Object]'));
assert.equal(-1, strings.shift().indexOf('baz'));
assert.equal('Trace: This is a {"formatted":"trace"} 10 foo',
strings.shift().split('\n').shift());

assert.throws(function () {
console.timeEnd('no such label');
});

assert.doesNotThrow(function () {
console.time('label');
console.timeEnd('label');
});
assert.ok(/^label: \d+ms$/.test(strings.shift().trim()));
assert.ok(/^__proto__: \d+ms$/.test(strings.shift().trim()));
assert.ok(/^constructor: \d+ms$/.test(strings.shift().trim()));
assert.ok(/^hasOwnProperty: \d+ms$/.test(strings.shift().trim()));
assert.equal(strings.length, 0);

0 comments on commit 6c3647c

Please sign in to comment.