1 | #ifndef SCHMORP_PERL_H_ |
1 | #ifndef SCHMORP_PERL_H_ |
2 | #define SCHMORP_PERL_H_ |
2 | #define SCHMORP_PERL_H_ |
3 | |
3 | |
|
|
4 | /* WARNING |
|
|
5 | * This header file is a shared resource between many modules. |
|
|
6 | */ |
|
|
7 | |
4 | /* useful stuff, used by schmorp mostly */ |
8 | /* useful stuff, used by schmorp mostly */ |
|
|
9 | |
|
|
10 | #include "patchlevel.h" |
5 | |
11 | |
6 | #define PERL_VERSION_ATLEAST(a,b,c) \ |
12 | #define PERL_VERSION_ATLEAST(a,b,c) \ |
7 | (PERL_REVISION > (a) \ |
13 | (PERL_REVISION > (a) \ |
8 | || (PERL_REVISION == (a) \ |
14 | || (PERL_REVISION == (a) \ |
9 | && (PERL_VERSION > (b) \ |
15 | && (PERL_VERSION > (b) \ |
… | |
… | |
131 | static SV * |
137 | static SV * |
132 | s_get_cv (SV *cb_sv) |
138 | s_get_cv (SV *cb_sv) |
133 | { |
139 | { |
134 | HV *st; |
140 | HV *st; |
135 | GV *gvp; |
141 | GV *gvp; |
136 | CV *cv = sv_2cv (cb_sv, &st, &gvp, 0); |
|
|
137 | |
142 | |
138 | return (SV *)cv; |
143 | return (SV *)sv_2cv (cb_sv, &st, &gvp, 0); |
139 | } |
144 | } |
140 | |
145 | |
141 | static SV * |
146 | static SV * |
142 | s_get_cv_croak (SV *cb_sv) |
147 | s_get_cv_croak (SV *cb_sv) |
143 | { |
148 | { |
144 | cb_sv = s_get_cv (cb_sv); |
149 | SV *cv = s_get_cv (cb_sv); |
145 | |
150 | |
146 | if (!cb_sv) |
151 | if (!cv) |
147 | croak ("%s: callback must be a CODE reference or another callable object", SvPV_nolen (cb_sv)); |
152 | croak ("%s: callback must be a CODE reference or another callable object", SvPV_nolen (cb_sv)); |
148 | |
153 | |
149 | return cb_sv; |
154 | return cv; |
150 | } |
155 | } |
151 | |
156 | |
152 | /*****************************************************************************/ |
157 | /*****************************************************************************/ |
153 | /* gensub: simple closure generation utility */ |
158 | /* gensub: simple closure generation utility */ |
154 | |
159 | |