console: allow Object.prototype fields as labels
Console.prototype.timeEnd() returns NaN if the timer label corresponds to a property on Object.prototype. This commit uses a Map to construct the _times object. Fixes: https://github.com/joyent/node/issues/9069 PR-URL: https://github.com/iojs/io.js/pull/563 Reviewed-By: Vladimir Kurchatkin <vladimir.kurchatkin@gmail.com> Reviewed-By: Chris Dickinson <christopher.s.dickinson@gmail.com> Reviewed-By: Rod Vagg <rod@vagg.org>
This commit is contained in:
parent
87e62bd4c8
commit
3cbb5cdfdb
@ -21,7 +21,7 @@ function Console(stdout, stderr) {
|
|||||||
Object.defineProperty(this, '_stdout', prop);
|
Object.defineProperty(this, '_stdout', prop);
|
||||||
prop.value = stderr;
|
prop.value = stderr;
|
||||||
Object.defineProperty(this, '_stderr', prop);
|
Object.defineProperty(this, '_stderr', prop);
|
||||||
prop.value = {};
|
prop.value = new Map();
|
||||||
Object.defineProperty(this, '_times', prop);
|
Object.defineProperty(this, '_times', prop);
|
||||||
|
|
||||||
// bind the prototype functions to this Console instance
|
// bind the prototype functions to this Console instance
|
||||||
@ -56,12 +56,12 @@ Console.prototype.dir = function(object, options) {
|
|||||||
|
|
||||||
|
|
||||||
Console.prototype.time = function(label) {
|
Console.prototype.time = function(label) {
|
||||||
this._times[label] = Date.now();
|
this._times.set(label, Date.now());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
Console.prototype.timeEnd = function(label) {
|
Console.prototype.timeEnd = function(label) {
|
||||||
var time = this._times[label];
|
var time = this._times.get(label);
|
||||||
if (!time) {
|
if (!time) {
|
||||||
throw new Error('No such label: ' + label);
|
throw new Error('No such label: ' + label);
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,15 @@ assert.ok(process.stderr.writable);
|
|||||||
assert.equal('number', typeof process.stdout.fd);
|
assert.equal('number', typeof process.stdout.fd);
|
||||||
assert.equal('number', typeof process.stderr.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
|
// an Object with a custom .inspect() function
|
||||||
var custom_inspect = { foo: 'bar', inspect: function () { return 'inspect'; } };
|
var custom_inspect = { foo: 'bar', inspect: function () { return 'inspect'; } };
|
||||||
|
|
||||||
@ -33,6 +42,17 @@ console.dir({ foo : { bar : { baz : true } } }, { depth: 1 });
|
|||||||
// test console.trace()
|
// test console.trace()
|
||||||
console.trace('This is a %j %d', { formatted: 'trace' }, 10, 'foo');
|
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;
|
global.process.stdout.write = stdout_write;
|
||||||
|
|
||||||
@ -47,12 +67,8 @@ assert.notEqual(-1, strings.shift().indexOf('foo: [Object]'));
|
|||||||
assert.equal(-1, strings.shift().indexOf('baz'));
|
assert.equal(-1, strings.shift().indexOf('baz'));
|
||||||
assert.equal('Trace: This is a {"formatted":"trace"} 10 foo',
|
assert.equal('Trace: This is a {"formatted":"trace"} 10 foo',
|
||||||
strings.shift().split('\n').shift());
|
strings.shift().split('\n').shift());
|
||||||
|
assert.ok(/^label: \d+ms$/.test(strings.shift().trim()));
|
||||||
assert.throws(function () {
|
assert.ok(/^__proto__: \d+ms$/.test(strings.shift().trim()));
|
||||||
console.timeEnd('no such label');
|
assert.ok(/^constructor: \d+ms$/.test(strings.shift().trim()));
|
||||||
});
|
assert.ok(/^hasOwnProperty: \d+ms$/.test(strings.shift().trim()));
|
||||||
|
assert.equal(strings.length, 0);
|
||||||
assert.doesNotThrow(function () {
|
|
||||||
console.time('label');
|
|
||||||
console.timeEnd('label');
|
|
||||||
});
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user