timers: Move list.ontimeout to separate function
authorisaacs <i@izs.me>
Thu, 27 Dec 2012 19:40:42 +0000 (11:40 -0800)
committerisaacs <i@izs.me>
Sat, 29 Dec 2012 23:32:25 +0000 (15:32 -0800)
lib/timers.js
test/message/timeout_throw.out

index 8ec6b2c..28c23c1 100644 (file)
@@ -66,60 +66,65 @@ function insert(item, msecs) {
     L.init(list);
 
     lists[msecs] = list;
+    list.msecs = msecs;
+    list.ontimeout = listOnTimeout;
+  }
+
+  L.append(list, item);
+  assert(!L.isEmpty(list)); // list is not empty
+}
+
+function listOnTimeout() {
+  var msecs = this.msecs;
+  var list = this;
+
+  debug('timeout callback ' + msecs);
 
-    list.ontimeout = function() {
-      debug('timeout callback ' + msecs);
-
-      var now = Date.now();
-      debug('now: ' + (new Date(now)));
-
-      var first;
-      while (first = L.peek(list)) {
-        var diff = now - first._idleStart;
-        if (diff + 1 < msecs) {
-          list.start(msecs - diff, 0);
-          debug(msecs + ' list wait because diff is ' + diff);
-          return;
-        } else {
-          L.remove(first);
-          assert(first !== L.peek(list));
-
-          if (!first._onTimeout) continue;
-
-          // v0.4 compatibility: if the timer callback throws and the
-          // domain or uncaughtException handler ignore the exception,
-          // other timers that expire on this tick should still run.
-          //
-          // https://github.com/joyent/node/issues/2631
-          var domain = first.domain;
-          if (domain && domain._disposed) continue;
-          try {
-            if (domain)
-              domain.enter();
-            var threw = true;
-            first._onTimeout();
-            if (domain)
-              domain.exit();
-            threw = false;
-          } finally {
-            if (threw) {
-              process.nextTick(function() {
-                list.ontimeout();
-              });
-            }
-          }
+  var now = Date.now();
+  debug('now: ' + now);
+
+  var first;
+  while (first = L.peek(list)) {
+    var diff = now - first._idleStart;
+    if (diff + 1 < msecs) {
+      list.start(msecs - diff, 0);
+      debug(msecs + ' list wait because diff is ' + diff);
+      return;
+    } else {
+      L.remove(first);
+      assert(first !== L.peek(list));
+
+      if (!first._onTimeout) continue;
+
+      // v0.4 compatibility: if the timer callback throws and the
+      // domain or uncaughtException handler ignore the exception,
+      // other timers that expire on this tick should still run.
+      //
+      // https://github.com/joyent/node/issues/2631
+      var domain = first.domain;
+      if (domain && domain._disposed) continue;
+      try {
+        if (domain)
+          domain.enter();
+        var threw = true;
+        first._onTimeout();
+        if (domain)
+          domain.exit();
+        threw = false;
+      } finally {
+        if (threw) {
+          process.nextTick(function() {
+            list.ontimeout();
+          });
         }
       }
-
-      debug(msecs + ' list empty');
-      assert(L.isEmpty(list));
-      list.close();
-      delete lists[msecs];
-    };
+    }
   }
 
-  L.append(list, item);
-  assert(!L.isEmpty(list)); // list is not empty
+  debug(msecs + ' list empty');
+  assert(L.isEmpty(list));
+  list.close();
+  delete lists[msecs];
 }
 
 
index 44659b9..de8ce51 100644 (file)
@@ -3,5 +3,5 @@
   ^
 ReferenceError: undefined_reference_error_maker is not defined
     at null._onTimeout (*test*message*timeout_throw.js:*:*)
-    at Timer.list.ontimeout (timers.js:*:*)
+    at Timer.listOnTimeout [as ontimeout] (timers.js:*:*)
     at process._makeCallback (node.js:*:*)