… | |
… | |
135 | static SV * |
135 | static SV * |
136 | s_get_cv (SV *cb_sv) |
136 | s_get_cv (SV *cb_sv) |
137 | { |
137 | { |
138 | HV *st; |
138 | HV *st; |
139 | GV *gvp; |
139 | GV *gvp; |
140 | CV *cv = sv_2cv (cb_sv, &st, &gvp, 0); |
|
|
141 | |
140 | |
142 | return (SV *)cv; |
141 | SvGETMAGIC (cb_sv); |
|
|
142 | return SvOK (cb_sv) ? sv_2cv (cb_sv, &st, &gvp, 0) : 0; |
143 | } |
143 | } |
144 | |
144 | |
145 | static SV * |
145 | static SV * |
146 | s_get_cv_croak (SV *cb_sv) |
146 | s_get_cv_croak (SV *cb_sv) |
147 | { |
147 | { |
148 | cb_sv = s_get_cv (cb_sv); |
148 | SV *cv = s_get_cv (cb_sv); |
149 | |
149 | |
150 | if (!cb_sv) |
150 | if (!cv) |
151 | croak ("%s: callback must be a CODE reference or another callable object", SvPV_nolen (cb_sv)); |
151 | croak ("%s: callback must be a CODE reference or another callable object", SvPV_nolen (cb_sv)); |
152 | |
152 | |
153 | return cb_sv; |
153 | return cv; |
154 | } |
154 | } |
155 | |
155 | |
156 | /*****************************************************************************/ |
156 | /*****************************************************************************/ |
157 | /* gensub: simple closure generation utility */ |
157 | /* gensub: simple closure generation utility */ |
158 | |
158 | |