--- EV/EV.xs 2013/04/05 21:04:30 1.165 +++ EV/EV.xs 2013/04/06 00:05:45 1.166 @@ -49,7 +49,6 @@ #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)) \ @@ -202,60 +201,51 @@ && !ev_is_active (w)) REF (w); - PUSHMARK (SP); + 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 (e_flags (w) & WFLAG_NOARGS)) + 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 (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); + sv_events = newSViv (revents); + SvREADONLY_on (sv_events); + } - PUTBACK; - call_sv (w->cb_sv, G_DISCARD | G_VOID | G_EVAL); + PUSHMARK (SP); + EXTEND (SP, 2); + PUSHs (sv_self); + PUSHs (sv_events); - 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; - } + 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); else { - PUTBACK; - call_sv (w->cb_sv, G_DISCARD | G_VOID | G_EVAL); + 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; + if (expect_false (SvTRUE (ERRSV))) { SPAGAIN; @@ -668,17 +658,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 != 1) START (io, RETVAL); + if (!ix) START (io, RETVAL); } OUTPUT: RETVAL