Fix event listener leak check timing
authorkoichik <koichik@improvement.jp>
Thu, 12 May 2011 06:18:21 +0000 (15:18 +0900)
committerRyan Dahl <ry@tinyclouds.org>
Sat, 14 May 2011 21:43:00 +0000 (14:43 -0700)
Fixes #1041.

lib/events.js
test/simple/test-event-emitter-check-listener-leaks.js [new file with mode: 0644]

index 6fe55bb..66aeb8e 100644 (file)
@@ -105,6 +105,9 @@ EventEmitter.prototype.addListener = function(type, listener) {
     this._events[type] = listener;
   } else if (isArray(this._events[type])) {
 
+    // If we've already got an array, just append.
+    this._events[type].push(listener);
+
     // Check for listener leak
     if (!this._events[type].warned) {
       var m;
@@ -123,9 +126,6 @@ EventEmitter.prototype.addListener = function(type, listener) {
         console.trace();
       }
     }
-
-    // If we've already got an array, just append.
-    this._events[type].push(listener);
   } else {
     // Adding the second element, need to change to array.
     this._events[type] = [this._events[type], listener];
diff --git a/test/simple/test-event-emitter-check-listener-leaks.js b/test/simple/test-event-emitter-check-listener-leaks.js
new file mode 100644 (file)
index 0000000..66e257c
--- /dev/null
@@ -0,0 +1,29 @@
+var assert = require('assert');
+var events = require('events');
+
+var e = new events.EventEmitter();
+
+// default
+for (var i = 0; i < 10; i++) {
+  e.on('default', function() {});
+}
+assert.ok(!e._events['default'].hasOwnProperty('warned'));
+e.on('default', function() {});
+assert.ok(e._events['default'].warned);
+
+// specific
+e.setMaxListeners(5);
+for (var i = 0; i < 5; i++) {
+  e.on('specific', function() {});
+}
+assert.ok(!e._events['specific'].hasOwnProperty('warned'));
+e.on('specific', function() {});
+assert.ok(e._events['specific'].warned);
+
+// unlimited
+e.setMaxListeners(0);
+for (var i = 0; i < 1000; i++) {
+  e.on('unlimited', function() {});
+}
+assert.ok(!e._events['unlimited'].hasOwnProperty('warned'));
+