diff options
author | Ben Noordhuis <info@bnoordhuis.nl> | 2013-08-01 14:35:13 +0200 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2013-08-01 14:52:06 +0200 |
commit | fc6f8a69438d45640d4d0a76633b57965c1f843a (patch) | |
tree | 4f8bec21c1b7af2226d84cd770aeb01e606451aa /lib/events.js | |
parent | 3398cce1934004e4d60c7d7605fa7548582c362f (diff) | |
download | nodejs-fc6f8a69438d45640d4d0a76633b57965c1f843a.tar.gz nodejs-fc6f8a69438d45640d4d0a76633b57965c1f843a.tar.bz2 nodejs-fc6f8a69438d45640d4d0a76633b57965c1f843a.zip |
events: fix memory leak, don't leak event names
Before this commit, events were set to undefined rather than deleted
from the EventEmitter's backing dictionary for performance reasons:
`delete obj.key` causes a transition of the dictionary's hidden class
and that can be costly.
Unfortunately, that introduces a memory leak when many events are added
and then removed again. The strings containing the event names are never
reclaimed by the garbage collector because they remain part of the
dictionary.
That's why this commit makes EventEmitter delete events again. This
effectively reverts commit 0397223.
Fixes #5970.
Diffstat (limited to 'lib/events.js')
-rw-r--r-- | lib/events.js | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/lib/events.js b/lib/events.js index 38422dab0..5188205d1 100644 --- a/lib/events.js +++ b/lib/events.js @@ -197,7 +197,7 @@ EventEmitter.prototype.removeListener = function(type, listener) { if (list === listener || (typeof list.listener === 'function' && list.listener === listener)) { - this._events[type] = undefined; + delete this._events[type]; if (this._events.removeListener) this.emit('removeListener', type, listener); @@ -215,7 +215,7 @@ EventEmitter.prototype.removeListener = function(type, listener) { if (list.length === 1) { list.length = 0; - this._events[type] = undefined; + delete this._events[type]; } else { list.splice(position, 1); } @@ -238,7 +238,7 @@ EventEmitter.prototype.removeAllListeners = function(type) { if (arguments.length === 0) this._events = {}; else if (this._events[type]) - this._events[type] = undefined; + delete this._events[type]; return this; } @@ -262,7 +262,7 @@ EventEmitter.prototype.removeAllListeners = function(type) { while (listeners.length) this.removeListener(type, listeners[listeners.length - 1]); } - this._events[type] = undefined; + delete this._events[type]; return this; }; |