Ticket #737: twisted.patch

File twisted.patch, 3.2 KB (added by bdew, at 2009-06-24T22:52:23Z)
  • base.py

    old new  
    2323    fcntl = None
    2424import traceback
    2525
     26def validfloat(x,msg=None):
     27    return repr(x)!='nan'
     28
     29
    2630from twisted.internet.interfaces import IReactorCore, IReactorTime, IReactorThreads
    2731from twisted.internet.interfaces import IResolverSimple, IReactorPluggableResolver
    2832from twisted.internet.interfaces import IConnector, IDelayedCall
     
    6367            used to determine the current time any time that information is
    6468            needed.
    6569        """
     70        assert validfloat(time)
    6671        self.time, self.func, self.args, self.kw = time, func, args, kw
    6772        self.resetter = reset
    6873        self.canceller = cancel
     
    7984        @return: The number of seconds after the epoch at which this call is
    8085        scheduled to be made.
    8186        """
     87        assert validfloat(self.time)
     88        assert validfloat(self.delayed_time)
    8289        return self.time + self.delayed_time
    8390
    8491    def cancel(self):
     
    115122        elif self.called:
    116123            raise error.AlreadyCalled
    117124        else:
     125            assert validfloat(secondsFromNow)
    118126            newTime = self.seconds() + secondsFromNow
    119127            if newTime < self.time:
    120128                self.delayed_time = 0
    121129                self.time = newTime
     130                assert validfloat(self.time)
    122131                self.resetter(self)
    123132            else:
    124133                self.delayed_time = newTime - self.time
     134                assert validfloat(self.delayed_time)
    125135
    126136    def delay(self, secondsLater):
    127137        """Reschedule this call for a later time
     
    138148        elif self.called:
    139149            raise error.AlreadyCalled
    140150        else:
     151            assert validfloat(secondsLater)
    141152            self.delayed_time += secondsLater
    142153            if self.delayed_time < 0:
    143154                self.activate_delay()
    144155                self.resetter(self)
     156            assert validfloat(self.time)
    145157
    146158    def activate_delay(self):
    147159        self.time += self.delayed_time
     160        assert validfloat(self.time)
    148161        self.delayed_time = 0
    149162
    150163    def active(self):
     
    651664        assert callable(_f), "%s is not callable" % _f
    652665        assert sys.maxint >= _seconds >= 0, \
    653666               "%s is not greater than or equal to 0 seconds" % (_seconds,)
     667
     668        assert validfloat(_seconds)
     669        assert repr(self.seconds())!='nan', 'self.seconds() [really: %r] returned NaN! %r,%r,%r'%(self.seconds,self.seconds(),self.seconds(),self.seconds())
     670
    654671        tple = DelayedCall(self.seconds() + _seconds, _f, args, kw,
    655672                           self._cancelCallLater,
    656673                           self._moveCallLaterSooner,
     
    741758        self._insertNewDelayedCalls()
    742759
    743760        now = self.seconds()
     761
     762        if self._pendingTimedCalls and repr(self._pendingTimedCalls[0].time)=='nan':
     763            print 'NAN TIME DETECTED', repr(self._pendingTimedCalls[0].time), self._pendingTimedCalls[0].__dict__
     764            self._pendingTimedCalls[0].time=0
     765
    744766        while self._pendingTimedCalls and (self._pendingTimedCalls[0].time <= now):
    745767            call = heappop(self._pendingTimedCalls)
    746768            if call.cancelled: