Optimize for few args in EventEmitter.emit

pull/22966/head
Ryan Dahl 2010-04-22 17:31:35 -07:00
parent 6abdf051d3
commit 0633e5cac9
1 changed files with 15 additions and 6 deletions

View File

@ -2,9 +2,10 @@ exports.EventEmitter = process.EventEmitter;
process.EventEmitter.prototype.emit = function (type) {
if (type == 'error') {
// If there is no 'error' event listener then throw.
if (type === 'error') {
if (!this._events || !this._events.error ||
(this._events.error instanceof Array && !this._events.error.length))
(this._events.error instanceof Array && !this._events.error.length))
{
if (arguments[1] instanceof Error) {
throw arguments[1];
@ -19,15 +20,23 @@ process.EventEmitter.prototype.emit = function (type) {
if (!this._events[type]) return false;
if (typeof this._events[type] == 'function') {
var args = Array.prototype.slice.call(arguments, 1);
this._events[type].apply(this, args);
if (arguments.length < 3) {
// fast case
this._events[type].call( this
, arguments[1]
, arguments[2]
);
} else {
// slower
var args = Array.prototype.slice.call(arguments, 1);
this._events[type].apply(this, args);
}
return true;
} else if (this._events[type] instanceof Array) {
var args = Array.prototype.slice.call(arguments, 1);
var listeners = this._events[type].slice(0);
for (var i = 0, l = listeners.length; i < l; i++) {
listeners[i].apply(this, args);