--- EV/EV.xs 2007/10/31 11:52:11 1.17 +++ EV/EV.xs 2007/10/31 11:55:42 1.18 @@ -213,6 +213,9 @@ } #endif +#define CHECK_REPEAT(repeat) if (repeat < 0.) \ + croak (# repeat " value must be >= 0"); + ///////////////////////////////////////////////////////////////////////////// // XS interface functions @@ -326,6 +329,8 @@ struct ev_timer *timer (NV after, NV repeat, SV *cb) ALIAS: timer_ns = 1 + INIT: + CHECK_REPEAT (repeat); CODE: RETVAL = e_new (sizeof (struct ev_timer), cb); evtimer_set (RETVAL, after, repeat); @@ -336,6 +341,8 @@ struct ev_periodic *periodic (NV at, NV interval, SV *cb) ALIAS: periodic_ns = 1 + INIT: + CHECK_REPEAT (interval); CODE: RETVAL = e_new (sizeof (struct ev_periodic), cb); evperiodic_set (RETVAL, at, interval); @@ -468,12 +475,18 @@ MODULE = EV PACKAGE = EV::Timer PREFIX = evtimer_ void evtimer_start (struct ev_timer *w) + INIT: + CHECK_REPEAT (w->repeat); void evtimer_stop (struct ev_timer *w) void evtimer_again (struct ev_timer *w) + INIT: + CHECK_REPEAT (w->repeat); void set (struct ev_timer *w, NV after, NV repeat = 0.) + INIT: + CHECK_REPEAT (repeat); CODE: { int active = w->active; @@ -485,10 +498,14 @@ MODULE = EV PACKAGE = EV::Periodic PREFIX = evperiodic_ void evperiodic_start (struct ev_periodic *w) + INIT: + CHECK_REPEAT (w->interval); void evperiodic_stop (struct ev_periodic *w) void set (struct ev_periodic *w, NV at, NV interval = 0.) + INIT: + CHECK_REPEAT (interval); CODE: { int active = w->active;