ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/EV/EV.xs
(Generate patch)

Comparing EV/EV.xs (file contents):
Revision 1.111 by root, Sun May 18 10:45:36 2008 UTC vs.
Revision 1.112 by root, Tue May 20 23:49:41 2008 UTC

127 return SvIV (fh); 127 return SvIV (fh);
128 128
129 return -1; 129 return -1;
130} 130}
131 131
132static SV *
133e_get_cv (SV *cb_sv)
134{
135 HV *st;
136 GV *gvp;
137 CV *cv = sv_2cv (cb_sv, &st, &gvp, 0);
138
139 if (!cv)
140 croak ("EV watcher callback must be a CODE reference");
141
142 return (SV *)cv;
143}
144
132static void * 145static void *
133e_new (int size, SV *cb_sv, SV *loop) 146e_new (int size, SV *cb_sv, SV *loop)
134{ 147{
148 SV *cv = e_get_cv (cb_sv);
135 ev_watcher *w; 149 ev_watcher *w;
136 SV *self = NEWSV (0, size); 150 SV *self = NEWSV (0, size);
137 SvPOK_only (self); 151 SvPOK_only (self);
138 SvCUR_set (self, size); 152 SvCUR_set (self, size);
139 153
143 157
144 w->loop = SvREFCNT_inc (SvRV (loop)); 158 w->loop = SvREFCNT_inc (SvRV (loop));
145 w->e_flags = WFLAG_KEEPALIVE; 159 w->e_flags = WFLAG_KEEPALIVE;
146 w->data = 0; 160 w->data = 0;
147 w->fh = 0; 161 w->fh = 0;
148 w->cb_sv = SvTEMP (cb_sv) && SvREFCNT (cb_sv) == 1 ? SvREFCNT_inc (cb_sv) : newSVsv (cb_sv); 162 w->cb_sv = SvREFCNT_inc (cv);
149 w->self = self; 163 w->self = self;
150 164
151 return (void *)w; 165 return (void *)w;
152} 166}
153 167
703 RETVAL 717 RETVAL
704 718
705SV *cb (ev_watcher *w, SV *new_cb = 0) 719SV *cb (ev_watcher *w, SV *new_cb = 0)
706 CODE: 720 CODE:
707{ 721{
708 RETVAL = newSVsv (w->cb_sv);
709
710 if (items > 1) 722 if (items > 1)
711 sv_setsv (w->cb_sv, new_cb); 723 {
724 new_cb = e_get_cv (new_cb);
725 RETVAL = newRV_noinc (w->cb_sv);
726 w->cb_sv = SvREFCNT_inc (new_cb);
727 }
728 else
729 RETVAL = newRV_inc (w->cb_sv);
712} 730}
713 OUTPUT: 731 OUTPUT:
714 RETVAL 732 RETVAL
715 733
716SV *data (ev_watcher *w, SV *new_data = 0) 734SV *data (ev_watcher *w, SV *new_data = 0)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines