summaryrefslogtreecommitdiff
path: root/lib/events.js
diff options
context:
space:
mode:
authorBen Noordhuis <info@bnoordhuis.nl>2013-08-01 14:35:13 +0200
committerBen Noordhuis <info@bnoordhuis.nl>2013-08-01 14:52:06 +0200
commitfc6f8a69438d45640d4d0a76633b57965c1f843a (patch)
tree4f8bec21c1b7af2226d84cd770aeb01e606451aa /lib/events.js
parent3398cce1934004e4d60c7d7605fa7548582c362f (diff)
downloadnodejs-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.js8
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;
};