--- EV/EV.xs 2013/04/03 23:46:45 1.163 +++ EV/EV.xs 2013/04/05 21:04:18 1.164 @@ -49,6 +49,7 @@ #define WFLAG_KEEPALIVE 1 #define WFLAG_UNREFED 2 /* has been unref'ed */ +#define WFLAG_NOARGS 4 /* do not pass anything to the callback */ #define UNREF(w) \ if (!(e_flags (w) & (WFLAG_KEEPALIVE | WFLAG_UNREFED)) \ @@ -201,50 +202,63 @@ && !ev_is_active (w)) REF (w); - if (expect_true (sv_self_cache)) - { - sv_self = sv_self_cache; sv_self_cache = 0; - SvRV_set (sv_self, SvREFCNT_inc_NN (w->self)); - } - else - { - sv_self = newRV_inc (w->self); /* e_self (w) MUST be blessed by now */ - SvREADONLY_on (sv_self); - } + PUSHMARK (SP); - if (expect_true (sv_events_cache)) - { - sv_events = sv_events_cache; sv_events_cache = 0; - SvIV_set (sv_events, revents); - SvIOK_only (sv_events); - } - else + if (!expect_true (e_flags (w) & WFLAG_NOARGS)) { - sv_events = newSViv (revents); - SvREADONLY_on (sv_events); - } - - PUSHMARK (SP); - EXTEND (SP, 2); - PUSHs (sv_self); - PUSHs (sv_events); + if (expect_true (sv_self_cache)) + { + sv_self = sv_self_cache; sv_self_cache = 0; + SvRV_set (sv_self, SvREFCNT_inc_NN (w->self)); + } + else + { + sv_self = newRV_inc (w->self); /* e_self (w) MUST be blessed by now */ + SvREADONLY_on (sv_self); + } + + if (expect_true (sv_events_cache)) + { + sv_events = sv_events_cache; sv_events_cache = 0; + SvIV_set (sv_events, revents); + SvIOK_only (sv_events); + } + else + { + sv_events = newSViv (revents); + SvREADONLY_on (sv_events); + } + + EXTEND (SP, 2); + PUSHs (sv_self); + PUSHs (sv_events); - PUTBACK; - call_sv (w->cb_sv, G_DISCARD | G_VOID | G_EVAL); + PUTBACK; + call_sv (w->cb_sv, G_DISCARD | G_VOID | G_EVAL); - if (expect_false (SvREFCNT (sv_self) != 1 || sv_self_cache)) - SvREFCNT_dec (sv_self); + if (expect_false (SvREFCNT (sv_self) != 1 || sv_self_cache)) + SvREFCNT_dec (sv_self); + else + { + SvREFCNT_dec (SvRV (sv_self)); + SvRV_set (sv_self, &PL_sv_undef); + sv_self_cache = sv_self; + } + + if (expect_false (SvREFCNT (sv_events) != 1 || sv_events_cache)) + SvREFCNT_dec (sv_events); + else + sv_events_cache = sv_events; + } else { - SvREFCNT_dec (SvRV (sv_self)); - SvRV_set (sv_self, &PL_sv_undef); - sv_self_cache = sv_self; - } + EXTEND (SP, 2); + PUSHs (sv_self); + PUSHs (sv_events); - if (expect_false (SvREFCNT (sv_events) != 1 || sv_events_cache)) - SvREFCNT_dec (sv_events); - else - sv_events_cache = sv_events; + PUTBACK; + call_sv (w->cb_sv, G_DISCARD | G_VOID | G_EVAL); + } if (expect_false (SvTRUE (ERRSV))) { @@ -658,17 +672,17 @@ { int fd = s_fileno (fh, events & EV_WRITE); CHECK_FD (fh, fd); + RETVAL = e_new (sizeof (ev_io), cb, default_loop_sv); + e_fh (RETVAL) = newSVsv (fh); if (ix == 2) { - ix = 0; events = events ? EV_WRITE : EV_READ; + e_flags (RETVAL) |= WFLAG_NOARGS; } - RETVAL = e_new (sizeof (ev_io), cb, default_loop_sv); - e_fh (RETVAL) = newSVsv (fh); ev_io_set (RETVAL, fd, events); - if (!ix) START (io, RETVAL); + if (ix != 1) START (io, RETVAL); } OUTPUT: RETVAL