Fix #3425: removeAllListeners should delete array
authorReid Burke <me@reidburke.com>
Wed, 13 Jun 2012 17:25:43 +0000 (12:25 -0500)
committerisaacs <i@izs.me>
Fri, 15 Jun 2012 00:26:50 +0000 (17:26 -0700)
When removeAllListeners is called, the listeners array
is deleted to maintain compatibility with v0.6.

Reverts "events: don't delete the listeners array"

This reverts commit 78dc13fbf97e2e3003e6f3baacdd5ff60e8de3f7.

Conflicts:

test/simple/test-event-emitter-remove-all-listeners.js

lib/events.js
test/simple/test-event-emitter-remove-all-listeners.js

index c4ab9d80a0a03ba2aafa5809441f9535851556e8..fe7c048738f9af7cfde515908c051a5c88ced467 100644 (file)
@@ -228,15 +228,8 @@ EventEmitter.prototype.removeAllListeners = function(type) {
     return this;
   }
 
-  var events = this._events && this._events[type];
-  if (!events) return this;
-
-  if (isArray(events)) {
-    events.splice(0);
-  } else {
-    this._events[type] = null;
-  }
-
+  // does not use listeners(), so no side effect of creating _events[type]
+  if (type && this._events && this._events[type]) this._events[type] = null;
   return this;
 };
 
index 6e27f3eb702ba85a9be6df40b4a80dd4e79392aa..38cfb79c67e21dbafd7786ab74eba786328cc812 100644 (file)
@@ -39,10 +39,15 @@ e1.removeAllListeners('baz');
 assert.deepEqual(e1.listeners('foo'), [listener]);
 assert.deepEqual(e1.listeners('bar'), []);
 assert.deepEqual(e1.listeners('baz'), []);
-// identity check, the array should not change
-assert.equal(e1.listeners('foo'), fooListeners);
-assert.equal(e1.listeners('bar'), barListeners);
-assert.equal(e1.listeners('baz'), bazListeners);
+// after calling removeAllListeners,
+// the old listeners array should stay unchanged
+assert.deepEqual(fooListeners, [listener]);
+assert.deepEqual(barListeners, [listener]);
+assert.deepEqual(bazListeners, [listener, listener]);
+// after calling removeAllListeners,
+// new listeners arrays are different from the old
+assert.notEqual(e1.listeners('bar'), barListeners);
+assert.notEqual(e1.listeners('baz'), bazListeners);
 
 var e2 = new events.EventEmitter();
 e2.on('foo', listener);