Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

timers: fix handling of large timeouts

Don't use the double-negate trick to coalesce the timeout argument into a
number, it produces the wrong result for very large timeouts.

Example:

    setTimeout(cb, 1e10); // doesn't work, ~~1e10 == 1410065408
  • Loading branch information...
commit 0c47219a72fcf58c639ccb37ddf6b01b2261e793 1 parent 9126dd2
@bnoordhuis bnoordhuis authored
Showing with 8 additions and 5 deletions.
  1. +6 −4 lib/timers.js
  2. +2 −1  test/simple/test-timers.js
View
10 lib/timers.js
@@ -170,8 +170,9 @@ exports.active = function(item) {
exports.setTimeout = function(callback, after) {
var timer;
- after = ~~after;
- if (after < 1 || after > TIMEOUT_MAX) {
+ after *= 1; // coalesce to number or NaN
+
+ if (!(after >= 1 && after <= TIMEOUT_MAX)) {
after = 1; // schedule on next tick, follows browser behaviour
}
@@ -222,8 +223,9 @@ exports.setInterval = function(callback, repeat) {
if (process.domain) timer.domain = process.domain;
- repeat = ~~repeat;
- if (repeat < 1 || repeat > TIMEOUT_MAX) {
+ repeat *= 1; // coalesce to number or NaN
+
+ if (!(repeat >= 1 && repeat <= TIMEOUT_MAX)) {
repeat = 1; // schedule on next tick, follows browser behaviour
}
View
3  test/simple/test-timers.js
@@ -45,7 +45,8 @@ var inputs = [
1,
1.0,
10,
- 2147483648 // browser behaviour: timeouts > 2^31-1 run on next tick
+ 2147483648, // browser behaviour: timeouts > 2^31-1 run on next tick
+ 12345678901234 // ditto
];
var timeouts = [];
Please sign in to comment.
Something went wrong with that request. Please try again.