Fix number of args emitted by EventEmitter during "fast case" (lte 3 args)
authorJeremy Martin <jmar777@gmail.com>
Sun, 28 Nov 2010 06:03:14 +0000 (01:03 -0500)
committerRyan Dahl <ry@tinyclouds.org>
Tue, 30 Nov 2010 01:25:50 +0000 (17:25 -0800)
lib/events.js
test/simple/test-event-emitter-num-args.js [new file with mode: 0644]

index cf9651a..ef27737 100644 (file)
@@ -22,20 +22,27 @@ EventEmitter.prototype.emit = function (type) {
   if (!handler) return false;
 
   if (typeof handler == 'function') {
-    if (arguments.length <= 3) {
-      // fast case
-      handler.call(this, arguments[1], arguments[2]);
-    } else {
+    switch (arguments.length) {
+      // fast cases
+      case 1:
+        handler.call(this);
+        break;
+      case 2:
+        handler.call(this, arguments[1]);
+        break;
+      case 3:
+        handler.call(this, arguments[1], arguments[2]);
+        break;
       // slower
-      var args = Array.prototype.slice.call(arguments, 1);
-      handler.apply(this, args);
+      default:
+        var args = Array.prototype.slice.call(arguments, 1);
+        handler.apply(this, args);
     }
     return true;
 
   } else if (isArray(handler)) {
     var args = Array.prototype.slice.call(arguments, 1);
 
-
     var listeners = handler.slice();
     for (var i = 0, l = listeners.length; i < l; i++) {
       listeners[i].apply(this, args);
diff --git a/test/simple/test-event-emitter-num-args.js b/test/simple/test-event-emitter-num-args.js
new file mode 100644 (file)
index 0000000..93a5149
--- /dev/null
@@ -0,0 +1,27 @@
+common = require("../common");
+assert = common.assert
+var events = require('events');
+
+var e = new events.EventEmitter(),
+  num_args_emited = [];
+
+e.on("numArgs", function() {
+  var numArgs = arguments.length;
+  console.log("numArgs: " + numArgs);
+  num_args_emited.push(numArgs);
+});
+
+console.log("start");
+
+e.emit("numArgs");
+e.emit("numArgs", null);
+e.emit("numArgs", null, null);
+e.emit("numArgs", null, null, null);
+e.emit("numArgs", null, null, null, null);
+e.emit("numArgs", null, null, null, null, null);
+
+process.addListener("exit", function () {
+  assert.deepEqual([0, 1, 2, 3, 4, 5], num_args_emited);
+});
+
+