1 /* Copyright (c) 1997-2000 Graham Barr <gbarr@pobox.com>. All rights reserved.
2 * This program is free software; you can redistribute it and/or
3 * modify it under the same terms as Perl itself.
5 #define PERL_NO_GET_CONTEXT /* we want efficiency */
10 #define NEED_sv_2pv_flags 1
13 #if PERL_BCDVERSION >= 0x5006000
14 # include "multicall.h"
18 # define CvISXSUB(cv) CvXSUB(cv)
21 /* Some platforms have strict exports. And before 5.7.3 cxinc (or Perl_cxinc)
22 was not exported. Therefore platforms like win32, VMS etc have problems
23 so we redefine it here -- GMB
25 #if PERL_BCDVERSION < 0x5007000
30 # define cxinc() my_cxinc(aTHX)
34 cxstack_max = cxstack_max * 3 / 2;
35 Renew(cxstack, cxstack_max + 1, struct context); /* fencepost bug in older CXINC macros requires +1 here */
36 return cxstack_ix + 1;
41 #define sv_copypv(a, b) my_sv_copypv(aTHX_ a, b)
43 my_sv_copypv(pTHX_ SV *const dsv, SV *const ssv)
46 const char * const s = SvPV_const(ssv,len);
56 # define slu_sv_value(sv) (SvIOK(sv)) ? (SvIOK_UV(sv)) ? (NV)(SvUVX(sv)) : (NV)(SvIVX(sv)) : (SvNV(sv))
58 # define slu_sv_value(sv) (SvIOK(sv)) ? (NV)(SvIVX(sv)) : (SvNV(sv))
61 #if PERL_VERSION < 13 || (PERL_VERSION == 13 && PERL_SUBVERSION < 9)
62 # define PERL_HAS_BAD_MULTICALL_REFCOUNT
65 MODULE=List::Util PACKAGE=List::Util
84 magic = SvAMAGIC(retsv);
86 retval = slu_sv_value(retsv);
88 for(index = 1 ; index < items ; index++) {
89 SV *stacksv = ST(index);
91 if((magic || SvAMAGIC(stacksv)) && (tmpsv = amagic_call(retsv, stacksv, gt_amg, 0))) {
92 if(SvTRUE(tmpsv) ? !ix : ix) {
94 magic = SvAMAGIC(retsv);
96 retval = slu_sv_value(retsv);
101 NV val = slu_sv_value(stacksv);
103 retval = slu_sv_value(retsv);
106 if(val < retval ? !ix : ix) {
132 int is_product = (ix == 2);
136 case 0: XSRETURN_UNDEF;
137 case 1: ST(0) = newSViv(0); XSRETURN(1);
138 case 2: ST(0) = newSViv(1); XSRETURN(1);
142 magic = SvAMAGIC(sv);
148 retval = slu_sv_value(sv);
151 for(index = 1 ; index < items ; index++) {
153 if(!magic && SvAMAGIC(sv)){
157 sv_setnv(retsv,retval);
160 SV *const tmpsv = amagic_call(retsv, sv,
161 is_product ? mult_amg : add_amg,
162 SvAMAGIC(retsv) ? AMGf_assign : 0);
164 magic = SvAMAGIC(tmpsv);
166 retval = slu_sv_value(tmpsv);
173 /* fall back to default */
175 is_product ? (retval = SvNV(retsv) * SvNV(sv))
176 : (retval = SvNV(retsv) + SvNV(sv));
180 is_product ? (retval *= slu_sv_value(sv))
181 : (retval += slu_sv_value(sv));
187 sv_setnv(retsv,retval);
194 #define SLU_CMP_LARGER 1
195 #define SLU_CMP_SMALLER -1
201 minstr = SLU_CMP_LARGER
202 maxstr = SLU_CMP_SMALLER
213 if(MAXARG & OPpLOCALE) {
214 for(index = 1 ; index < items ; index++) {
215 SV *right = ST(index);
216 if(sv_cmp_locale(left, right) == ix)
222 for(index = 1 ; index < items ; index++) {
223 SV *right = ST(index);
224 if(sv_cmp(left, right) == ix)
243 SV *ret = sv_newmortal();
247 SV **args = &PL_stack_base[ax];
248 CV *cv = sv_2cv(block, &stash, &gv, 0);
251 croak("Not a subroutine reference");
256 agv = gv_fetchpv("a", GV_ADD, SVt_PV);
257 bgv = gv_fetchpv("b", GV_ADD, SVt_PV);
261 SvSetSV(ret, args[1]);
265 I32 gimme = G_SCALAR;
268 for(index = 2 ; index < items ; index++) {
269 GvSV(bgv) = args[index];
271 SvSetSV(ret, *PL_stack_sp);
273 # ifdef PERL_HAS_BAD_MULTICALL_REFCOUNT
274 if(CvDEPTH(multicall_cv) > 1)
275 SvREFCNT_inc_simple_void_NN(multicall_cv);
282 for(index = 2 ; index < items ; index++) {
284 GvSV(bgv) = args[index];
287 call_sv((SV*)cv, G_SCALAR);
289 SvSetSV(ret, *PL_stack_sp);
306 SV **args = &PL_stack_base[ax];
307 CV *cv = sv_2cv(block, &stash, &gv, 0);
310 croak("Not a subroutine reference");
315 SAVESPTR(GvSV(PL_defgv));
319 I32 gimme = G_SCALAR;
322 for(index = 1 ; index < items ; index++) {
323 GvSV(PL_defgv) = args[index];
325 if(SvTRUEx(*PL_stack_sp)) {
326 # ifdef PERL_HAS_BAD_MULTICALL_REFCOUNT
327 if(CvDEPTH(multicall_cv) > 1)
328 SvREFCNT_inc_simple_void_NN(multicall_cv);
335 # ifdef PERL_HAS_BAD_MULTICALL_REFCOUNT
336 if(CvDEPTH(multicall_cv) > 1)
337 SvREFCNT_inc_simple_void_NN(multicall_cv);
344 for(index = 1 ; index < items ; index++) {
346 GvSV(PL_defgv) = args[index];
349 call_sv((SV*)cv, G_SCALAR);
350 if(SvTRUEx(*PL_stack_sp)) {
371 int ret_true = !(ix & 2); /* return true at end of loop for none/all; false for any/notall */
372 int invert = (ix & 1); /* invert block test for all/notall */
375 SV **args = &PL_stack_base[ax];
376 CV *cv = sv_2cv(block, &stash, &gv, 0);
379 croak("Not a subroutine reference");
381 SAVESPTR(GvSV(PL_defgv));
385 I32 gimme = G_SCALAR;
389 for(index = 1; index < items; index++) {
390 GvSV(PL_defgv) = args[index];
393 if(SvTRUEx(*PL_stack_sp) ^ invert) {
395 ST(0) = ret_true ? &PL_sv_no : &PL_sv_yes;
405 for(index = 1; index < items; index++) {
407 GvSV(PL_defgv) = args[index];
410 call_sv((SV*)cv, G_SCALAR);
411 if(SvTRUEx(*PL_stack_sp) ^ invert) {
412 ST(0) = ret_true ? &PL_sv_no : &PL_sv_yes;
418 ST(0) = ret_true ? &PL_sv_yes : &PL_sv_no;
430 CV *cv = sv_2cv(block, &stash, &gv, 0);
431 I32 ret_gimme = GIMME_V;
432 int argi = 1; /* "shift" the block */
434 if(!(items % 2) && ckWARN(WARN_MISC))
435 warn("Odd number of elements in pairfirst");
437 agv = gv_fetchpv("a", GV_ADD, SVt_PV);
438 bgv = gv_fetchpv("b", GV_ADD, SVt_PV);
443 /* Since MULTICALL is about to move it */
444 SV **stack = PL_stack_base + ax;
447 I32 gimme = G_SCALAR;
450 for(; argi < items; argi += 2) {
451 SV *a = GvSV(agv) = stack[argi];
452 SV *b = GvSV(bgv) = argi < items-1 ? stack[argi+1] : &PL_sv_undef;
456 if(!SvTRUEx(*PL_stack_sp))
460 if(ret_gimme == G_ARRAY) {
461 ST(0) = sv_mortalcopy(a);
462 ST(1) = sv_mortalcopy(b);
474 for(; argi < items; argi += 2) {
476 SV *a = GvSV(agv) = ST(argi);
477 SV *b = GvSV(bgv) = argi < items-1 ? ST(argi+1) : &PL_sv_undef;
480 call_sv((SV*)cv, G_SCALAR);
484 if(!SvTRUEx(*PL_stack_sp))
487 if(ret_gimme == G_ARRAY) {
488 ST(0) = sv_mortalcopy(a);
489 ST(1) = sv_mortalcopy(b);
508 CV *cv = sv_2cv(block, &stash, &gv, 0);
509 I32 ret_gimme = GIMME_V;
511 /* This function never returns more than it consumed in arguments. So we
512 * can build the results "live", behind the arguments
514 int argi = 1; /* "shift" the block */
517 if(!(items % 2) && ckWARN(WARN_MISC))
518 warn("Odd number of elements in pairgrep");
520 agv = gv_fetchpv("a", GV_ADD, SVt_PV);
521 bgv = gv_fetchpv("b", GV_ADD, SVt_PV);
526 /* Since MULTICALL is about to move it */
527 SV **stack = PL_stack_base + ax;
531 I32 gimme = G_SCALAR;
534 for(; argi < items; argi += 2) {
535 SV *a = GvSV(agv) = stack[argi];
536 SV *b = GvSV(bgv) = argi < items-1 ? stack[argi+1] : &PL_sv_undef;
540 if(SvTRUEx(*PL_stack_sp)) {
541 if(ret_gimme == G_ARRAY) {
542 /* We can't mortalise yet or they'd be mortal too early */
543 stack[reti++] = newSVsv(a);
544 stack[reti++] = newSVsv(b);
546 else if(ret_gimme == G_SCALAR)
552 if(ret_gimme == G_ARRAY)
553 for(i = 0; i < reti; i++)
554 sv_2mortal(stack[i]);
559 for(; argi < items; argi += 2) {
561 SV *a = GvSV(agv) = ST(argi);
562 SV *b = GvSV(bgv) = argi < items-1 ? ST(argi+1) : &PL_sv_undef;
565 call_sv((SV*)cv, G_SCALAR);
569 if(SvTRUEx(*PL_stack_sp)) {
570 if(ret_gimme == G_ARRAY) {
571 ST(reti++) = sv_mortalcopy(a);
572 ST(reti++) = sv_mortalcopy(b);
574 else if(ret_gimme == G_SCALAR)
580 if(ret_gimme == G_ARRAY)
582 else if(ret_gimme == G_SCALAR) {
583 ST(0) = newSViv(reti);
596 CV *cv = sv_2cv(block, &stash, &gv, 0);
597 SV **args_copy = NULL;
598 I32 ret_gimme = GIMME_V;
600 int argi = 1; /* "shift" the block */
603 if(!(items % 2) && ckWARN(WARN_MISC))
604 warn("Odd number of elements in pairmap");
606 agv = gv_fetchpv("a", GV_ADD, SVt_PV);
607 bgv = gv_fetchpv("b", GV_ADD, SVt_PV);
610 /* This MULTICALL-based code appears to fail on perl 5.10.0 and 5.8.9
611 * Skip it on those versions (RT#87857)
613 #if defined(dMULTICALL) && (PERL_BCDVERSION > 0x5010000 || PERL_BCDVERSION < 0x5008009)
615 /* Since MULTICALL is about to move it */
616 SV **stack = PL_stack_base + ax;
617 I32 ret_gimme = GIMME_V;
624 for(; argi < items; argi += 2) {
625 SV *a = GvSV(agv) = args_copy ? args_copy[argi] : stack[argi];
626 SV *b = GvSV(bgv) = argi < items-1 ?
627 (args_copy ? args_copy[argi+1] : stack[argi+1]) :
632 count = PL_stack_sp - PL_stack_base;
634 if(count > 2 && !args_copy) {
635 /* We can't return more than 2 results for a given input pair
636 * without trashing the remaining argmuents on the stack still
637 * to be processed. So, we'll copy them out to a temporary
638 * buffer and work from there instead.
639 * We didn't do this initially because in the common case, most
640 * code blocks will return only 1 or 2 items so it won't be
643 int n_args = items - argi;
644 Newx(args_copy, n_args, SV *);
645 SAVEFREEPV(args_copy);
647 Copy(stack + argi, args_copy, n_args, SV *);
653 for(i = 0; i < count; i++)
654 stack[reti++] = newSVsv(PL_stack_sp[i - count + 1]);
658 if(ret_gimme == G_ARRAY)
659 for(i = 0; i < reti; i++)
660 sv_2mortal(stack[i]);
665 for(; argi < items; argi += 2) {
667 SV *a = GvSV(agv) = args_copy ? args_copy[argi] : ST(argi);
668 SV *b = GvSV(bgv) = argi < items-1 ?
669 (args_copy ? args_copy[argi+1] : ST(argi+1)) :
675 count = call_sv((SV*)cv, G_ARRAY);
679 if(count > 2 && !args_copy && ret_gimme == G_ARRAY) {
680 int n_args = items - argi;
681 Newx(args_copy, n_args, SV *);
682 SAVEFREEPV(args_copy);
684 Copy(&ST(argi), args_copy, n_args, SV *);
690 if(ret_gimme == G_ARRAY)
691 for(i = 0; i < count; i++)
692 ST(reti++) = sv_mortalcopy(SP[i - count + 1]);
700 if(ret_gimme == G_ARRAY)
703 ST(0) = sv_2mortal(newSViv(reti));
715 if(items % 2 && ckWARN(WARN_MISC))
716 warn("Odd number of elements in pairs");
719 for(; argi < items; argi += 2) {
721 SV *b = argi < items-1 ? ST(argi+1) : &PL_sv_undef;
724 av_push(av, newSVsv(a));
725 av_push(av, newSVsv(b));
727 ST(reti++) = sv_2mortal(newRV_noinc((SV *)av));
742 if(items % 2 && ckWARN(WARN_MISC))
743 warn("Odd number of elements in pairkeys");
746 for(; argi < items; argi += 2) {
749 ST(reti++) = sv_2mortal(newSVsv(a));
764 if(items % 2 && ckWARN(WARN_MISC))
765 warn("Odd number of elements in pairvalues");
768 for(; argi < items; argi += 2) {
769 SV *b = argi < items-1 ? ST(argi+1) : &PL_sv_undef;
771 ST(reti++) = sv_2mortal(newSVsv(b));
784 #if (PERL_VERSION < 9)
786 struct op *old_op = PL_op;
788 /* We call pp_rand here so that Drand01 get initialized if rand()
789 or srand() has not already been called
791 memzero((char*)(&dmy_op), sizeof(struct op));
792 /* we let pp_rand() borrow the TARG allocated for this XS sub */
793 dmy_op.op_targ = PL_op->op_targ;
795 (void)*(PL_ppaddr[OP_RAND])(aTHX);
798 /* Initialize Drand01 if rand() or srand() has
799 not already been called
801 if(!PL_srand_called) {
802 (void)seedDrand01((Rand_seed_t)Perl_seed(aTHX));
803 PL_srand_called = TRUE;
807 for (index = items ; index > 1 ; ) {
808 int swap = (int)(Drand01() * (double)(index--));
810 ST(swap) = ST(index);
818 MODULE=List::Util PACKAGE=Scalar::Util
829 (void)SvUPGRADE(TARG, SVt_PVNV);
833 if(SvNOK(num) || SvPOK(num) || SvMAGICAL(num)) {
834 SvNV_set(TARG, SvNV(num));
838 else if(SvUOK(num)) {
839 SvUV_set(TARG, SvUV(num));
845 SvIV_set(TARG, SvIV(num));
849 if(PL_tainting && (SvTAINTED(num) || SvTAINTED(str)))
864 ST(0) = boolSV((SvPOK(sv) || SvPOKp(sv)) && (SvNIOK(sv) || SvNIOKp(sv)));
875 if(!(SvROK(sv) && SvOBJECT(SvRV(sv))))
878 RETVAL = (char*)sv_reftype(SvRV(sv),TRUE);
893 RETVAL = (char*)sv_reftype(SvRV(sv),FALSE);
908 RETVAL = PTR2UV(SvRV(sv));
921 croak("weak references are not implemented in this release of perl");
930 ST(0) = boolSV(SvROK(sv) && SvWEAKREF(sv));
933 croak("weak references are not implemented in this release of perl");
942 RETVAL = SvREADONLY(sv);
952 RETVAL = SvTAINTED(sv);
963 ST(0) = boolSV(SvVOK(sv));
966 croak("vstrings are not implemented in this release of perl");
970 looks_like_number(sv)
976 if(SvAMAGIC(sv) && (tempsv = AMG_CALLun(sv, numer))) {
979 #if PERL_BCDVERSION < 0x5008005
980 if(SvPOK(sv) || SvPOKp(sv)) {
981 RETVAL = looks_like_number(sv);
984 RETVAL = SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
987 RETVAL = looks_like_number(sv);
993 set_prototype(subref, proto)
1000 SV *sv = SvRV(subref);
1001 if(SvTYPE(sv) != SVt_PVCV) {
1002 /* not a subroutine reference */
1003 croak("set_prototype: not a subroutine reference");
1006 /* set the prototype */
1007 sv_copypv(sv, proto);
1010 /* delete the prototype */
1015 croak("set_prototype: not a reference");
1032 /* must be GLOB or IO */
1036 else if(SvTYPE(sv) == SVt_PVIO){
1041 /* real or tied filehandle? */
1042 if(IoIFP(io) || SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar)){
1051 HV *lu_stash = gv_stashpvn("List::Util", 10, TRUE);
1052 GV *rmcgv = *(GV**)hv_fetch(lu_stash, "REAL_MULTICALL", 14, TRUE);
1054 #if !defined(SvWEAKREF) || !defined(SvVOK)
1055 HV *su_stash = gv_stashpvn("Scalar::Util", 12, TRUE);
1056 GV *vargv = *(GV**)hv_fetch(su_stash, "EXPORT_FAIL", 11, TRUE);
1058 if(SvTYPE(vargv) != SVt_PVGV)
1059 gv_init(vargv, su_stash, "Scalar::Util", 12, TRUE);
1060 varav = GvAVn(vargv);
1062 if(SvTYPE(rmcgv) != SVt_PVGV)
1063 gv_init(rmcgv, lu_stash, "List::Util", 10, TRUE);
1064 rmcsv = GvSVn(rmcgv);
1066 av_push(varav, newSVpv("weaken",6));
1067 av_push(varav, newSVpv("isweak",6));
1070 av_push(varav, newSVpv("isvstring",9));
1072 #ifdef REAL_MULTICALL
1073 sv_setsv(rmcsv, &PL_sv_yes);
1075 sv_setsv(rmcsv, &PL_sv_no);