File Coverage

XS.xs
Criterion Covered Total %
statement 880 983 89.5
branch 1040 4692 22.1
condition n/a
subroutine n/a
pod n/a
total 1920 5675 33.8


line stmt bran cond sub pod time code
1             #define PERL_NO_GET_CONTEXT
2             #include "xshelper.h"
3             #include "multicall.h"
4              
5             /* When testing, also test this with DO_MULTICALL set to 0 */
6             #ifndef DO_MULTICALL
7             #define DO_MULTICALL 1
8             #endif
9              
10             #ifndef CvISXSUB
11             #define CvISXSUB(cv) (CvXSUB(cv) != NULL)
12             #endif
13              
14             #define IsObject(sv) (SvROK(sv) && SvOBJECT(SvRV(sv)))
15             #define IsArrayRef(sv) (SvROK(sv) && !SvOBJECT(SvRV(sv)) && SvTYPE(SvRV(sv)) == SVt_PVAV)
16             #define IsHashRef(sv) (SvROK(sv) && !SvOBJECT(SvRV(sv)) && SvTYPE(SvRV(sv)) == SVt_PVHV)
17             #define IsCodeRef(sv) (SvROK(sv) && !SvOBJECT(SvRV(sv)) && SvTYPE(SvRV(sv)) == SVt_PVCV)
18             #define IsScalarRef(sv) (SvROK(sv) && !SvOBJECT(SvRV(sv)) && SvTYPE(SvRV(sv)) <= SVt_PVMG)
19              
20             #define INSTALL_CONST(module, name) newCONSTSUB(module, #name, newSViv(name))
21             #define WRONG_NUMBER_OF_PARAMETERS "Wrong number of parameters"
22              
23             #define SV_SAFE_COPY(val) \
24             ( \
25             (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) \
26             ? newRV_inc(SvRV(val)) \
27             : newSVsv(val) \
28             )
29              
30             /* Utility macros, typedefs, etc. */
31             #include "src/types.c"
32             #include "src/should_return.c"
33             #include "src/unpacking.c"
34             #include "src/sorting.c"
35              
36             /* Type-specific macros, typedefs, etc. */
37             #include "src/Array.c"
38             #include "src/String.c"
39              
40             MODULE = Sub::HandlesVia::XS PACKAGE = Sub::HandlesVia::XS
41              
42             BOOT:
43             {
44 45           HV *stash = gv_stashpv("Sub::HandlesVia::XS", GV_ADD);
45              
46 45           INSTALL_CONST(stash, TYPE_BASE_ANY);
47 45           INSTALL_CONST(stash, TYPE_BASE_DEFINED);
48 45           INSTALL_CONST(stash, TYPE_BASE_REF);
49 45           INSTALL_CONST(stash, TYPE_BASE_BOOL);
50 45           INSTALL_CONST(stash, TYPE_BASE_INT);
51 45           INSTALL_CONST(stash, TYPE_BASE_PZINT);
52 45           INSTALL_CONST(stash, TYPE_BASE_NUM);
53 45           INSTALL_CONST(stash, TYPE_BASE_PZNUM);
54 45           INSTALL_CONST(stash, TYPE_BASE_STR);
55 45           INSTALL_CONST(stash, TYPE_BASE_NESTR);
56 45           INSTALL_CONST(stash, TYPE_BASE_CLASSNAME);
57 45           INSTALL_CONST(stash, TYPE_BASE_OBJECT);
58 45           INSTALL_CONST(stash, TYPE_BASE_SCALARREF);
59 45           INSTALL_CONST(stash, TYPE_BASE_CODEREF);
60 45           INSTALL_CONST(stash, TYPE_OTHER);
61 45           INSTALL_CONST(stash, TYPE_ARRAYREF);
62 45           INSTALL_CONST(stash, TYPE_HASHREF);
63              
64 45           INSTALL_CONST(stash, ARRAY_SRC_INVOCANT);
65 45           INSTALL_CONST(stash, ARRAY_SRC_DEREF_SCALAR);
66 45           INSTALL_CONST(stash, ARRAY_SRC_DEREF_ARRAY);
67 45           INSTALL_CONST(stash, ARRAY_SRC_DEREF_HASH);
68 45           INSTALL_CONST(stash, ARRAY_SRC_CALL_METHOD);
69              
70 45           INSTALL_CONST(stash, STR_SRC_INVOCANT);
71 45           INSTALL_CONST(stash, STR_SRC_DEREF_SCALAR);
72 45           INSTALL_CONST(stash, STR_SRC_DEREF_ARRAY);
73 45           INSTALL_CONST(stash, STR_SRC_DEREF_HASH);
74 45           INSTALL_CONST(stash, STR_SRC_CALL_METHOD);
75              
76 45           INSTALL_CONST(stash, SHOULD_RETURN_NOTHING);
77 45           INSTALL_CONST(stash, SHOULD_RETURN_UNDEF);
78 45           INSTALL_CONST(stash, SHOULD_RETURN_FALSE);
79 45           INSTALL_CONST(stash, SHOULD_RETURN_TRUE);
80 45           INSTALL_CONST(stash, SHOULD_RETURN_INVOCANT);
81 45           INSTALL_CONST(stash, SHOULD_RETURN_OTHER);
82 45           INSTALL_CONST(stash, SHOULD_RETURN_ARRAY);
83 45           INSTALL_CONST(stash, SHOULD_RETURN_ARRAYBLESS);
84 45           INSTALL_CONST(stash, SHOULD_RETURN_OUT);
85 45           INSTALL_CONST(stash, SHOULD_RETURN_OUTBLESS);
86 45           INSTALL_CONST(stash, SHOULD_RETURN_VAL);
87 45           INSTALL_CONST(stash, SHOULD_RETURN_COUNT);
88 45           INSTALL_CONST(stash, SHOULD_RETURN_STRING);
89             }
90              
91             #### array : accessor
92              
93             void
94             shvxs_array_accessor (SV *invocant, ...)
95             CODE:
96             {
97             dTHX;
98 216           dSP;
99              
100 216           UNPACK_SIG(shvxs_array_SETTER_SIG);
101 216 50         GET_ARRAY_FROM_SOURCE;
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
102 216 100         GET_INDEX_FROM_SOURCE(1);
    100          
    50          
103              
104 201           I32 len = av_len(array) + 1;
105 201           I32 real_ix = ix;
106 201 100         if (real_ix < 0)
107 90           real_ix += len;
108              
109             /*
110             warn("HERE, items=%d, sig.has_curried_sv=%d, sig.index=%d, sig.has_index=%d, ix=%d, real_ix=%d, has_ix=%d", items, sig->has_curried_sv, sig->index, sig->has_index, ix, real_ix, has_ix);
111             Perl_sv_dump(sig->curried_sv);
112             */
113              
114 249 100         if ( items > ( has_ix ? 1 : 2 ) || sig->has_curried_sv ) {
    100          
    100          
115              
116 50 100         GET_CURRIED_SV_FROM_SOURCE(has_ix ? 1 : 2);
    100          
    50          
    100          
117              
118 50           I32 expected = 3;
119 50 100         if (has_ix) expected--;
120 50 100         if (has_curried_sv) expected--;
121 50 50         if ( items != expected ) croak(WRONG_NUMBER_OF_PARAMETERS);
122              
123 50 50         val = SV_SAFE_COPY(curried_sv);
    0          
124              
125             bool ok;
126 50 0         CHECK_TYPE(ok, val, sig->element_type, sig->element_type_cv);
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    100          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
127 50 100         TRY_COERCE_TYPE(ok, val, sig->element_type, sig->element_type_cv, sig->element_coercion_cv);
    100          
    50          
    50          
    50          
    50          
    50          
128 50 100         if (!ok) {
129 2 50         if ( has_ix && has_curried_sv ) {
    0          
130 0           type_error(val, "$curried", 1, sig->element_type, sig->element_type_tiny);
131             }
132 2 50         else if ( has_curried_sv ) {
133 0           type_error(val, "$curried", 0, sig->element_type, sig->element_type_tiny);
134             }
135 2 50         else if ( has_ix ) {
136 0           type_error(val, "$_", 1, sig->element_type, sig->element_type_tiny);
137             }
138             else {
139 2           type_error(val, "$_", 2, sig->element_type, sig->element_type_tiny);
140             }
141             }
142              
143 48           av_store(array, real_ix, val);
144             }
145             else {
146 151           I32 expected = 2;
147 151 100         if (has_ix) expected--;
148 151 50         if ( items != expected ) croak(WRONG_NUMBER_OF_PARAMETERS);
149              
150 151 50         if (real_ix < 0 || real_ix >= len) {
    50          
151 0           val = &PL_sv_undef;
152             }
153             else {
154 151           SV **svp = av_fetch(array, real_ix, 0);
155 151 50         val = svp ? *svp : &PL_sv_undef;
156             }
157             }
158              
159 199 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
160             }
161              
162             #### array : all
163              
164             void
165             shvxs_array_all (SV *invocant, ...)
166             CODE:
167             {
168             dTHX;
169 23           dSP;
170              
171 23 50         if ( items > 1 ) croak(WRONG_NUMBER_OF_PARAMETERS);
172              
173 23           UNPACK_SIG(shvxs_array_SIMPLE_SIG);
174 23 50         GET_ARRAY_FROM_SOURCE;
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    0          
175              
176 23           out = array;
177              
178 56 100         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    100          
    100          
    50          
    50          
    50          
    50          
    100          
179             }
180              
181             #### array : all_true
182              
183             void
184             shvxs_array_all_true (SV *invocant, ...)
185             CODE:
186             {
187             dTHX;
188 6           dSP;
189              
190 6           UNPACK_SIG(shvxs_array_CALLBACK_SIG);
191 6 50         GET_ARRAY_FROM_SOURCE;
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
192              
193 6 100         GET_CALLBACK_FROM_SOURCE(1);
    50          
    0          
    0          
    0          
    50          
    50          
    50          
194 6 100         if ( items != ( has_callback ? 1 : 2 ) ) croak(WRONG_NUMBER_OF_PARAMETERS);
    50          
195              
196 6           val = &PL_sv_yes;
197              
198 6           SV *sv_dollar_underscore = get_sv("_", 0);
199 6           I32 len = av_len(array) + 1;
200             I32 i;
201              
202 6 50         if ( DO_MULTICALL && !CvISXSUB(callback) ) {
203             dMULTICALL;
204 6           U8 gimme = G_SCALAR;
205 6 50         PUSH_MULTICALL(callback);
206 18 100         for (i = 0; i < len; i++) {
207 15           SV **svp = av_fetch(array, i, 0);
208 15 50         SV *elem = svp ? *svp : &PL_sv_undef;
209 15           sv_setsv(sv_dollar_underscore, elem);
210 15           MULTICALL;
211 15 100         if (!SvTRUEx(*PL_stack_sp)) {
212 3           val = &PL_sv_no;
213 3           break;
214             }
215             }
216 6 50         POP_MULTICALL;
217             }
218             else {
219 0 0         for (i = 0; i < len; i++) {
220 0           SV **svp = av_fetch(array, i, 0);
221 0 0         SV *elem = svp ? *svp : &PL_sv_undef;
222 0           sv_setsv(sv_dollar_underscore, elem);
223 0 0         PUSHMARK(SP);
224 0           call_sv((SV*)callback, G_SCALAR);
225 0 0         if (!SvTRUEx(*PL_stack_sp)) {
226 0           val = &PL_sv_no;
227 0           break;
228             }
229             }
230             }
231              
232 6 50         FREETMPS;
233 6           SAVETMPS;
234              
235 6 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
236             }
237              
238             #### array : any
239              
240             void
241             shvxs_array_any (SV *invocant, ...)
242             CODE:
243             {
244             dTHX;
245 9           dSP;
246              
247 9           UNPACK_SIG(shvxs_array_CALLBACK_SIG);
248 9 50         GET_ARRAY_FROM_SOURCE;
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
249              
250 9 100         GET_CALLBACK_FROM_SOURCE(1);
    50          
    0          
    0          
    0          
    50          
    50          
    50          
251 9 100         if ( items != ( has_callback ? 1 : 2 ) ) croak(WRONG_NUMBER_OF_PARAMETERS);
    50          
252              
253 9           val = &PL_sv_no;
254              
255 9           SV *sv_dollar_underscore = get_sv("_", 0);
256 9           I32 len = av_len(array) + 1;
257             I32 i;
258              
259 9 50         if ( DO_MULTICALL && !CvISXSUB(callback) ) {
260             dMULTICALL;
261 9           U8 gimme = G_SCALAR;
262 9 50         PUSH_MULTICALL(callback);
263 39 100         for (i = 0; i < len; i++) {
264 36           SV **svp = av_fetch(array, i, 0);
265 36 50         SV *elem = svp ? *svp : &PL_sv_undef;
266 36           sv_setsv(sv_dollar_underscore, elem);
267 36           MULTICALL;
268 36 100         if (SvTRUEx(*PL_stack_sp)) {
269 6           val = &PL_sv_yes;
270 6           break;
271             }
272             }
273 9 50         POP_MULTICALL;
274             }
275             else {
276 0 0         for (i = 0; i < len; i++) {
277 0           SV **svp = av_fetch(array, i, 0);
278 0 0         SV *elem = svp ? *svp : &PL_sv_undef;
279 0           sv_setsv(sv_dollar_underscore, elem);
280 0 0         PUSHMARK(SP);
281 0           call_sv((SV*)callback, G_SCALAR);
282 0 0         if (SvTRUEx(*PL_stack_sp)) {
283 0           val = &PL_sv_yes;
284 0           break;
285             }
286             }
287             }
288              
289 9 50         FREETMPS;
290 9           SAVETMPS;
291              
292 9 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
293             }
294              
295             #### array : clear
296              
297             void
298             shvxs_array_clear (SV *invocant, ...)
299             CODE:
300             {
301             dTHX;
302 1           dSP;
303              
304 1 50         if ( items > 1 ) croak(WRONG_NUMBER_OF_PARAMETERS);
305              
306 1           UNPACK_SIG(shvxs_array_SIMPLE_SIG);
307 1 50         GET_ARRAY_FROM_SOURCE;
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
308              
309 1           av_clear(array);
310              
311 1 50         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
312             }
313              
314             #### array : count
315              
316             void
317             shvxs_array_count (SV *invocant, ...)
318             CODE:
319             {
320             dTHX;
321 3           dSP;
322              
323 3 50         if ( items > 1 ) croak(WRONG_NUMBER_OF_PARAMETERS);
324              
325 3           UNPACK_SIG(shvxs_array_SIMPLE_SIG);
326 3 50         GET_ARRAY_FROM_SOURCE;
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    0          
327              
328 3           SETVAL_INT( av_len(array) + 1 );
329            
330 3 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
331             }
332              
333             #### array : first
334              
335             void
336             shvxs_array_first (SV *invocant, ...)
337             CODE:
338             {
339             dTHX;
340 6           dSP;
341              
342 6           UNPACK_SIG(shvxs_array_CALLBACK_SIG);
343 6 50         GET_ARRAY_FROM_SOURCE;
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
344              
345 6 100         GET_CALLBACK_FROM_SOURCE(1);
    50          
    0          
    0          
    0          
    50          
    50          
    50          
346 6 100         if ( items != ( has_callback ? 1 : 2 ) ) croak(WRONG_NUMBER_OF_PARAMETERS);
    50          
347              
348 6           val = &PL_sv_undef;
349              
350 6           SV *sv_dollar_underscore = get_sv("_", 0);
351 6           I32 len = av_len(array) + 1;
352             I32 i;
353              
354 6 50         if ( DO_MULTICALL && !CvISXSUB(callback) ) {
355             dMULTICALL;
356 6           U8 gimme = G_SCALAR;
357 6 50         PUSH_MULTICALL(callback);
358 24 100         for (i = 0; i < len; i++) {
359 21           SV **svp = av_fetch(array, i, 0);
360 21 50         SV *elem = svp ? *svp : &PL_sv_undef;
361 21           sv_setsv(sv_dollar_underscore, elem);
362 21           MULTICALL;
363 21 100         if (SvTRUEx(*PL_stack_sp)) {
364 3           val = newSVsv(*svp);
365 3           break;
366             }
367             }
368 6 50         POP_MULTICALL;
369             }
370             else {
371 0 0         for (i = 0; i < len; i++) {
372 0           SV **svp = av_fetch(array, i, 0);
373 0 0         if (!svp) continue;
374 0 0         SV *elem = svp ? *svp : &PL_sv_undef;
375 0           sv_setsv(sv_dollar_underscore, elem);
376 0 0         PUSHMARK(SP);
377 0           call_sv((SV*)callback, G_SCALAR);
378 0 0         if (SvTRUEx(*PL_stack_sp)) {
379 0           val = newSVsv(*svp);
380 0           break;
381             }
382             }
383             }
384              
385 6 50         FREETMPS;
386 6           SAVETMPS;
387              
388 6 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
389             }
390              
391             #### array : for_each
392              
393             void
394             shvxs_array_for_each (SV *invocant, ...)
395             CODE:
396             {
397             dTHX;
398 4           dSP;
399              
400 4           UNPACK_SIG(shvxs_array_CALLBACK_SIG);
401 4 50         GET_ARRAY_FROM_SOURCE;
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    0          
402              
403 4 100         GET_CALLBACK_FROM_SOURCE(1);
    50          
    0          
    0          
    0          
    50          
    50          
    50          
404 4 100         if ( items != ( has_callback ? 1 : 2 ) ) croak(WRONG_NUMBER_OF_PARAMETERS);
    50          
405              
406 4           SV *sv_dollar_underscore = get_sv("_", 0);
407 4           SV *ixsv = sv_2mortal(newSViv(0));
408 4           I32 len = av_len(array) + 1;
409             I32 i;
410              
411 4           ENTER;
412 4           SAVETMPS;
413              
414 29 100         for (i = 0; i < len; i++) {
415 25           SV **svp = av_fetch(array, i, 0);
416 25 50         if (!svp) continue;
417 25           SV *elem = *svp;
418 25           sv_setsv(sv_dollar_underscore, elem);
419 25           sv_setiv(ixsv, i);
420              
421 25 50         PUSHMARK(SP);
422 25 50         XPUSHs(elem);
423 25 50         XPUSHs(ixsv);
424 25           PUTBACK;
425              
426 25           call_sv((SV*)callback, G_VOID | G_DISCARD);
427 25           SPAGAIN;
428              
429 25 50         FREETMPS;
430 25           SAVETMPS;
431             }
432              
433 4 50         FREETMPS;
434 4           LEAVE;
435              
436 4 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
437             }
438              
439             #### array : for_each2
440              
441             void
442             shvxs_array_for_each2 (SV *invocant, ...)
443             CODE:
444             {
445             dTHX;
446 1           dSP;
447              
448 1           UNPACK_SIG(shvxs_array_CALLBACK_SIG);
449 1 50         GET_ARRAY_FROM_SOURCE;
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
450              
451 1 50         GET_CALLBACK_FROM_SOURCE(1);
    0          
    0          
    0          
    0          
    50          
    50          
    50          
452 1 50         if ( items != ( has_callback ? 1 : 2 ) ) croak(WRONG_NUMBER_OF_PARAMETERS);
    50          
453              
454 1           SV *sv_dollar_underscore = get_sv("_", 0);
455 1           I32 len = av_len(array) + 1;
456             I32 i;
457              
458 1 50         if ( DO_MULTICALL && !CvISXSUB(callback) ) {
459             dMULTICALL;
460 1           U8 gimme = G_VOID;
461 1 50         PUSH_MULTICALL(callback);
462 5 100         for (i = 0; i < len; i++) {
463 4           SV **svp = av_fetch(array, i, 0);
464 4 50         SV *elem = svp ? *svp : &PL_sv_undef;
465 4           sv_setsv(sv_dollar_underscore, elem);
466 4           MULTICALL;
467             }
468 1 50         POP_MULTICALL;
469             }
470             else {
471 0 0         for (i = 0; i < len; i++) {
472 0           SV **svp = av_fetch(array, i, 0);
473 0 0         if (!svp) continue;
474 0 0         SV *elem = svp ? *svp : &PL_sv_undef;
475 0           sv_setsv(sv_dollar_underscore, elem);
476 0 0         PUSHMARK(SP);
477 0           PUTBACK;
478 0           call_sv((SV*)callback, G_VOID);
479 0           SPAGAIN;
480             }
481             }
482              
483 1 50         FREETMPS;
484 1           SAVETMPS;
485              
486 1 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
487             }
488              
489             #### array : get
490              
491             void
492             shvxs_array_get (SV *invocant, ...)
493             CODE:
494             {
495             dTHX;
496 93           dSP;
497              
498 93           UNPACK_SIG(shvxs_array_INDEX_SIG);
499 93 50         GET_ARRAY_FROM_SOURCE;
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
500              
501 93 100         GET_INDEX_FROM_SOURCE(1);
    50          
    50          
502 93 100         if ( items != ( has_ix ? 1 : 2 ) ) croak(WRONG_NUMBER_OF_PARAMETERS);
    50          
503              
504 93           I32 len = av_len(array) + 1;
505 93           I32 real_ix = ix;
506 93 100         if (real_ix < 0)
507 46           real_ix += len;
508              
509 93 50         if (real_ix < 0 || real_ix >= len) {
    50          
510 0           val = &PL_sv_undef;
511             }
512             else {
513 93           SV **svp = av_fetch(array, real_ix, 0);
514 93 50         val = svp ? *svp : &PL_sv_undef;
515             }
516              
517 93 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
518             }
519              
520             #### array : grep
521              
522             void
523             shvxs_array_grep (SV *invocant, ...)
524             CODE:
525             {
526             dTHX;
527 8           dSP;
528              
529 8           UNPACK_SIG(shvxs_array_CALLBACK_SIG);
530 8 50         GET_ARRAY_FROM_SOURCE;
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
531              
532 8 100         GET_CALLBACK_FROM_SOURCE(1);
    50          
    0          
    0          
    0          
    50          
    50          
    50          
533 8 100         if ( items != ( has_callback ? 1 : 2 ) ) croak(WRONG_NUMBER_OF_PARAMETERS);
    50          
534              
535 8           out = newAV();
536              
537 8           SV *sv_dollar_underscore = get_sv("_", 0);
538 8           I32 len = av_len(array) + 1;
539             I32 i;
540              
541 8 50         if ( DO_MULTICALL && !CvISXSUB(callback) ) {
542             dMULTICALL;
543 8           U8 gimme = G_SCALAR;
544 8 50         PUSH_MULTICALL(callback);
545 40 100         for (i = 0; i < len; i++) {
546 32           SV **svp = av_fetch(array, i, 0);
547 32 50         SV *elem = svp ? *svp : &PL_sv_undef;
548 32           sv_setsv(sv_dollar_underscore, elem);
549 32           MULTICALL;
550 32 100         if (SvTRUEx(*PL_stack_sp)) {
551 8 50         av_push(out, SV_SAFE_COPY(*svp));
    0          
552             }
553             }
554 8 50         POP_MULTICALL;
555             }
556             else {
557 0 0         for (i = 0; i < len; i++) {
558 0           SV **svp = av_fetch(array, i, 0);
559 0 0         if (!svp) continue;
560 0 0         SV *elem = svp ? *svp : &PL_sv_undef;
561 0           sv_setsv(sv_dollar_underscore, elem);
562 0 0         PUSHMARK(SP);
563 0           call_sv((SV*)callback, G_SCALAR);
564 0 0         if (SvTRUEx(*PL_stack_sp)) {
565 0 0         av_push(out, SV_SAFE_COPY(*svp));
    0          
566             }
567             }
568             }
569              
570 8 50         FREETMPS;
571 8           SAVETMPS;
572              
573 12 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    100          
    50          
    100          
    50          
    50          
    50          
    100          
574             }
575              
576             #### array : is_empty
577              
578             void
579             shvxs_array_is_empty (SV *invocant, ...)
580             CODE:
581             {
582             dTHX;
583 4           dSP;
584              
585 4 50         if ( items > 1 ) croak(WRONG_NUMBER_OF_PARAMETERS);
586              
587 4           UNPACK_SIG(shvxs_array_SIMPLE_SIG);
588 4 50         GET_ARRAY_FROM_SOURCE;
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
589              
590 4 100         SETVAL_BOOL( av_len(array) < 0 );
591              
592 4 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
593             }
594              
595             #### array : join
596              
597             void
598             shvxs_array_join (SV *invocant, ...)
599             CODE:
600             {
601             dTHX;
602 3           dSP;
603              
604 3           UNPACK_SIG(shvxs_array_SV_SIG);
605 3 50         GET_ARRAY_FROM_SOURCE;
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
606              
607 3 100         MAYBE_GET_CURRIED_SV_FROM_SOURCE(1);
    100          
608 3 100         if ( items > ( has_curried_sv ? 1 : 2 ) ) croak(WRONG_NUMBER_OF_PARAMETERS);
    50          
609              
610 3 100         SV* joiner = curried_sv ? curried_sv : sv_2mortal(newSVpv(",", 1));
611 3 50         if ( !joiner || !SvOK(joiner) || SvROK(joiner) || isGV(joiner) ) {
    50          
    50          
    50          
612 0 0         if ( has_curried_sv ) type_error(joiner, "$curried", 0, TYPE_BASE_STR, NULL);
613 0           type_error(joiner, "$_", 1, TYPE_BASE_STR, NULL);
614             }
615              
616             STRLEN sep_len;
617 3           const char *sep = SvPV(joiner, sep_len);
618              
619 3           val = newSVpv("", 0);
620              
621 3           I32 len = av_len(array) + 1;
622             I32 i;
623              
624 15 100         for (i = 0; i < len; i++) {
625 12           SV **svp = av_fetch(array, i, 0);
626              
627 12 100         if (i > 0)
628 9           sv_catpvn(val, sep, sep_len);
629              
630 12 50         if (svp && SvOK(*svp)) {
    50          
631             STRLEN l;
632 12           const char *p = SvPV(*svp, l);
633 12           sv_catpvn(val, p, l);
634             }
635             }
636              
637 3 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
638             }
639              
640             #### array : map
641              
642             void
643             shvxs_array_map (SV *invocant, ...)
644             CODE:
645             {
646             dTHX;
647 5           dSP;
648              
649 5           UNPACK_SIG(shvxs_array_CALLBACK_SIG);
650 5 50         GET_ARRAY_FROM_SOURCE;
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
651              
652 5 100         GET_CALLBACK_FROM_SOURCE(1);
    50          
    0          
    0          
    0          
    50          
    50          
    50          
653 5 100         if ( items != ( has_callback ? 1 : 2 ) ) croak(WRONG_NUMBER_OF_PARAMETERS);
    50          
654              
655 5           out = newAV();
656              
657 5           SV *sv_dollar_underscore = get_sv("_", 0);
658 5           I32 len = av_len(array) + 1;
659             I32 i, j;
660              
661 5           ENTER;
662 5           SAVETMPS;
663              
664 20 100         for (i = 0; i < len; i++) {
665 15           SV **svp = av_fetch(array, i, 0);
666 15 50         if (!svp) continue;
667 15           SV *elem = *svp;
668 15           sv_setsv(sv_dollar_underscore, elem);
669              
670 15 50         PUSHMARK(SP);
671 15           PUTBACK;
672              
673 15           I32 count = call_sv((SV *)callback, G_ARRAY);
674 15           SPAGAIN;
675              
676             /* stack is LIFO; preserve order */
677 15 50         if (count > 0) {
678 15           SV **results = SP - count + 1;
679 36 100         for (j = 0; j < count; j++) {
680 21 50         av_push(out, SV_SAFE_COPY(results[j]));
    0          
681             }
682 15           SP -= count;
683             }
684            
685 15           PUTBACK;
686 15 50         FREETMPS;
687 15           SAVETMPS;
688             }
689              
690 5 50         FREETMPS;
691 5           LEAVE;
692              
693 17 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    100          
    50          
    50          
    50          
    50          
    50          
    100          
694             }
695              
696             #### array : none
697              
698             void
699             shvxs_array_none (SV *invocant, ...)
700             CODE:
701             {
702             dTHX;
703 2           dSP;
704              
705 2           UNPACK_SIG(shvxs_array_CALLBACK_SIG);
706 2 50         GET_ARRAY_FROM_SOURCE;
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
707              
708 2 50         GET_CALLBACK_FROM_SOURCE(1);
    0          
    0          
    0          
    0          
    50          
    50          
    50          
709 2 50         if ( items != ( has_callback ? 1 : 2 ) ) croak(WRONG_NUMBER_OF_PARAMETERS);
    50          
710              
711 2           val = &PL_sv_yes;
712              
713 2           SV *sv_dollar_underscore = get_sv("_", 0);
714 2           I32 len = av_len(array) + 1;
715             I32 i;
716              
717 2 50         if ( DO_MULTICALL && !CvISXSUB(callback) ) {
718             dMULTICALL;
719 2           U8 gimme = G_SCALAR;
720 2 50         PUSH_MULTICALL(callback);
721 20 100         for (i = 0; i < len; i++) {
722 19           SV **svp = av_fetch(array, i, 0);
723 19 50         SV *elem = svp ? *svp : &PL_sv_undef;
724 19           sv_setsv(sv_dollar_underscore, elem);
725 19           MULTICALL;
726 19 100         if (SvTRUEx(*PL_stack_sp)) {
727 1           val = &PL_sv_no;
728 1           break;
729             }
730             }
731 2 50         POP_MULTICALL;
732             }
733             else {
734 0 0         for (i = 0; i < len; i++) {
735 0           SV **svp = av_fetch(array, i, 0);
736 0 0         SV *elem = svp ? *svp : &PL_sv_undef;
737 0           sv_setsv(sv_dollar_underscore, elem);
738 0 0         PUSHMARK(SP);
739 0           call_sv((SV*)callback, G_SCALAR);
740 0 0         if (SvTRUEx(*PL_stack_sp)) {
741 0           val = &PL_sv_no;
742 0           break;
743             }
744             }
745             }
746              
747 2 50         FREETMPS;
748 2           SAVETMPS;
749              
750 2 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
751             }
752              
753             #### array : not_all_true
754              
755             void
756             shvxs_array_not_all_true (SV *invocant, ...)
757             CODE:
758             {
759             dTHX;
760 3           dSP;
761              
762 3           UNPACK_SIG(shvxs_array_CALLBACK_SIG);
763 3 50         GET_ARRAY_FROM_SOURCE;
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
764              
765 3 50         GET_CALLBACK_FROM_SOURCE(1);
    0          
    0          
    0          
    0          
    50          
    50          
    50          
766 3 50         if ( items != ( has_callback ? 1 : 2 ) ) croak(WRONG_NUMBER_OF_PARAMETERS);
    50          
767              
768 3           val = &PL_sv_no;
769              
770 3           SV *sv_dollar_underscore = get_sv("_", 0);
771 3           I32 len = av_len(array) + 1;
772             I32 i;
773              
774 3 50         if ( DO_MULTICALL && !CvISXSUB(callback) ) {
775             dMULTICALL;
776 3           U8 gimme = G_SCALAR;
777 3 50         PUSH_MULTICALL(callback);
778 21 100         for (i = 0; i < len; i++) {
779 20           SV **svp = av_fetch(array, i, 0);
780 20 50         SV *elem = svp ? *svp : &PL_sv_undef;
781 20           sv_setsv(sv_dollar_underscore, elem);
782 20           MULTICALL;
783 20 100         if (!SvTRUEx(*PL_stack_sp)) {
784 2           val = &PL_sv_yes;
785 2           break;
786             }
787             }
788 3 50         POP_MULTICALL;
789             }
790             else {
791 0 0         for (i = 0; i < len; i++) {
792 0           SV **svp = av_fetch(array, i, 0);
793 0 0         SV *elem = svp ? *svp : &PL_sv_undef;
794 0           sv_setsv(sv_dollar_underscore, elem);
795 0 0         PUSHMARK(SP);
796 0           call_sv((SV*)callback, G_SCALAR);
797 0 0         if (!SvTRUEx(*PL_stack_sp)) {
798 0           val = &PL_sv_yes;
799 0           break;
800             }
801             }
802             }
803              
804 3 50         FREETMPS;
805 3           SAVETMPS;
806              
807 3 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
808             }
809              
810             #### array : pop
811              
812             void
813             shvxs_array_pop (SV *invocant, ...)
814             CODE:
815             {
816             dTHX;
817 6           dSP;
818              
819 6 50         if ( items > 1 ) croak(WRONG_NUMBER_OF_PARAMETERS);
820              
821 6           UNPACK_SIG(shvxs_array_SIMPLE_SIG);
822 6 50         GET_ARRAY_FROM_SOURCE;
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
823              
824 6           val = (SV*)av_pop(array);
825 6 50         if (val) {
826 6           SvREFCNT_inc(val);
827             }
828             else {
829 0           val = newSV(0);
830             }
831              
832 6 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
833             }
834              
835             #### array : push
836              
837             void
838             shvxs_array_push (SV *invocant, ...)
839             CODE:
840             {
841             dTHX;
842 29           dSP;
843              
844 29           UNPACK_SIG(shvxs_array_NEW_ELEMS_SIG);
845 29 50         GET_ARRAY_FROM_SOURCE;
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    0          
846              
847             bool ok;
848             I32 i;
849 62 100         for (i = 1; i < items; i++) {
850 38           val = ST(i);
851 38 0         CHECK_TYPE(ok, newSVsv(val), sig->element_type, sig->element_type_cv);
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    100          
    100          
    50          
    100          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    0          
    0          
852 38 100         TRY_COERCE_TYPE(ok, val, sig->element_type, sig->element_type_cv, sig->element_coercion_cv);
    100          
    50          
    50          
    50          
    100          
    50          
853 38 100         if (!ok) type_error(val, "$_", i, sig->element_type, sig->element_type_tiny);
854 33 100         av_push(array, SV_SAFE_COPY(val));
    50          
855             }
856              
857 24 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
858             }
859              
860             #### array : reverse
861              
862             void
863             shvxs_array_reverse (SV *invocant, ...)
864             CODE:
865             {
866             dTHX;
867 1           dSP;
868              
869 1 50         if ( items > 1 ) croak(WRONG_NUMBER_OF_PARAMETERS);
870              
871 1           UNPACK_SIG(shvxs_array_SIMPLE_SIG);
872 1 50         GET_ARRAY_FROM_SOURCE;
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
873              
874 1           out = newAV();
875 1           I32 len = av_len(array);
876 1 50         if (len >= 0)
877 1           av_extend(out, len);
878              
879             I32 i;
880             SV **svp;
881 5 100         for (i = len; i >= 0; i--) {
882 4           svp = av_fetch(array, i, 0);
883 4 50         av_push(out, svp ? newSVsv(*svp) : &PL_sv_undef);
884             }
885              
886 5 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    50          
    0          
    50          
    50          
    50          
    50          
    100          
887             }
888              
889             #### array : set
890              
891             void
892             shvxs_array_set (SV *invocant, ...)
893             CODE:
894             {
895             dTHX;
896 59           dSP;
897              
898 59           UNPACK_SIG(shvxs_array_SETTER_SIG);
899 59 50         GET_ARRAY_FROM_SOURCE;
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
900 59 100         GET_INDEX_FROM_SOURCE(1);
    100          
    50          
901 46 100         GET_CURRIED_SV_FROM_SOURCE(has_ix ? 1 : 2);
    100          
    100          
    100          
902              
903 45           I32 expected = 3;
904 45 100         if (has_ix) expected--;
905 45 100         if (has_curried_sv) expected--;
906 45 50         if ( items != expected ) croak(WRONG_NUMBER_OF_PARAMETERS);
907              
908 45           I32 len = av_len(array) + 1;
909 45           I32 real_ix = ix;
910 45 100         if (real_ix < 0)
911 13           real_ix += len;
912              
913 45 50         val = SV_SAFE_COPY(curried_sv);
    0          
914              
915             bool ok;
916 45 0         CHECK_TYPE(ok, val, sig->element_type, sig->element_type_cv);
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    100          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
917 45 100         TRY_COERCE_TYPE(ok, val, sig->element_type, sig->element_type_cv, sig->element_coercion_cv);
    100          
    50          
    50          
    50          
    50          
    50          
918 45 100         if (!ok) {
919 2 50         if ( has_ix && has_curried_sv ) {
    0          
920 0           type_error(val, "$curried", 1, sig->element_type, sig->element_type_tiny);
921             }
922 2 50         else if ( has_curried_sv ) {
923 0           type_error(val, "$curried", 0, sig->element_type, sig->element_type_tiny);
924             }
925 2 50         else if ( has_ix ) {
926 0           type_error(val, "$_", 1, sig->element_type, sig->element_type_tiny);
927             }
928             else {
929 2           type_error(val, "$_", 2, sig->element_type, sig->element_type_tiny);
930             }
931             }
932              
933 43           av_store(array, real_ix, val);
934              
935 43 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
936             }
937              
938             #### array : shift
939              
940             void
941             shvxs_array_shift (SV *invocant, ...)
942             CODE:
943             {
944             dTHX;
945 6           dSP;
946              
947 6 50         if ( items > 1 ) croak(WRONG_NUMBER_OF_PARAMETERS);
948              
949 6           UNPACK_SIG(shvxs_array_SIMPLE_SIG);
950 6 50         GET_ARRAY_FROM_SOURCE;
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
951              
952 6           val = (SV*)av_shift(array);
953 6 50         if (val) {
954 6           SvREFCNT_inc(val);
955             }
956             else {
957 0           val = newSV(0);
958             }
959              
960 6 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
961             }
962              
963             #### array : sort
964              
965             void
966             shvxs_array_sort (SV *invocant, ...)
967             CODE:
968             {
969             dTHX;
970 4           dSP;
971              
972 4           UNPACK_SIG(shvxs_array_CALLBACK_SIG);
973 4 50         GET_ARRAY_FROM_SOURCE;
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
974              
975 4 100         MAYBE_GET_CALLBACK_FROM_SOURCE(1);
    50          
    0          
    0          
    0          
    100          
    50          
    50          
976 4 100         if ( items > ( has_callback ? 1 : 2 ) ) croak(WRONG_NUMBER_OF_PARAMETERS);
    50          
977 4 100         if ( !has_callback && items == 2 && !callback && !IsCodeRef(ST(1)) ) {
    100          
    50          
    0          
    0          
    0          
978 0           type_error(ST(1), "$_", 1, TYPE_BASE_CODEREF, NULL);
979             }
980              
981 4           out = newAV();
982              
983 4           I32 len = av_len(array) + 1;
984 4 50         if (len > 1) {
985 4           SV **elems = (SV **)malloc(len * sizeof(SV *));
986 4 50         if (!elems)
987 0           croak("Out of memory");
988              
989             I32 i;
990 20 100         for (i = 0; i < len; i++) {
991 16           SV **svp = av_fetch(array, i, 0);
992 16 50         elems[i] = svp ? *svp : &PL_sv_undef;
993             }
994              
995             sort_ctx_t ctx;
996             #ifdef USE_ITHREADS
997             ctx.my_perl = my_perl;
998             #endif
999 4           ctx.callback = NULL;
1000 4           ctx.err = NULL;
1001 4 100         if ( callback )
1002 3           ctx.callback = callback;
1003              
1004 4           SHVXS_QSORT(elems, len, sizeof(SV *), &ctx);
1005              
1006 4           av_extend(out, len - 1);
1007              
1008 20 100         for (i = 0; i < len; i++) {
1009 16           av_push(out, newSVsv(elems[i]));
1010             }
1011              
1012 4           free(elems);
1013              
1014 4 50         if (ctx.err) {
1015 0           SV *e = ctx.err;
1016 0           ctx.err = NULL;
1017 0           croak_sv(e);
1018             }
1019             }
1020              
1021 20 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    50          
    0          
    50          
    50          
    50          
    50          
    100          
1022             }
1023              
1024             #### array : unshift
1025              
1026             void
1027             shvxs_array_unshift (SV *invocant, ...)
1028             CODE:
1029             {
1030             dTHX;
1031 6           dSP;
1032              
1033 6           UNPACK_SIG(shvxs_array_NEW_ELEMS_SIG);
1034 6 50         GET_ARRAY_FROM_SOURCE;
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    0          
1035              
1036             bool ok;
1037             I32 i;
1038 16 100         for (i = items - 1; i >= 1; i--) {
1039 10           val = ST(i);
1040 10 0         CHECK_TYPE(ok, newSVsv(val), sig->element_type, sig->element_type_cv);
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1041 10 50         TRY_COERCE_TYPE(ok, val, sig->element_type, sig->element_type_cv, sig->element_coercion_cv);
    0          
    0          
    0          
    0          
    0          
    0          
1042 10 50         if (!ok) type_error(val, "$_", i, sig->element_type, sig->element_type_tiny);
1043 10           av_unshift(array, 1);
1044 10 50         av_store(array, 0, SV_SAFE_COPY(val));
    0          
1045             }
1046              
1047 6 0         RETURN_ARRAY_EXPECTATION;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1048             }
1049              
1050             #### array : INSTALL(SIMPLE)
1051              
1052             void
1053             INSTALL_shvxs_array_SIMPLE(SV *name, SV *href)
1054             ALIAS:
1055             INSTALL_shvxs_array_all = 1
1056             INSTALL_shvxs_array_clear = 2
1057             INSTALL_shvxs_array_count = 3
1058             INSTALL_shvxs_array_is_empty = 4
1059             INSTALL_shvxs_array_pop = 5
1060             INSTALL_shvxs_array_reverse = 6
1061             INSTALL_shvxs_array_shift = 7
1062             CODE:
1063             {
1064             dTHX;
1065              
1066             XSUBADDR_t op;
1067             enum ReturnPattern rp;
1068 19           switch ( ix ) {
1069 12           case 1:
1070 12           op = XS_Sub__HandlesVia__XS_shvxs_array_all;
1071 12           rp = SHOULD_RETURN_OUT;
1072 12           break;
1073 1           case 2:
1074 1           op = XS_Sub__HandlesVia__XS_shvxs_array_clear;
1075 1           rp = SHOULD_RETURN_NOTHING;
1076 1           break;
1077 2           case 3:
1078 2           op = XS_Sub__HandlesVia__XS_shvxs_array_count;
1079 2           rp = SHOULD_RETURN_VAL;
1080 2           break;
1081 1           case 4:
1082 1           op = XS_Sub__HandlesVia__XS_shvxs_array_is_empty;
1083 1           rp = SHOULD_RETURN_VAL;
1084 1           break;
1085 1           case 5:
1086 1           op = XS_Sub__HandlesVia__XS_shvxs_array_pop;
1087 1           rp = SHOULD_RETURN_VAL;
1088 1           break;
1089 1           case 6:
1090 1           op = XS_Sub__HandlesVia__XS_shvxs_array_reverse;
1091 1           rp = SHOULD_RETURN_OUT;
1092 1           break;
1093 1           case 7:
1094 1           op = XS_Sub__HandlesVia__XS_shvxs_array_shift;
1095 1           rp = SHOULD_RETURN_VAL;
1096 1           break;
1097 0           default:
1098 0           croak("PANIC!");
1099             }
1100              
1101             shvxs_array_SIMPLE_SIG *sig;
1102 19           Newxz(sig, 1, shvxs_array_SIMPLE_SIG);
1103 19 50         UNPACKING_HV_FROM_SV (href, hv);
    50          
1104 19 50         UNPACKING_GET_ENUM (hv, sig, arr_source, ARRAY_SRC_INVOCANT, ArraySource);
    50          
1105 19 100         UNPACKING_GET_STRING (hv, sig, arr_source_string, NULL);
    50          
1106 19 50         UNPACKING_GET_STRING (hv, sig, arr_source_fallback, NULL);
    0          
1107 19 100         UNPACKING_GET_I32 (hv, sig, arr_source_index, 0);
    50          
1108 19 100         UNPACKING_GET_ENUM (hv, sig, method_return_pattern, rp, ReturnPattern);
    50          
1109 19 100         UNPACKING_GET_STRING (hv, sig, method_return_class, NULL);
    50          
1110 19 100         UNPACKING_GET_STRING (hv, sig, method_return_constructor, NULL);
    50          
1111              
1112 19           CV *cv = newXS( SvPV_nolen(name), op, (char *)__FILE__ );
1113 19           CvXSUBANY(cv).any_ptr = sig;
1114 19           XSRETURN_EMPTY;
1115             }
1116              
1117             #### array : INSTALL(CALLBACK)
1118              
1119             void
1120             INSTALL_shvxs_array_CALLBACK(SV *name, SV *href)
1121             ALIAS:
1122             INSTALL_shvxs_array_for_each = 1
1123             INSTALL_shvxs_array_grep = 2
1124             INSTALL_shvxs_array_map = 3
1125             INSTALL_shvxs_array_first = 4
1126             INSTALL_shvxs_array_any = 5
1127             INSTALL_shvxs_array_all_true = 6
1128             INSTALL_shvxs_array_sort = 7
1129             INSTALL_shvxs_array_for_each2 = 8
1130             INSTALL_shvxs_array_none = 9
1131             INSTALL_shvxs_array_not_all_true = 10
1132             CODE:
1133             {
1134             dTHX;
1135              
1136             XSUBADDR_t op;
1137             enum ReturnPattern rp;
1138 19           switch ( ix ) {
1139 4           case 1:
1140 4           op = XS_Sub__HandlesVia__XS_shvxs_array_for_each;
1141 4           rp = SHOULD_RETURN_INVOCANT;
1142 4           break;
1143 2           case 2:
1144 2           op = XS_Sub__HandlesVia__XS_shvxs_array_grep;
1145 2           rp = SHOULD_RETURN_OUT;
1146 2           break;
1147 2           case 3:
1148 2           op = XS_Sub__HandlesVia__XS_shvxs_array_map;
1149 2           rp = SHOULD_RETURN_OUT;
1150 2           break;
1151 2           case 4:
1152 2           op = XS_Sub__HandlesVia__XS_shvxs_array_first;
1153 2           rp = SHOULD_RETURN_VAL;
1154 2           break;
1155 2           case 5:
1156 2           op = XS_Sub__HandlesVia__XS_shvxs_array_any;
1157 2           rp = SHOULD_RETURN_VAL;
1158 2           break;
1159 2           case 6:
1160 2           op = XS_Sub__HandlesVia__XS_shvxs_array_all_true;
1161 2           rp = SHOULD_RETURN_VAL;
1162 2           break;
1163 2           case 7:
1164 2           op = XS_Sub__HandlesVia__XS_shvxs_array_sort;
1165 2           rp = SHOULD_RETURN_OUT;
1166 2           break;
1167 1           case 8:
1168 1           op = XS_Sub__HandlesVia__XS_shvxs_array_for_each2;
1169 1           rp = SHOULD_RETURN_INVOCANT;
1170 1           break;
1171 1           case 9:
1172 1           op = XS_Sub__HandlesVia__XS_shvxs_array_none;
1173 1           rp = SHOULD_RETURN_VAL;
1174 1           break;
1175 1           case 10:
1176 1           op = XS_Sub__HandlesVia__XS_shvxs_array_not_all_true;
1177 1           rp = SHOULD_RETURN_VAL;
1178 1           break;
1179 0           default:
1180 0           croak("PANIC!");
1181             }
1182              
1183             shvxs_array_CALLBACK_SIG *sig;
1184 19           Newxz(sig, 1, shvxs_array_CALLBACK_SIG);
1185 19 50         UNPACKING_HV_FROM_SV (href, hv);
    50          
1186 19 50         UNPACKING_GET_ENUM (hv, sig, arr_source, ARRAY_SRC_INVOCANT, ArraySource);
    50          
1187 19 100         UNPACKING_GET_STRING (hv, sig, arr_source_string, NULL);
    50          
1188 19 50         UNPACKING_GET_STRING (hv, sig, arr_source_fallback, NULL);
    0          
1189 19 50         UNPACKING_GET_I32 (hv, sig, arr_source_index, 0);
    0          
1190 19 100         UNPACKING_GET_CV (hv, sig, callback);
    50          
    50          
    50          
    0          
    0          
1191 19 50         UNPACKING_GET_ENUM (hv, sig, method_return_pattern, rp, ReturnPattern);
    0          
1192 19 50         UNPACKING_GET_STRING (hv, sig, method_return_class, NULL);
    0          
1193 19 50         UNPACKING_GET_STRING (hv, sig, method_return_constructor, NULL);
    0          
1194              
1195 19           CV *cv = newXS( SvPV_nolen(name), op, (char *)__FILE__ );
1196 19           CvXSUBANY(cv).any_ptr = sig;
1197 19           XSRETURN_EMPTY;
1198             }
1199              
1200             #### array : INSTALL(SV)
1201              
1202             void
1203             INSTALL_shvxs_array_SV(SV *name, SV *href)
1204             ALIAS:
1205             INSTALL_shvxs_array_join = 1
1206             CODE:
1207             {
1208             dTHX;
1209              
1210             XSUBADDR_t op;
1211             enum ReturnPattern rp;
1212 2 50         switch ( ix ) {
1213 2           case 1:
1214 2           op = XS_Sub__HandlesVia__XS_shvxs_array_join;
1215 2           rp = SHOULD_RETURN_VAL;
1216 2           break;
1217 0           default:
1218 0           croak("PANIC!");
1219             }
1220              
1221             shvxs_array_SV_SIG *sig;
1222 2           Newxz(sig, 1, shvxs_array_SV_SIG);
1223 2 50         UNPACKING_HV_FROM_SV (href, hv);
    50          
1224 2 50         UNPACKING_GET_ENUM (hv, sig, arr_source, ARRAY_SRC_INVOCANT, ArraySource);
    50          
1225 2 50         UNPACKING_GET_STRING (hv, sig, arr_source_string, NULL);
    0          
1226 2 50         UNPACKING_GET_STRING (hv, sig, arr_source_fallback, NULL);
    0          
1227 2 50         UNPACKING_GET_I32 (hv, sig, arr_source_index, 0);
    0          
1228 2 100         UNPACKING_MAYBE_SV (hv, sig, curried_sv, has_curried_sv);
    50          
    50          
    0          
1229 2 50         UNPACKING_GET_ENUM (hv, sig, method_return_pattern, rp, ReturnPattern);
    0          
1230 2 50         UNPACKING_GET_STRING (hv, sig, method_return_class, NULL);
    0          
1231 2 50         UNPACKING_GET_STRING (hv, sig, method_return_constructor, NULL);
    0          
1232              
1233 2           CV *cv = newXS( SvPV_nolen(name), op, (char *)__FILE__ );
1234 2           CvXSUBANY(cv).any_ptr = sig;
1235 2           XSRETURN_EMPTY;
1236             }
1237              
1238             #### array : INSTALL(NEW_ELEMS)
1239              
1240             void
1241             INSTALL_shvxs_array_NEW_ELEMS(SV *name, SV *href)
1242             ALIAS:
1243             INSTALL_shvxs_array_push = 1
1244             INSTALL_shvxs_array_unshift = 2
1245             CODE:
1246             {
1247             dTHX;
1248              
1249             XSUBADDR_t op;
1250             enum ReturnPattern rp;
1251 10           switch ( ix ) {
1252 8           case 1:
1253 8           op = XS_Sub__HandlesVia__XS_shvxs_array_push;
1254 8           rp = SHOULD_RETURN_COUNT;
1255 8           break;
1256 2           case 2:
1257 2           op = XS_Sub__HandlesVia__XS_shvxs_array_unshift;
1258 2           rp = SHOULD_RETURN_COUNT;
1259 2           break;
1260 0           default:
1261 0           croak("PANIC!");
1262             }
1263              
1264             shvxs_array_NEW_ELEMS_SIG *sig;
1265 10           Newxz(sig, 1, shvxs_array_NEW_ELEMS_SIG);
1266 10 50         UNPACKING_HV_FROM_SV (href, hv);
    50          
1267 10 50         UNPACKING_GET_ENUM (hv, sig, arr_source, ARRAY_SRC_INVOCANT, ArraySource);
    50          
1268 10 100         UNPACKING_GET_STRING (hv, sig, arr_source_string, NULL);
    50          
1269 10 50         UNPACKING_GET_STRING (hv, sig, arr_source_fallback, NULL);
    0          
1270 10 50         UNPACKING_GET_I32 (hv, sig, arr_source_index, 0);
    0          
1271 10 100         UNPACKING_GET_I32 (hv, sig, element_type, TYPE_BASE_ANY);
    50          
1272 10 100         UNPACKING_GET_CV (hv, sig, element_type_cv);
    50          
    50          
    50          
    0          
    0          
1273 10 100         UNPACKING_MAYBE_SV (hv, sig, element_type_tiny, has_element_type_tiny);
    50          
    50          
    50          
1274 10 100         UNPACKING_GET_CV (hv, sig, element_coercion_cv);
    50          
    50          
    50          
    0          
    0          
1275 10 100         UNPACKING_GET_ENUM (hv, sig, method_return_pattern, rp, ReturnPattern);
    50          
1276 10 50         UNPACKING_GET_STRING (hv, sig, method_return_class, NULL);
    0          
1277 10 50         UNPACKING_GET_STRING (hv, sig, method_return_constructor, NULL);
    0          
1278              
1279 10 100         if (sig->element_type != TYPE_BASE_ANY && sig->element_type_cv == NULL) {
    50          
1280 0           croak("element_type_cv is required unless element_type is TYPE_BASE_ANY");
1281             }
1282              
1283 10           CV *cv = newXS( SvPV_nolen(name), op, (char *)__FILE__ );
1284 10           CvXSUBANY(cv).any_ptr = sig;
1285 10           XSRETURN_EMPTY;
1286             }
1287              
1288             #### array : INSTALL(INDEX)
1289              
1290             void
1291             INSTALL_shvxs_array_INDEX(SV *name, SV *href)
1292             ALIAS:
1293             INSTALL_shvxs_array_get = 1
1294             INSTALL_shvxs_array_peek = 2
1295             INSTALL_shvxs_array_peekend = 3
1296             CODE:
1297             {
1298             dTHX;
1299              
1300             XSUBADDR_t op;
1301             enum ReturnPattern rp;
1302 8 50         switch ( ix ) {
1303 8           case 1:
1304             case 2:
1305             case 3:
1306 8           op = XS_Sub__HandlesVia__XS_shvxs_array_get;
1307 8           rp = SHOULD_RETURN_VAL;
1308 8           break;
1309 0           default:
1310 0           croak("PANIC!");
1311             }
1312              
1313             shvxs_array_INDEX_SIG *sig;
1314 8           Newxz(sig, 1, shvxs_array_INDEX_SIG);
1315 8 50         UNPACKING_HV_FROM_SV (href, hv);
    50          
1316 8 50         UNPACKING_GET_ENUM (hv, sig, arr_source, ARRAY_SRC_INVOCANT, ArraySource);
    50          
1317 8 100         UNPACKING_GET_STRING (hv, sig, arr_source_string, NULL);
    50          
1318 8 50         UNPACKING_GET_STRING (hv, sig, arr_source_fallback, NULL);
    0          
1319 8 100         UNPACKING_GET_I32 (hv, sig, arr_source_index, 0);
    50          
1320 8 100         UNPACKING_MAYBE_I32 (hv, sig, index, has_index);
    50          
1321 8 50         UNPACKING_GET_ENUM (hv, sig, method_return_pattern, rp, ReturnPattern);
    0          
1322 8 50         UNPACKING_GET_STRING (hv, sig, method_return_class, NULL);
    0          
1323 8 50         UNPACKING_GET_STRING (hv, sig, method_return_constructor, NULL);
    0          
1324              
1325 8 100         if ( ix == 2 ) {
1326 1           sig->has_index = TRUE;
1327 1           sig->index = 0;
1328             }
1329 7 100         else if ( ix == 3 ) {
1330 1           sig->has_index = TRUE;
1331 1           sig->index = -1;
1332             }
1333              
1334 8           CV *cv = newXS( SvPV_nolen(name), op, (char *)__FILE__ );
1335 8           CvXSUBANY(cv).any_ptr = sig;
1336 8           XSRETURN_EMPTY;
1337             }
1338              
1339             #### array : INSTALL(SETTER)
1340              
1341             void
1342             INSTALL_shvxs_array_SETTER(SV *name, SV *href)
1343             ALIAS:
1344             INSTALL_shvxs_array_set = 1
1345             INSTALL_shvxs_array_accessor = 2
1346             CODE:
1347             {
1348             dTHX;
1349              
1350             XSUBADDR_t op;
1351             enum ReturnPattern rp;
1352 21           switch ( ix ) {
1353 9           case 1:
1354 9           op = XS_Sub__HandlesVia__XS_shvxs_array_set;
1355 9           rp = SHOULD_RETURN_VAL;
1356 9           break;
1357 12           case 2:
1358 12           op = XS_Sub__HandlesVia__XS_shvxs_array_accessor;
1359 12           rp = SHOULD_RETURN_VAL;
1360 12           break;
1361 0           default:
1362 0           croak("PANIC!");
1363             }
1364              
1365             shvxs_array_SETTER_SIG *sig;
1366 21           Newxz(sig, 1, shvxs_array_SETTER_SIG);
1367 21 50         UNPACKING_HV_FROM_SV (href, hv);
    50          
1368 21 50         UNPACKING_GET_ENUM (hv, sig, arr_source, ARRAY_SRC_INVOCANT, ArraySource);
    50          
1369 21 100         UNPACKING_GET_STRING (hv, sig, arr_source_string, NULL);
    50          
1370 21 100         UNPACKING_GET_STRING (hv, sig, arr_source_fallback, NULL);
    50          
1371 21 100         UNPACKING_GET_I32 (hv, sig, arr_source_index, 0);
    50          
1372 21 100         UNPACKING_MAYBE_I32 (hv, sig, index, has_index);
    50          
1373 21 100         UNPACKING_MAYBE_SV (hv, sig, curried_sv, has_curried_sv);
    50          
    50          
    0          
1374 21 100         UNPACKING_GET_I32 (hv, sig, element_type, TYPE_BASE_ANY);
    50          
1375 21 100         UNPACKING_GET_CV (hv, sig, element_type_cv);
    50          
    50          
    50          
    0          
    0          
1376 21 50         UNPACKING_MAYBE_SV (hv, sig, element_type_tiny, has_element_type_tiny);
    0          
    0          
    0          
1377 21 100         UNPACKING_GET_CV (hv, sig, element_coercion_cv);
    50          
    50          
    50          
    0          
    0          
1378 21 50         UNPACKING_GET_ENUM (hv, sig, method_return_pattern, rp, ReturnPattern);
    0          
1379 21 50         UNPACKING_GET_STRING (hv, sig, method_return_class, NULL);
    0          
1380 21 50         UNPACKING_GET_STRING (hv, sig, method_return_constructor, NULL);
    0          
1381              
1382 21 100         if (sig->element_type != TYPE_BASE_ANY && sig->element_type_cv == NULL) {
    50          
1383 0           croak("element_type_cv is required unless element_type is TYPE_BASE_ANY");
1384             }
1385              
1386 21           CV *cv = newXS( SvPV_nolen(name), op, (char *)__FILE__ );
1387 21           CvXSUBANY(cv).any_ptr = sig;
1388 21           XSRETURN_EMPTY;
1389             }
1390              
1391             #### string : append
1392              
1393             void
1394             shvxs_string_append (SV *invocant, ...)
1395             CODE:
1396             {
1397             dTHX;
1398 25           dSP;
1399              
1400 25           UNPACK_SIG(shvxs_string_SETTER_SIG);
1401 25 50         GET_STRING_FROM_SOURCE;
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
1402 25 100         GET_CURRIED_SV_FROM_SOURCE(1);
    50          
1403 25 100         COMMON_STRING_PARAM_COUNT_CHECK;
    50          
    100          
    50          
1404 25 50         CHECK_CURRIED_SV_IS_STRING;
    50          
    50          
    50          
    0          
    50          
1405              
1406 25           SV *tmp = newSVsv(string);
1407 25           SvREFCNT_inc(tmp);
1408 25           sv_catsv(tmp, curried_sv);
1409              
1410 25 0         CHECK_TYPE(ok, tmp, sig->type, sig->type_cv);
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1411 25 50         TRY_COERCE_TYPE(ok, tmp, sig->type, sig->type_cv, sig->coercion_cv);
    0          
    0          
    0          
    0          
    0          
    0          
1412 25 50         if (!ok) type_error(tmp, "$newvalue", -1, sig->type, sig->type_tiny);
1413              
1414 25 50         SET_STRING(tmp);
    100          
    50          
    50          
    50          
    50          
    50          
1415 25           SvREFCNT_dec(tmp);
1416              
1417 25 0         RETURN_STRING_EXPECTATION;
1418             }
1419              
1420             #### string : cmp
1421              
1422             void
1423             shvxs_string_cmp (SV *invocant, ...)
1424             CODE:
1425             {
1426             dTHX;
1427 5           dSP;
1428              
1429 5           UNPACK_SIG(shvxs_string_CMP_SIG);
1430 5 0         GET_STRING_FROM_SOURCE;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1431 5 50         GET_CURRIED_SV_FROM_SOURCE(1);
    50          
1432 5 50         COMMON_STRING_PARAM_COUNT_CHECK;
    0          
    50          
    50          
1433 5 50         CHECK_CURRIED_SV_IS_STRING;
    50          
    50          
    50          
    0          
    50          
1434              
1435 5           SETVAL_INT( sv_cmp(string, curried_sv) );
1436              
1437 5 0         RETURN_STRING_EXPECTATION;
1438             }
1439              
1440             #### string : cmpi
1441              
1442             void
1443             shvxs_string_cmpi (SV *invocant, ...)
1444             CODE:
1445             {
1446             dTHX;
1447 5           dSP;
1448              
1449 5           UNPACK_SIG(shvxs_string_CMP_SIG);
1450 5 0         GET_STRING_FROM_SOURCE;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1451 5 50         GET_CURRIED_SV_FROM_SOURCE(1);
    50          
1452 5 50         COMMON_STRING_PARAM_COUNT_CHECK;
    0          
    50          
    50          
1453 5 50         CHECK_CURRIED_SV_IS_STRING;
    50          
    50          
    50          
    0          
    50          
1454              
1455 5           SETVAL_INT( SV_CMP_CI(string, curried_sv) );
1456              
1457 5 0         RETURN_STRING_EXPECTATION;
1458             }
1459              
1460             #### string : eq
1461              
1462             void
1463             shvxs_string_eq (SV *invocant, ...)
1464             CODE:
1465             {
1466             dTHX;
1467 6           dSP;
1468              
1469 6           UNPACK_SIG(shvxs_string_CMP_SIG);
1470 6 0         GET_STRING_FROM_SOURCE;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1471 6 100         GET_CURRIED_SV_FROM_SOURCE(1);
    50          
1472 6 100         COMMON_STRING_PARAM_COUNT_CHECK;
    50          
    100          
    50          
1473 6 50         CHECK_CURRIED_SV_IS_STRING;
    50          
    50          
    50          
    0          
    50          
1474              
1475 6 100         SETVAL_BOOL( sv_eq(string, curried_sv) );
1476              
1477 6 0         RETURN_STRING_EXPECTATION;
1478             }
1479              
1480             #### string : eqi
1481              
1482             void
1483             shvxs_string_eqi (SV *invocant, ...)
1484             CODE:
1485             {
1486             dTHX;
1487 6           dSP;
1488              
1489 6           UNPACK_SIG(shvxs_string_CMP_SIG);
1490 6 0         GET_STRING_FROM_SOURCE;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1491 6 100         GET_CURRIED_SV_FROM_SOURCE(1);
    50          
1492 6 100         COMMON_STRING_PARAM_COUNT_CHECK;
    50          
    100          
    50          
1493 6 50         CHECK_CURRIED_SV_IS_STRING;
    50          
    50          
    50          
    0          
    50          
1494              
1495 6 100         SETVAL_BOOL( SV_CMP_CI(string, curried_sv)==0 );
1496              
1497 6 0         RETURN_STRING_EXPECTATION;
1498             }
1499              
1500             #### string : ge
1501              
1502             void
1503             shvxs_string_ge (SV *invocant, ...)
1504             CODE:
1505             {
1506             dTHX;
1507 7           dSP;
1508              
1509 7           UNPACK_SIG(shvxs_string_CMP_SIG);
1510 7 0         GET_STRING_FROM_SOURCE;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1511 7 50         GET_CURRIED_SV_FROM_SOURCE(1);
    50          
1512 7 50         COMMON_STRING_PARAM_COUNT_CHECK;
    0          
    50          
    50          
1513 7 50         CHECK_CURRIED_SV_IS_STRING;
    50          
    50          
    50          
    0          
    50          
1514              
1515 7 100         SETVAL_BOOL( sv_cmp(string, curried_sv) >= 0 );
1516              
1517 7 0         RETURN_STRING_EXPECTATION;
1518             }
1519              
1520             #### string : gei
1521              
1522             void
1523             shvxs_string_gei (SV *invocant, ...)
1524             CODE:
1525             {
1526             dTHX;
1527 7           dSP;
1528              
1529 7           UNPACK_SIG(shvxs_string_CMP_SIG);
1530 7 0         GET_STRING_FROM_SOURCE;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1531 7 50         GET_CURRIED_SV_FROM_SOURCE(1);
    50          
1532 7 50         COMMON_STRING_PARAM_COUNT_CHECK;
    0          
    50          
    50          
1533 7 50         CHECK_CURRIED_SV_IS_STRING;
    50          
    50          
    50          
    0          
    50          
1534              
1535 7 100         SETVAL_BOOL( SV_CMP_CI(string, curried_sv) >= 0 );
1536              
1537 7 0         RETURN_STRING_EXPECTATION;
1538             }
1539              
1540             #### string : gt
1541              
1542             void
1543             shvxs_string_gt (SV *invocant, ...)
1544             CODE:
1545             {
1546             dTHX;
1547 7           dSP;
1548              
1549 7           UNPACK_SIG(shvxs_string_CMP_SIG);
1550 7 0         GET_STRING_FROM_SOURCE;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1551 7 50         GET_CURRIED_SV_FROM_SOURCE(1);
    50          
1552 7 50         COMMON_STRING_PARAM_COUNT_CHECK;
    0          
    50          
    50          
1553 7 50         CHECK_CURRIED_SV_IS_STRING;
    50          
    50          
    50          
    0          
    50          
1554              
1555 7 100         SETVAL_BOOL( sv_cmp(string, curried_sv) > 0 );
1556              
1557 7 0         RETURN_STRING_EXPECTATION;
1558             }
1559              
1560             #### string : gti
1561              
1562             void
1563             shvxs_string_gti (SV *invocant, ...)
1564             CODE:
1565             {
1566             dTHX;
1567 7           dSP;
1568              
1569 7           UNPACK_SIG(shvxs_string_CMP_SIG);
1570 7 0         GET_STRING_FROM_SOURCE;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1571 7 50         GET_CURRIED_SV_FROM_SOURCE(1);
    50          
1572 7 50         COMMON_STRING_PARAM_COUNT_CHECK;
    0          
    50          
    50          
1573 7 50         CHECK_CURRIED_SV_IS_STRING;
    50          
    50          
    50          
    0          
    50          
1574              
1575 7 100         SETVAL_BOOL( SV_CMP_CI(string, curried_sv) > 0 );
1576              
1577 7 0         RETURN_STRING_EXPECTATION;
1578             }
1579              
1580             #### string : le
1581              
1582             void
1583             shvxs_string_le (SV *invocant, ...)
1584             CODE:
1585             {
1586             dTHX;
1587 7           dSP;
1588              
1589 7           UNPACK_SIG(shvxs_string_CMP_SIG);
1590 7 0         GET_STRING_FROM_SOURCE;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1591 7 50         GET_CURRIED_SV_FROM_SOURCE(1);
    50          
1592 7 50         COMMON_STRING_PARAM_COUNT_CHECK;
    0          
    50          
    50          
1593 7 50         CHECK_CURRIED_SV_IS_STRING;
    50          
    50          
    50          
    0          
    50          
1594              
1595 7 100         SETVAL_BOOL( sv_cmp(string, curried_sv) <= 0 );
1596              
1597 7 0         RETURN_STRING_EXPECTATION;
1598             }
1599              
1600             #### string : lei
1601              
1602             void
1603             shvxs_string_lei (SV *invocant, ...)
1604             CODE:
1605             {
1606             dTHX;
1607 7           dSP;
1608              
1609 7           UNPACK_SIG(shvxs_string_CMP_SIG);
1610 7 0         GET_STRING_FROM_SOURCE;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1611 7 50         GET_CURRIED_SV_FROM_SOURCE(1);
    50          
1612 7 50         COMMON_STRING_PARAM_COUNT_CHECK;
    0          
    50          
    50          
1613 7 50         CHECK_CURRIED_SV_IS_STRING;
    50          
    50          
    50          
    0          
    50          
1614              
1615 7 100         SETVAL_BOOL( SV_CMP_CI(string, curried_sv) <= 0 );
1616              
1617 7 0         RETURN_STRING_EXPECTATION;
1618             }
1619              
1620             #### string : lt
1621              
1622             void
1623             shvxs_string_lt (SV *invocant, ...)
1624             CODE:
1625             {
1626             dTHX;
1627 7           dSP;
1628              
1629 7           UNPACK_SIG(shvxs_string_CMP_SIG);
1630 7 0         GET_STRING_FROM_SOURCE;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1631 7 50         GET_CURRIED_SV_FROM_SOURCE(1);
    50          
1632 7 50         COMMON_STRING_PARAM_COUNT_CHECK;
    0          
    50          
    50          
1633 7 50         CHECK_CURRIED_SV_IS_STRING;
    50          
    50          
    50          
    0          
    50          
1634              
1635 7 100         SETVAL_BOOL( sv_cmp(string, curried_sv) < 0 );
1636              
1637 7 0         RETURN_STRING_EXPECTATION;
1638             }
1639              
1640             #### string : lti
1641              
1642             void
1643             shvxs_string_lti (SV *invocant, ...)
1644             CODE:
1645             {
1646             dTHX;
1647 7           dSP;
1648              
1649 7           UNPACK_SIG(shvxs_string_CMP_SIG);
1650 7 0         GET_STRING_FROM_SOURCE;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1651 7 50         GET_CURRIED_SV_FROM_SOURCE(1);
    50          
1652 7 50         COMMON_STRING_PARAM_COUNT_CHECK;
    0          
    50          
    50          
1653 7 50         CHECK_CURRIED_SV_IS_STRING;
    50          
    50          
    50          
    0          
    50          
1654              
1655 7 100         SETVAL_BOOL( SV_CMP_CI(string, curried_sv) < 0 );
1656              
1657 7 0         RETURN_STRING_EXPECTATION;
1658             }
1659              
1660             #### string : ne
1661              
1662             void
1663             shvxs_string_ne (SV *invocant, ...)
1664             CODE:
1665             {
1666             dTHX;
1667 6           dSP;
1668              
1669 6           UNPACK_SIG(shvxs_string_CMP_SIG);
1670 6 0         GET_STRING_FROM_SOURCE;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1671 6 100         GET_CURRIED_SV_FROM_SOURCE(1);
    50          
1672 6 100         COMMON_STRING_PARAM_COUNT_CHECK;
    50          
    100          
    50          
1673 6 50         CHECK_CURRIED_SV_IS_STRING;
    50          
    50          
    50          
    0          
    50          
1674              
1675 6 100         SETVAL_BOOL( !sv_eq(string, curried_sv) );
1676              
1677 6 0         RETURN_STRING_EXPECTATION;
1678             }
1679              
1680             #### string : nei
1681              
1682             void
1683             shvxs_string_nei (SV *invocant, ...)
1684             CODE:
1685             {
1686             dTHX;
1687 6           dSP;
1688              
1689 6           UNPACK_SIG(shvxs_string_CMP_SIG);
1690 6 0         GET_STRING_FROM_SOURCE;
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1691 6 100         GET_CURRIED_SV_FROM_SOURCE(1);
    50          
1692 6 100         COMMON_STRING_PARAM_COUNT_CHECK;
    50          
    100          
    50          
1693 6 50         CHECK_CURRIED_SV_IS_STRING;
    50          
    50          
    50          
    0          
    50          
1694              
1695 6 100         SETVAL_BOOL( SV_CMP_CI(string, curried_sv)!=0 );
1696              
1697 6 0         RETURN_STRING_EXPECTATION;
1698             }
1699              
1700             #### string : prepend
1701              
1702             void
1703             shvxs_string_prepend (SV *invocant, ...)
1704             CODE:
1705             {
1706             dTHX;
1707 25           dSP;
1708              
1709 25           UNPACK_SIG(shvxs_string_SETTER_SIG);
1710 25 50         GET_STRING_FROM_SOURCE;
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
1711 25 100         GET_CURRIED_SV_FROM_SOURCE(1);
    50          
1712 25 100         COMMON_STRING_PARAM_COUNT_CHECK;
    50          
    100          
    50          
1713 25 50         CHECK_CURRIED_SV_IS_STRING;
    50          
    50          
    50          
    0          
    50          
1714              
1715 25           SV *tmp = newSVsv(curried_sv);
1716 25           SvREFCNT_inc(tmp);
1717 25           sv_catsv(tmp, string);
1718              
1719 25 0         CHECK_TYPE(ok, tmp, sig->type, sig->type_cv);
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1720 25 50         TRY_COERCE_TYPE(ok, tmp, sig->type, sig->type_cv, sig->coercion_cv);
    0          
    0          
    0          
    0          
    0          
    0          
1721 25 50         if (!ok) type_error(tmp, "$newvalue", -1, sig->type, sig->type_tiny);
1722              
1723 25 50         SET_STRING(tmp);
    100          
    50          
    50          
    50          
    50          
    50          
1724 25           SvREFCNT_dec(tmp);
1725              
1726 25 0         RETURN_STRING_EXPECTATION;
1727             }
1728              
1729             #### string : set
1730              
1731             void
1732             shvxs_string_set (SV *invocant, ...)
1733             CODE:
1734             {
1735             dTHX;
1736 20           dSP;
1737              
1738 20           UNPACK_SIG(shvxs_string_SETTER_SIG);
1739 20 50         GET_STRING_FROM_SOURCE;
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
1740 20 50         GET_CURRIED_SV_FROM_SOURCE(1);
    50          
1741 20 50         COMMON_STRING_PARAM_COUNT_CHECK;
    0          
    50          
    50          
1742              
1743             bool ok;
1744 20 0         CHECK_TYPE(ok, curried_sv, sig->type, sig->type_cv);
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1745 20 50         TRY_COERCE_TYPE(ok, curried_sv, sig->type, sig->type_cv, sig->coercion_cv);
    0          
    0          
    0          
    0          
    0          
    0          
1746 20 50         if (!ok) {
1747 0 0         if (has_curried_sv) {
1748 0           type_error(curried_sv, "$curried", 0, sig->type, sig->type_tiny);
1749             }
1750             else {
1751 0           type_error(curried_sv, "$_", 1, sig->type, sig->type_tiny);
1752             }
1753             }
1754              
1755 20 50         SET_STRING(curried_sv);
    100          
    50          
    50          
    50          
    50          
    50          
1756              
1757 20 0         RETURN_STRING_EXPECTATION;
1758             }
1759              
1760             #### string : INSTALL(CMP)
1761              
1762             void
1763             INSTALL_shvxs_string_CMP(SV *name, SV *href)
1764             ALIAS:
1765             INSTALL_shvxs_string_eq = 1
1766             INSTALL_shvxs_string_ne = 2
1767             INSTALL_shvxs_string_gt = 3
1768             INSTALL_shvxs_string_ge = 4
1769             INSTALL_shvxs_string_lt = 5
1770             INSTALL_shvxs_string_le = 6
1771             INSTALL_shvxs_string_cmp = 7
1772             INSTALL_shvxs_string_eqi = 17
1773             INSTALL_shvxs_string_nei = 18
1774             INSTALL_shvxs_string_gti = 19
1775             INSTALL_shvxs_string_gei = 20
1776             INSTALL_shvxs_string_lti = 21
1777             INSTALL_shvxs_string_lei = 22
1778             INSTALL_shvxs_string_cmpi = 23
1779             CODE:
1780             {
1781             dTHX;
1782              
1783             XSUBADDR_t op;
1784             enum ReturnPattern rp;
1785 18           switch ( ix ) {
1786 2           case 1:
1787 2           op = XS_Sub__HandlesVia__XS_shvxs_string_eq;
1788 2           rp = SHOULD_RETURN_VAL;
1789 2           break;
1790 2           case 2:
1791 2           op = XS_Sub__HandlesVia__XS_shvxs_string_ne;
1792 2           rp = SHOULD_RETURN_VAL;
1793 2           break;
1794 1           case 3:
1795 1           op = XS_Sub__HandlesVia__XS_shvxs_string_gt;
1796 1           rp = SHOULD_RETURN_VAL;
1797 1           break;
1798 1           case 4:
1799 1           op = XS_Sub__HandlesVia__XS_shvxs_string_ge;
1800 1           rp = SHOULD_RETURN_VAL;
1801 1           break;
1802 1           case 5:
1803 1           op = XS_Sub__HandlesVia__XS_shvxs_string_lt;
1804 1           rp = SHOULD_RETURN_VAL;
1805 1           break;
1806 1           case 6:
1807 1           op = XS_Sub__HandlesVia__XS_shvxs_string_le;
1808 1           rp = SHOULD_RETURN_VAL;
1809 1           break;
1810 1           case 7:
1811 1           op = XS_Sub__HandlesVia__XS_shvxs_string_cmp;
1812 1           rp = SHOULD_RETURN_VAL;
1813 1           break;
1814 2           case 17:
1815 2           op = XS_Sub__HandlesVia__XS_shvxs_string_eqi;
1816 2           rp = SHOULD_RETURN_VAL;
1817 2           break;
1818 2           case 18:
1819 2           op = XS_Sub__HandlesVia__XS_shvxs_string_nei;
1820 2           rp = SHOULD_RETURN_VAL;
1821 2           break;
1822 1           case 19:
1823 1           op = XS_Sub__HandlesVia__XS_shvxs_string_gti;
1824 1           rp = SHOULD_RETURN_VAL;
1825 1           break;
1826 1           case 20:
1827 1           op = XS_Sub__HandlesVia__XS_shvxs_string_gei;
1828 1           rp = SHOULD_RETURN_VAL;
1829 1           break;
1830 1           case 21:
1831 1           op = XS_Sub__HandlesVia__XS_shvxs_string_lti;
1832 1           rp = SHOULD_RETURN_VAL;
1833 1           break;
1834 1           case 22:
1835 1           op = XS_Sub__HandlesVia__XS_shvxs_string_lei;
1836 1           rp = SHOULD_RETURN_VAL;
1837 1           break;
1838 1           case 23:
1839 1           op = XS_Sub__HandlesVia__XS_shvxs_string_cmpi;
1840 1           rp = SHOULD_RETURN_VAL;
1841 1           break;
1842 0           default:
1843 0           croak("PANIC!");
1844             }
1845              
1846             shvxs_string_CMP_SIG *sig;
1847 18           Newxz(sig, 1, shvxs_string_CMP_SIG);
1848 18 50         UNPACKING_HV_FROM_SV (href, hv);
    50          
1849 18 50         UNPACKING_GET_ENUM (hv, sig, str_source, ARRAY_SRC_INVOCANT, ArraySource);
    50          
1850 18 50         UNPACKING_GET_STRING (hv, sig, str_source_string, NULL);
    0          
1851 18 50         UNPACKING_GET_STRING (hv, sig, str_source_fallback, NULL);
    0          
1852 18 50         UNPACKING_GET_I32 (hv, sig, str_source_index, 0);
    0          
1853 18 100         UNPACKING_MAYBE_SV (hv, sig, curried_sv, has_curried_sv);
    50          
    50          
    0          
1854 18 50         UNPACKING_GET_ENUM (hv, sig, method_return_pattern, rp, ReturnPattern);
    0          
1855 18 50         UNPACKING_GET_STRING (hv, sig, method_return_class, NULL);
    0          
1856 18 50         UNPACKING_GET_STRING (hv, sig, method_return_constructor, NULL);
    0          
1857              
1858 18           CV *cv = newXS( SvPV_nolen(name), op, (char *)__FILE__ );
1859 18           CvXSUBANY(cv).any_ptr = sig;
1860 18           XSRETURN_EMPTY;
1861             }
1862              
1863             #### string : INSTALL(SETTER)
1864              
1865             void
1866             INSTALL_shvxs_string_SETTER(SV *name, SV *href)
1867             ALIAS:
1868             INSTALL_shvxs_string_set = 1
1869             INSTALL_shvxs_string_append = 2
1870             INSTALL_shvxs_string_prepend = 3
1871             CODE:
1872             {
1873             dTHX;
1874              
1875             XSUBADDR_t op;
1876             enum ReturnPattern rp;
1877 24           switch ( ix ) {
1878 6           case 1:
1879 6           op = XS_Sub__HandlesVia__XS_shvxs_string_set;
1880 6           rp = SHOULD_RETURN_STRING;
1881 6           break;
1882 9           case 2:
1883 9           op = XS_Sub__HandlesVia__XS_shvxs_string_append;
1884 9           rp = SHOULD_RETURN_STRING;
1885 9           break;
1886 9           case 3:
1887 9           op = XS_Sub__HandlesVia__XS_shvxs_string_prepend;
1888 9           rp = SHOULD_RETURN_STRING;
1889 9           break;
1890 0           default:
1891 0           croak("PANIC!");
1892             }
1893              
1894             shvxs_string_SETTER_SIG *sig;
1895 24           Newxz(sig, 1, shvxs_string_SETTER_SIG);
1896 24 50         UNPACKING_HV_FROM_SV (href, hv);
    50          
1897 24 50         UNPACKING_GET_ENUM (hv, sig, str_source, ARRAY_SRC_INVOCANT, ArraySource);
    50          
1898 24 100         UNPACKING_GET_STRING (hv, sig, str_source_string, NULL);
    50          
1899 24 100         UNPACKING_GET_STRING (hv, sig, str_source_fallback, NULL);
    50          
1900 24 100         UNPACKING_GET_I32 (hv, sig, str_source_index, 0);
    50          
1901 24 100         UNPACKING_MAYBE_SV (hv, sig, curried_sv, has_curried_sv);
    50          
    50          
    0          
1902 24 50         UNPACKING_GET_I32 (hv, sig, type, TYPE_BASE_ANY);
    0          
1903 24 50         UNPACKING_GET_CV (hv, sig, type_cv);
    0          
    0          
    0          
    0          
    0          
1904 24 50         UNPACKING_MAYBE_SV (hv, sig, type_tiny, has_type_tiny);
    0          
    0          
    0          
1905 24 50         UNPACKING_GET_CV (hv, sig, coercion_cv);
    0          
    0          
    0          
    0          
    0          
1906 24 100         UNPACKING_GET_ENUM (hv, sig, method_return_pattern, rp, ReturnPattern);
    50          
1907 24 50         UNPACKING_GET_STRING (hv, sig, method_return_class, NULL);
    0          
1908 24 50         UNPACKING_GET_STRING (hv, sig, method_return_constructor, NULL);
    0          
1909              
1910 24 50         if (sig->type != TYPE_BASE_ANY && sig->type_cv == NULL) {
    0          
1911 0           croak("type_cv is required unless type is TYPE_BASE_ANY");
1912             }
1913              
1914 24           CV *cv = newXS( SvPV_nolen(name), op, (char *)__FILE__ );
1915 24           CvXSUBANY(cv).any_ptr = sig;
1916 24           XSRETURN_EMPTY;
1917             }