File Coverage

Util.xs
Criterion Covered Total %
statement 131 144 90.9
branch 133 206 64.5
condition n/a
subroutine n/a
pod n/a
total 264 350 75.4


line stmt bran cond sub pod time code
1             #include "EXTERN.h"
2             #include "perl.h"
3             #include "XSUB.h"
4              
5             /* Changes in 5.7 series mean that now IOK is only set if scalar is
6             precisely integer but in 5.6 and earlier we need to do a more
7             complex test */
8             #if PERL_VERSION <= 6
9             #define DD_is_integer(sv) (SvIOK(sv) && (SvIsUV(val) ? SvUV(sv) == SvNV(sv) : SvIV(sv) == SvNV(sv)))
10             #else
11             #define DD_is_integer(sv) SvIOK(sv)
12             #endif
13              
14             static int
15 122           is_string0( SV *sv )
16             {
17 122           return SvFLAGS(sv) & (SVf_OK & ~SVf_ROK);
18             }
19              
20             static int
21 122           is_string( SV *sv )
22             {
23 122           STRLEN len = 0;
24 122 100         if( is_string0(sv) )
25             {
26 96 100         const char *pv = SvPV(sv, len);
27             }
28 122           return len;
29             }
30              
31             static int
32 78           is_array( SV *sv )
33             {
34 78 100         return SvROK(sv) && ( SVt_PVAV == SvTYPE(SvRV(sv) ) );
    100          
35             }
36              
37             static int
38 74           is_hash( SV *sv )
39             {
40 74 100         return SvROK(sv) && ( SVt_PVHV == SvTYPE(SvRV(sv) ) );
    100          
41             }
42              
43             static int
44 43           is_like( SV *sv, const char *like )
45             {
46 43           int likely = 0;
47 43 100         if( sv_isobject( sv ) )
48             {
49 37           dSP;
50             int count;
51              
52 37           ENTER;
53 37           SAVETMPS;
54 37 50         PUSHMARK(SP);
55 37 50         XPUSHs( sv_2mortal( newSVsv( sv ) ) );
56 37 50         XPUSHs( sv_2mortal( newSVpv( like, strlen(like) ) ) );
57 37           PUTBACK;
58              
59 37 50         if( ( count = call_pv("overload::Method", G_SCALAR) ) )
60             {
61             I32 ax;
62 37           SPAGAIN;
63              
64 37           SP -= count;
65 37           ax = (SP - PL_stack_base) + 1;
66 37 50         if( SvTRUE(ST(0)) )
    50          
    100          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    50          
    0          
    0          
    0          
    0          
    100          
67 26           ++likely;
68             }
69              
70 37           PUTBACK;
71 37 50         FREETMPS;
72 37           LEAVE;
73             }
74              
75 43           return likely;
76             }
77              
78             MODULE = Params::Util PACKAGE = Params::Util
79              
80             void
81             _STRING(sv)
82             SV *sv
83             PROTOTYPE: $
84             CODE:
85             {
86 50 100         if( SvMAGICAL(sv) )
87 18           mg_get(sv);
88 50 100         if( is_string( sv ) )
89             {
90 36           ST(0) = sv;
91 36           XSRETURN(1);
92             }
93 14           XSRETURN_UNDEF;
94             }
95              
96             void
97             _NUMBER(sv)
98             SV *sv;
99             PROTOTYPE: $
100             CODE:
101             {
102 62 100         if( SvMAGICAL(sv) )
103 22           mg_get(sv);
104 62 50         if( ( SvIOK(sv) ) || ( SvNOK(sv) ) || ( is_string( sv ) && looks_like_number( sv ) ) )
    50          
    100          
    100          
105             {
106 44           ST(0) = sv;
107 44           XSRETURN(1);
108             }
109 18           XSRETURN_UNDEF;
110             }
111              
112             void
113             _SCALAR0(ref)
114             SV *ref;
115             PROTOTYPE: $
116             CODE:
117             {
118 28 50         if( SvMAGICAL(ref) )
119 0           mg_get(ref);
120 28 100         if( SvROK(ref) )
121             {
122 20 100         if( ( SvTYPE(SvRV(ref)) <= SVt_PVBM ) && !sv_isobject(ref) )
    50          
123             {
124 14           ST(0) = ref;
125 14           XSRETURN(1);
126             }
127             }
128 14           XSRETURN_UNDEF;
129             }
130              
131             void
132             _SCALAR(ref)
133             SV *ref;
134             PROTOTYPE: $
135             CODE:
136             {
137 24 50         if( SvMAGICAL(ref) )
138 0           mg_get(ref);
139 24 100         if( SvROK(ref) )
140             {
141 16           svtype tp = SvTYPE(SvRV(ref));
142 16 100         if( ( SvTYPE(SvRV(ref)) <= SVt_PVBM ) && (!sv_isobject(ref)) && is_string( SvRV(ref) ) )
    50          
    100          
143             {
144 6           ST(0) = ref;
145 6           XSRETURN(1);
146             }
147             }
148 18           XSRETURN_UNDEF;
149             }
150              
151             void
152             _REGEX(ref)
153             SV *ref;
154             PROTOTYPE: $
155             CODE:
156             {
157 22 50         if( SvMAGICAL(ref) )
158 0           mg_get(ref);
159 22 100         if( SvROK(ref) )
160             {
161 14           svtype tp = SvTYPE(SvRV(ref));
162             #if PERL_VERSION >= 11
163 14 100         if( ( SVt_REGEXP == tp ) )
164             #else
165             if( ( SVt_PVMG == tp ) && sv_isobject(ref)
166             && ( 0 == strncmp( "Regexp", sv_reftype(SvRV(ref),TRUE),
167             strlen("Regexp") ) ) )
168             #endif
169             {
170 4           ST(0) = ref;
171 4           XSRETURN(1);
172             }
173             }
174 18           XSRETURN_UNDEF;
175             }
176              
177             void
178             _ARRAY0(ref)
179             SV *ref;
180             PROTOTYPE: $
181             CODE:
182             {
183 24 50         if( SvMAGICAL(ref) )
184 0           mg_get(ref);
185 24 100         if( is_array(ref) )
186             {
187 10           ST(0) = ref;
188 10           XSRETURN(1);
189             }
190              
191 14           XSRETURN_UNDEF;
192             }
193              
194             void
195             _ARRAY(ref)
196             SV *ref;
197             PROTOTYPE: $
198             CODE:
199             {
200 24 50         if( SvMAGICAL(ref) )
201 0           mg_get(ref);
202 24 100         if( is_array(ref) && ( av_len((AV *)(SvRV(ref))) >= 0 ) )
    100          
203             {
204 8           ST(0) = ref;
205 8           XSRETURN(1);
206             }
207 16           XSRETURN_UNDEF;
208             }
209              
210             void
211             _ARRAYLIKE(ref)
212             SV *ref;
213             PROTOTYPE: $
214             CODE:
215             {
216 36 50         if( SvMAGICAL(ref) )
217 0           mg_get(ref);
218 36 100         if( SvROK(ref) )
219             {
220 30 100         if( is_array(ref) || is_like( ref, "@{}" ) )
    100          
221             {
222 24           ST(0) = ref;
223 24           XSRETURN(1);
224             }
225             }
226              
227 12           XSRETURN_UNDEF;
228             }
229              
230             void
231             _HASH0(ref)
232             SV *ref;
233             PROTOTYPE: $
234             CODE:
235             {
236 22 50         if( SvMAGICAL(ref) )
237 0           mg_get(ref);
238 22 100         if( is_hash(ref) )
239             {
240 8           ST(0) = ref;
241 8           XSRETURN(1);
242             }
243              
244 14           XSRETURN_UNDEF;
245             }
246              
247             void
248             _HASH(ref)
249             SV *ref;
250             PROTOTYPE: $
251             CODE:
252             {
253 22 50         if( SvMAGICAL(ref) )
254 0           mg_get(ref);
255 22 100         if( is_hash(ref) && ( HvKEYS(SvRV(ref)) >= 1 ) )
    50          
    100          
256             {
257 6           ST(0) = ref;
258 6           XSRETURN(1);
259             }
260              
261 16           XSRETURN_UNDEF;
262             }
263              
264             void
265             _HASHLIKE(ref)
266             SV *ref;
267             PROTOTYPE: $
268             CODE:
269             {
270 36 50         if( SvMAGICAL(ref) )
271 0           mg_get(ref);
272 36 100         if( SvROK(ref) )
273             {
274 30 100         if( is_hash(ref) || is_like( ref, "%{}" ) )
    100          
275             {
276 24           ST(0) = ref;
277 24           XSRETURN(1);
278             }
279             }
280              
281 12           XSRETURN_UNDEF;
282             }
283              
284             void
285             _CODE(ref)
286             SV *ref;
287             PROTOTYPE: $
288             CODE:
289             {
290 24 50         if( SvMAGICAL(ref) )
291 0           mg_get(ref);
292 24 100         if( SvROK(ref) )
293             {
294 16 100         if( SVt_PVCV == SvTYPE(SvRV(ref)) )
295             {
296 10           ST(0) = ref;
297 10           XSRETURN(1);
298             }
299             }
300 14           XSRETURN_UNDEF;
301             }
302              
303             void
304             _CODELIKE(ref)
305             SV *ref;
306             PROTOTYPE: $
307             CODE:
308             {
309 17 50         if( SvMAGICAL(ref) )
310 0           mg_get(ref);
311 17 100         if( SvROK(ref) )
312             {
313 11 100         if( ( SVt_PVCV == SvTYPE(SvRV(ref)) ) || ( is_like(ref, "&{}" ) ) )
    100          
314             {
315 6           ST(0) = ref;
316 6           XSRETURN(1);
317             }
318             }
319 11           XSRETURN_UNDEF;
320             }
321              
322             void
323             _INSTANCE(ref,type)
324             SV *ref;
325             char *type;
326             PROTOTYPE: $$
327             CODE:
328             {
329             STRLEN len;
330 57 50         if( SvMAGICAL(ref) )
331 0           mg_get(ref);
332 57 100         if( SvROK(ref) && type && ( ( len = strlen(type) ) > 0 ) )
    50          
    50          
333             {
334 49 100         if( sv_isobject(ref) )
335             {
336 39           I32 isa_type = 0;
337             int count;
338              
339 39           ENTER;
340 39           SAVETMPS;
341 39 50         PUSHMARK(SP);
342 39 50         XPUSHs( sv_2mortal( newSVsv( ref ) ) );
343 39 50         XPUSHs( sv_2mortal( newSVpv( type, len ) ) );
344 39           PUTBACK;
345              
346 39 50         if( ( count = call_method("isa", G_SCALAR) ) )
347             {
348 39           I32 oldax = ax;
349 39           SPAGAIN;
350 39           SP -= count;
351 39           ax = (SP - PL_stack_base) + 1;
352 39 50         isa_type = SvTRUE(ST(0));
    50          
    0          
    50          
    0          
    0          
    100          
    50          
    50          
    100          
    50          
    100          
    50          
    50          
    50          
    0          
    0          
    50          
    0          
353 39           ax = oldax;
354             }
355              
356 39           PUTBACK;
357 39 50         FREETMPS;
358 39           LEAVE;
359              
360 39 100         if( isa_type )
361             {
362 36           ST(0) = ref;
363 36           XSRETURN(1);
364             }
365             }
366             }
367 21           XSRETURN_UNDEF;
368             }
369              
370             void
371             _XScompiled ()
372             CODE:
373 0           XSRETURN_YES;