3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 2005, by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * "It's a big house this, and very peculiar. Always a bit more to discover,
13 * and no knowing what you'll find around a corner. And Elves, sir!" --Samwise
16 /* This file contains general pp ("push/pop") functions that execute the
17 * opcodes that make up a perl program. A typical pp function expects to
18 * find its arguments on the stack, and usually pushes its results onto
19 * the stack, hence the 'pp' terminology. Each OP structure contains
20 * a pointer to the relevant pp_foo() function.
30 /* XXX I can't imagine anyone who doesn't have this actually _needs_
31 it, since pid_t is an integral type.
34 #ifdef NEED_GETPID_PROTO
35 extern Pid_t getpid (void);
39 * Some BSDs and Cygwin default to POSIX math instead of IEEE.
40 * This switches them over to IEEE.
42 #if defined(LIBM_LIB_VERSION)
43 _LIB_VERSION_TYPE _LIB_VERSION = _IEEE_;
46 /* variations on pp_null */
51 if (GIMME_V == G_SCALAR)
67 if (PL_op->op_private & OPpLVAL_INTRO)
68 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
70 if (PL_op->op_flags & OPf_REF) {
74 if (GIMME == G_SCALAR)
75 Perl_croak(aTHX_ "Can't return array to lvalue scalar context");
80 if (gimme == G_ARRAY) {
81 const I32 maxarg = AvFILL((AV*)TARG) + 1;
83 if (SvMAGICAL(TARG)) {
85 for (i=0; i < (U32)maxarg; i++) {
86 SV ** const svp = av_fetch((AV*)TARG, i, FALSE);
87 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
91 Copy(AvARRAY((AV*)TARG), SP+1, maxarg, SV*);
95 else if (gimme == G_SCALAR) {
96 SV* const sv = sv_newmortal();
97 const I32 maxarg = AvFILL((AV*)TARG) + 1;
110 if (PL_op->op_private & OPpLVAL_INTRO)
111 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
112 if (PL_op->op_flags & OPf_REF)
115 if (GIMME == G_SCALAR)
116 Perl_croak(aTHX_ "Can't return hash to lvalue scalar context");
120 if (gimme == G_ARRAY) {
123 else if (gimme == G_SCALAR) {
124 SV* const sv = Perl_hv_scalar(aTHX_ (HV*)TARG);
132 DIE(aTHX_ "NOT IMPL LINE %d",__LINE__);
143 tryAMAGICunDEREF(to_gv);
146 if (SvTYPE(sv) == SVt_PVIO) {
147 GV * const gv = (GV*) sv_newmortal();
148 gv_init(gv, 0, "", 0, 0);
149 GvIOp(gv) = (IO *)sv;
150 (void)SvREFCNT_inc(sv);
153 else if (SvTYPE(sv) != SVt_PVGV)
154 DIE(aTHX_ "Not a GLOB reference");
157 if (SvTYPE(sv) != SVt_PVGV) {
158 if (SvGMAGICAL(sv)) {
163 if (!SvOK(sv) && sv != &PL_sv_undef) {
164 /* If this is a 'my' scalar and flag is set then vivify
168 Perl_croak(aTHX_ PL_no_modify);
169 if (PL_op->op_private & OPpDEREF) {
171 if (cUNOP->op_targ) {
173 SV *namesv = PAD_SV(cUNOP->op_targ);
174 const char *name = SvPV(namesv, len);
175 gv = (GV*)NEWSV(0,0);
176 gv_init(gv, CopSTASH(PL_curcop), name, len, 0);
179 const char *name = CopSTASHPV(PL_curcop);
182 if (SvTYPE(sv) < SVt_RV)
183 sv_upgrade(sv, SVt_RV);
184 if (SvPVX_const(sv)) {
189 SvRV_set(sv, (SV*)gv);
194 if (PL_op->op_flags & OPf_REF ||
195 PL_op->op_private & HINT_STRICT_REFS)
196 DIE(aTHX_ PL_no_usym, "a symbol");
197 if (ckWARN(WARN_UNINITIALIZED))
201 if ((PL_op->op_flags & OPf_SPECIAL) &&
202 !(PL_op->op_flags & OPf_MOD))
204 SV * const temp = (SV*)gv_fetchsv(sv, FALSE, SVt_PVGV);
206 && (!is_gv_magical_sv(sv,0)
207 || !(sv = (SV*)gv_fetchsv(sv, TRUE, SVt_PVGV)))) {
213 if (PL_op->op_private & HINT_STRICT_REFS)
214 DIE(aTHX_ PL_no_symref_sv, sv, "a symbol");
215 sv = (SV*)gv_fetchsv(sv, TRUE, SVt_PVGV);
219 if (PL_op->op_private & OPpLVAL_INTRO)
220 save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
232 tryAMAGICunDEREF(to_sv);
235 switch (SvTYPE(sv)) {
239 DIE(aTHX_ "Not a SCALAR reference");
245 if (SvTYPE(gv) != SVt_PVGV) {
246 if (SvGMAGICAL(sv)) {
252 if (PL_op->op_flags & OPf_REF ||
253 PL_op->op_private & HINT_STRICT_REFS)
254 DIE(aTHX_ PL_no_usym, "a SCALAR");
255 if (ckWARN(WARN_UNINITIALIZED))
259 if ((PL_op->op_flags & OPf_SPECIAL) &&
260 !(PL_op->op_flags & OPf_MOD))
262 gv = (GV*)gv_fetchsv(sv, FALSE, SVt_PV);
264 && (!is_gv_magical_sv(sv, 0)
265 || !(gv = (GV*)gv_fetchsv(sv, TRUE, SVt_PV))))
271 if (PL_op->op_private & HINT_STRICT_REFS)
272 DIE(aTHX_ PL_no_symref_sv, sv, "a SCALAR");
273 gv = (GV*)gv_fetchsv(sv, TRUE, SVt_PV);
278 if (PL_op->op_flags & OPf_MOD) {
279 if (PL_op->op_private & OPpLVAL_INTRO) {
280 if (cUNOP->op_first->op_type == OP_NULL)
281 sv = save_scalar((GV*)TOPs);
283 sv = save_scalar(gv);
285 Perl_croak(aTHX_ PL_no_localize_ref);
287 else if (PL_op->op_private & OPpDEREF)
288 vivify_ref(sv, PL_op->op_private & OPpDEREF);
297 AV * const av = (AV*)TOPs;
298 SV ** const sv = Perl_av_arylen_p(aTHX_ (AV*)av);
301 sv_upgrade(*sv, SVt_PVMG);
302 sv_magic(*sv, (SV*)av, PERL_MAGIC_arylen, Nullch, 0);
310 dSP; dTARGET; dPOPss;
312 if (PL_op->op_flags & OPf_MOD || LVRET) {
313 if (SvTYPE(TARG) < SVt_PVLV) {
314 sv_upgrade(TARG, SVt_PVLV);
315 sv_magic(TARG, Nullsv, PERL_MAGIC_pos, Nullch, 0);
319 if (LvTARG(TARG) != sv) {
321 SvREFCNT_dec(LvTARG(TARG));
322 LvTARG(TARG) = SvREFCNT_inc(sv);
324 PUSHs(TARG); /* no SvSETMAGIC */
328 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
329 const MAGIC * const mg = mg_find(sv, PERL_MAGIC_regex_global);
330 if (mg && mg->mg_len >= 0) {
334 PUSHi(i + PL_curcop->cop_arybase);
348 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
349 /* (But not in defined().) */
350 CV *cv = sv_2cv(TOPs, &stash, &gv, !(PL_op->op_flags & OPf_SPECIAL));
353 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
354 if ((PL_op->op_private & OPpLVAL_INTRO)) {
355 if (gv && GvCV(gv) == cv && (gv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv), FALSE)))
358 DIE(aTHX_ "Can't modify non-lvalue subroutine call");
362 cv = (CV*)&PL_sv_undef;
376 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
377 const char *s = SvPVX_const(TOPs);
378 if (strnEQ(s, "CORE::", 6)) {
379 const int code = keyword(s + 6, SvCUR(TOPs) - 6);
380 if (code < 0) { /* Overridable. */
381 #define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
382 int i = 0, n = 0, seen_question = 0;
384 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
386 if (code == -KEY_chop || code == -KEY_chomp
387 || code == -KEY_exec || code == -KEY_system)
389 while (i < MAXO) { /* The slow way. */
390 if (strEQ(s + 6, PL_op_name[i])
391 || strEQ(s + 6, PL_op_desc[i]))
397 goto nonesuch; /* Should not happen... */
399 oa = PL_opargs[i] >> OASHIFT;
401 if (oa & OA_OPTIONAL && !seen_question) {
405 if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
406 && (oa & (OA_OPTIONAL - 1)) <= OA_SCALARREF
407 /* But globs are already references (kinda) */
408 && (oa & (OA_OPTIONAL - 1)) != OA_FILEREF
412 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
416 ret = sv_2mortal(newSVpvn(str, n - 1));
418 else if (code) /* Non-Overridable */
420 else { /* None such */
422 DIE(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
426 cv = sv_2cv(TOPs, &stash, &gv, FALSE);
428 ret = sv_2mortal(newSVpvn(SvPVX_const(cv), SvCUR(cv)));
437 CV* cv = (CV*)PAD_SV(PL_op->op_targ);
439 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
455 if (GIMME != G_ARRAY) {
459 *MARK = &PL_sv_undef;
460 *MARK = refto(*MARK);
464 EXTEND_MORTAL(SP - MARK);
466 *MARK = refto(*MARK);
471 S_refto(pTHX_ SV *sv)
475 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
478 if (!(sv = LvTARG(sv)))
481 (void)SvREFCNT_inc(sv);
483 else if (SvTYPE(sv) == SVt_PVAV) {
484 if (!AvREAL((AV*)sv) && AvREIFY((AV*)sv))
487 (void)SvREFCNT_inc(sv);
489 else if (SvPADTMP(sv) && !IS_PADGV(sv))
493 (void)SvREFCNT_inc(sv);
496 sv_upgrade(rv, SVt_RV);
506 SV * const sv = POPs;
508 if (sv && SvGMAGICAL(sv))
511 if (!sv || !SvROK(sv))
514 pv = sv_reftype(SvRV(sv),TRUE);
515 PUSHp(pv, strlen(pv));
525 stash = CopSTASH(PL_curcop);
527 SV * const ssv = POPs;
531 if (ssv && !SvGMAGICAL(ssv) && !SvAMAGIC(ssv) && SvROK(ssv))
532 Perl_croak(aTHX_ "Attempt to bless into a reference");
533 ptr = SvPV_const(ssv,len);
534 if (len == 0 && ckWARN(WARN_MISC))
535 Perl_warner(aTHX_ packWARN(WARN_MISC),
536 "Explicit blessing to '' (assuming package main)");
537 stash = gv_stashpvn(ptr, len, TRUE);
540 (void)sv_bless(TOPs, stash);
549 const char * const elem = SvPV_nolen_const(sv);
550 GV * const gv = (GV*)POPs;
551 SV * tmpRef = Nullsv;
555 /* elem will always be NUL terminated. */
556 const char * const second_letter = elem + 1;
559 if (strEQ(second_letter, "RRAY"))
560 tmpRef = (SV*)GvAV(gv);
563 if (strEQ(second_letter, "ODE"))
564 tmpRef = (SV*)GvCVu(gv);
567 if (strEQ(second_letter, "ILEHANDLE")) {
568 /* finally deprecated in 5.8.0 */
569 deprecate("*glob{FILEHANDLE}");
570 tmpRef = (SV*)GvIOp(gv);
573 if (strEQ(second_letter, "ORMAT"))
574 tmpRef = (SV*)GvFORM(gv);
577 if (strEQ(second_letter, "LOB"))
581 if (strEQ(second_letter, "ASH"))
582 tmpRef = (SV*)GvHV(gv);
585 if (*second_letter == 'O' && !elem[2])
586 tmpRef = (SV*)GvIOp(gv);
589 if (strEQ(second_letter, "AME"))
590 sv = newSVpvn(GvNAME(gv), GvNAMELEN(gv));
593 if (strEQ(second_letter, "ACKAGE")) {
594 const HEK *hek = HvNAME_HEK(GvSTASH(gv));
595 sv = hek ? newSVhek(hek) : newSVpvn("__ANON__", 8);
599 if (strEQ(second_letter, "CALAR"))
614 /* Pattern matching */
619 register unsigned char *s;
622 register I32 *sfirst;
626 if (sv == PL_lastscream) {
632 SvSCREAM_off(PL_lastscream);
633 SvREFCNT_dec(PL_lastscream);
635 PL_lastscream = SvREFCNT_inc(sv);
638 s = (unsigned char*)(SvPV(sv, len));
642 if (pos > PL_maxscream) {
643 if (PL_maxscream < 0) {
644 PL_maxscream = pos + 80;
645 Newx(PL_screamfirst, 256, I32);
646 Newx(PL_screamnext, PL_maxscream, I32);
649 PL_maxscream = pos + pos / 4;
650 Renew(PL_screamnext, PL_maxscream, I32);
654 sfirst = PL_screamfirst;
655 snext = PL_screamnext;
657 if (!sfirst || !snext)
658 DIE(aTHX_ "do_study: out of memory");
660 for (ch = 256; ch; --ch)
665 register const I32 ch = s[pos];
667 snext[pos] = sfirst[ch] - pos;
674 /* piggyback on m//g magic */
675 sv_magic(sv, Nullsv, PERL_MAGIC_regex_global, Nullch, 0);
684 if (PL_op->op_flags & OPf_STACKED)
686 else if (PL_op->op_private & OPpTARGET_MY)
692 TARG = sv_newmortal();
697 /* Lvalue operators. */
709 dSP; dMARK; dTARGET; dORIGMARK;
711 do_chop(TARG, *++MARK);
720 SETi(do_chomp(TOPs));
727 register I32 count = 0;
730 count += do_chomp(POPs);
738 register SV* const sv = POPs;
740 if (!sv || !SvANY(sv))
742 switch (SvTYPE(sv)) {
744 if (AvMAX(sv) >= 0 || SvGMAGICAL(sv)
745 || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
749 if (HvARRAY(sv) || SvGMAGICAL(sv)
750 || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
754 if (CvROOT(sv) || CvXSUB(sv))
771 if (!PL_op->op_private) {
780 SV_CHECK_THINKFIRST_COW_DROP(sv);
782 switch (SvTYPE(sv)) {
792 if (cv_const_sv((CV*)sv) && ckWARN(WARN_MISC))
793 Perl_warner(aTHX_ packWARN(WARN_MISC), "Constant subroutine %s undefined",
794 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
798 /* let user-undef'd sub keep its identity */
799 GV* gv = CvGV((CV*)sv);
806 SvSetMagicSV(sv, &PL_sv_undef);
811 GvGP(sv) = gp_ref(gp);
812 GvSV(sv) = NEWSV(72,0);
813 GvLINE(sv) = CopLINE(PL_curcop);
819 if (SvTYPE(sv) >= SVt_PV && SvPVX_const(sv) && SvLEN(sv)) {
821 SvPV_set(sv, Nullch);
834 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
835 DIE(aTHX_ PL_no_modify);
836 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
837 && SvIVX(TOPs) != IV_MIN)
839 SvIV_set(TOPs, SvIVX(TOPs) - 1);
840 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
851 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
852 DIE(aTHX_ PL_no_modify);
853 sv_setsv(TARG, TOPs);
854 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
855 && SvIVX(TOPs) != IV_MAX)
857 SvIV_set(TOPs, SvIVX(TOPs) + 1);
858 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
863 /* special case for undef: see thread at 2003-03/msg00536.html in archive */
873 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
874 DIE(aTHX_ PL_no_modify);
875 sv_setsv(TARG, TOPs);
876 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
877 && SvIVX(TOPs) != IV_MIN)
879 SvIV_set(TOPs, SvIVX(TOPs) - 1);
880 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
889 /* Ordinary operators. */
894 #ifdef PERL_PRESERVE_IVUV
897 tryAMAGICbin(pow,opASSIGN);
898 #ifdef PERL_PRESERVE_IVUV
899 /* For integer to integer power, we do the calculation by hand wherever
900 we're sure it is safe; otherwise we call pow() and try to convert to
901 integer afterwards. */
914 const IV iv = SvIVX(TOPs);
918 goto float_it; /* Can't do negative powers this way. */
922 baseuok = SvUOK(TOPm1s);
924 baseuv = SvUVX(TOPm1s);
926 const IV iv = SvIVX(TOPm1s);
929 baseuok = TRUE; /* effectively it's a UV now */
931 baseuv = -iv; /* abs, baseuok == false records sign */
934 /* now we have integer ** positive integer. */
937 /* foo & (foo - 1) is zero only for a power of 2. */
938 if (!(baseuv & (baseuv - 1))) {
939 /* We are raising power-of-2 to a positive integer.
940 The logic here will work for any base (even non-integer
941 bases) but it can be less accurate than
942 pow (base,power) or exp (power * log (base)) when the
943 intermediate values start to spill out of the mantissa.
944 With powers of 2 we know this can't happen.
945 And powers of 2 are the favourite thing for perl
946 programmers to notice ** not doing what they mean. */
948 NV base = baseuok ? baseuv : -(NV)baseuv;
953 while (power >>= 1) {
964 register unsigned int highbit = 8 * sizeof(UV);
965 register unsigned int diff = 8 * sizeof(UV);
968 if (baseuv >> highbit) {
972 /* we now have baseuv < 2 ** highbit */
973 if (power * highbit <= 8 * sizeof(UV)) {
974 /* result will definitely fit in UV, so use UV math
975 on same algorithm as above */
976 register UV result = 1;
977 register UV base = baseuv;
978 const bool odd_power = (bool)(power & 1);
982 while (power >>= 1) {
989 if (baseuok || !odd_power)
990 /* answer is positive */
992 else if (result <= (UV)IV_MAX)
993 /* answer negative, fits in IV */
995 else if (result == (UV)IV_MIN)
996 /* 2's complement assumption: special case IV_MIN */
999 /* answer negative, doesn't fit */
1000 SETn( -(NV)result );
1011 SETn( Perl_pow( left, right) );
1012 #ifdef PERL_PRESERVE_IVUV
1022 dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
1023 #ifdef PERL_PRESERVE_IVUV
1026 /* Unless the left argument is integer in range we are going to have to
1027 use NV maths. Hence only attempt to coerce the right argument if
1028 we know the left is integer. */
1029 /* Left operand is defined, so is it IV? */
1030 SvIV_please(TOPm1s);
1031 if (SvIOK(TOPm1s)) {
1032 bool auvok = SvUOK(TOPm1s);
1033 bool buvok = SvUOK(TOPs);
1034 const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
1035 const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
1042 alow = SvUVX(TOPm1s);
1044 const IV aiv = SvIVX(TOPm1s);
1047 auvok = TRUE; /* effectively it's a UV now */
1049 alow = -aiv; /* abs, auvok == false records sign */
1055 const IV biv = SvIVX(TOPs);
1058 buvok = TRUE; /* effectively it's a UV now */
1060 blow = -biv; /* abs, buvok == false records sign */
1064 /* If this does sign extension on unsigned it's time for plan B */
1065 ahigh = alow >> (4 * sizeof (UV));
1067 bhigh = blow >> (4 * sizeof (UV));
1069 if (ahigh && bhigh) {
1070 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
1071 which is overflow. Drop to NVs below. */
1072 } else if (!ahigh && !bhigh) {
1073 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
1074 so the unsigned multiply cannot overflow. */
1075 UV product = alow * blow;
1076 if (auvok == buvok) {
1077 /* -ve * -ve or +ve * +ve gives a +ve result. */
1081 } else if (product <= (UV)IV_MIN) {
1082 /* 2s complement assumption that (UV)-IV_MIN is correct. */
1083 /* -ve result, which could overflow an IV */
1085 SETi( -(IV)product );
1087 } /* else drop to NVs below. */
1089 /* One operand is large, 1 small */
1092 /* swap the operands */
1094 bhigh = blow; /* bhigh now the temp var for the swap */
1098 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1099 multiplies can't overflow. shift can, add can, -ve can. */
1100 product_middle = ahigh * blow;
1101 if (!(product_middle & topmask)) {
1102 /* OK, (ahigh * blow) won't lose bits when we shift it. */
1104 product_middle <<= (4 * sizeof (UV));
1105 product_low = alow * blow;
1107 /* as for pp_add, UV + something mustn't get smaller.
1108 IIRC ANSI mandates this wrapping *behaviour* for
1109 unsigned whatever the actual representation*/
1110 product_low += product_middle;
1111 if (product_low >= product_middle) {
1112 /* didn't overflow */
1113 if (auvok == buvok) {
1114 /* -ve * -ve or +ve * +ve gives a +ve result. */
1116 SETu( product_low );
1118 } else if (product_low <= (UV)IV_MIN) {
1119 /* 2s complement assumption again */
1120 /* -ve result, which could overflow an IV */
1122 SETi( -(IV)product_low );
1124 } /* else drop to NVs below. */
1126 } /* product_middle too large */
1127 } /* ahigh && bhigh */
1128 } /* SvIOK(TOPm1s) */
1133 SETn( left * right );
1140 dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
1141 /* Only try to do UV divide first
1142 if ((SLOPPYDIVIDE is true) or
1143 (PERL_PRESERVE_IVUV is true and one or both SV is a UV too large
1145 The assumption is that it is better to use floating point divide
1146 whenever possible, only doing integer divide first if we can't be sure.
1147 If NV_PRESERVES_UV is true then we know at compile time that no UV
1148 can be too large to preserve, so don't need to compile the code to
1149 test the size of UVs. */
1152 # define PERL_TRY_UV_DIVIDE
1153 /* ensure that 20./5. == 4. */
1155 # ifdef PERL_PRESERVE_IVUV
1156 # ifndef NV_PRESERVES_UV
1157 # define PERL_TRY_UV_DIVIDE
1162 #ifdef PERL_TRY_UV_DIVIDE
1165 SvIV_please(TOPm1s);
1166 if (SvIOK(TOPm1s)) {
1167 bool left_non_neg = SvUOK(TOPm1s);
1168 bool right_non_neg = SvUOK(TOPs);
1172 if (right_non_neg) {
1173 right = SvUVX(TOPs);
1176 const IV biv = SvIVX(TOPs);
1179 right_non_neg = TRUE; /* effectively it's a UV now */
1185 /* historically undef()/0 gives a "Use of uninitialized value"
1186 warning before dieing, hence this test goes here.
1187 If it were immediately before the second SvIV_please, then
1188 DIE() would be invoked before left was even inspected, so
1189 no inpsection would give no warning. */
1191 DIE(aTHX_ "Illegal division by zero");
1194 left = SvUVX(TOPm1s);
1197 const IV aiv = SvIVX(TOPm1s);
1200 left_non_neg = TRUE; /* effectively it's a UV now */
1209 /* For sloppy divide we always attempt integer division. */
1211 /* Otherwise we only attempt it if either or both operands
1212 would not be preserved by an NV. If both fit in NVs
1213 we fall through to the NV divide code below. However,
1214 as left >= right to ensure integer result here, we know that
1215 we can skip the test on the right operand - right big
1216 enough not to be preserved can't get here unless left is
1219 && (left > ((UV)1 << NV_PRESERVES_UV_BITS))
1222 /* Integer division can't overflow, but it can be imprecise. */
1223 const UV result = left / right;
1224 if (result * right == left) {
1225 SP--; /* result is valid */
1226 if (left_non_neg == right_non_neg) {
1227 /* signs identical, result is positive. */
1231 /* 2s complement assumption */
1232 if (result <= (UV)IV_MIN)
1233 SETi( -(IV)result );
1235 /* It's exact but too negative for IV. */
1236 SETn( -(NV)result );
1239 } /* tried integer divide but it was not an integer result */
1240 } /* else (PERL_ABS(result) < 1.0) or (both UVs in range for NV) */
1241 } /* left wasn't SvIOK */
1242 } /* right wasn't SvIOK */
1243 #endif /* PERL_TRY_UV_DIVIDE */
1247 DIE(aTHX_ "Illegal division by zero");
1248 PUSHn( left / right );
1255 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1259 bool left_neg = FALSE;
1260 bool right_neg = FALSE;
1261 bool use_double = FALSE;
1262 bool dright_valid = FALSE;
1268 right_neg = !SvUOK(TOPs);
1270 right = SvUVX(POPs);
1272 const IV biv = SvIVX(POPs);
1275 right_neg = FALSE; /* effectively it's a UV now */
1283 right_neg = dright < 0;
1286 if (dright < UV_MAX_P1) {
1287 right = U_V(dright);
1288 dright_valid = TRUE; /* In case we need to use double below. */
1294 /* At this point use_double is only true if right is out of range for
1295 a UV. In range NV has been rounded down to nearest UV and
1296 use_double false. */
1298 if (!use_double && SvIOK(TOPs)) {
1300 left_neg = !SvUOK(TOPs);
1304 IV aiv = SvIVX(POPs);
1307 left_neg = FALSE; /* effectively it's a UV now */
1316 left_neg = dleft < 0;
1320 /* This should be exactly the 5.6 behaviour - if left and right are
1321 both in range for UV then use U_V() rather than floor. */
1323 if (dleft < UV_MAX_P1) {
1324 /* right was in range, so is dleft, so use UVs not double.
1328 /* left is out of range for UV, right was in range, so promote
1329 right (back) to double. */
1331 /* The +0.5 is used in 5.6 even though it is not strictly
1332 consistent with the implicit +0 floor in the U_V()
1333 inside the #if 1. */
1334 dleft = Perl_floor(dleft + 0.5);
1337 dright = Perl_floor(dright + 0.5);
1347 DIE(aTHX_ "Illegal modulus zero");
1349 dans = Perl_fmod(dleft, dright);
1350 if ((left_neg != right_neg) && dans)
1351 dans = dright - dans;
1354 sv_setnv(TARG, dans);
1360 DIE(aTHX_ "Illegal modulus zero");
1363 if ((left_neg != right_neg) && ans)
1366 /* XXX may warn: unary minus operator applied to unsigned type */
1367 /* could change -foo to be (~foo)+1 instead */
1368 if (ans <= ~((UV)IV_MAX)+1)
1369 sv_setiv(TARG, ~ans+1);
1371 sv_setnv(TARG, -(NV)ans);
1374 sv_setuv(TARG, ans);
1383 dSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
1391 const UV uv = SvUV(sv);
1393 count = IV_MAX; /* The best we can do? */
1404 else if (SvNOKp(sv)) {
1405 const NV nv = SvNV(sv);
1413 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1415 I32 items = SP - MARK;
1417 static const char oom_list_extend[] =
1418 "Out of memory during list extend";
1420 max = items * count;
1421 MEM_WRAP_CHECK_1(max, SV*, oom_list_extend);
1422 /* Did the max computation overflow? */
1423 if (items > 0 && max > 0 && (max < items || max < count))
1424 Perl_croak(aTHX_ oom_list_extend);
1429 /* This code was intended to fix 20010809.028:
1432 for (($x =~ /./g) x 2) {
1433 print chop; # "abcdabcd" expected as output.
1436 * but that change (#11635) broke this code:
1438 $x = [("foo")x2]; # only one "foo" ended up in the anonlist.
1440 * I can't think of a better fix that doesn't introduce
1441 * an efficiency hit by copying the SVs. The stack isn't
1442 * refcounted, and mortalisation obviously doesn't
1443 * Do The Right Thing when the stack has more than
1444 * one pointer to the same mortal value.
1448 *SP = sv_2mortal(newSVsv(*SP));
1458 repeatcpy((char*)(MARK + items), (char*)MARK,
1459 items * sizeof(SV*), count - 1);
1462 else if (count <= 0)
1465 else { /* Note: mark already snarfed by pp_list */
1469 static const char oom_string_extend[] =
1470 "Out of memory during string extend";
1472 SvSetSV(TARG, tmpstr);
1473 SvPV_force(TARG, len);
1474 isutf = DO_UTF8(TARG);
1479 STRLEN max = (UV)count * len;
1480 if (len > ((MEM_SIZE)~0)/count)
1481 Perl_croak(aTHX_ oom_string_extend);
1482 MEM_WRAP_CHECK_1(max, char, oom_string_extend);
1483 SvGROW(TARG, max + 1);
1484 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1485 SvCUR_set(TARG, SvCUR(TARG) * count);
1487 *SvEND(TARG) = '\0';
1490 (void)SvPOK_only_UTF8(TARG);
1492 (void)SvPOK_only(TARG);
1494 if (PL_op->op_private & OPpREPEAT_DOLIST) {
1495 /* The parser saw this as a list repeat, and there
1496 are probably several items on the stack. But we're
1497 in scalar context, and there's no pp_list to save us
1498 now. So drop the rest of the items -- robin@kitsite.com
1511 dSP; dATARGET; bool useleft; tryAMAGICbin(subtr,opASSIGN);
1512 useleft = USE_LEFT(TOPm1s);
1513 #ifdef PERL_PRESERVE_IVUV
1514 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1515 "bad things" happen if you rely on signed integers wrapping. */
1518 /* Unless the left argument is integer in range we are going to have to
1519 use NV maths. Hence only attempt to coerce the right argument if
1520 we know the left is integer. */
1521 register UV auv = 0;
1527 a_valid = auvok = 1;
1528 /* left operand is undef, treat as zero. */
1530 /* Left operand is defined, so is it IV? */
1531 SvIV_please(TOPm1s);
1532 if (SvIOK(TOPm1s)) {
1533 if ((auvok = SvUOK(TOPm1s)))
1534 auv = SvUVX(TOPm1s);
1536 register const IV aiv = SvIVX(TOPm1s);
1539 auvok = 1; /* Now acting as a sign flag. */
1540 } else { /* 2s complement assumption for IV_MIN */
1548 bool result_good = 0;
1551 bool buvok = SvUOK(TOPs);
1556 register const IV biv = SvIVX(TOPs);
1563 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1564 else "IV" now, independent of how it came in.
1565 if a, b represents positive, A, B negative, a maps to -A etc
1570 all UV maths. negate result if A negative.
1571 subtract if signs same, add if signs differ. */
1573 if (auvok ^ buvok) {
1582 /* Must get smaller */
1587 if (result <= buv) {
1588 /* result really should be -(auv-buv). as its negation
1589 of true value, need to swap our result flag */
1601 if (result <= (UV)IV_MIN)
1602 SETi( -(IV)result );
1604 /* result valid, but out of range for IV. */
1605 SETn( -(NV)result );
1609 } /* Overflow, drop through to NVs. */
1613 useleft = USE_LEFT(TOPm1s);
1617 /* left operand is undef, treat as zero - value */
1621 SETn( TOPn - value );
1628 dSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1630 const IV shift = POPi;
1631 if (PL_op->op_private & HINT_INTEGER) {
1645 dSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1647 const IV shift = POPi;
1648 if (PL_op->op_private & HINT_INTEGER) {
1662 dSP; tryAMAGICbinSET(lt,0);
1663 #ifdef PERL_PRESERVE_IVUV
1666 SvIV_please(TOPm1s);
1667 if (SvIOK(TOPm1s)) {
1668 bool auvok = SvUOK(TOPm1s);
1669 bool buvok = SvUOK(TOPs);
1671 if (!auvok && !buvok) { /* ## IV < IV ## */
1672 const IV aiv = SvIVX(TOPm1s);
1673 const IV biv = SvIVX(TOPs);
1676 SETs(boolSV(aiv < biv));
1679 if (auvok && buvok) { /* ## UV < UV ## */
1680 const UV auv = SvUVX(TOPm1s);
1681 const UV buv = SvUVX(TOPs);
1684 SETs(boolSV(auv < buv));
1687 if (auvok) { /* ## UV < IV ## */
1689 const IV biv = SvIVX(TOPs);
1692 /* As (a) is a UV, it's >=0, so it cannot be < */
1697 SETs(boolSV(auv < (UV)biv));
1700 { /* ## IV < UV ## */
1701 const IV aiv = SvIVX(TOPm1s);
1705 /* As (b) is a UV, it's >=0, so it must be < */
1712 SETs(boolSV((UV)aiv < buv));
1718 #ifndef NV_PRESERVES_UV
1719 #ifdef PERL_PRESERVE_IVUV
1722 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1724 SETs(boolSV(SvRV(TOPs) < SvRV(TOPp1s)));
1730 SETs(boolSV(TOPn < value));
1737 dSP; tryAMAGICbinSET(gt,0);
1738 #ifdef PERL_PRESERVE_IVUV
1741 SvIV_please(TOPm1s);
1742 if (SvIOK(TOPm1s)) {
1743 bool auvok = SvUOK(TOPm1s);
1744 bool buvok = SvUOK(TOPs);
1746 if (!auvok && !buvok) { /* ## IV > IV ## */
1747 const IV aiv = SvIVX(TOPm1s);
1748 const IV biv = SvIVX(TOPs);
1751 SETs(boolSV(aiv > biv));
1754 if (auvok && buvok) { /* ## UV > UV ## */
1755 const UV auv = SvUVX(TOPm1s);
1756 const UV buv = SvUVX(TOPs);
1759 SETs(boolSV(auv > buv));
1762 if (auvok) { /* ## UV > IV ## */
1764 const IV biv = SvIVX(TOPs);
1768 /* As (a) is a UV, it's >=0, so it must be > */
1773 SETs(boolSV(auv > (UV)biv));
1776 { /* ## IV > UV ## */
1777 const IV aiv = SvIVX(TOPm1s);
1781 /* As (b) is a UV, it's >=0, so it cannot be > */
1788 SETs(boolSV((UV)aiv > buv));
1794 #ifndef NV_PRESERVES_UV
1795 #ifdef PERL_PRESERVE_IVUV
1798 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1800 SETs(boolSV(SvRV(TOPs) > SvRV(TOPp1s)));
1806 SETs(boolSV(TOPn > value));
1813 dSP; tryAMAGICbinSET(le,0);
1814 #ifdef PERL_PRESERVE_IVUV
1817 SvIV_please(TOPm1s);
1818 if (SvIOK(TOPm1s)) {
1819 bool auvok = SvUOK(TOPm1s);
1820 bool buvok = SvUOK(TOPs);
1822 if (!auvok && !buvok) { /* ## IV <= IV ## */
1823 const IV aiv = SvIVX(TOPm1s);
1824 const IV biv = SvIVX(TOPs);
1827 SETs(boolSV(aiv <= biv));
1830 if (auvok && buvok) { /* ## UV <= UV ## */
1831 UV auv = SvUVX(TOPm1s);
1832 UV buv = SvUVX(TOPs);
1835 SETs(boolSV(auv <= buv));
1838 if (auvok) { /* ## UV <= IV ## */
1840 const IV biv = SvIVX(TOPs);
1844 /* As (a) is a UV, it's >=0, so a cannot be <= */
1849 SETs(boolSV(auv <= (UV)biv));
1852 { /* ## IV <= UV ## */
1853 const IV aiv = SvIVX(TOPm1s);
1857 /* As (b) is a UV, it's >=0, so a must be <= */
1864 SETs(boolSV((UV)aiv <= buv));
1870 #ifndef NV_PRESERVES_UV
1871 #ifdef PERL_PRESERVE_IVUV
1874 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1876 SETs(boolSV(SvRV(TOPs) <= SvRV(TOPp1s)));
1882 SETs(boolSV(TOPn <= value));
1889 dSP; tryAMAGICbinSET(ge,0);
1890 #ifdef PERL_PRESERVE_IVUV
1893 SvIV_please(TOPm1s);
1894 if (SvIOK(TOPm1s)) {
1895 bool auvok = SvUOK(TOPm1s);
1896 bool buvok = SvUOK(TOPs);
1898 if (!auvok && !buvok) { /* ## IV >= IV ## */
1899 const IV aiv = SvIVX(TOPm1s);
1900 const IV biv = SvIVX(TOPs);
1903 SETs(boolSV(aiv >= biv));
1906 if (auvok && buvok) { /* ## UV >= UV ## */
1907 const UV auv = SvUVX(TOPm1s);
1908 const UV buv = SvUVX(TOPs);
1911 SETs(boolSV(auv >= buv));
1914 if (auvok) { /* ## UV >= IV ## */
1916 const IV biv = SvIVX(TOPs);
1920 /* As (a) is a UV, it's >=0, so it must be >= */
1925 SETs(boolSV(auv >= (UV)biv));
1928 { /* ## IV >= UV ## */
1929 const IV aiv = SvIVX(TOPm1s);
1933 /* As (b) is a UV, it's >=0, so a cannot be >= */
1940 SETs(boolSV((UV)aiv >= buv));
1946 #ifndef NV_PRESERVES_UV
1947 #ifdef PERL_PRESERVE_IVUV
1950 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1952 SETs(boolSV(SvRV(TOPs) >= SvRV(TOPp1s)));
1958 SETs(boolSV(TOPn >= value));
1965 dSP; tryAMAGICbinSET(ne,0);
1966 #ifndef NV_PRESERVES_UV
1967 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1969 SETs(boolSV(SvRV(TOPs) != SvRV(TOPp1s)));
1973 #ifdef PERL_PRESERVE_IVUV
1976 SvIV_please(TOPm1s);
1977 if (SvIOK(TOPm1s)) {
1978 bool auvok = SvUOK(TOPm1s);
1979 bool buvok = SvUOK(TOPs);
1981 if (auvok == buvok) { /* ## IV == IV or UV == UV ## */
1982 /* Casting IV to UV before comparison isn't going to matter
1983 on 2s complement. On 1s complement or sign&magnitude
1984 (if we have any of them) it could make negative zero
1985 differ from normal zero. As I understand it. (Need to
1986 check - is negative zero implementation defined behaviour
1988 const UV buv = SvUVX(POPs);
1989 const UV auv = SvUVX(TOPs);
1991 SETs(boolSV(auv != buv));
1994 { /* ## Mixed IV,UV ## */
1998 /* != is commutative so swap if needed (save code) */
2000 /* swap. top of stack (b) is the iv */
2004 /* As (a) is a UV, it's >0, so it cannot be == */
2013 /* As (b) is a UV, it's >0, so it cannot be == */
2017 uv = SvUVX(*(SP+1)); /* Do I want TOPp1s() ? */
2019 SETs(boolSV((UV)iv != uv));
2027 SETs(boolSV(TOPn != value));
2034 dSP; dTARGET; tryAMAGICbin(ncmp,0);
2035 #ifndef NV_PRESERVES_UV
2036 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2037 UV right = PTR2UV(SvRV(POPs));
2038 UV left = PTR2UV(SvRV(TOPs));
2039 SETi((left > right) - (left < right));
2043 #ifdef PERL_PRESERVE_IVUV
2044 /* Fortunately it seems NaN isn't IOK */
2047 SvIV_please(TOPm1s);
2048 if (SvIOK(TOPm1s)) {
2049 const bool leftuvok = SvUOK(TOPm1s);
2050 const bool rightuvok = SvUOK(TOPs);
2052 if (!leftuvok && !rightuvok) { /* ## IV <=> IV ## */
2053 const IV leftiv = SvIVX(TOPm1s);
2054 const IV rightiv = SvIVX(TOPs);
2056 if (leftiv > rightiv)
2058 else if (leftiv < rightiv)
2062 } else if (leftuvok && rightuvok) { /* ## UV <=> UV ## */
2063 const UV leftuv = SvUVX(TOPm1s);
2064 const UV rightuv = SvUVX(TOPs);
2066 if (leftuv > rightuv)
2068 else if (leftuv < rightuv)
2072 } else if (leftuvok) { /* ## UV <=> IV ## */
2073 const IV rightiv = SvIVX(TOPs);
2075 /* As (a) is a UV, it's >=0, so it cannot be < */
2078 const UV leftuv = SvUVX(TOPm1s);
2079 if (leftuv > (UV)rightiv) {
2081 } else if (leftuv < (UV)rightiv) {
2087 } else { /* ## IV <=> UV ## */
2088 const IV leftiv = SvIVX(TOPm1s);
2090 /* As (b) is a UV, it's >=0, so it must be < */
2093 const UV rightuv = SvUVX(TOPs);
2094 if ((UV)leftiv > rightuv) {
2096 } else if ((UV)leftiv < rightuv) {
2114 if (Perl_isnan(left) || Perl_isnan(right)) {
2118 value = (left > right) - (left < right);
2122 else if (left < right)
2124 else if (left > right)
2138 dSP; tryAMAGICbinSET(slt,0);
2141 const int cmp = (IN_LOCALE_RUNTIME
2142 ? sv_cmp_locale(left, right)
2143 : sv_cmp(left, right));
2144 SETs(boolSV(cmp < 0));
2151 dSP; tryAMAGICbinSET(sgt,0);
2154 const int cmp = (IN_LOCALE_RUNTIME
2155 ? sv_cmp_locale(left, right)
2156 : sv_cmp(left, right));
2157 SETs(boolSV(cmp > 0));
2164 dSP; tryAMAGICbinSET(sle,0);
2167 const int cmp = (IN_LOCALE_RUNTIME
2168 ? sv_cmp_locale(left, right)
2169 : sv_cmp(left, right));
2170 SETs(boolSV(cmp <= 0));
2177 dSP; tryAMAGICbinSET(sge,0);
2180 const int cmp = (IN_LOCALE_RUNTIME
2181 ? sv_cmp_locale(left, right)
2182 : sv_cmp(left, right));
2183 SETs(boolSV(cmp >= 0));
2190 dSP; tryAMAGICbinSET(seq,0);
2193 SETs(boolSV(sv_eq(left, right)));
2200 dSP; tryAMAGICbinSET(sne,0);
2203 SETs(boolSV(!sv_eq(left, right)));
2210 dSP; dTARGET; tryAMAGICbin(scmp,0);
2213 const int cmp = (IN_LOCALE_RUNTIME
2214 ? sv_cmp_locale(left, right)
2215 : sv_cmp(left, right));
2223 dSP; dATARGET; tryAMAGICbin(band,opASSIGN);
2226 if (SvGMAGICAL(left)) mg_get(left);
2227 if (SvGMAGICAL(right)) mg_get(right);
2228 if (SvNIOKp(left) || SvNIOKp(right)) {
2229 if (PL_op->op_private & HINT_INTEGER) {
2230 const IV i = SvIV_nomg(left) & SvIV_nomg(right);
2234 const UV u = SvUV_nomg(left) & SvUV_nomg(right);
2239 do_vop(PL_op->op_type, TARG, left, right);
2248 dSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
2251 if (SvGMAGICAL(left)) mg_get(left);
2252 if (SvGMAGICAL(right)) mg_get(right);
2253 if (SvNIOKp(left) || SvNIOKp(right)) {
2254 if (PL_op->op_private & HINT_INTEGER) {
2255 const IV i = (USE_LEFT(left) ? SvIV_nomg(left) : 0) ^ SvIV_nomg(right);
2259 const UV u = (USE_LEFT(left) ? SvUV_nomg(left) : 0) ^ SvUV_nomg(right);
2264 do_vop(PL_op->op_type, TARG, left, right);
2273 dSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
2276 if (SvGMAGICAL(left)) mg_get(left);
2277 if (SvGMAGICAL(right)) mg_get(right);
2278 if (SvNIOKp(left) || SvNIOKp(right)) {
2279 if (PL_op->op_private & HINT_INTEGER) {
2280 const IV i = (USE_LEFT(left) ? SvIV_nomg(left) : 0) | SvIV_nomg(right);
2284 const UV u = (USE_LEFT(left) ? SvUV_nomg(left) : 0) | SvUV_nomg(right);
2289 do_vop(PL_op->op_type, TARG, left, right);
2298 dSP; dTARGET; tryAMAGICun(neg);
2301 const int flags = SvFLAGS(sv);
2304 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
2305 /* It's publicly an integer, or privately an integer-not-float */
2308 if (SvIVX(sv) == IV_MIN) {
2309 /* 2s complement assumption. */
2310 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
2313 else if (SvUVX(sv) <= IV_MAX) {
2318 else if (SvIVX(sv) != IV_MIN) {
2322 #ifdef PERL_PRESERVE_IVUV
2331 else if (SvPOKp(sv)) {
2333 const char *s = SvPV_const(sv, len);
2334 if (isIDFIRST(*s)) {
2335 sv_setpvn(TARG, "-", 1);
2338 else if (*s == '+' || *s == '-') {
2340 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
2342 else if (DO_UTF8(sv)) {
2345 goto oops_its_an_int;
2347 sv_setnv(TARG, -SvNV(sv));
2349 sv_setpvn(TARG, "-", 1);
2356 goto oops_its_an_int;
2357 sv_setnv(TARG, -SvNV(sv));
2369 dSP; tryAMAGICunSET(not);
2370 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
2376 dSP; dTARGET; tryAMAGICun(compl);
2382 if (PL_op->op_private & HINT_INTEGER) {
2383 const IV i = ~SvIV_nomg(sv);
2387 const UV u = ~SvUV_nomg(sv);
2396 (void)SvPV_nomg_const(sv,len); /* force check for uninit var */
2397 sv_setsv_nomg(TARG, sv);
2398 tmps = (U8*)SvPV_force(TARG, len);
2401 /* Calculate exact length, let's not estimate. */
2410 while (tmps < send) {
2411 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2412 tmps += UTF8SKIP(tmps);
2413 targlen += UNISKIP(~c);
2419 /* Now rewind strings and write them. */
2423 Newxz(result, targlen + 1, U8);
2424 while (tmps < send) {
2425 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2426 tmps += UTF8SKIP(tmps);
2427 result = uvchr_to_utf8_flags(result, ~c, UNICODE_ALLOW_ANY);
2431 sv_setpvn(TARG, (char*)result, targlen);
2435 Newxz(result, nchar + 1, U8);
2436 while (tmps < send) {
2437 const U8 c = (U8)utf8n_to_uvchr(tmps, 0, &l, UTF8_ALLOW_ANY);
2438 tmps += UTF8SKIP(tmps);
2443 sv_setpvn(TARG, (char*)result, nchar);
2452 register long *tmpl;
2453 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2456 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
2461 for ( ; anum > 0; anum--, tmps++)
2470 /* integer versions of some of the above */
2474 dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
2477 SETi( left * right );
2484 dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
2488 DIE(aTHX_ "Illegal division by zero");
2489 value = POPi / value;
2498 /* This is the vanilla old i_modulo. */
2499 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2503 DIE(aTHX_ "Illegal modulus zero");
2504 SETi( left % right );
2509 #if defined(__GLIBC__) && IVSIZE == 8
2513 /* This is the i_modulo with the workaround for the _moddi3 bug
2514 * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
2515 * See below for pp_i_modulo. */
2516 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2520 DIE(aTHX_ "Illegal modulus zero");
2521 SETi( left % PERL_ABS(right) );
2529 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2533 DIE(aTHX_ "Illegal modulus zero");
2534 /* The assumption is to use hereafter the old vanilla version... */
2536 PL_ppaddr[OP_I_MODULO] =
2538 /* .. but if we have glibc, we might have a buggy _moddi3
2539 * (at least glicb 2.2.5 is known to have this bug), in other
2540 * words our integer modulus with negative quad as the second
2541 * argument might be broken. Test for this and re-patch the
2542 * opcode dispatch table if that is the case, remembering to
2543 * also apply the workaround so that this first round works
2544 * right, too. See [perl #9402] for more information. */
2545 #if defined(__GLIBC__) && IVSIZE == 8
2549 /* Cannot do this check with inlined IV constants since
2550 * that seems to work correctly even with the buggy glibc. */
2552 /* Yikes, we have the bug.
2553 * Patch in the workaround version. */
2555 PL_ppaddr[OP_I_MODULO] =
2556 &Perl_pp_i_modulo_1;
2557 /* Make certain we work right this time, too. */
2558 right = PERL_ABS(right);
2562 SETi( left % right );
2569 dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
2572 SETi( left + right );
2579 dSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
2582 SETi( left - right );
2589 dSP; tryAMAGICbinSET(lt,0);
2592 SETs(boolSV(left < right));
2599 dSP; tryAMAGICbinSET(gt,0);
2602 SETs(boolSV(left > right));
2609 dSP; tryAMAGICbinSET(le,0);
2612 SETs(boolSV(left <= right));
2619 dSP; tryAMAGICbinSET(ge,0);
2622 SETs(boolSV(left >= right));
2629 dSP; tryAMAGICbinSET(eq,0);
2632 SETs(boolSV(left == right));
2639 dSP; tryAMAGICbinSET(ne,0);
2642 SETs(boolSV(left != right));
2649 dSP; dTARGET; tryAMAGICbin(ncmp,0);
2656 else if (left < right)
2667 dSP; dTARGET; tryAMAGICun(neg);
2672 /* High falutin' math. */
2676 dSP; dTARGET; tryAMAGICbin(atan2,0);
2679 SETn(Perl_atan2(left, right));
2686 dSP; dTARGET; tryAMAGICun(sin);
2688 const NV value = POPn;
2689 XPUSHn(Perl_sin(value));
2696 dSP; dTARGET; tryAMAGICun(cos);
2698 const NV value = POPn;
2699 XPUSHn(Perl_cos(value));
2704 /* Support Configure command-line overrides for rand() functions.
2705 After 5.005, perhaps we should replace this by Configure support
2706 for drand48(), random(), or rand(). For 5.005, though, maintain
2707 compatibility by calling rand() but allow the user to override it.
2708 See INSTALL for details. --Andy Dougherty 15 July 1998
2710 /* Now it's after 5.005, and Configure supports drand48() and random(),
2711 in addition to rand(). So the overrides should not be needed any more.
2712 --Jarkko Hietaniemi 27 September 1998
2715 #ifndef HAS_DRAND48_PROTO
2716 extern double drand48 (void);
2729 if (!PL_srand_called) {
2730 (void)seedDrand01((Rand_seed_t)seed());
2731 PL_srand_called = TRUE;
2746 (void)seedDrand01((Rand_seed_t)anum);
2747 PL_srand_called = TRUE;
2754 dSP; dTARGET; tryAMAGICun(exp);
2758 value = Perl_exp(value);
2766 dSP; dTARGET; tryAMAGICun(log);
2768 const NV value = POPn;
2770 SET_NUMERIC_STANDARD();
2771 DIE(aTHX_ "Can't take log of %"NVgf, value);
2773 XPUSHn(Perl_log(value));
2780 dSP; dTARGET; tryAMAGICun(sqrt);
2782 const NV value = POPn;
2784 SET_NUMERIC_STANDARD();
2785 DIE(aTHX_ "Can't take sqrt of %"NVgf, value);
2787 XPUSHn(Perl_sqrt(value));
2794 dSP; dTARGET; tryAMAGICun(int);
2796 const IV iv = TOPi; /* attempt to convert to IV if possible. */
2797 /* XXX it's arguable that compiler casting to IV might be subtly
2798 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2799 else preferring IV has introduced a subtle behaviour change bug. OTOH
2800 relying on floating point to be accurate is a bug. */
2804 else if (SvIOK(TOPs)) {
2811 const NV value = TOPn;
2813 if (value < (NV)UV_MAX + 0.5) {
2816 SETn(Perl_floor(value));
2820 if (value > (NV)IV_MIN - 0.5) {
2823 SETn(Perl_ceil(value));
2833 dSP; dTARGET; tryAMAGICun(abs);
2835 /* This will cache the NV value if string isn't actually integer */
2840 else if (SvIOK(TOPs)) {
2841 /* IVX is precise */
2843 SETu(TOPu); /* force it to be numeric only */
2851 /* 2s complement assumption. Also, not really needed as
2852 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
2858 const NV value = TOPn;
2873 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2877 SV* const sv = POPs;
2879 tmps = (SvPV_const(sv, len));
2881 /* If Unicode, try to downgrade
2882 * If not possible, croak. */
2883 SV* const tsv = sv_2mortal(newSVsv(sv));
2886 sv_utf8_downgrade(tsv, FALSE);
2887 tmps = SvPV_const(tsv, len);
2889 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2890 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
2903 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2907 SV* const sv = POPs;
2909 tmps = (SvPV_const(sv, len));
2911 /* If Unicode, try to downgrade
2912 * If not possible, croak. */
2913 SV* const tsv = sv_2mortal(newSVsv(sv));
2916 sv_utf8_downgrade(tsv, FALSE);
2917 tmps = SvPV_const(tsv, len);
2919 while (*tmps && len && isSPACE(*tmps))
2924 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2925 else if (*tmps == 'b')
2926 result_uv = grok_bin (tmps, &len, &flags, &result_nv);
2928 result_uv = grok_oct (tmps, &len, &flags, &result_nv);
2930 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
2947 SETi(sv_len_utf8(sv));
2963 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
2965 const I32 arybase = PL_curcop->cop_arybase;
2967 const char *repl = 0;
2969 const int num_args = PL_op->op_private & 7;
2970 bool repl_need_utf8_upgrade = FALSE;
2971 bool repl_is_utf8 = FALSE;
2973 SvTAINTED_off(TARG); /* decontaminate */
2974 SvUTF8_off(TARG); /* decontaminate */
2978 repl = SvPV_const(repl_sv, repl_len);
2979 repl_is_utf8 = DO_UTF8(repl_sv) && SvCUR(repl_sv);
2989 sv_utf8_upgrade(sv);
2991 else if (DO_UTF8(sv))
2992 repl_need_utf8_upgrade = TRUE;
2994 tmps = SvPV_const(sv, curlen);
2996 utf8_curlen = sv_len_utf8(sv);
2997 if (utf8_curlen == curlen)
3000 curlen = utf8_curlen;
3005 if (pos >= arybase) {
3023 else if (len >= 0) {
3025 if (rem > (I32)curlen)
3040 Perl_croak(aTHX_ "substr outside of string");
3041 if (ckWARN(WARN_SUBSTR))
3042 Perl_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3046 const I32 upos = pos;
3047 const I32 urem = rem;
3049 sv_pos_u2b(sv, &pos, &rem);
3051 /* we either return a PV or an LV. If the TARG hasn't been used
3052 * before, or is of that type, reuse it; otherwise use a mortal
3053 * instead. Note that LVs can have an extended lifetime, so also
3054 * dont reuse if refcount > 1 (bug #20933) */
3055 if (SvTYPE(TARG) > SVt_NULL) {
3056 if ( (SvTYPE(TARG) == SVt_PVLV)
3057 ? (!lvalue || SvREFCNT(TARG) > 1)
3060 TARG = sv_newmortal();
3064 sv_setpvn(TARG, tmps, rem);
3065 #ifdef USE_LOCALE_COLLATE
3066 sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3071 SV* repl_sv_copy = NULL;
3073 if (repl_need_utf8_upgrade) {
3074 repl_sv_copy = newSVsv(repl_sv);
3075 sv_utf8_upgrade(repl_sv_copy);
3076 repl = SvPV_const(repl_sv_copy, repl_len);
3077 repl_is_utf8 = DO_UTF8(repl_sv_copy) && SvCUR(sv);
3079 sv_insert(sv, pos, rem, repl, repl_len);
3083 SvREFCNT_dec(repl_sv_copy);
3085 else if (lvalue) { /* it's an lvalue! */
3086 if (!SvGMAGICAL(sv)) {
3088 SvPV_force_nolen(sv);
3089 if (ckWARN(WARN_SUBSTR))
3090 Perl_warner(aTHX_ packWARN(WARN_SUBSTR),
3091 "Attempt to use reference as lvalue in substr");
3093 if (SvOK(sv)) /* is it defined ? */
3094 (void)SvPOK_only_UTF8(sv);
3096 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
3099 if (SvTYPE(TARG) < SVt_PVLV) {
3100 sv_upgrade(TARG, SVt_PVLV);
3101 sv_magic(TARG, Nullsv, PERL_MAGIC_substr, Nullch, 0);
3107 if (LvTARG(TARG) != sv) {
3109 SvREFCNT_dec(LvTARG(TARG));
3110 LvTARG(TARG) = SvREFCNT_inc(sv);
3112 LvTARGOFF(TARG) = upos;
3113 LvTARGLEN(TARG) = urem;
3117 PUSHs(TARG); /* avoid SvSETMAGIC here */
3124 register const IV size = POPi;
3125 register const IV offset = POPi;
3126 register SV * const src = POPs;
3127 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3129 SvTAINTED_off(TARG); /* decontaminate */
3130 if (lvalue) { /* it's an lvalue! */
3131 if (SvREFCNT(TARG) > 1) /* don't share the TARG (#20933) */
3132 TARG = sv_newmortal();
3133 if (SvTYPE(TARG) < SVt_PVLV) {
3134 sv_upgrade(TARG, SVt_PVLV);
3135 sv_magic(TARG, Nullsv, PERL_MAGIC_vec, Nullch, 0);
3138 if (LvTARG(TARG) != src) {
3140 SvREFCNT_dec(LvTARG(TARG));
3141 LvTARG(TARG) = SvREFCNT_inc(src);
3143 LvTARGOFF(TARG) = offset;
3144 LvTARGLEN(TARG) = size;
3147 sv_setuv(TARG, do_vecget(src, offset, size));
3163 const I32 arybase = PL_curcop->cop_arybase;
3170 offset = POPi - arybase;
3173 big_utf8 = DO_UTF8(big);
3174 little_utf8 = DO_UTF8(little);
3175 if (big_utf8 ^ little_utf8) {
3176 /* One needs to be upgraded. */
3177 SV * const bytes = little_utf8 ? big : little;
3179 const char * const p = SvPV_const(bytes, len);
3181 temp = newSVpvn(p, len);
3184 sv_recode_to_utf8(temp, PL_encoding);
3186 sv_utf8_upgrade(temp);
3195 if (big_utf8 && offset > 0)
3196 sv_pos_u2b(big, &offset, 0);
3197 tmps = SvPV_const(big, biglen);
3200 else if (offset > (I32)biglen)
3202 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
3203 (unsigned char*)tmps + biglen, little, 0)))
3206 retval = tmps2 - tmps;
3207 if (retval > 0 && big_utf8)
3208 sv_pos_b2u(big, &retval);
3211 PUSHi(retval + arybase);
3227 const I32 arybase = PL_curcop->cop_arybase;
3235 big_utf8 = DO_UTF8(big);
3236 little_utf8 = DO_UTF8(little);
3237 if (big_utf8 ^ little_utf8) {
3238 /* One needs to be upgraded. */
3239 SV * const bytes = little_utf8 ? big : little;
3241 const char *p = SvPV_const(bytes, len);
3243 temp = newSVpvn(p, len);
3246 sv_recode_to_utf8(temp, PL_encoding);
3248 sv_utf8_upgrade(temp);
3257 tmps2 = SvPV_const(little, llen);
3258 tmps = SvPV_const(big, blen);
3263 if (offset > 0 && big_utf8)
3264 sv_pos_u2b(big, &offset, 0);
3265 offset = offset - arybase + llen;
3269 else if (offset > (I32)blen)
3271 if (!(tmps2 = rninstr(tmps, tmps + offset,
3272 tmps2, tmps2 + llen)))
3275 retval = tmps2 - tmps;
3276 if (retval > 0 && big_utf8)
3277 sv_pos_b2u(big, &retval);
3280 PUSHi(retval + arybase);
3286 dSP; dMARK; dORIGMARK; dTARGET;
3287 do_sprintf(TARG, SP-MARK, MARK+1);
3288 TAINT_IF(SvTAINTED(TARG));
3289 if (DO_UTF8(*(MARK+1)))
3301 const U8 *s = (U8*)SvPV_const(argsv, len);
3304 if (PL_encoding && SvPOK(argsv) && !DO_UTF8(argsv)) {
3305 tmpsv = sv_2mortal(newSVsv(argsv));
3306 s = (U8*)sv_recode_to_utf8(tmpsv, PL_encoding);
3310 XPUSHu(DO_UTF8(argsv) ?
3311 utf8n_to_uvchr(s, UTF8_MAXBYTES, 0, UTF8_ALLOW_ANYUV) :
3323 if (((SvIOK_notUV(TOPs) && SvIV(TOPs) < 0)
3325 (SvNOK(TOPs) && SvNV(TOPs) < 0.0))) {
3327 value = POPu; /* chr(-1) eq chr(0xff), etc. */
3329 (void) POPs; /* Ignore the argument value. */
3330 value = UNICODE_REPLACEMENT;
3336 SvUPGRADE(TARG,SVt_PV);
3338 if (value > 255 && !IN_BYTES) {
3339 SvGROW(TARG, (STRLEN)UNISKIP(value)+1);
3340 tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3341 SvCUR_set(TARG, tmps - SvPVX_const(TARG));
3343 (void)SvPOK_only(TARG);
3352 *tmps++ = (char)value;
3354 (void)SvPOK_only(TARG);
3355 if (PL_encoding && !IN_BYTES) {
3356 sv_recode_to_utf8(TARG, PL_encoding);
3358 if (SvCUR(TARG) == 0 || !is_utf8_string((U8*)tmps, SvCUR(TARG)) ||
3359 memEQ(tmps, "\xef\xbf\xbd\0", 4)) {
3363 *tmps++ = (U8)UTF8_EIGHT_BIT_HI(value);
3364 *tmps++ = (U8)UTF8_EIGHT_BIT_LO(value);
3379 const char *tmps = SvPV_const(left, len);
3381 if (DO_UTF8(left)) {
3382 /* If Unicode, try to downgrade.
3383 * If not possible, croak.
3384 * Yes, we made this up. */
3385 SV* const tsv = sv_2mortal(newSVsv(left));
3388 sv_utf8_downgrade(tsv, FALSE);
3389 tmps = SvPV_const(tsv, len);
3391 # ifdef USE_ITHREADS
3393 if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3394 /* This should be threadsafe because in ithreads there is only
3395 * one thread per interpreter. If this would not be true,
3396 * we would need a mutex to protect this malloc. */
3397 PL_reentrant_buffer->_crypt_struct_buffer =
3398 (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3399 #if defined(__GLIBC__) || defined(__EMX__)
3400 if (PL_reentrant_buffer->_crypt_struct_buffer) {
3401 PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3402 /* work around glibc-2.2.5 bug */
3403 PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3407 # endif /* HAS_CRYPT_R */
3408 # endif /* USE_ITHREADS */
3410 sv_setpv(TARG, fcrypt(tmps, SvPV_nolen_const(right)));
3412 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV_nolen_const(right)));
3418 "The crypt() function is unimplemented due to excessive paranoia.");
3431 (s = (const U8*)SvPV_nomg_const(sv, slen)) && slen &&
3432 UTF8_IS_START(*s)) {
3433 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3437 utf8_to_uvchr(s, &ulen);
3438 toTITLE_utf8(s, tmpbuf, &tculen);
3439 utf8_to_uvchr(tmpbuf, 0);
3441 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3443 /* slen is the byte length of the whole SV.
3444 * ulen is the byte length of the original Unicode character
3445 * stored as UTF-8 at s.
3446 * tculen is the byte length of the freshly titlecased
3447 * Unicode character stored as UTF-8 at tmpbuf.
3448 * We first set the result to be the titlecased character,
3449 * and then append the rest of the SV data. */
3450 sv_setpvn(TARG, (char*)tmpbuf, tculen);
3452 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3457 s = (U8*)SvPV_force_nomg(sv, slen);
3458 Copy(tmpbuf, s, tculen, U8);
3463 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3465 SvUTF8_off(TARG); /* decontaminate */
3466 sv_setsv_nomg(TARG, sv);
3470 s1 = (U8*)SvPV_force_nomg(sv, slen);
3472 if (IN_LOCALE_RUNTIME) {
3475 *s1 = toUPPER_LC(*s1);
3494 (s = (const U8*)SvPV_nomg_const(sv, slen)) && slen &&
3495 UTF8_IS_START(*s)) {
3497 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3501 toLOWER_utf8(s, tmpbuf, &ulen);
3502 uv = utf8_to_uvchr(tmpbuf, 0);
3503 tend = uvchr_to_utf8(tmpbuf, uv);
3505 if (!SvPADTMP(sv) || (STRLEN)(tend - tmpbuf) != ulen || SvREADONLY(sv)) {
3507 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
3509 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3514 s = (U8*)SvPV_force_nomg(sv, slen);
3515 Copy(tmpbuf, s, ulen, U8);
3520 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3522 SvUTF8_off(TARG); /* decontaminate */
3523 sv_setsv_nomg(TARG, sv);
3527 s1 = (U8*)SvPV_force_nomg(sv, slen);
3529 if (IN_LOCALE_RUNTIME) {
3532 *s1 = toLOWER_LC(*s1);
3555 U8 tmpbuf[UTF8_MAXBYTES+1];
3557 s = (const U8*)SvPV_nomg_const(sv,len);
3559 SvUTF8_off(TARG); /* decontaminate */
3560 sv_setpvn(TARG, "", 0);
3564 STRLEN min = len + 1;
3566 SvUPGRADE(TARG, SVt_PV);
3568 (void)SvPOK_only(TARG);
3569 d = (U8*)SvPVX(TARG);
3572 STRLEN u = UTF8SKIP(s);
3574 toUPPER_utf8(s, tmpbuf, &ulen);
3575 if (ulen > u && (SvLEN(TARG) < (min += ulen - u))) {
3576 /* If the eventually required minimum size outgrows
3577 * the available space, we need to grow. */
3578 UV o = d - (U8*)SvPVX_const(TARG);
3580 /* If someone uppercases one million U+03B0s we
3581 * SvGROW() one million times. Or we could try
3582 * guessing how much to allocate without allocating
3583 * too much. Such is life. */
3585 d = (U8*)SvPVX(TARG) + o;
3587 Copy(tmpbuf, d, ulen, U8);
3593 SvCUR_set(TARG, d - (U8*)SvPVX_const(TARG));
3599 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3601 SvUTF8_off(TARG); /* decontaminate */
3602 sv_setsv_nomg(TARG, sv);
3606 s = (U8*)SvPV_force_nomg(sv, len);
3608 const register U8 *send = s + len;
3610 if (IN_LOCALE_RUNTIME) {
3613 for (; s < send; s++)
3614 *s = toUPPER_LC(*s);
3617 for (; s < send; s++)
3639 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3641 s = (const U8*)SvPV_nomg_const(sv,len);
3643 SvUTF8_off(TARG); /* decontaminate */
3644 sv_setpvn(TARG, "", 0);
3648 STRLEN min = len + 1;
3650 SvUPGRADE(TARG, SVt_PV);
3652 (void)SvPOK_only(TARG);
3653 d = (U8*)SvPVX(TARG);
3656 const STRLEN u = UTF8SKIP(s);
3657 const UV uv = toLOWER_utf8(s, tmpbuf, &ulen);
3659 #define GREEK_CAPITAL_LETTER_SIGMA 0x03A3 /* Unicode U+03A3 */
3660 if (uv == GREEK_CAPITAL_LETTER_SIGMA) {
3662 * Now if the sigma is NOT followed by
3663 * /$ignorable_sequence$cased_letter/;
3664 * and it IS preceded by
3665 * /$cased_letter$ignorable_sequence/;
3666 * where $ignorable_sequence is
3667 * [\x{2010}\x{AD}\p{Mn}]*
3668 * and $cased_letter is
3669 * [\p{Ll}\p{Lo}\p{Lt}]
3670 * then it should be mapped to 0x03C2,
3671 * (GREEK SMALL LETTER FINAL SIGMA),
3672 * instead of staying 0x03A3.
3673 * "should be": in other words,
3674 * this is not implemented yet.
3675 * See lib/unicore/SpecialCasing.txt.
3678 if (ulen > u && (SvLEN(TARG) < (min += ulen - u))) {
3679 /* If the eventually required minimum size outgrows
3680 * the available space, we need to grow. */
3681 UV o = d - (U8*)SvPVX_const(TARG);
3683 /* If someone lowercases one million U+0130s we
3684 * SvGROW() one million times. Or we could try
3685 * guessing how much to allocate without allocating.
3686 * too much. Such is life. */
3688 d = (U8*)SvPVX(TARG) + o;
3690 Copy(tmpbuf, d, ulen, U8);
3696 SvCUR_set(TARG, d - (U8*)SvPVX_const(TARG));
3702 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3704 SvUTF8_off(TARG); /* decontaminate */
3705 sv_setsv_nomg(TARG, sv);
3710 s = (U8*)SvPV_force_nomg(sv, len);
3712 register const U8 * const send = s + len;
3714 if (IN_LOCALE_RUNTIME) {
3717 for (; s < send; s++)
3718 *s = toLOWER_LC(*s);
3721 for (; s < send; s++)
3733 SV * const sv = TOPs;
3735 const register char *s = SvPV_const(sv,len);
3737 SvUTF8_off(TARG); /* decontaminate */
3740 SvUPGRADE(TARG, SVt_PV);
3741 SvGROW(TARG, (len * 2) + 1);
3745 if (UTF8_IS_CONTINUED(*s)) {
3746 STRLEN ulen = UTF8SKIP(s);
3770 SvCUR_set(TARG, d - SvPVX_const(TARG));
3771 (void)SvPOK_only_UTF8(TARG);
3774 sv_setpvn(TARG, s, len);
3776 if (SvSMAGICAL(TARG))
3785 dSP; dMARK; dORIGMARK;
3786 register AV* const av = (AV*)POPs;
3787 register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3789 if (SvTYPE(av) == SVt_PVAV) {
3790 const I32 arybase = PL_curcop->cop_arybase;
3791 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
3794 for (svp = MARK + 1; svp <= SP; svp++) {
3795 const I32 elem = SvIVx(*svp);
3799 if (max > AvMAX(av))
3802 while (++MARK <= SP) {
3804 I32 elem = SvIVx(*MARK);
3808 svp = av_fetch(av, elem, lval);
3810 if (!svp || *svp == &PL_sv_undef)
3811 DIE(aTHX_ PL_no_aelem, elem);
3812 if (PL_op->op_private & OPpLVAL_INTRO)
3813 save_aelem(av, elem, svp);
3815 *MARK = svp ? *svp : &PL_sv_undef;
3818 if (GIMME != G_ARRAY) {
3820 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
3826 /* Associative arrays. */
3831 HV * const hash = (HV*)POPs;
3833 const I32 gimme = GIMME_V;
3836 /* might clobber stack_sp */
3837 entry = hv_iternext(hash);
3842 SV* const sv = hv_iterkeysv(entry);
3843 PUSHs(sv); /* won't clobber stack_sp */
3844 if (gimme == G_ARRAY) {
3847 /* might clobber stack_sp */
3848 val = hv_iterval(hash, entry);
3853 else if (gimme == G_SCALAR)
3872 const I32 gimme = GIMME_V;
3873 const I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
3875 if (PL_op->op_private & OPpSLICE) {
3877 HV * const hv = (HV*)POPs;
3878 const U32 hvtype = SvTYPE(hv);
3879 if (hvtype == SVt_PVHV) { /* hash element */
3880 while (++MARK <= SP) {
3881 SV * const sv = hv_delete_ent(hv, *MARK, discard, 0);
3882 *MARK = sv ? sv : &PL_sv_undef;
3885 else if (hvtype == SVt_PVAV) { /* array element */
3886 if (PL_op->op_flags & OPf_SPECIAL) {
3887 while (++MARK <= SP) {
3888 SV * const sv = av_delete((AV*)hv, SvIV(*MARK), discard);
3889 *MARK = sv ? sv : &PL_sv_undef;
3894 DIE(aTHX_ "Not a HASH reference");
3897 else if (gimme == G_SCALAR) {
3902 *++MARK = &PL_sv_undef;
3908 HV * const hv = (HV*)POPs;
3910 if (SvTYPE(hv) == SVt_PVHV)
3911 sv = hv_delete_ent(hv, keysv, discard, 0);
3912 else if (SvTYPE(hv) == SVt_PVAV) {
3913 if (PL_op->op_flags & OPf_SPECIAL)
3914 sv = av_delete((AV*)hv, SvIV(keysv), discard);
3916 DIE(aTHX_ "panic: avhv_delete no longer supported");
3919 DIE(aTHX_ "Not a HASH reference");
3934 if (PL_op->op_private & OPpEXISTS_SUB) {
3937 CV * const cv = sv_2cv(sv, &hv, &gv, FALSE);
3940 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
3946 if (SvTYPE(hv) == SVt_PVHV) {
3947 if (hv_exists_ent(hv, tmpsv, 0))
3950 else if (SvTYPE(hv) == SVt_PVAV) {
3951 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
3952 if (av_exists((AV*)hv, SvIV(tmpsv)))
3957 DIE(aTHX_ "Not a HASH reference");
3964 dSP; dMARK; dORIGMARK;
3965 register HV * const hv = (HV*)POPs;
3966 register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3967 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
3968 bool other_magic = FALSE;
3974 other_magic = mg_find((SV*)hv, PERL_MAGIC_env) ||
3975 ((mg = mg_find((SV*)hv, PERL_MAGIC_tied))
3976 /* Try to preserve the existenceness of a tied hash
3977 * element by using EXISTS and DELETE if possible.
3978 * Fallback to FETCH and STORE otherwise */
3979 && (stash = SvSTASH(SvRV(SvTIED_obj((SV*)hv, mg))))
3980 && gv_fetchmethod_autoload(stash, "EXISTS", TRUE)
3981 && gv_fetchmethod_autoload(stash, "DELETE", TRUE));
3984 while (++MARK <= SP) {
3985 SV * const keysv = *MARK;
3988 bool preeminent = FALSE;
3991 preeminent = SvRMAGICAL(hv) && !other_magic ? 1 :
3992 hv_exists_ent(hv, keysv, 0);
3995 he = hv_fetch_ent(hv, keysv, lval, 0);
3996 svp = he ? &HeVAL(he) : 0;
3999 if (!svp || *svp == &PL_sv_undef) {
4000 DIE(aTHX_ PL_no_helem_sv, keysv);
4004 save_helem(hv, keysv, svp);
4007 const char *key = SvPV_const(keysv, keylen);
4008 SAVEDELETE(hv, savepvn(key,keylen), keylen);
4012 *MARK = svp ? *svp : &PL_sv_undef;
4014 if (GIMME != G_ARRAY) {
4016 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
4022 /* List operators. */
4027 if (GIMME != G_ARRAY) {
4029 *MARK = *SP; /* unwanted list, return last item */
4031 *MARK = &PL_sv_undef;
4040 SV ** const lastrelem = PL_stack_sp;
4041 SV ** const lastlelem = PL_stack_base + POPMARK;
4042 SV ** const firstlelem = PL_stack_base + POPMARK + 1;
4043 register SV ** const firstrelem = lastlelem + 1;
4044 const I32 arybase = PL_curcop->cop_arybase;
4045 I32 is_something_there = PL_op->op_flags & OPf_MOD;
4047 register const I32 max = lastrelem - lastlelem;
4048 register SV **lelem;
4050 if (GIMME != G_ARRAY) {
4051 I32 ix = SvIVx(*lastlelem);
4056 if (ix < 0 || ix >= max)
4057 *firstlelem = &PL_sv_undef;
4059 *firstlelem = firstrelem[ix];
4065 SP = firstlelem - 1;
4069 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
4070 I32 ix = SvIVx(*lelem);
4075 if (ix < 0 || ix >= max)
4076 *lelem = &PL_sv_undef;
4078 is_something_there = TRUE;
4079 if (!(*lelem = firstrelem[ix]))
4080 *lelem = &PL_sv_undef;
4083 if (is_something_there)
4086 SP = firstlelem - 1;
4092 dSP; dMARK; dORIGMARK;
4093 const I32 items = SP - MARK;
4094 SV * const av = sv_2mortal((SV*)av_make(items, MARK+1));
4095 SP = ORIGMARK; /* av_make() might realloc stack_sp */
4102 dSP; dMARK; dORIGMARK;
4103 HV* const hv = (HV*)sv_2mortal((SV*)newHV());
4106 SV * const key = *++MARK;
4107 SV * const val = NEWSV(46, 0);
4109 sv_setsv(val, *++MARK);
4110 else if (ckWARN(WARN_MISC))
4111 Perl_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
4112 (void)hv_store_ent(hv,key,val,0);
4121 dVAR; dSP; dMARK; dORIGMARK;
4122 register AV *ary = (AV*)*++MARK;
4126 register I32 offset;
4127 register I32 length;
4132 const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4135 *MARK-- = SvTIED_obj((SV*)ary, mg);
4139 call_method("SPLICE",GIMME_V);
4148 offset = i = SvIVx(*MARK);
4150 offset += AvFILLp(ary) + 1;
4152 offset -= PL_curcop->cop_arybase;
4154 DIE(aTHX_ PL_no_aelem, i);
4156 length = SvIVx(*MARK++);
4158 length += AvFILLp(ary) - offset + 1;
4164 length = AvMAX(ary) + 1; /* close enough to infinity */
4168 length = AvMAX(ary) + 1;
4170 if (offset > AvFILLp(ary) + 1) {
4171 if (ckWARN(WARN_MISC))
4172 Perl_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
4173 offset = AvFILLp(ary) + 1;
4175 after = AvFILLp(ary) + 1 - (offset + length);
4176 if (after < 0) { /* not that much array */
4177 length += after; /* offset+length now in array */
4183 /* At this point, MARK .. SP-1 is our new LIST */
4186 diff = newlen - length;
4187 if (newlen && !AvREAL(ary) && AvREIFY(ary))
4190 /* make new elements SVs now: avoid problems if they're from the array */
4191 for (dst = MARK, i = newlen; i; i--) {
4192 SV * const h = *dst;
4193 *dst++ = newSVsv(h);
4196 if (diff < 0) { /* shrinking the area */
4198 Newx(tmparyval, newlen, SV*); /* so remember insertion */
4199 Copy(MARK, tmparyval, newlen, SV*);
4202 MARK = ORIGMARK + 1;
4203 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4204 MEXTEND(MARK, length);
4205 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
4207 EXTEND_MORTAL(length);
4208 for (i = length, dst = MARK; i; i--) {
4209 sv_2mortal(*dst); /* free them eventualy */
4216 *MARK = AvARRAY(ary)[offset+length-1];
4219 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
4220 SvREFCNT_dec(*dst++); /* free them now */
4223 AvFILLp(ary) += diff;
4225 /* pull up or down? */
4227 if (offset < after) { /* easier to pull up */
4228 if (offset) { /* esp. if nothing to pull */
4229 src = &AvARRAY(ary)[offset-1];
4230 dst = src - diff; /* diff is negative */
4231 for (i = offset; i > 0; i--) /* can't trust Copy */
4235 SvPV_set(ary, (char*)(AvARRAY(ary) - diff)); /* diff is negative */
4239 if (after) { /* anything to pull down? */
4240 src = AvARRAY(ary) + offset + length;
4241 dst = src + diff; /* diff is negative */
4242 Move(src, dst, after, SV*);
4244 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
4245 /* avoid later double free */
4249 dst[--i] = &PL_sv_undef;
4252 Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
4253 Safefree(tmparyval);
4256 else { /* no, expanding (or same) */
4258 Newx(tmparyval, length, SV*); /* so remember deletion */
4259 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
4262 if (diff > 0) { /* expanding */
4264 /* push up or down? */
4266 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
4270 Move(src, dst, offset, SV*);
4272 SvPV_set(ary, (char*)(AvARRAY(ary) - diff));/* diff is positive */
4274 AvFILLp(ary) += diff;
4277 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
4278 av_extend(ary, AvFILLp(ary) + diff);
4279 AvFILLp(ary) += diff;
4282 dst = AvARRAY(ary) + AvFILLp(ary);
4284 for (i = after; i; i--) {
4292 Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
4295 MARK = ORIGMARK + 1;
4296 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4298 Copy(tmparyval, MARK, length, SV*);
4300 EXTEND_MORTAL(length);
4301 for (i = length, dst = MARK; i; i--) {
4302 sv_2mortal(*dst); /* free them eventualy */
4306 Safefree(tmparyval);
4310 else if (length--) {
4311 *MARK = tmparyval[length];
4314 while (length-- > 0)
4315 SvREFCNT_dec(tmparyval[length]);
4317 Safefree(tmparyval);
4320 *MARK = &PL_sv_undef;
4328 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4329 register AV *ary = (AV*)*++MARK;
4330 const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4333 *MARK-- = SvTIED_obj((SV*)ary, mg);
4337 call_method("PUSH",G_SCALAR|G_DISCARD);
4342 /* Why no pre-extend of ary here ? */
4343 for (++MARK; MARK <= SP; MARK++) {
4344 SV * const sv = NEWSV(51, 0);
4346 sv_setsv(sv, *MARK);
4351 PUSHi( AvFILL(ary) + 1 );
4358 AV * const av = (AV*)POPs;
4359 SV * const sv = av_pop(av);
4361 (void)sv_2mortal(sv);
4369 AV * const av = (AV*)POPs;
4370 SV * const sv = av_shift(av);
4375 (void)sv_2mortal(sv);
4382 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4383 register AV *ary = (AV*)*++MARK;
4384 const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4387 *MARK-- = SvTIED_obj((SV*)ary, mg);
4391 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
4397 av_unshift(ary, SP - MARK);
4399 SV * const sv = newSVsv(*++MARK);
4400 (void)av_store(ary, i++, sv);
4404 PUSHi( AvFILL(ary) + 1 );
4411 SV ** const oldsp = SP;
4413 if (GIMME == G_ARRAY) {
4416 register SV * const tmp = *MARK;
4420 /* safe as long as stack cannot get extended in the above */
4425 register char *down;
4431 SvUTF8_off(TARG); /* decontaminate */
4433 do_join(TARG, &PL_sv_no, MARK, SP);
4435 sv_setsv(TARG, (SP > MARK)
4437 : (padoff_du = find_rundefsvoffset(),
4438 (padoff_du == NOT_IN_PAD || PAD_COMPNAME_FLAGS(padoff_du) & SVpad_OUR)
4439 ? DEFSV : PAD_SVl(padoff_du)));
4440 up = SvPV_force(TARG, len);
4442 if (DO_UTF8(TARG)) { /* first reverse each character */
4443 U8* s = (U8*)SvPVX(TARG);
4444 const U8* send = (U8*)(s + len);
4446 if (UTF8_IS_INVARIANT(*s)) {
4451 if (!utf8_to_uvchr(s, 0))
4455 down = (char*)(s - 1);
4456 /* reverse this character */
4460 *down-- = (char)tmp;
4466 down = SvPVX(TARG) + len - 1;
4470 *down-- = (char)tmp;
4472 (void)SvPOK_only_UTF8(TARG);
4484 register IV limit = POPi; /* note, negative is forever */
4485 SV * const sv = POPs;
4487 register const char *s = SvPV_const(sv, len);
4488 const bool do_utf8 = DO_UTF8(sv);
4489 const char *strend = s + len;
4491 register REGEXP *rx;
4493 register const char *m;
4495 const STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (strend - s);
4496 I32 maxiters = slen + 10;
4498 const I32 origlimit = limit;
4501 const I32 gimme = GIMME_V;
4502 const I32 oldsave = PL_savestack_ix;
4503 I32 make_mortal = 1;
4505 MAGIC *mg = (MAGIC *) NULL;
4508 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4513 DIE(aTHX_ "panic: pp_split");
4516 TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
4517 (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
4519 RX_MATCH_UTF8_set(rx, do_utf8);
4521 if (pm->op_pmreplroot) {
4523 ary = GvAVn((GV*)PAD_SVl(INT2PTR(PADOFFSET, pm->op_pmreplroot)));
4525 ary = GvAVn((GV*)pm->op_pmreplroot);
4528 else if (gimme != G_ARRAY)
4529 ary = GvAVn(PL_defgv);
4532 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4538 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4540 XPUSHs(SvTIED_obj((SV*)ary, mg));
4547 for (i = AvFILLp(ary); i >= 0; i--)
4548 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
4550 /* temporarily switch stacks */
4551 SAVESWITCHSTACK(PL_curstack, ary);
4555 base = SP - PL_stack_base;
4557 if (pm->op_pmflags & PMf_SKIPWHITE) {
4558 if (pm->op_pmflags & PMf_LOCALE) {
4559 while (isSPACE_LC(*s))
4567 if (pm->op_pmflags & PMf_MULTILINE) {
4572 limit = maxiters + 2;
4573 if (pm->op_pmflags & PMf_WHITE) {
4576 while (m < strend &&
4577 !((pm->op_pmflags & PMf_LOCALE)
4578 ? isSPACE_LC(*m) : isSPACE(*m)))
4583 dstr = newSVpvn(s, m-s);
4587 (void)SvUTF8_on(dstr);
4591 while (s < strend &&
4592 ((pm->op_pmflags & PMf_LOCALE)
4593 ? isSPACE_LC(*s) : isSPACE(*s)))
4597 else if (rx->precomp[0] == '^' && rx->precomp[1] == '\0') {
4599 for (m = s; m < strend && *m != '\n'; m++)
4604 dstr = newSVpvn(s, m-s);
4608 (void)SvUTF8_on(dstr);
4613 else if (do_utf8 == ((rx->reganch & ROPT_UTF8) != 0) &&
4614 (rx->reganch & RE_USE_INTUIT) && !rx->nparens
4615 && (rx->reganch & ROPT_CHECK_ALL)
4616 && !(rx->reganch & ROPT_ANCH)) {
4617 const int tail = (rx->reganch & RE_INTUIT_TAIL);
4618 SV * const csv = CALLREG_INTUIT_STRING(aTHX_ rx);
4621 if (len == 1 && !(rx->reganch & ROPT_UTF8) && !tail) {
4622 const char c = *SvPV_nolen_const(csv);
4624 for (m = s; m < strend && *m != c; m++)
4628 dstr = newSVpvn(s, m-s);
4632 (void)SvUTF8_on(dstr);
4634 /* The rx->minlen is in characters but we want to step
4635 * s ahead by bytes. */
4637 s = (char*)utf8_hop((U8*)m, len);
4639 s = m + len; /* Fake \n at the end */
4643 while (s < strend && --limit &&
4644 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
4645 csv, multiline ? FBMrf_MULTILINE : 0)) )
4647 dstr = newSVpvn(s, m-s);
4651 (void)SvUTF8_on(dstr);
4653 /* The rx->minlen is in characters but we want to step
4654 * s ahead by bytes. */
4656 s = (char*)utf8_hop((U8*)m, len);
4658 s = m + len; /* Fake \n at the end */
4663 maxiters += slen * rx->nparens;
4664 while (s < strend && --limit)
4668 rex_return = CALLREGEXEC(aTHX_ rx, (char*)s, (char*)strend, (char*)orig, 1 ,
4671 if (rex_return == 0)
4673 TAINT_IF(RX_MATCH_TAINTED(rx));
4674 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
4679 strend = s + (strend - m);
4681 m = rx->startp[0] + orig;
4682 dstr = newSVpvn(s, m-s);
4686 (void)SvUTF8_on(dstr);
4690 for (i = 1; i <= (I32)rx->nparens; i++) {
4691 s = rx->startp[i] + orig;
4692 m = rx->endp[i] + orig;
4694 /* japhy (07/27/01) -- the (m && s) test doesn't catch
4695 parens that didn't match -- they should be set to
4696 undef, not the empty string */
4697 if (m >= orig && s >= orig) {
4698 dstr = newSVpvn(s, m-s);
4701 dstr = &PL_sv_undef; /* undef, not "" */
4705 (void)SvUTF8_on(dstr);
4709 s = rx->endp[0] + orig;
4713 iters = (SP - PL_stack_base) - base;
4714 if (iters > maxiters)
4715 DIE(aTHX_ "Split loop");
4717 /* keep field after final delim? */
4718 if (s < strend || (iters && origlimit)) {
4719 const STRLEN l = strend - s;
4720 dstr = newSVpvn(s, l);
4724 (void)SvUTF8_on(dstr);
4728 else if (!origlimit) {
4729 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
4730 if (TOPs && !make_mortal)
4733 *SP-- = &PL_sv_undef;
4738 LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */
4742 if (SvSMAGICAL(ary)) {
4747 if (gimme == G_ARRAY) {
4749 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4757 call_method("PUSH",G_SCALAR|G_DISCARD);
4760 if (gimme == G_ARRAY) {
4762 /* EXTEND should not be needed - we just popped them */
4764 for (i=0; i < iters; i++) {
4765 SV **svp = av_fetch(ary, i, FALSE);
4766 PUSHs((svp) ? *svp : &PL_sv_undef);
4773 if (gimme == G_ARRAY)
4788 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
4789 || SvTYPE(retsv) == SVt_PVCV) {
4790 retsv = refto(retsv);
4798 DIE(aTHX_ "tried to access per-thread data in non-threaded perl");
4803 * c-indentation-style: bsd
4805 * indent-tabs-mode: t
4808 * ex: set ts=8 sts=4 sw=4 noet: