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);
38 /* variations on pp_null */
43 if (GIMME_V == G_SCALAR)
59 if (PL_op->op_private & OPpLVAL_INTRO)
60 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
62 if (PL_op->op_flags & OPf_REF) {
66 if (GIMME == G_SCALAR)
67 Perl_croak(aTHX_ "Can't return array to lvalue scalar context");
72 if (gimme == G_ARRAY) {
73 I32 maxarg = AvFILL((AV*)TARG) + 1;
75 if (SvMAGICAL(TARG)) {
77 for (i=0; i < (U32)maxarg; i++) {
78 SV **svp = av_fetch((AV*)TARG, i, FALSE);
79 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
83 Copy(AvARRAY((AV*)TARG), SP+1, maxarg, SV*);
87 else if (gimme == G_SCALAR) {
88 SV* sv = sv_newmortal();
89 I32 maxarg = AvFILL((AV*)TARG) + 1;
102 if (PL_op->op_private & OPpLVAL_INTRO)
103 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
104 if (PL_op->op_flags & OPf_REF)
107 if (GIMME == G_SCALAR)
108 Perl_croak(aTHX_ "Can't return hash to lvalue scalar context");
112 if (gimme == G_ARRAY) {
115 else if (gimme == G_SCALAR) {
116 SV* sv = Perl_hv_scalar(aTHX_ (HV*)TARG);
124 DIE(aTHX_ "NOT IMPL LINE %d",__LINE__);
135 tryAMAGICunDEREF(to_gv);
138 if (SvTYPE(sv) == SVt_PVIO) {
139 GV *gv = (GV*) sv_newmortal();
140 gv_init(gv, 0, "", 0, 0);
141 GvIOp(gv) = (IO *)sv;
142 (void)SvREFCNT_inc(sv);
145 else if (SvTYPE(sv) != SVt_PVGV)
146 DIE(aTHX_ "Not a GLOB reference");
149 if (SvTYPE(sv) != SVt_PVGV) {
150 if (SvGMAGICAL(sv)) {
155 if (!SvOK(sv) && sv != &PL_sv_undef) {
156 /* If this is a 'my' scalar and flag is set then vivify
160 Perl_croak(aTHX_ PL_no_modify);
161 if (PL_op->op_private & OPpDEREF) {
164 if (cUNOP->op_targ) {
166 SV *namesv = PAD_SV(cUNOP->op_targ);
167 name = SvPV(namesv, len);
168 gv = (GV*)NEWSV(0,0);
169 gv_init(gv, CopSTASH(PL_curcop), name, len, 0);
172 name = CopSTASHPV(PL_curcop);
175 if (SvTYPE(sv) < SVt_RV)
176 sv_upgrade(sv, SVt_RV);
178 SvOOK_off(sv); /* backoff */
181 SvLEN(sv)=SvCUR(sv)=0;
188 if (PL_op->op_flags & OPf_REF ||
189 PL_op->op_private & HINT_STRICT_REFS)
190 DIE(aTHX_ PL_no_usym, "a symbol");
191 if (ckWARN(WARN_UNINITIALIZED))
195 if ((PL_op->op_flags & OPf_SPECIAL) &&
196 !(PL_op->op_flags & OPf_MOD))
198 SV * temp = (SV*)gv_fetchsv(sv, FALSE, SVt_PVGV);
200 && (!is_gv_magical_sv(sv,0)
201 || !(sv = (SV*)gv_fetchsv(sv, TRUE, SVt_PVGV)))) {
207 if (PL_op->op_private & HINT_STRICT_REFS)
208 DIE(aTHX_ PL_no_symref_sv, sv, "a symbol");
209 sv = (SV*)gv_fetchsv(sv, TRUE, SVt_PVGV);
213 if (PL_op->op_private & OPpLVAL_INTRO)
214 save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
226 tryAMAGICunDEREF(to_sv);
229 switch (SvTYPE(sv)) {
233 DIE(aTHX_ "Not a SCALAR reference");
239 if (SvTYPE(gv) != SVt_PVGV) {
240 if (SvGMAGICAL(sv)) {
246 if (PL_op->op_flags & OPf_REF ||
247 PL_op->op_private & HINT_STRICT_REFS)
248 DIE(aTHX_ PL_no_usym, "a SCALAR");
249 if (ckWARN(WARN_UNINITIALIZED))
253 if ((PL_op->op_flags & OPf_SPECIAL) &&
254 !(PL_op->op_flags & OPf_MOD))
256 gv = (GV*)gv_fetchsv(sv, FALSE, SVt_PV);
258 && (!is_gv_magical_sv(sv, 0)
259 || !(gv = (GV*)gv_fetchsv(sv, TRUE, SVt_PV))))
265 if (PL_op->op_private & HINT_STRICT_REFS)
266 DIE(aTHX_ PL_no_symref_sv, sv, "a SCALAR");
267 gv = (GV*)gv_fetchsv(sv, TRUE, SVt_PV);
272 if (PL_op->op_flags & OPf_MOD) {
273 if (PL_op->op_private & OPpLVAL_INTRO) {
274 if (cUNOP->op_first->op_type == OP_NULL)
275 sv = save_scalar((GV*)TOPs);
277 sv = save_scalar(gv);
279 Perl_croak(aTHX_ PL_no_localize_ref);
281 else if (PL_op->op_private & OPpDEREF)
282 vivify_ref(sv, PL_op->op_private & OPpDEREF);
292 SV *sv = AvARYLEN(av);
294 AvARYLEN(av) = sv = NEWSV(0,0);
295 sv_upgrade(sv, SVt_IV);
296 sv_magic(sv, (SV*)av, PERL_MAGIC_arylen, Nullch, 0);
304 dSP; dTARGET; dPOPss;
306 if (PL_op->op_flags & OPf_MOD || LVRET) {
307 if (SvTYPE(TARG) < SVt_PVLV) {
308 sv_upgrade(TARG, SVt_PVLV);
309 sv_magic(TARG, Nullsv, PERL_MAGIC_pos, Nullch, 0);
313 if (LvTARG(TARG) != sv) {
315 SvREFCNT_dec(LvTARG(TARG));
316 LvTARG(TARG) = SvREFCNT_inc(sv);
318 PUSHs(TARG); /* no SvSETMAGIC */
324 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
325 mg = mg_find(sv, PERL_MAGIC_regex_global);
326 if (mg && mg->mg_len >= 0) {
330 PUSHi(i + PL_curcop->cop_arybase);
344 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
345 /* (But not in defined().) */
346 CV *cv = sv_2cv(TOPs, &stash, &gv, !(PL_op->op_flags & OPf_SPECIAL));
349 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
350 if ((PL_op->op_private & OPpLVAL_INTRO)) {
351 if (gv && GvCV(gv) == cv && (gv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv), FALSE)))
354 DIE(aTHX_ "Can't modify non-lvalue subroutine call");
358 cv = (CV*)&PL_sv_undef;
372 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
373 char *s = SvPVX(TOPs);
374 if (strnEQ(s, "CORE::", 6)) {
377 code = keyword(s + 6, SvCUR(TOPs) - 6);
378 if (code < 0) { /* Overridable. */
379 #define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
380 int i = 0, n = 0, seen_question = 0;
382 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
384 if (code == -KEY_chop || code == -KEY_chomp)
386 while (i < MAXO) { /* The slow way. */
387 if (strEQ(s + 6, PL_op_name[i])
388 || strEQ(s + 6, PL_op_desc[i]))
394 goto nonesuch; /* Should not happen... */
396 oa = PL_opargs[i] >> OASHIFT;
398 if (oa & OA_OPTIONAL && !seen_question) {
402 else if (n && str[0] == ';' && seen_question)
403 goto set; /* XXXX system, exec */
404 if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
405 && (oa & (OA_OPTIONAL - 1)) <= OA_SCALARREF
406 /* But globs are already references (kinda) */
407 && (oa & (OA_OPTIONAL - 1)) != OA_FILEREF
411 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
415 ret = sv_2mortal(newSVpvn(str, n - 1));
417 else if (code) /* Non-Overridable */
419 else { /* None such */
421 DIE(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
425 cv = sv_2cv(TOPs, &stash, &gv, FALSE);
427 ret = sv_2mortal(newSVpvn(SvPVX(cv), SvCUR(cv)));
436 CV* cv = (CV*)PAD_SV(PL_op->op_targ);
438 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
454 if (GIMME != G_ARRAY) {
458 *MARK = &PL_sv_undef;
459 *MARK = refto(*MARK);
463 EXTEND_MORTAL(SP - MARK);
465 *MARK = refto(*MARK);
470 S_refto(pTHX_ SV *sv)
474 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
477 if (!(sv = LvTARG(sv)))
480 (void)SvREFCNT_inc(sv);
482 else if (SvTYPE(sv) == SVt_PVAV) {
483 if (!AvREAL((AV*)sv) && AvREIFY((AV*)sv))
486 (void)SvREFCNT_inc(sv);
488 else if (SvPADTMP(sv) && !IS_PADGV(sv))
492 (void)SvREFCNT_inc(sv);
495 sv_upgrade(rv, SVt_RV);
509 if (sv && SvGMAGICAL(sv))
512 if (!sv || !SvROK(sv))
516 pv = sv_reftype(sv,TRUE);
517 PUSHp(pv, strlen(pv));
527 stash = CopSTASH(PL_curcop);
533 if (ssv && !SvGMAGICAL(ssv) && !SvAMAGIC(ssv) && SvROK(ssv))
534 Perl_croak(aTHX_ "Attempt to bless into a reference");
536 if (ckWARN(WARN_MISC) && len == 0)
537 Perl_warner(aTHX_ packWARN(WARN_MISC),
538 "Explicit blessing to '' (assuming package main)");
539 stash = gv_stashpvn(ptr, len, TRUE);
542 (void)sv_bless(TOPs, stash);
556 elem = SvPV(sv, n_a);
561 /* elem will always be NUL terminated. */
562 const char *elem2 = elem + 1;
565 if (strEQ(elem2, "RRAY"))
566 tmpRef = (SV*)GvAV(gv);
569 if (strEQ(elem2, "ODE"))
570 tmpRef = (SV*)GvCVu(gv);
573 if (strEQ(elem2, "ILEHANDLE")) {
574 /* finally deprecated in 5.8.0 */
575 deprecate("*glob{FILEHANDLE}");
576 tmpRef = (SV*)GvIOp(gv);
579 if (strEQ(elem2, "ORMAT"))
580 tmpRef = (SV*)GvFORM(gv);
583 if (strEQ(elem2, "LOB"))
587 if (strEQ(elem2, "ASH"))
588 tmpRef = (SV*)GvHV(gv);
591 if (*elem2 == 'O' && !elem[2])
592 tmpRef = (SV*)GvIOp(gv);
595 if (strEQ(elem2, "AME"))
596 sv = newSVpvn(GvNAME(gv), GvNAMELEN(gv));
599 if (strEQ(elem2, "ACKAGE")) {
600 if (HvNAME(GvSTASH(gv)))
601 sv = newSVpv(HvNAME(GvSTASH(gv)), 0);
603 sv = newSVpv("__ANON__",0);
607 if (strEQ(elem2, "CALAR"))
622 /* Pattern matching */
627 register unsigned char *s;
630 register I32 *sfirst;
634 if (sv == PL_lastscream) {
640 SvSCREAM_off(PL_lastscream);
641 SvREFCNT_dec(PL_lastscream);
643 PL_lastscream = SvREFCNT_inc(sv);
646 s = (unsigned char*)(SvPV(sv, len));
650 if (pos > PL_maxscream) {
651 if (PL_maxscream < 0) {
652 PL_maxscream = pos + 80;
653 New(301, PL_screamfirst, 256, I32);
654 New(302, PL_screamnext, PL_maxscream, I32);
657 PL_maxscream = pos + pos / 4;
658 Renew(PL_screamnext, PL_maxscream, I32);
662 sfirst = PL_screamfirst;
663 snext = PL_screamnext;
665 if (!sfirst || !snext)
666 DIE(aTHX_ "do_study: out of memory");
668 for (ch = 256; ch; --ch)
675 snext[pos] = sfirst[ch] - pos;
682 /* piggyback on m//g magic */
683 sv_magic(sv, Nullsv, PERL_MAGIC_regex_global, Nullch, 0);
692 if (PL_op->op_flags & OPf_STACKED)
694 else if (PL_op->op_private & OPpTARGET_MY)
700 TARG = sv_newmortal();
705 /* Lvalue operators. */
717 dSP; dMARK; dTARGET; dORIGMARK;
719 do_chop(TARG, *++MARK);
728 SETi(do_chomp(TOPs));
735 register I32 count = 0;
738 count += do_chomp(POPs);
749 if (!sv || !SvANY(sv))
751 switch (SvTYPE(sv)) {
753 if (AvMAX(sv) >= 0 || SvGMAGICAL(sv)
754 || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
758 if (HvARRAY(sv) || SvGMAGICAL(sv)
759 || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
763 if (CvROOT(sv) || CvXSUB(sv))
780 if (!PL_op->op_private) {
789 SV_CHECK_THINKFIRST_COW_DROP(sv);
791 switch (SvTYPE(sv)) {
801 if (ckWARN(WARN_MISC) && cv_const_sv((CV*)sv))
802 Perl_warner(aTHX_ packWARN(WARN_MISC), "Constant subroutine %s undefined",
803 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
807 /* let user-undef'd sub keep its identity */
808 GV* gv = CvGV((CV*)sv);
815 SvSetMagicSV(sv, &PL_sv_undef);
819 Newz(602, gp, 1, GP);
820 GvGP(sv) = gp_ref(gp);
821 GvSV(sv) = NEWSV(72,0);
822 GvLINE(sv) = CopLINE(PL_curcop);
828 if (SvTYPE(sv) >= SVt_PV && SvPVX(sv) && SvLEN(sv)) {
831 SvPV_set(sv, Nullch);
844 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
845 DIE(aTHX_ PL_no_modify);
846 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
847 && SvIVX(TOPs) != IV_MIN)
850 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
861 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
862 DIE(aTHX_ PL_no_modify);
863 sv_setsv(TARG, TOPs);
864 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
865 && SvIVX(TOPs) != IV_MAX)
868 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
873 /* special case for undef: see thread at 2003-03/msg00536.html in archive */
883 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
884 DIE(aTHX_ PL_no_modify);
885 sv_setsv(TARG, TOPs);
886 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
887 && SvIVX(TOPs) != IV_MIN)
890 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
899 /* Ordinary operators. */
904 #ifdef PERL_PRESERVE_IVUV
907 tryAMAGICbin(pow,opASSIGN);
908 #ifdef PERL_PRESERVE_IVUV
909 /* For integer to integer power, we do the calculation by hand wherever
910 we're sure it is safe; otherwise we call pow() and try to convert to
911 integer afterwards. */
915 bool baseuok = SvUOK(TOPm1s);
919 baseuv = SvUVX(TOPm1s);
921 IV iv = SvIVX(TOPm1s);
924 baseuok = TRUE; /* effectively it's a UV now */
926 baseuv = -iv; /* abs, baseuok == false records sign */
940 goto float_it; /* Can't do negative powers this way. */
943 /* now we have integer ** positive integer. */
946 /* foo & (foo - 1) is zero only for a power of 2. */
947 if (!(baseuv & (baseuv - 1))) {
948 /* We are raising power-of-2 to a positive integer.
949 The logic here will work for any base (even non-integer
950 bases) but it can be less accurate than
951 pow (base,power) or exp (power * log (base)) when the
952 intermediate values start to spill out of the mantissa.
953 With powers of 2 we know this can't happen.
954 And powers of 2 are the favourite thing for perl
955 programmers to notice ** not doing what they mean. */
957 NV base = baseuok ? baseuv : -(NV)baseuv;
960 for (; power; base *= base, n++) {
961 /* Do I look like I trust gcc with long longs here?
963 UV bit = (UV)1 << (UV)n;
966 /* Only bother to clear the bit if it is set. */
968 /* Avoid squaring base again if we're done. */
969 if (power == 0) break;
977 register unsigned int highbit = 8 * sizeof(UV);
978 register unsigned int lowbit = 0;
979 register unsigned int diff;
980 bool odd_power = (bool)(power & 1);
981 while ((diff = (highbit - lowbit) >> 1)) {
982 if (baseuv & ~((1 << (lowbit + diff)) - 1))
987 /* we now have baseuv < 2 ** highbit */
988 if (power * highbit <= 8 * sizeof(UV)) {
989 /* result will definitely fit in UV, so use UV math
990 on same algorithm as above */
991 register UV result = 1;
992 register UV base = baseuv;
994 for (; power; base *= base, n++) {
995 register UV bit = (UV)1 << (UV)n;
999 if (power == 0) break;
1003 if (baseuok || !odd_power)
1004 /* answer is positive */
1006 else if (result <= (UV)IV_MAX)
1007 /* answer negative, fits in IV */
1008 SETi( -(IV)result );
1009 else if (result == (UV)IV_MIN)
1010 /* 2's complement assumption: special case IV_MIN */
1013 /* answer negative, doesn't fit */
1014 SETn( -(NV)result );
1025 SETn( Perl_pow( left, right) );
1026 #ifdef PERL_PRESERVE_IVUV
1036 dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
1037 #ifdef PERL_PRESERVE_IVUV
1040 /* Unless the left argument is integer in range we are going to have to
1041 use NV maths. Hence only attempt to coerce the right argument if
1042 we know the left is integer. */
1043 /* Left operand is defined, so is it IV? */
1044 SvIV_please(TOPm1s);
1045 if (SvIOK(TOPm1s)) {
1046 bool auvok = SvUOK(TOPm1s);
1047 bool buvok = SvUOK(TOPs);
1048 const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
1049 const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
1056 alow = SvUVX(TOPm1s);
1058 IV aiv = SvIVX(TOPm1s);
1061 auvok = TRUE; /* effectively it's a UV now */
1063 alow = -aiv; /* abs, auvok == false records sign */
1069 IV biv = SvIVX(TOPs);
1072 buvok = TRUE; /* effectively it's a UV now */
1074 blow = -biv; /* abs, buvok == false records sign */
1078 /* If this does sign extension on unsigned it's time for plan B */
1079 ahigh = alow >> (4 * sizeof (UV));
1081 bhigh = blow >> (4 * sizeof (UV));
1083 if (ahigh && bhigh) {
1084 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
1085 which is overflow. Drop to NVs below. */
1086 } else if (!ahigh && !bhigh) {
1087 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
1088 so the unsigned multiply cannot overflow. */
1089 UV product = alow * blow;
1090 if (auvok == buvok) {
1091 /* -ve * -ve or +ve * +ve gives a +ve result. */
1095 } else if (product <= (UV)IV_MIN) {
1096 /* 2s complement assumption that (UV)-IV_MIN is correct. */
1097 /* -ve result, which could overflow an IV */
1099 SETi( -(IV)product );
1101 } /* else drop to NVs below. */
1103 /* One operand is large, 1 small */
1106 /* swap the operands */
1108 bhigh = blow; /* bhigh now the temp var for the swap */
1112 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1113 multiplies can't overflow. shift can, add can, -ve can. */
1114 product_middle = ahigh * blow;
1115 if (!(product_middle & topmask)) {
1116 /* OK, (ahigh * blow) won't lose bits when we shift it. */
1118 product_middle <<= (4 * sizeof (UV));
1119 product_low = alow * blow;
1121 /* as for pp_add, UV + something mustn't get smaller.
1122 IIRC ANSI mandates this wrapping *behaviour* for
1123 unsigned whatever the actual representation*/
1124 product_low += product_middle;
1125 if (product_low >= product_middle) {
1126 /* didn't overflow */
1127 if (auvok == buvok) {
1128 /* -ve * -ve or +ve * +ve gives a +ve result. */
1130 SETu( product_low );
1132 } else if (product_low <= (UV)IV_MIN) {
1133 /* 2s complement assumption again */
1134 /* -ve result, which could overflow an IV */
1136 SETi( -(IV)product_low );
1138 } /* else drop to NVs below. */
1140 } /* product_middle too large */
1141 } /* ahigh && bhigh */
1142 } /* SvIOK(TOPm1s) */
1147 SETn( left * right );
1154 dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
1155 /* Only try to do UV divide first
1156 if ((SLOPPYDIVIDE is true) or
1157 (PERL_PRESERVE_IVUV is true and one or both SV is a UV too large
1159 The assumption is that it is better to use floating point divide
1160 whenever possible, only doing integer divide first if we can't be sure.
1161 If NV_PRESERVES_UV is true then we know at compile time that no UV
1162 can be too large to preserve, so don't need to compile the code to
1163 test the size of UVs. */
1166 # define PERL_TRY_UV_DIVIDE
1167 /* ensure that 20./5. == 4. */
1169 # ifdef PERL_PRESERVE_IVUV
1170 # ifndef NV_PRESERVES_UV
1171 # define PERL_TRY_UV_DIVIDE
1176 #ifdef PERL_TRY_UV_DIVIDE
1179 SvIV_please(TOPm1s);
1180 if (SvIOK(TOPm1s)) {
1181 bool left_non_neg = SvUOK(TOPm1s);
1182 bool right_non_neg = SvUOK(TOPs);
1186 if (right_non_neg) {
1187 right = SvUVX(TOPs);
1190 IV biv = SvIVX(TOPs);
1193 right_non_neg = TRUE; /* effectively it's a UV now */
1199 /* historically undef()/0 gives a "Use of uninitialized value"
1200 warning before dieing, hence this test goes here.
1201 If it were immediately before the second SvIV_please, then
1202 DIE() would be invoked before left was even inspected, so
1203 no inpsection would give no warning. */
1205 DIE(aTHX_ "Illegal division by zero");
1208 left = SvUVX(TOPm1s);
1211 IV aiv = SvIVX(TOPm1s);
1214 left_non_neg = TRUE; /* effectively it's a UV now */
1223 /* For sloppy divide we always attempt integer division. */
1225 /* Otherwise we only attempt it if either or both operands
1226 would not be preserved by an NV. If both fit in NVs
1227 we fall through to the NV divide code below. However,
1228 as left >= right to ensure integer result here, we know that
1229 we can skip the test on the right operand - right big
1230 enough not to be preserved can't get here unless left is
1233 && (left > ((UV)1 << NV_PRESERVES_UV_BITS))
1236 /* Integer division can't overflow, but it can be imprecise. */
1237 UV result = left / right;
1238 if (result * right == left) {
1239 SP--; /* result is valid */
1240 if (left_non_neg == right_non_neg) {
1241 /* signs identical, result is positive. */
1245 /* 2s complement assumption */
1246 if (result <= (UV)IV_MIN)
1247 SETi( -(IV)result );
1249 /* It's exact but too negative for IV. */
1250 SETn( -(NV)result );
1253 } /* tried integer divide but it was not an integer result */
1254 } /* else (PERL_ABS(result) < 1.0) or (both UVs in range for NV) */
1255 } /* left wasn't SvIOK */
1256 } /* right wasn't SvIOK */
1257 #endif /* PERL_TRY_UV_DIVIDE */
1261 DIE(aTHX_ "Illegal division by zero");
1262 PUSHn( left / right );
1269 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1273 bool left_neg = FALSE;
1274 bool right_neg = FALSE;
1275 bool use_double = FALSE;
1276 bool dright_valid = FALSE;
1282 right_neg = !SvUOK(TOPs);
1284 right = SvUVX(POPs);
1286 IV biv = SvIVX(POPs);
1289 right_neg = FALSE; /* effectively it's a UV now */
1297 right_neg = dright < 0;
1300 if (dright < UV_MAX_P1) {
1301 right = U_V(dright);
1302 dright_valid = TRUE; /* In case we need to use double below. */
1308 /* At this point use_double is only true if right is out of range for
1309 a UV. In range NV has been rounded down to nearest UV and
1310 use_double false. */
1312 if (!use_double && SvIOK(TOPs)) {
1314 left_neg = !SvUOK(TOPs);
1318 IV aiv = SvIVX(POPs);
1321 left_neg = FALSE; /* effectively it's a UV now */
1330 left_neg = dleft < 0;
1334 /* This should be exactly the 5.6 behaviour - if left and right are
1335 both in range for UV then use U_V() rather than floor. */
1337 if (dleft < UV_MAX_P1) {
1338 /* right was in range, so is dleft, so use UVs not double.
1342 /* left is out of range for UV, right was in range, so promote
1343 right (back) to double. */
1345 /* The +0.5 is used in 5.6 even though it is not strictly
1346 consistent with the implicit +0 floor in the U_V()
1347 inside the #if 1. */
1348 dleft = Perl_floor(dleft + 0.5);
1351 dright = Perl_floor(dright + 0.5);
1361 DIE(aTHX_ "Illegal modulus zero");
1363 dans = Perl_fmod(dleft, dright);
1364 if ((left_neg != right_neg) && dans)
1365 dans = dright - dans;
1368 sv_setnv(TARG, dans);
1374 DIE(aTHX_ "Illegal modulus zero");
1377 if ((left_neg != right_neg) && ans)
1380 /* XXX may warn: unary minus operator applied to unsigned type */
1381 /* could change -foo to be (~foo)+1 instead */
1382 if (ans <= ~((UV)IV_MAX)+1)
1383 sv_setiv(TARG, ~ans+1);
1385 sv_setnv(TARG, -(NV)ans);
1388 sv_setuv(TARG, ans);
1397 dSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
1407 count = IV_MAX; /* The best we can do? */
1418 else if (SvNOKp(sv)) {
1427 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1429 I32 items = SP - MARK;
1431 static const char oom_list_extend[] =
1432 "Out of memory during list extend";
1434 max = items * count;
1435 MEM_WRAP_CHECK_1(max, SV*, oom_list_extend);
1436 /* Did the max computation overflow? */
1437 if (items > 0 && max > 0 && (max < items || max < count))
1438 Perl_croak(aTHX_ oom_list_extend);
1443 /* This code was intended to fix 20010809.028:
1446 for (($x =~ /./g) x 2) {
1447 print chop; # "abcdabcd" expected as output.
1450 * but that change (#11635) broke this code:
1452 $x = [("foo")x2]; # only one "foo" ended up in the anonlist.
1454 * I can't think of a better fix that doesn't introduce
1455 * an efficiency hit by copying the SVs. The stack isn't
1456 * refcounted, and mortalisation obviously doesn't
1457 * Do The Right Thing when the stack has more than
1458 * one pointer to the same mortal value.
1462 *SP = sv_2mortal(newSVsv(*SP));
1472 repeatcpy((char*)(MARK + items), (char*)MARK,
1473 items * sizeof(SV*), count - 1);
1476 else if (count <= 0)
1479 else { /* Note: mark already snarfed by pp_list */
1483 static const char oom_string_extend[] =
1484 "Out of memory during string extend";
1486 SvSetSV(TARG, tmpstr);
1487 SvPV_force(TARG, len);
1488 isutf = DO_UTF8(TARG);
1493 IV max = count * len;
1494 if (len > ((MEM_SIZE)~0)/count)
1495 Perl_croak(aTHX_ oom_string_extend);
1496 MEM_WRAP_CHECK_1(max, char, oom_string_extend);
1497 SvGROW(TARG, (count * len) + 1);
1498 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1499 SvCUR(TARG) *= count;
1501 *SvEND(TARG) = '\0';
1504 (void)SvPOK_only_UTF8(TARG);
1506 (void)SvPOK_only(TARG);
1508 if (PL_op->op_private & OPpREPEAT_DOLIST) {
1509 /* The parser saw this as a list repeat, and there
1510 are probably several items on the stack. But we're
1511 in scalar context, and there's no pp_list to save us
1512 now. So drop the rest of the items -- robin@kitsite.com
1525 dSP; dATARGET; bool useleft; tryAMAGICbin(subtr,opASSIGN);
1526 useleft = USE_LEFT(TOPm1s);
1527 #ifdef PERL_PRESERVE_IVUV
1528 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1529 "bad things" happen if you rely on signed integers wrapping. */
1532 /* Unless the left argument is integer in range we are going to have to
1533 use NV maths. Hence only attempt to coerce the right argument if
1534 we know the left is integer. */
1535 register UV auv = 0;
1541 a_valid = auvok = 1;
1542 /* left operand is undef, treat as zero. */
1544 /* Left operand is defined, so is it IV? */
1545 SvIV_please(TOPm1s);
1546 if (SvIOK(TOPm1s)) {
1547 if ((auvok = SvUOK(TOPm1s)))
1548 auv = SvUVX(TOPm1s);
1550 register IV aiv = SvIVX(TOPm1s);
1553 auvok = 1; /* Now acting as a sign flag. */
1554 } else { /* 2s complement assumption for IV_MIN */
1562 bool result_good = 0;
1565 bool buvok = SvUOK(TOPs);
1570 register IV biv = SvIVX(TOPs);
1577 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1578 else "IV" now, independent of how it came in.
1579 if a, b represents positive, A, B negative, a maps to -A etc
1584 all UV maths. negate result if A negative.
1585 subtract if signs same, add if signs differ. */
1587 if (auvok ^ buvok) {
1596 /* Must get smaller */
1601 if (result <= buv) {
1602 /* result really should be -(auv-buv). as its negation
1603 of true value, need to swap our result flag */
1615 if (result <= (UV)IV_MIN)
1616 SETi( -(IV)result );
1618 /* result valid, but out of range for IV. */
1619 SETn( -(NV)result );
1623 } /* Overflow, drop through to NVs. */
1627 useleft = USE_LEFT(TOPm1s);
1631 /* left operand is undef, treat as zero - value */
1635 SETn( TOPn - value );
1642 dSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1645 if (PL_op->op_private & HINT_INTEGER) {
1659 dSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1662 if (PL_op->op_private & HINT_INTEGER) {
1676 dSP; tryAMAGICbinSET(lt,0);
1677 #ifdef PERL_PRESERVE_IVUV
1680 SvIV_please(TOPm1s);
1681 if (SvIOK(TOPm1s)) {
1682 bool auvok = SvUOK(TOPm1s);
1683 bool buvok = SvUOK(TOPs);
1685 if (!auvok && !buvok) { /* ## IV < IV ## */
1686 IV aiv = SvIVX(TOPm1s);
1687 IV biv = SvIVX(TOPs);
1690 SETs(boolSV(aiv < biv));
1693 if (auvok && buvok) { /* ## UV < UV ## */
1694 UV auv = SvUVX(TOPm1s);
1695 UV buv = SvUVX(TOPs);
1698 SETs(boolSV(auv < buv));
1701 if (auvok) { /* ## UV < IV ## */
1708 /* As (a) is a UV, it's >=0, so it cannot be < */
1713 SETs(boolSV(auv < (UV)biv));
1716 { /* ## IV < UV ## */
1720 aiv = SvIVX(TOPm1s);
1722 /* As (b) is a UV, it's >=0, so it must be < */
1729 SETs(boolSV((UV)aiv < buv));
1735 #ifndef NV_PRESERVES_UV
1736 #ifdef PERL_PRESERVE_IVUV
1739 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1741 SETs(boolSV(SvRV(TOPs) < SvRV(TOPp1s)));
1747 SETs(boolSV(TOPn < value));
1754 dSP; tryAMAGICbinSET(gt,0);
1755 #ifdef PERL_PRESERVE_IVUV
1758 SvIV_please(TOPm1s);
1759 if (SvIOK(TOPm1s)) {
1760 bool auvok = SvUOK(TOPm1s);
1761 bool buvok = SvUOK(TOPs);
1763 if (!auvok && !buvok) { /* ## IV > IV ## */
1764 IV aiv = SvIVX(TOPm1s);
1765 IV biv = SvIVX(TOPs);
1768 SETs(boolSV(aiv > biv));
1771 if (auvok && buvok) { /* ## UV > UV ## */
1772 UV auv = SvUVX(TOPm1s);
1773 UV buv = SvUVX(TOPs);
1776 SETs(boolSV(auv > buv));
1779 if (auvok) { /* ## UV > IV ## */
1786 /* As (a) is a UV, it's >=0, so it must be > */
1791 SETs(boolSV(auv > (UV)biv));
1794 { /* ## IV > UV ## */
1798 aiv = SvIVX(TOPm1s);
1800 /* As (b) is a UV, it's >=0, so it cannot be > */
1807 SETs(boolSV((UV)aiv > buv));
1813 #ifndef NV_PRESERVES_UV
1814 #ifdef PERL_PRESERVE_IVUV
1817 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1819 SETs(boolSV(SvRV(TOPs) > SvRV(TOPp1s)));
1825 SETs(boolSV(TOPn > value));
1832 dSP; tryAMAGICbinSET(le,0);
1833 #ifdef PERL_PRESERVE_IVUV
1836 SvIV_please(TOPm1s);
1837 if (SvIOK(TOPm1s)) {
1838 bool auvok = SvUOK(TOPm1s);
1839 bool buvok = SvUOK(TOPs);
1841 if (!auvok && !buvok) { /* ## IV <= IV ## */
1842 IV aiv = SvIVX(TOPm1s);
1843 IV biv = SvIVX(TOPs);
1846 SETs(boolSV(aiv <= biv));
1849 if (auvok && buvok) { /* ## UV <= UV ## */
1850 UV auv = SvUVX(TOPm1s);
1851 UV buv = SvUVX(TOPs);
1854 SETs(boolSV(auv <= buv));
1857 if (auvok) { /* ## UV <= IV ## */
1864 /* As (a) is a UV, it's >=0, so a cannot be <= */
1869 SETs(boolSV(auv <= (UV)biv));
1872 { /* ## IV <= UV ## */
1876 aiv = SvIVX(TOPm1s);
1878 /* As (b) is a UV, it's >=0, so a must be <= */
1885 SETs(boolSV((UV)aiv <= buv));
1891 #ifndef NV_PRESERVES_UV
1892 #ifdef PERL_PRESERVE_IVUV
1895 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1897 SETs(boolSV(SvRV(TOPs) <= SvRV(TOPp1s)));
1903 SETs(boolSV(TOPn <= value));
1910 dSP; tryAMAGICbinSET(ge,0);
1911 #ifdef PERL_PRESERVE_IVUV
1914 SvIV_please(TOPm1s);
1915 if (SvIOK(TOPm1s)) {
1916 bool auvok = SvUOK(TOPm1s);
1917 bool buvok = SvUOK(TOPs);
1919 if (!auvok && !buvok) { /* ## IV >= IV ## */
1920 IV aiv = SvIVX(TOPm1s);
1921 IV biv = SvIVX(TOPs);
1924 SETs(boolSV(aiv >= biv));
1927 if (auvok && buvok) { /* ## UV >= UV ## */
1928 UV auv = SvUVX(TOPm1s);
1929 UV buv = SvUVX(TOPs);
1932 SETs(boolSV(auv >= buv));
1935 if (auvok) { /* ## UV >= IV ## */
1942 /* As (a) is a UV, it's >=0, so it must be >= */
1947 SETs(boolSV(auv >= (UV)biv));
1950 { /* ## IV >= UV ## */
1954 aiv = SvIVX(TOPm1s);
1956 /* As (b) is a UV, it's >=0, so a cannot be >= */
1963 SETs(boolSV((UV)aiv >= buv));
1969 #ifndef NV_PRESERVES_UV
1970 #ifdef PERL_PRESERVE_IVUV
1973 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1975 SETs(boolSV(SvRV(TOPs) >= SvRV(TOPp1s)));
1981 SETs(boolSV(TOPn >= value));
1988 dSP; tryAMAGICbinSET(ne,0);
1989 #ifndef NV_PRESERVES_UV
1990 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1992 SETs(boolSV(SvRV(TOPs) != SvRV(TOPp1s)));
1996 #ifdef PERL_PRESERVE_IVUV
1999 SvIV_please(TOPm1s);
2000 if (SvIOK(TOPm1s)) {
2001 bool auvok = SvUOK(TOPm1s);
2002 bool buvok = SvUOK(TOPs);
2004 if (auvok == buvok) { /* ## IV == IV or UV == UV ## */
2005 /* Casting IV to UV before comparison isn't going to matter
2006 on 2s complement. On 1s complement or sign&magnitude
2007 (if we have any of them) it could make negative zero
2008 differ from normal zero. As I understand it. (Need to
2009 check - is negative zero implementation defined behaviour
2011 UV buv = SvUVX(POPs);
2012 UV auv = SvUVX(TOPs);
2014 SETs(boolSV(auv != buv));
2017 { /* ## Mixed IV,UV ## */
2021 /* != is commutative so swap if needed (save code) */
2023 /* swap. top of stack (b) is the iv */
2027 /* As (a) is a UV, it's >0, so it cannot be == */
2036 /* As (b) is a UV, it's >0, so it cannot be == */
2040 uv = SvUVX(*(SP+1)); /* Do I want TOPp1s() ? */
2042 SETs(boolSV((UV)iv != uv));
2050 SETs(boolSV(TOPn != value));
2057 dSP; dTARGET; tryAMAGICbin(ncmp,0);
2058 #ifndef NV_PRESERVES_UV
2059 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2060 UV right = PTR2UV(SvRV(POPs));
2061 UV left = PTR2UV(SvRV(TOPs));
2062 SETi((left > right) - (left < right));
2066 #ifdef PERL_PRESERVE_IVUV
2067 /* Fortunately it seems NaN isn't IOK */
2070 SvIV_please(TOPm1s);
2071 if (SvIOK(TOPm1s)) {
2072 bool leftuvok = SvUOK(TOPm1s);
2073 bool rightuvok = SvUOK(TOPs);
2075 if (!leftuvok && !rightuvok) { /* ## IV <=> IV ## */
2076 IV leftiv = SvIVX(TOPm1s);
2077 IV rightiv = SvIVX(TOPs);
2079 if (leftiv > rightiv)
2081 else if (leftiv < rightiv)
2085 } else if (leftuvok && rightuvok) { /* ## UV <=> UV ## */
2086 UV leftuv = SvUVX(TOPm1s);
2087 UV rightuv = SvUVX(TOPs);
2089 if (leftuv > rightuv)
2091 else if (leftuv < rightuv)
2095 } else if (leftuvok) { /* ## UV <=> IV ## */
2099 rightiv = SvIVX(TOPs);
2101 /* As (a) is a UV, it's >=0, so it cannot be < */
2104 leftuv = SvUVX(TOPm1s);
2105 if (leftuv > (UV)rightiv) {
2107 } else if (leftuv < (UV)rightiv) {
2113 } else { /* ## IV <=> UV ## */
2117 leftiv = SvIVX(TOPm1s);
2119 /* As (b) is a UV, it's >=0, so it must be < */
2122 rightuv = SvUVX(TOPs);
2123 if ((UV)leftiv > rightuv) {
2125 } else if ((UV)leftiv < rightuv) {
2143 if (Perl_isnan(left) || Perl_isnan(right)) {
2147 value = (left > right) - (left < right);
2151 else if (left < right)
2153 else if (left > right)
2167 dSP; tryAMAGICbinSET(slt,0);
2170 int cmp = (IN_LOCALE_RUNTIME
2171 ? sv_cmp_locale(left, right)
2172 : sv_cmp(left, right));
2173 SETs(boolSV(cmp < 0));
2180 dSP; tryAMAGICbinSET(sgt,0);
2183 int cmp = (IN_LOCALE_RUNTIME
2184 ? sv_cmp_locale(left, right)
2185 : sv_cmp(left, right));
2186 SETs(boolSV(cmp > 0));
2193 dSP; tryAMAGICbinSET(sle,0);
2196 int cmp = (IN_LOCALE_RUNTIME
2197 ? sv_cmp_locale(left, right)
2198 : sv_cmp(left, right));
2199 SETs(boolSV(cmp <= 0));
2206 dSP; tryAMAGICbinSET(sge,0);
2209 int cmp = (IN_LOCALE_RUNTIME
2210 ? sv_cmp_locale(left, right)
2211 : sv_cmp(left, right));
2212 SETs(boolSV(cmp >= 0));
2219 dSP; tryAMAGICbinSET(seq,0);
2222 SETs(boolSV(sv_eq(left, right)));
2229 dSP; tryAMAGICbinSET(sne,0);
2232 SETs(boolSV(!sv_eq(left, right)));
2239 dSP; dTARGET; tryAMAGICbin(scmp,0);
2242 int cmp = (IN_LOCALE_RUNTIME
2243 ? sv_cmp_locale(left, right)
2244 : sv_cmp(left, right));
2252 dSP; dATARGET; tryAMAGICbin(band,opASSIGN);
2255 if (SvGMAGICAL(left)) mg_get(left);
2256 if (SvGMAGICAL(right)) mg_get(right);
2257 if (SvNIOKp(left) || SvNIOKp(right)) {
2258 if (PL_op->op_private & HINT_INTEGER) {
2259 IV i = SvIV_nomg(left) & SvIV_nomg(right);
2263 UV u = SvUV_nomg(left) & SvUV_nomg(right);
2268 do_vop(PL_op->op_type, TARG, left, right);
2277 dSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
2280 if (SvGMAGICAL(left)) mg_get(left);
2281 if (SvGMAGICAL(right)) mg_get(right);
2282 if (SvNIOKp(left) || SvNIOKp(right)) {
2283 if (PL_op->op_private & HINT_INTEGER) {
2284 IV i = (USE_LEFT(left) ? SvIV_nomg(left) : 0) ^ SvIV_nomg(right);
2288 UV u = (USE_LEFT(left) ? SvUV_nomg(left) : 0) ^ SvUV_nomg(right);
2293 do_vop(PL_op->op_type, TARG, left, right);
2302 dSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
2305 if (SvGMAGICAL(left)) mg_get(left);
2306 if (SvGMAGICAL(right)) mg_get(right);
2307 if (SvNIOKp(left) || SvNIOKp(right)) {
2308 if (PL_op->op_private & HINT_INTEGER) {
2309 IV i = (USE_LEFT(left) ? SvIV_nomg(left) : 0) | SvIV_nomg(right);
2313 UV u = (USE_LEFT(left) ? SvUV_nomg(left) : 0) | SvUV_nomg(right);
2318 do_vop(PL_op->op_type, TARG, left, right);
2327 dSP; dTARGET; tryAMAGICun(neg);
2330 int flags = SvFLAGS(sv);
2333 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
2334 /* It's publicly an integer, or privately an integer-not-float */
2337 if (SvIVX(sv) == IV_MIN) {
2338 /* 2s complement assumption. */
2339 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
2342 else if (SvUVX(sv) <= IV_MAX) {
2347 else if (SvIVX(sv) != IV_MIN) {
2351 #ifdef PERL_PRESERVE_IVUV
2360 else if (SvPOKp(sv)) {
2362 char *s = SvPV(sv, len);
2363 if (isIDFIRST(*s)) {
2364 sv_setpvn(TARG, "-", 1);
2367 else if (*s == '+' || *s == '-') {
2369 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
2371 else if (DO_UTF8(sv)) {
2374 goto oops_its_an_int;
2376 sv_setnv(TARG, -SvNV(sv));
2378 sv_setpvn(TARG, "-", 1);
2385 goto oops_its_an_int;
2386 sv_setnv(TARG, -SvNV(sv));
2398 dSP; tryAMAGICunSET(not);
2399 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
2405 dSP; dTARGET; tryAMAGICun(compl);
2411 if (PL_op->op_private & HINT_INTEGER) {
2412 IV i = ~SvIV_nomg(sv);
2416 UV u = ~SvUV_nomg(sv);
2425 (void)SvPV_nomg(sv,len); /* force check for uninit var */
2426 sv_setsv_nomg(TARG, sv);
2427 tmps = (U8*)SvPV_force(TARG, len);
2430 /* Calculate exact length, let's not estimate. */
2439 while (tmps < send) {
2440 UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2441 tmps += UTF8SKIP(tmps);
2442 targlen += UNISKIP(~c);
2448 /* Now rewind strings and write them. */
2452 Newz(0, result, targlen + 1, U8);
2453 while (tmps < send) {
2454 UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2455 tmps += UTF8SKIP(tmps);
2456 result = uvchr_to_utf8_flags(result, ~c, UNICODE_ALLOW_ANY);
2460 sv_setpvn(TARG, (char*)result, targlen);
2464 Newz(0, result, nchar + 1, U8);
2465 while (tmps < send) {
2466 U8 c = (U8)utf8n_to_uvchr(tmps, 0, &l, UTF8_ALLOW_ANY);
2467 tmps += UTF8SKIP(tmps);
2472 sv_setpvn(TARG, (char*)result, nchar);
2481 register long *tmpl;
2482 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2485 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
2490 for ( ; anum > 0; anum--, tmps++)
2499 /* integer versions of some of the above */
2503 dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
2506 SETi( left * right );
2513 dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
2517 DIE(aTHX_ "Illegal division by zero");
2518 value = POPi / value;
2527 /* This is the vanilla old i_modulo. */
2528 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2532 DIE(aTHX_ "Illegal modulus zero");
2533 SETi( left % right );
2538 #if defined(__GLIBC__) && IVSIZE == 8
2542 /* This is the i_modulo with the workaround for the _moddi3 bug
2543 * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
2544 * See below for pp_i_modulo. */
2545 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2549 DIE(aTHX_ "Illegal modulus zero");
2550 SETi( left % PERL_ABS(right) );
2558 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2562 DIE(aTHX_ "Illegal modulus zero");
2563 /* The assumption is to use hereafter the old vanilla version... */
2565 PL_ppaddr[OP_I_MODULO] =
2566 &Perl_pp_i_modulo_0;
2567 /* .. but if we have glibc, we might have a buggy _moddi3
2568 * (at least glicb 2.2.5 is known to have this bug), in other
2569 * words our integer modulus with negative quad as the second
2570 * argument might be broken. Test for this and re-patch the
2571 * opcode dispatch table if that is the case, remembering to
2572 * also apply the workaround so that this first round works
2573 * right, too. See [perl #9402] for more information. */
2574 #if defined(__GLIBC__) && IVSIZE == 8
2578 /* Cannot do this check with inlined IV constants since
2579 * that seems to work correctly even with the buggy glibc. */
2581 /* Yikes, we have the bug.
2582 * Patch in the workaround version. */
2584 PL_ppaddr[OP_I_MODULO] =
2585 &Perl_pp_i_modulo_1;
2586 /* Make certain we work right this time, too. */
2587 right = PERL_ABS(right);
2591 SETi( left % right );
2598 dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
2601 SETi( left + right );
2608 dSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
2611 SETi( left - right );
2618 dSP; tryAMAGICbinSET(lt,0);
2621 SETs(boolSV(left < right));
2628 dSP; tryAMAGICbinSET(gt,0);
2631 SETs(boolSV(left > right));
2638 dSP; tryAMAGICbinSET(le,0);
2641 SETs(boolSV(left <= right));
2648 dSP; tryAMAGICbinSET(ge,0);
2651 SETs(boolSV(left >= right));
2658 dSP; tryAMAGICbinSET(eq,0);
2661 SETs(boolSV(left == right));
2668 dSP; tryAMAGICbinSET(ne,0);
2671 SETs(boolSV(left != right));
2678 dSP; dTARGET; tryAMAGICbin(ncmp,0);
2685 else if (left < right)
2696 dSP; dTARGET; tryAMAGICun(neg);
2701 /* High falutin' math. */
2705 dSP; dTARGET; tryAMAGICbin(atan2,0);
2708 SETn(Perl_atan2(left, right));
2715 dSP; dTARGET; tryAMAGICun(sin);
2719 value = Perl_sin(value);
2727 dSP; dTARGET; tryAMAGICun(cos);
2731 value = Perl_cos(value);
2737 /* Support Configure command-line overrides for rand() functions.
2738 After 5.005, perhaps we should replace this by Configure support
2739 for drand48(), random(), or rand(). For 5.005, though, maintain
2740 compatibility by calling rand() but allow the user to override it.
2741 See INSTALL for details. --Andy Dougherty 15 July 1998
2743 /* Now it's after 5.005, and Configure supports drand48() and random(),
2744 in addition to rand(). So the overrides should not be needed any more.
2745 --Jarkko Hietaniemi 27 September 1998
2748 #ifndef HAS_DRAND48_PROTO
2749 extern double drand48 (void);
2762 if (!PL_srand_called) {
2763 (void)seedDrand01((Rand_seed_t)seed());
2764 PL_srand_called = TRUE;
2779 (void)seedDrand01((Rand_seed_t)anum);
2780 PL_srand_called = TRUE;
2787 dSP; dTARGET; tryAMAGICun(exp);
2791 value = Perl_exp(value);
2799 dSP; dTARGET; tryAMAGICun(log);
2804 SET_NUMERIC_STANDARD();
2805 DIE(aTHX_ "Can't take log of %"NVgf, value);
2807 value = Perl_log(value);
2815 dSP; dTARGET; tryAMAGICun(sqrt);
2820 SET_NUMERIC_STANDARD();
2821 DIE(aTHX_ "Can't take sqrt of %"NVgf, value);
2823 value = Perl_sqrt(value);
2831 dSP; dTARGET; tryAMAGICun(int);
2834 IV iv = TOPi; /* attempt to convert to IV if possible. */
2835 /* XXX it's arguable that compiler casting to IV might be subtly
2836 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2837 else preferring IV has introduced a subtle behaviour change bug. OTOH
2838 relying on floating point to be accurate is a bug. */
2842 else if (SvIOK(TOPs)) {
2851 if (value < (NV)UV_MAX + 0.5) {
2854 SETn(Perl_floor(value));
2858 if (value > (NV)IV_MIN - 0.5) {
2861 SETn(Perl_ceil(value));
2871 dSP; dTARGET; tryAMAGICun(abs);
2873 /* This will cache the NV value if string isn't actually integer */
2878 else if (SvIOK(TOPs)) {
2879 /* IVX is precise */
2881 SETu(TOPu); /* force it to be numeric only */
2889 /* 2s complement assumption. Also, not really needed as
2890 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
2910 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2916 tmps = (SvPVx(sv, len));
2918 /* If Unicode, try to downgrade
2919 * If not possible, croak. */
2920 SV* tsv = sv_2mortal(newSVsv(sv));
2923 sv_utf8_downgrade(tsv, FALSE);
2926 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2927 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
2940 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2946 tmps = (SvPVx(sv, len));
2948 /* If Unicode, try to downgrade
2949 * If not possible, croak. */
2950 SV* tsv = sv_2mortal(newSVsv(sv));
2953 sv_utf8_downgrade(tsv, FALSE);
2956 while (*tmps && len && isSPACE(*tmps))
2961 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2962 else if (*tmps == 'b')
2963 result_uv = grok_bin (tmps, &len, &flags, &result_nv);
2965 result_uv = grok_oct (tmps, &len, &flags, &result_nv);
2967 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
2984 SETi(sv_len_utf8(sv));
3000 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3002 I32 arybase = PL_curcop->cop_arybase;
3006 int num_args = PL_op->op_private & 7;
3007 bool repl_need_utf8_upgrade = FALSE;
3008 bool repl_is_utf8 = FALSE;
3010 SvTAINTED_off(TARG); /* decontaminate */
3011 SvUTF8_off(TARG); /* decontaminate */
3015 repl = SvPV(repl_sv, repl_len);
3016 repl_is_utf8 = DO_UTF8(repl_sv) && SvCUR(repl_sv);
3026 sv_utf8_upgrade(sv);
3028 else if (DO_UTF8(sv))
3029 repl_need_utf8_upgrade = TRUE;
3031 tmps = SvPV(sv, curlen);
3033 utf8_curlen = sv_len_utf8(sv);
3034 if (utf8_curlen == curlen)
3037 curlen = utf8_curlen;
3042 if (pos >= arybase) {
3060 else if (len >= 0) {
3062 if (rem > (I32)curlen)
3077 Perl_croak(aTHX_ "substr outside of string");
3078 if (ckWARN(WARN_SUBSTR))
3079 Perl_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3086 sv_pos_u2b(sv, &pos, &rem);
3088 /* we either return a PV or an LV. If the TARG hasn't been used
3089 * before, or is of that type, reuse it; otherwise use a mortal
3090 * instead. Note that LVs can have an extended lifetime, so also
3091 * dont reuse if refcount > 1 (bug #20933) */
3092 if (SvTYPE(TARG) > SVt_NULL) {
3093 if ( (SvTYPE(TARG) == SVt_PVLV)
3094 ? (!lvalue || SvREFCNT(TARG) > 1)
3097 TARG = sv_newmortal();
3101 sv_setpvn(TARG, tmps, rem);
3102 #ifdef USE_LOCALE_COLLATE
3103 sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3108 SV* repl_sv_copy = NULL;
3110 if (repl_need_utf8_upgrade) {
3111 repl_sv_copy = newSVsv(repl_sv);
3112 sv_utf8_upgrade(repl_sv_copy);
3113 repl = SvPV(repl_sv_copy, repl_len);
3114 repl_is_utf8 = DO_UTF8(repl_sv_copy) && SvCUR(sv);
3116 sv_insert(sv, pos, rem, repl, repl_len);
3120 SvREFCNT_dec(repl_sv_copy);
3122 else if (lvalue) { /* it's an lvalue! */
3123 if (!SvGMAGICAL(sv)) {
3127 if (ckWARN(WARN_SUBSTR))
3128 Perl_warner(aTHX_ packWARN(WARN_SUBSTR),
3129 "Attempt to use reference as lvalue in substr");
3131 if (SvOK(sv)) /* is it defined ? */
3132 (void)SvPOK_only_UTF8(sv);
3134 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
3137 if (SvTYPE(TARG) < SVt_PVLV) {
3138 sv_upgrade(TARG, SVt_PVLV);
3139 sv_magic(TARG, Nullsv, PERL_MAGIC_substr, Nullch, 0);
3145 if (LvTARG(TARG) != sv) {
3147 SvREFCNT_dec(LvTARG(TARG));
3148 LvTARG(TARG) = SvREFCNT_inc(sv);
3150 LvTARGOFF(TARG) = upos;
3151 LvTARGLEN(TARG) = urem;
3155 PUSHs(TARG); /* avoid SvSETMAGIC here */
3162 register IV size = POPi;
3163 register IV offset = POPi;
3164 register SV *src = POPs;
3165 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3167 SvTAINTED_off(TARG); /* decontaminate */
3168 if (lvalue) { /* it's an lvalue! */
3169 if (SvREFCNT(TARG) > 1) /* don't share the TARG (#20933) */
3170 TARG = sv_newmortal();
3171 if (SvTYPE(TARG) < SVt_PVLV) {
3172 sv_upgrade(TARG, SVt_PVLV);
3173 sv_magic(TARG, Nullsv, PERL_MAGIC_vec, Nullch, 0);
3176 if (LvTARG(TARG) != src) {
3178 SvREFCNT_dec(LvTARG(TARG));
3179 LvTARG(TARG) = SvREFCNT_inc(src);
3181 LvTARGOFF(TARG) = offset;
3182 LvTARGLEN(TARG) = size;
3185 sv_setuv(TARG, do_vecget(src, offset, size));
3200 I32 arybase = PL_curcop->cop_arybase;
3205 offset = POPi - arybase;
3208 tmps = SvPV(big, biglen);
3209 if (offset > 0 && DO_UTF8(big))
3210 sv_pos_u2b(big, &offset, 0);
3213 else if (offset > (I32)biglen)
3215 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
3216 (unsigned char*)tmps + biglen, little, 0)))
3219 retval = tmps2 - tmps;
3220 if (retval > 0 && DO_UTF8(big))
3221 sv_pos_b2u(big, &retval);
3222 PUSHi(retval + arybase);
3237 I32 arybase = PL_curcop->cop_arybase;
3243 tmps2 = SvPV(little, llen);
3244 tmps = SvPV(big, blen);
3248 if (offset > 0 && DO_UTF8(big))
3249 sv_pos_u2b(big, &offset, 0);
3250 offset = offset - arybase + llen;
3254 else if (offset > (I32)blen)
3256 if (!(tmps2 = rninstr(tmps, tmps + offset,
3257 tmps2, tmps2 + llen)))
3260 retval = tmps2 - tmps;
3261 if (retval > 0 && DO_UTF8(big))
3262 sv_pos_b2u(big, &retval);
3263 PUSHi(retval + arybase);
3269 dSP; dMARK; dORIGMARK; dTARGET;
3270 do_sprintf(TARG, SP-MARK, MARK+1);
3271 TAINT_IF(SvTAINTED(TARG));
3272 if (DO_UTF8(*(MARK+1)))
3284 U8 *s = (U8*)SvPVx(argsv, len);
3287 if (PL_encoding && SvPOK(argsv) && !DO_UTF8(argsv)) {
3288 tmpsv = sv_2mortal(newSVsv(argsv));
3289 s = (U8*)sv_recode_to_utf8(tmpsv, PL_encoding);
3293 XPUSHu(DO_UTF8(argsv) ?
3294 utf8n_to_uvchr(s, UTF8_MAXLEN, 0, UTF8_ALLOW_ANYUV) :
3306 (void)SvUPGRADE(TARG,SVt_PV);
3308 if (value > 255 && !IN_BYTES) {
3309 SvGROW(TARG, (STRLEN)UNISKIP(value)+1);
3310 tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3311 SvCUR_set(TARG, tmps - SvPVX(TARG));
3313 (void)SvPOK_only(TARG);
3322 *tmps++ = (char)value;
3324 (void)SvPOK_only(TARG);
3325 if (PL_encoding && !IN_BYTES) {
3326 sv_recode_to_utf8(TARG, PL_encoding);
3328 if (SvCUR(TARG) == 0 || !is_utf8_string((U8*)tmps, SvCUR(TARG)) ||
3329 memEQ(tmps, "\xef\xbf\xbd\0", 4)) {
3333 *tmps++ = (U8)UTF8_EIGHT_BIT_HI(value);
3334 *tmps++ = (U8)UTF8_EIGHT_BIT_LO(value);
3350 char *tmps = SvPV(left, len);
3352 if (DO_UTF8(left)) {
3353 /* If Unicode, try to downgrade.
3354 * If not possible, croak.
3355 * Yes, we made this up. */
3356 SV* tsv = sv_2mortal(newSVsv(left));
3359 sv_utf8_downgrade(tsv, FALSE);
3362 # ifdef USE_ITHREADS
3364 if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3365 /* This should be threadsafe because in ithreads there is only
3366 * one thread per interpreter. If this would not be true,
3367 * we would need a mutex to protect this malloc. */
3368 PL_reentrant_buffer->_crypt_struct_buffer =
3369 (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3370 #if defined(__GLIBC__) || defined(__EMX__)
3371 if (PL_reentrant_buffer->_crypt_struct_buffer) {
3372 PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3373 /* work around glibc-2.2.5 bug */
3374 PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3378 # endif /* HAS_CRYPT_R */
3379 # endif /* USE_ITHREADS */
3381 sv_setpv(TARG, fcrypt(tmps, SvPV(right, n_a)));
3383 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV(right, n_a)));
3389 "The crypt() function is unimplemented due to excessive paranoia.");
3402 (s = (U8*)SvPV_nomg(sv, slen)) && slen &&
3403 UTF8_IS_START(*s)) {
3404 U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3408 utf8_to_uvchr(s, &ulen);
3409 toTITLE_utf8(s, tmpbuf, &tculen);
3410 utf8_to_uvchr(tmpbuf, 0);
3412 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3414 /* slen is the byte length of the whole SV.
3415 * ulen is the byte length of the original Unicode character
3416 * stored as UTF-8 at s.
3417 * tculen is the byte length of the freshly titlecased
3418 * Unicode character stored as UTF-8 at tmpbuf.
3419 * We first set the result to be the titlecased character,
3420 * and then append the rest of the SV data. */
3421 sv_setpvn(TARG, (char*)tmpbuf, tculen);
3423 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3428 s = (U8*)SvPV_force_nomg(sv, slen);
3429 Copy(tmpbuf, s, tculen, U8);
3433 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3435 SvUTF8_off(TARG); /* decontaminate */
3436 sv_setsv_nomg(TARG, sv);
3440 s = (U8*)SvPV_force_nomg(sv, slen);
3442 if (IN_LOCALE_RUNTIME) {
3445 *s = toUPPER_LC(*s);
3464 (s = (U8*)SvPV_nomg(sv, slen)) && slen &&
3465 UTF8_IS_START(*s)) {
3467 U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3471 toLOWER_utf8(s, tmpbuf, &ulen);
3472 uv = utf8_to_uvchr(tmpbuf, 0);
3473 tend = uvchr_to_utf8(tmpbuf, uv);
3475 if (!SvPADTMP(sv) || (STRLEN)(tend - tmpbuf) != ulen || SvREADONLY(sv)) {
3477 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
3479 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3484 s = (U8*)SvPV_force_nomg(sv, slen);
3485 Copy(tmpbuf, s, ulen, U8);
3489 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3491 SvUTF8_off(TARG); /* decontaminate */
3492 sv_setsv_nomg(TARG, sv);
3496 s = (U8*)SvPV_force_nomg(sv, slen);
3498 if (IN_LOCALE_RUNTIME) {
3501 *s = toLOWER_LC(*s);
3524 U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3526 s = (U8*)SvPV_nomg(sv,len);
3528 SvUTF8_off(TARG); /* decontaminate */
3529 sv_setpvn(TARG, "", 0);
3533 STRLEN nchar = utf8_length(s, s + len);
3535 (void)SvUPGRADE(TARG, SVt_PV);
3536 SvGROW(TARG, (nchar * UTF8_MAXLEN_UCLC) + 1);
3537 (void)SvPOK_only(TARG);
3538 d = (U8*)SvPVX(TARG);
3541 toUPPER_utf8(s, tmpbuf, &ulen);
3542 Copy(tmpbuf, d, ulen, U8);
3548 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
3553 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3555 SvUTF8_off(TARG); /* decontaminate */
3556 sv_setsv_nomg(TARG, sv);
3560 s = (U8*)SvPV_force_nomg(sv, len);
3562 register U8 *send = s + len;
3564 if (IN_LOCALE_RUNTIME) {
3567 for (; s < send; s++)
3568 *s = toUPPER_LC(*s);
3571 for (; s < send; s++)
3593 U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3595 s = (U8*)SvPV_nomg(sv,len);
3597 SvUTF8_off(TARG); /* decontaminate */
3598 sv_setpvn(TARG, "", 0);
3602 STRLEN nchar = utf8_length(s, s + len);
3604 (void)SvUPGRADE(TARG, SVt_PV);
3605 SvGROW(TARG, (nchar * UTF8_MAXLEN_UCLC) + 1);
3606 (void)SvPOK_only(TARG);
3607 d = (U8*)SvPVX(TARG);
3610 UV uv = toLOWER_utf8(s, tmpbuf, &ulen);
3611 #define GREEK_CAPITAL_LETTER_SIGMA 0x03A3 /* Unicode */
3612 if (uv == GREEK_CAPITAL_LETTER_SIGMA) {
3614 * Now if the sigma is NOT followed by
3615 * /$ignorable_sequence$cased_letter/;
3616 * and it IS preceded by
3617 * /$cased_letter$ignorable_sequence/;
3618 * where $ignorable_sequence is
3619 * [\x{2010}\x{AD}\p{Mn}]*
3620 * and $cased_letter is
3621 * [\p{Ll}\p{Lo}\p{Lt}]
3622 * then it should be mapped to 0x03C2,
3623 * (GREEK SMALL LETTER FINAL SIGMA),
3624 * instead of staying 0x03A3.
3625 * See lib/unicore/SpecCase.txt.
3628 Copy(tmpbuf, d, ulen, U8);
3634 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
3639 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3641 SvUTF8_off(TARG); /* decontaminate */
3642 sv_setsv_nomg(TARG, sv);
3647 s = (U8*)SvPV_force_nomg(sv, len);
3649 register U8 *send = s + len;
3651 if (IN_LOCALE_RUNTIME) {
3654 for (; s < send; s++)
3655 *s = toLOWER_LC(*s);
3658 for (; s < send; s++)
3672 register char *s = SvPV(sv,len);
3675 SvUTF8_off(TARG); /* decontaminate */
3677 (void)SvUPGRADE(TARG, SVt_PV);
3678 SvGROW(TARG, (len * 2) + 1);
3682 if (UTF8_IS_CONTINUED(*s)) {
3683 STRLEN ulen = UTF8SKIP(s);
3707 SvCUR_set(TARG, d - SvPVX(TARG));
3708 (void)SvPOK_only_UTF8(TARG);
3711 sv_setpvn(TARG, s, len);
3713 if (SvSMAGICAL(TARG))
3722 dSP; dMARK; dORIGMARK;
3724 register AV* av = (AV*)POPs;
3725 register I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3726 I32 arybase = PL_curcop->cop_arybase;
3729 if (SvTYPE(av) == SVt_PVAV) {
3730 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
3732 for (svp = MARK + 1; svp <= SP; svp++) {
3737 if (max > AvMAX(av))
3740 while (++MARK <= SP) {
3741 elem = SvIVx(*MARK);
3745 svp = av_fetch(av, elem, lval);
3747 if (!svp || *svp == &PL_sv_undef)
3748 DIE(aTHX_ PL_no_aelem, elem);
3749 if (PL_op->op_private & OPpLVAL_INTRO)
3750 save_aelem(av, elem, svp);
3752 *MARK = svp ? *svp : &PL_sv_undef;
3755 if (GIMME != G_ARRAY) {
3757 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
3763 /* Associative arrays. */
3768 HV *hash = (HV*)POPs;
3770 I32 gimme = GIMME_V;
3773 /* might clobber stack_sp */
3774 entry = hv_iternext(hash);
3779 SV* sv = hv_iterkeysv(entry);
3780 PUSHs(sv); /* won't clobber stack_sp */
3781 if (gimme == G_ARRAY) {
3784 /* might clobber stack_sp */
3785 val = hv_iterval(hash, entry);
3790 else if (gimme == G_SCALAR)
3809 I32 gimme = GIMME_V;
3810 I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
3814 if (PL_op->op_private & OPpSLICE) {
3818 hvtype = SvTYPE(hv);
3819 if (hvtype == SVt_PVHV) { /* hash element */
3820 while (++MARK <= SP) {
3821 sv = hv_delete_ent(hv, *MARK, discard, 0);
3822 *MARK = sv ? sv : &PL_sv_undef;
3825 else if (hvtype == SVt_PVAV) { /* array element */
3826 if (PL_op->op_flags & OPf_SPECIAL) {
3827 while (++MARK <= SP) {
3828 sv = av_delete((AV*)hv, SvIV(*MARK), discard);
3829 *MARK = sv ? sv : &PL_sv_undef;
3834 DIE(aTHX_ "Not a HASH reference");
3837 else if (gimme == G_SCALAR) {
3842 *++MARK = &PL_sv_undef;
3849 if (SvTYPE(hv) == SVt_PVHV)
3850 sv = hv_delete_ent(hv, keysv, discard, 0);
3851 else if (SvTYPE(hv) == SVt_PVAV) {
3852 if (PL_op->op_flags & OPf_SPECIAL)
3853 sv = av_delete((AV*)hv, SvIV(keysv), discard);
3855 DIE(aTHX_ "panic: avhv_delete no longer supported");
3858 DIE(aTHX_ "Not a HASH reference");
3873 if (PL_op->op_private & OPpEXISTS_SUB) {
3877 cv = sv_2cv(sv, &hv, &gv, FALSE);
3880 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
3886 if (SvTYPE(hv) == SVt_PVHV) {
3887 if (hv_exists_ent(hv, tmpsv, 0))
3890 else if (SvTYPE(hv) == SVt_PVAV) {
3891 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
3892 if (av_exists((AV*)hv, SvIV(tmpsv)))
3897 DIE(aTHX_ "Not a HASH reference");
3904 dSP; dMARK; dORIGMARK;
3905 register HV *hv = (HV*)POPs;
3906 register I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3907 bool localizing = PL_op->op_private & OPpLVAL_INTRO ? TRUE : FALSE;
3908 bool other_magic = FALSE;
3914 other_magic = mg_find((SV*)hv, PERL_MAGIC_env) ||
3915 ((mg = mg_find((SV*)hv, PERL_MAGIC_tied))
3916 /* Try to preserve the existenceness of a tied hash
3917 * element by using EXISTS and DELETE if possible.
3918 * Fallback to FETCH and STORE otherwise */
3919 && (stash = SvSTASH(SvRV(SvTIED_obj((SV*)hv, mg))))
3920 && gv_fetchmethod_autoload(stash, "EXISTS", TRUE)
3921 && gv_fetchmethod_autoload(stash, "DELETE", TRUE));
3924 while (++MARK <= SP) {
3928 bool preeminent = FALSE;
3931 preeminent = SvRMAGICAL(hv) && !other_magic ? 1 :
3932 hv_exists_ent(hv, keysv, 0);
3935 he = hv_fetch_ent(hv, keysv, lval, 0);
3936 svp = he ? &HeVAL(he) : 0;
3939 if (!svp || *svp == &PL_sv_undef) {
3941 DIE(aTHX_ PL_no_helem, SvPV(keysv, n_a));
3945 save_helem(hv, keysv, svp);
3948 char *key = SvPV(keysv, keylen);
3949 SAVEDELETE(hv, savepvn(key,keylen), keylen);
3953 *MARK = svp ? *svp : &PL_sv_undef;
3955 if (GIMME != G_ARRAY) {
3957 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
3963 /* List operators. */
3968 if (GIMME != G_ARRAY) {
3970 *MARK = *SP; /* unwanted list, return last item */
3972 *MARK = &PL_sv_undef;
3981 SV **lastrelem = PL_stack_sp;
3982 SV **lastlelem = PL_stack_base + POPMARK;
3983 SV **firstlelem = PL_stack_base + POPMARK + 1;
3984 register SV **firstrelem = lastlelem + 1;
3985 I32 arybase = PL_curcop->cop_arybase;
3986 I32 lval = PL_op->op_flags & OPf_MOD;
3987 I32 is_something_there = lval;
3989 register I32 max = lastrelem - lastlelem;
3990 register SV **lelem;
3993 if (GIMME != G_ARRAY) {
3994 ix = SvIVx(*lastlelem);
3999 if (ix < 0 || ix >= max)
4000 *firstlelem = &PL_sv_undef;
4002 *firstlelem = firstrelem[ix];
4008 SP = firstlelem - 1;
4012 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
4018 if (ix < 0 || ix >= max)
4019 *lelem = &PL_sv_undef;
4021 is_something_there = TRUE;
4022 if (!(*lelem = firstrelem[ix]))
4023 *lelem = &PL_sv_undef;
4026 if (is_something_there)
4029 SP = firstlelem - 1;
4035 dSP; dMARK; dORIGMARK;
4036 I32 items = SP - MARK;
4037 SV *av = sv_2mortal((SV*)av_make(items, MARK+1));
4038 SP = ORIGMARK; /* av_make() might realloc stack_sp */
4045 dSP; dMARK; dORIGMARK;
4046 HV* hv = (HV*)sv_2mortal((SV*)newHV());
4050 SV *val = NEWSV(46, 0);
4052 sv_setsv(val, *++MARK);
4053 else if (ckWARN(WARN_MISC))
4054 Perl_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
4055 (void)hv_store_ent(hv,key,val,0);
4064 dSP; dMARK; dORIGMARK;
4065 register AV *ary = (AV*)*++MARK;
4069 register I32 offset;
4070 register I32 length;
4077 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4078 *MARK-- = SvTIED_obj((SV*)ary, mg);
4082 call_method("SPLICE",GIMME_V);
4091 offset = i = SvIVx(*MARK);
4093 offset += AvFILLp(ary) + 1;
4095 offset -= PL_curcop->cop_arybase;
4097 DIE(aTHX_ PL_no_aelem, i);
4099 length = SvIVx(*MARK++);
4101 length += AvFILLp(ary) - offset + 1;
4107 length = AvMAX(ary) + 1; /* close enough to infinity */
4111 length = AvMAX(ary) + 1;
4113 if (offset > AvFILLp(ary) + 1) {
4114 if (ckWARN(WARN_MISC))
4115 Perl_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
4116 offset = AvFILLp(ary) + 1;
4118 after = AvFILLp(ary) + 1 - (offset + length);
4119 if (after < 0) { /* not that much array */
4120 length += after; /* offset+length now in array */
4126 /* At this point, MARK .. SP-1 is our new LIST */
4129 diff = newlen - length;
4130 if (newlen && !AvREAL(ary) && AvREIFY(ary))
4133 /* make new elements SVs now: avoid problems if they're from the array */
4134 for (dst = MARK, i = newlen; i; i--) {
4136 *dst = NEWSV(46, 0);
4137 sv_setsv(*dst++, h);
4140 if (diff < 0) { /* shrinking the area */
4142 New(451, tmparyval, newlen, SV*); /* so remember insertion */
4143 Copy(MARK, tmparyval, newlen, SV*);
4146 MARK = ORIGMARK + 1;
4147 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4148 MEXTEND(MARK, length);
4149 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
4151 EXTEND_MORTAL(length);
4152 for (i = length, dst = MARK; i; i--) {
4153 sv_2mortal(*dst); /* free them eventualy */
4160 *MARK = AvARRAY(ary)[offset+length-1];
4163 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
4164 SvREFCNT_dec(*dst++); /* free them now */
4167 AvFILLp(ary) += diff;
4169 /* pull up or down? */
4171 if (offset < after) { /* easier to pull up */
4172 if (offset) { /* esp. if nothing to pull */
4173 src = &AvARRAY(ary)[offset-1];
4174 dst = src - diff; /* diff is negative */
4175 for (i = offset; i > 0; i--) /* can't trust Copy */
4179 SvPVX(ary) = (char*)(AvARRAY(ary) - diff); /* diff is negative */
4183 if (after) { /* anything to pull down? */
4184 src = AvARRAY(ary) + offset + length;
4185 dst = src + diff; /* diff is negative */
4186 Move(src, dst, after, SV*);
4188 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
4189 /* avoid later double free */
4193 dst[--i] = &PL_sv_undef;
4196 Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
4197 Safefree(tmparyval);
4200 else { /* no, expanding (or same) */
4202 New(452, tmparyval, length, SV*); /* so remember deletion */
4203 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
4206 if (diff > 0) { /* expanding */
4208 /* push up or down? */
4210 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
4214 Move(src, dst, offset, SV*);
4216 SvPVX(ary) = (char*)(AvARRAY(ary) - diff);/* diff is positive */
4218 AvFILLp(ary) += diff;
4221 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
4222 av_extend(ary, AvFILLp(ary) + diff);
4223 AvFILLp(ary) += diff;
4226 dst = AvARRAY(ary) + AvFILLp(ary);
4228 for (i = after; i; i--) {
4236 Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
4239 MARK = ORIGMARK + 1;
4240 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4242 Copy(tmparyval, MARK, length, SV*);
4244 EXTEND_MORTAL(length);
4245 for (i = length, dst = MARK; i; i--) {
4246 sv_2mortal(*dst); /* free them eventualy */
4250 Safefree(tmparyval);
4254 else if (length--) {
4255 *MARK = tmparyval[length];
4258 while (length-- > 0)
4259 SvREFCNT_dec(tmparyval[length]);
4261 Safefree(tmparyval);
4264 *MARK = &PL_sv_undef;
4272 dSP; dMARK; dORIGMARK; dTARGET;
4273 register AV *ary = (AV*)*++MARK;
4274 register SV *sv = &PL_sv_undef;
4277 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4278 *MARK-- = SvTIED_obj((SV*)ary, mg);
4282 call_method("PUSH",G_SCALAR|G_DISCARD);
4287 /* Why no pre-extend of ary here ? */
4288 for (++MARK; MARK <= SP; MARK++) {
4291 sv_setsv(sv, *MARK);
4296 PUSHi( AvFILL(ary) + 1 );
4304 SV *sv = av_pop(av);
4306 (void)sv_2mortal(sv);
4315 SV *sv = av_shift(av);
4320 (void)sv_2mortal(sv);
4327 dSP; dMARK; dORIGMARK; dTARGET;
4328 register AV *ary = (AV*)*++MARK;
4333 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4334 *MARK-- = SvTIED_obj((SV*)ary, mg);
4338 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
4343 av_unshift(ary, SP - MARK);
4346 sv_setsv(sv, *++MARK);
4347 (void)av_store(ary, i++, sv);
4351 PUSHi( AvFILL(ary) + 1 );
4361 if (GIMME == G_ARRAY) {
4368 /* safe as long as stack cannot get extended in the above */
4373 register char *down;
4379 SvUTF8_off(TARG); /* decontaminate */
4381 do_join(TARG, &PL_sv_no, MARK, SP);
4383 sv_setsv(TARG, (SP > MARK)
4385 : (padoff_du = find_rundefsvoffset(),
4386 (padoff_du == NOT_IN_PAD || PAD_COMPNAME_FLAGS(padoff_du) & SVpad_OUR)
4387 ? DEFSV : PAD_SVl(padoff_du)));
4388 up = SvPV_force(TARG, len);
4390 if (DO_UTF8(TARG)) { /* first reverse each character */
4391 U8* s = (U8*)SvPVX(TARG);
4392 U8* send = (U8*)(s + len);
4394 if (UTF8_IS_INVARIANT(*s)) {
4399 if (!utf8_to_uvchr(s, 0))
4403 down = (char*)(s - 1);
4404 /* reverse this character */
4408 *down-- = (char)tmp;
4414 down = SvPVX(TARG) + len - 1;
4418 *down-- = (char)tmp;
4420 (void)SvPOK_only_UTF8(TARG);
4432 register IV limit = POPi; /* note, negative is forever */
4435 register char *s = SvPV(sv, len);
4436 bool do_utf8 = DO_UTF8(sv);
4437 char *strend = s + len;
4439 register REGEXP *rx;
4443 STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (strend - s);
4444 I32 maxiters = slen + 10;
4447 I32 origlimit = limit;
4450 I32 gimme = GIMME_V;
4451 I32 oldsave = PL_savestack_ix;
4452 I32 make_mortal = 1;
4454 MAGIC *mg = (MAGIC *) NULL;
4457 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4462 DIE(aTHX_ "panic: pp_split");
4465 TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
4466 (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
4468 RX_MATCH_UTF8_set(rx, do_utf8);
4470 if (pm->op_pmreplroot) {
4472 ary = GvAVn((GV*)PAD_SVl(INT2PTR(PADOFFSET, pm->op_pmreplroot)));
4474 ary = GvAVn((GV*)pm->op_pmreplroot);
4477 else if (gimme != G_ARRAY)
4478 ary = GvAVn(PL_defgv);
4481 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4487 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4489 XPUSHs(SvTIED_obj((SV*)ary, mg));
4495 for (i = AvFILLp(ary); i >= 0; i--)
4496 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
4498 /* temporarily switch stacks */
4499 SAVESWITCHSTACK(PL_curstack, ary);
4503 base = SP - PL_stack_base;
4505 if (pm->op_pmflags & PMf_SKIPWHITE) {
4506 if (pm->op_pmflags & PMf_LOCALE) {
4507 while (isSPACE_LC(*s))
4515 if (pm->op_pmflags & PMf_MULTILINE) {
4520 limit = maxiters + 2;
4521 if (pm->op_pmflags & PMf_WHITE) {
4524 while (m < strend &&
4525 !((pm->op_pmflags & PMf_LOCALE)
4526 ? isSPACE_LC(*m) : isSPACE(*m)))
4531 dstr = NEWSV(30, m-s);
4532 sv_setpvn(dstr, s, m-s);
4536 (void)SvUTF8_on(dstr);
4540 while (s < strend &&
4541 ((pm->op_pmflags & PMf_LOCALE)
4542 ? isSPACE_LC(*s) : isSPACE(*s)))
4546 else if (rx->precomp[0] == '^' && rx->precomp[1] == '\0') {
4549 for (m = s; m < strend && *m != '\n'; m++) ;
4553 dstr = NEWSV(30, m-s);
4554 sv_setpvn(dstr, s, m-s);
4558 (void)SvUTF8_on(dstr);
4563 else if (do_utf8 == ((rx->reganch & ROPT_UTF8) != 0) &&
4564 (rx->reganch & RE_USE_INTUIT) && !rx->nparens
4565 && (rx->reganch & ROPT_CHECK_ALL)
4566 && !(rx->reganch & ROPT_ANCH)) {
4567 int tail = (rx->reganch & RE_INTUIT_TAIL);
4568 SV *csv = CALLREG_INTUIT_STRING(aTHX_ rx);
4571 if (len == 1 && !(rx->reganch & ROPT_UTF8) && !tail) {
4573 char c = *SvPV(csv, n_a);
4576 for (m = s; m < strend && *m != c; m++) ;
4579 dstr = NEWSV(30, m-s);
4580 sv_setpvn(dstr, s, m-s);
4584 (void)SvUTF8_on(dstr);
4586 /* The rx->minlen is in characters but we want to step
4587 * s ahead by bytes. */
4589 s = (char*)utf8_hop((U8*)m, len);
4591 s = m + len; /* Fake \n at the end */
4596 while (s < strend && --limit &&
4597 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
4598 csv, multiline ? FBMrf_MULTILINE : 0)) )
4601 dstr = NEWSV(31, m-s);
4602 sv_setpvn(dstr, s, m-s);
4606 (void)SvUTF8_on(dstr);
4608 /* The rx->minlen is in characters but we want to step
4609 * s ahead by bytes. */
4611 s = (char*)utf8_hop((U8*)m, len);
4613 s = m + len; /* Fake \n at the end */
4618 maxiters += slen * rx->nparens;
4619 while (s < strend && --limit)
4622 i = CALLREGEXEC(aTHX_ rx, s, strend, orig, 1 , sv, NULL, 0);
4626 TAINT_IF(RX_MATCH_TAINTED(rx));
4627 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
4632 strend = s + (strend - m);
4634 m = rx->startp[0] + orig;
4635 dstr = NEWSV(32, m-s);
4636 sv_setpvn(dstr, s, m-s);
4640 (void)SvUTF8_on(dstr);
4643 for (i = 1; i <= (I32)rx->nparens; i++) {
4644 s = rx->startp[i] + orig;
4645 m = rx->endp[i] + orig;
4647 /* japhy (07/27/01) -- the (m && s) test doesn't catch
4648 parens that didn't match -- they should be set to
4649 undef, not the empty string */
4650 if (m >= orig && s >= orig) {
4651 dstr = NEWSV(33, m-s);
4652 sv_setpvn(dstr, s, m-s);
4655 dstr = &PL_sv_undef; /* undef, not "" */
4659 (void)SvUTF8_on(dstr);
4663 s = rx->endp[0] + orig;
4667 iters = (SP - PL_stack_base) - base;
4668 if (iters > maxiters)
4669 DIE(aTHX_ "Split loop");
4671 /* keep field after final delim? */
4672 if (s < strend || (iters && origlimit)) {
4673 STRLEN l = strend - s;
4674 dstr = NEWSV(34, l);
4675 sv_setpvn(dstr, s, l);
4679 (void)SvUTF8_on(dstr);
4683 else if (!origlimit) {
4684 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
4685 if (TOPs && !make_mortal)
4688 *SP-- = &PL_sv_undef;
4693 LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */
4697 if (SvSMAGICAL(ary)) {
4702 if (gimme == G_ARRAY) {
4704 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4712 call_method("PUSH",G_SCALAR|G_DISCARD);
4715 if (gimme == G_ARRAY) {
4716 /* EXTEND should not be needed - we just popped them */
4718 for (i=0; i < iters; i++) {
4719 SV **svp = av_fetch(ary, i, FALSE);
4720 PUSHs((svp) ? *svp : &PL_sv_undef);
4727 if (gimme == G_ARRAY)
4742 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
4743 || SvTYPE(retsv) == SVt_PVCV) {
4744 retsv = refto(retsv);
4752 DIE(aTHX_ "tried to access per-thread data in non-threaded perl");