3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 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
23 /* XXX I can't imagine anyone who doesn't have this actually _needs_
24 it, since pid_t is an integral type.
27 #ifdef NEED_GETPID_PROTO
28 extern Pid_t getpid (void);
31 /* variations on pp_null */
36 if (GIMME_V == G_SCALAR)
52 if (PL_op->op_private & OPpLVAL_INTRO)
53 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
55 if (PL_op->op_flags & OPf_REF) {
59 if (GIMME == G_SCALAR)
60 Perl_croak(aTHX_ "Can't return array to lvalue scalar context");
65 if (gimme == G_ARRAY) {
66 I32 maxarg = AvFILL((AV*)TARG) + 1;
68 if (SvMAGICAL(TARG)) {
70 for (i=0; i < (U32)maxarg; i++) {
71 SV **svp = av_fetch((AV*)TARG, i, FALSE);
72 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
76 Copy(AvARRAY((AV*)TARG), SP+1, maxarg, SV*);
80 else if (gimme == G_SCALAR) {
81 SV* sv = sv_newmortal();
82 I32 maxarg = AvFILL((AV*)TARG) + 1;
95 if (PL_op->op_private & OPpLVAL_INTRO)
96 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
97 if (PL_op->op_flags & OPf_REF)
100 if (GIMME == G_SCALAR)
101 Perl_croak(aTHX_ "Can't return hash to lvalue scalar context");
105 if (gimme == G_ARRAY) {
108 else if (gimme == G_SCALAR) {
109 SV* sv = sv_newmortal();
110 if (SvRMAGICAL(TARG) && mg_find(TARG, PERL_MAGIC_tied))
111 Perl_croak(aTHX_ "Can't provide tied hash usage; "
112 "use keys(%%hash) to test if empty");
113 if (HvFILL((HV*)TARG))
114 Perl_sv_setpvf(aTHX_ sv, "%ld/%ld",
115 (long)HvFILL((HV*)TARG), (long)HvMAX((HV*)TARG) + 1);
125 DIE(aTHX_ "NOT IMPL LINE %d",__LINE__);
136 tryAMAGICunDEREF(to_gv);
139 if (SvTYPE(sv) == SVt_PVIO) {
140 GV *gv = (GV*) sv_newmortal();
141 gv_init(gv, 0, "", 0, 0);
142 GvIOp(gv) = (IO *)sv;
143 (void)SvREFCNT_inc(sv);
146 else if (SvTYPE(sv) != SVt_PVGV)
147 DIE(aTHX_ "Not a GLOB reference");
150 if (SvTYPE(sv) != SVt_PVGV) {
154 if (SvGMAGICAL(sv)) {
159 if (!SvOK(sv) && sv != &PL_sv_undef) {
160 /* If this is a 'my' scalar and flag is set then vivify
163 if (PL_op->op_private & OPpDEREF) {
166 if (cUNOP->op_targ) {
168 SV *namesv = PAD_SV(cUNOP->op_targ);
169 name = SvPV(namesv, len);
170 gv = (GV*)NEWSV(0,0);
171 gv_init(gv, CopSTASH(PL_curcop), name, len, 0);
174 name = CopSTASHPV(PL_curcop);
177 if (SvTYPE(sv) < SVt_RV)
178 sv_upgrade(sv, SVt_RV);
184 if (PL_op->op_flags & OPf_REF ||
185 PL_op->op_private & HINT_STRICT_REFS)
186 DIE(aTHX_ PL_no_usym, "a symbol");
187 if (ckWARN(WARN_UNINITIALIZED))
192 if ((PL_op->op_flags & OPf_SPECIAL) &&
193 !(PL_op->op_flags & OPf_MOD))
195 sv = (SV*)gv_fetchpv(sym, FALSE, SVt_PVGV);
197 && (!is_gv_magical(sym,len,0)
198 || !(sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV))))
204 if (PL_op->op_private & HINT_STRICT_REFS)
205 DIE(aTHX_ PL_no_symref, sym, "a symbol");
206 sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV);
210 if (PL_op->op_private & OPpLVAL_INTRO)
211 save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
223 tryAMAGICunDEREF(to_sv);
226 switch (SvTYPE(sv)) {
230 DIE(aTHX_ "Not a SCALAR reference");
238 if (SvTYPE(gv) != SVt_PVGV) {
239 if (SvGMAGICAL(sv)) {
245 if (PL_op->op_flags & OPf_REF ||
246 PL_op->op_private & HINT_STRICT_REFS)
247 DIE(aTHX_ PL_no_usym, "a SCALAR");
248 if (ckWARN(WARN_UNINITIALIZED))
253 if ((PL_op->op_flags & OPf_SPECIAL) &&
254 !(PL_op->op_flags & OPf_MOD))
256 gv = (GV*)gv_fetchpv(sym, FALSE, SVt_PV);
258 && (!is_gv_magical(sym,len,0)
259 || !(gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV))))
265 if (PL_op->op_private & HINT_STRICT_REFS)
266 DIE(aTHX_ PL_no_symref, sym, "a SCALAR");
267 gv = (GV*)gv_fetchpv(sym, 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);
560 switch (elem ? *elem : '\0')
563 if (strEQ(elem, "ARRAY"))
564 tmpRef = (SV*)GvAV(gv);
567 if (strEQ(elem, "CODE"))
568 tmpRef = (SV*)GvCVu(gv);
571 if (strEQ(elem, "FILEHANDLE")) {
572 /* finally deprecated in 5.8.0 */
573 deprecate("*glob{FILEHANDLE}");
574 tmpRef = (SV*)GvIOp(gv);
577 if (strEQ(elem, "FORMAT"))
578 tmpRef = (SV*)GvFORM(gv);
581 if (strEQ(elem, "GLOB"))
585 if (strEQ(elem, "HASH"))
586 tmpRef = (SV*)GvHV(gv);
589 if (strEQ(elem, "IO"))
590 tmpRef = (SV*)GvIOp(gv);
593 if (strEQ(elem, "NAME"))
594 sv = newSVpvn(GvNAME(gv), GvNAMELEN(gv));
597 if (strEQ(elem, "PACKAGE"))
598 if (HvNAME(GvSTASH(gv)))
599 sv = newSVpv(HvNAME(GvSTASH(gv)), 0);
601 sv = newSVpv("__ANON__",0);
604 if (strEQ(elem, "SCALAR"))
618 /* Pattern matching */
623 register unsigned char *s;
626 register I32 *sfirst;
630 if (sv == PL_lastscream) {
636 SvSCREAM_off(PL_lastscream);
637 SvREFCNT_dec(PL_lastscream);
639 PL_lastscream = SvREFCNT_inc(sv);
642 s = (unsigned char*)(SvPV(sv, len));
646 if (pos > PL_maxscream) {
647 if (PL_maxscream < 0) {
648 PL_maxscream = pos + 80;
649 New(301, PL_screamfirst, 256, I32);
650 New(302, PL_screamnext, PL_maxscream, I32);
653 PL_maxscream = pos + pos / 4;
654 Renew(PL_screamnext, PL_maxscream, I32);
658 sfirst = PL_screamfirst;
659 snext = PL_screamnext;
661 if (!sfirst || !snext)
662 DIE(aTHX_ "do_study: out of memory");
664 for (ch = 256; ch; --ch)
671 snext[pos] = sfirst[ch] - pos;
678 /* piggyback on m//g magic */
679 sv_magic(sv, Nullsv, PERL_MAGIC_regex_global, Nullch, 0);
688 if (PL_op->op_flags & OPf_STACKED)
694 TARG = sv_newmortal();
699 /* Lvalue operators. */
711 dSP; dMARK; dTARGET; dORIGMARK;
713 do_chop(TARG, *++MARK);
722 SETi(do_chomp(TOPs));
729 register I32 count = 0;
732 count += do_chomp(POPs);
743 if (!sv || !SvANY(sv))
745 switch (SvTYPE(sv)) {
747 if (AvMAX(sv) >= 0 || SvGMAGICAL(sv)
748 || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
752 if (HvARRAY(sv) || SvGMAGICAL(sv)
753 || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
757 if (CvROOT(sv) || CvXSUB(sv))
774 if (!PL_op->op_private) {
783 SV_CHECK_THINKFIRST_COW_DROP(sv);
785 switch (SvTYPE(sv)) {
795 if (ckWARN(WARN_MISC) && cv_const_sv((CV*)sv))
796 Perl_warner(aTHX_ packWARN(WARN_MISC), "Constant subroutine %s undefined",
797 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
801 /* let user-undef'd sub keep its identity */
802 GV* gv = CvGV((CV*)sv);
809 SvSetMagicSV(sv, &PL_sv_undef);
813 Newz(602, gp, 1, GP);
814 GvGP(sv) = gp_ref(gp);
815 GvSV(sv) = NEWSV(72,0);
816 GvLINE(sv) = CopLINE(PL_curcop);
822 if (SvTYPE(sv) >= SVt_PV && SvPVX(sv) && SvLEN(sv)) {
825 SvPV_set(sv, Nullch);
838 if (SvTYPE(TOPs) > SVt_PVLV)
839 DIE(aTHX_ PL_no_modify);
840 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
841 && SvIVX(TOPs) != IV_MIN)
844 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
855 if (SvTYPE(TOPs) > SVt_PVLV)
856 DIE(aTHX_ PL_no_modify);
857 sv_setsv(TARG, TOPs);
858 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
859 && SvIVX(TOPs) != IV_MAX)
862 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
867 /* special case for undef: see thread at 2003-03/msg00536.html in archive */
877 if (SvTYPE(TOPs) > SVt_PVLV)
878 DIE(aTHX_ PL_no_modify);
879 sv_setsv(TARG, TOPs);
880 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
881 && SvIVX(TOPs) != IV_MIN)
884 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
893 /* Ordinary operators. */
898 #ifdef PERL_PRESERVE_IVUV
901 tryAMAGICbin(pow,opASSIGN);
902 #ifdef PERL_PRESERVE_IVUV
903 /* For integer to integer power, we do the calculation by hand wherever
904 we're sure it is safe; otherwise we call pow() and try to convert to
905 integer afterwards. */
909 bool baseuok = SvUOK(TOPm1s);
913 baseuv = SvUVX(TOPm1s);
915 IV iv = SvIVX(TOPm1s);
918 baseuok = TRUE; /* effectively it's a UV now */
920 baseuv = -iv; /* abs, baseuok == false records sign */
934 goto float_it; /* Can't do negative powers this way. */
937 /* now we have integer ** positive integer. */
940 /* foo & (foo - 1) is zero only for a power of 2. */
941 if (!(baseuv & (baseuv - 1))) {
942 /* We are raising power-of-2 to a positive integer.
943 The logic here will work for any base (even non-integer
944 bases) but it can be less accurate than
945 pow (base,power) or exp (power * log (base)) when the
946 intermediate values start to spill out of the mantissa.
947 With powers of 2 we know this can't happen.
948 And powers of 2 are the favourite thing for perl
949 programmers to notice ** not doing what they mean. */
951 NV base = baseuok ? baseuv : -(NV)baseuv;
954 for (; power; base *= base, n++) {
955 /* Do I look like I trust gcc with long longs here?
957 UV bit = (UV)1 << (UV)n;
960 /* Only bother to clear the bit if it is set. */
962 /* Avoid squaring base again if we're done. */
963 if (power == 0) break;
971 register unsigned int highbit = 8 * sizeof(UV);
972 register unsigned int lowbit = 0;
973 register unsigned int diff;
974 while ((diff = (highbit - lowbit) >> 1)) {
975 if (baseuv & ~((1 << (lowbit + diff)) - 1))
980 /* we now have baseuv < 2 ** highbit */
981 if (power * highbit <= 8 * sizeof(UV)) {
982 /* result will definitely fit in UV, so use UV math
983 on same algorithm as above */
984 register UV result = 1;
985 register UV base = baseuv;
987 for (; power; base *= base, n++) {
988 register UV bit = (UV)1 << (UV)n;
992 if (power == 0) break;
996 if (baseuok || !(power & 1))
997 /* answer is positive */
999 else if (result <= (UV)IV_MAX)
1000 /* answer negative, fits in IV */
1001 SETi( -(IV)result );
1002 else if (result == (UV)IV_MIN)
1003 /* 2's complement assumption: special case IV_MIN */
1006 /* answer negative, doesn't fit */
1007 SETn( -(NV)result );
1018 SETn( Perl_pow( left, right) );
1019 #ifdef PERL_PRESERVE_IVUV
1029 dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
1030 #ifdef PERL_PRESERVE_IVUV
1033 /* Unless the left argument is integer in range we are going to have to
1034 use NV maths. Hence only attempt to coerce the right argument if
1035 we know the left is integer. */
1036 /* Left operand is defined, so is it IV? */
1037 SvIV_please(TOPm1s);
1038 if (SvIOK(TOPm1s)) {
1039 bool auvok = SvUOK(TOPm1s);
1040 bool buvok = SvUOK(TOPs);
1041 const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
1042 const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
1049 alow = SvUVX(TOPm1s);
1051 IV aiv = SvIVX(TOPm1s);
1054 auvok = TRUE; /* effectively it's a UV now */
1056 alow = -aiv; /* abs, auvok == false records sign */
1062 IV biv = SvIVX(TOPs);
1065 buvok = TRUE; /* effectively it's a UV now */
1067 blow = -biv; /* abs, buvok == false records sign */
1071 /* If this does sign extension on unsigned it's time for plan B */
1072 ahigh = alow >> (4 * sizeof (UV));
1074 bhigh = blow >> (4 * sizeof (UV));
1076 if (ahigh && bhigh) {
1077 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
1078 which is overflow. Drop to NVs below. */
1079 } else if (!ahigh && !bhigh) {
1080 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
1081 so the unsigned multiply cannot overflow. */
1082 UV product = alow * blow;
1083 if (auvok == buvok) {
1084 /* -ve * -ve or +ve * +ve gives a +ve result. */
1088 } else if (product <= (UV)IV_MIN) {
1089 /* 2s complement assumption that (UV)-IV_MIN is correct. */
1090 /* -ve result, which could overflow an IV */
1092 SETi( -(IV)product );
1094 } /* else drop to NVs below. */
1096 /* One operand is large, 1 small */
1099 /* swap the operands */
1101 bhigh = blow; /* bhigh now the temp var for the swap */
1105 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1106 multiplies can't overflow. shift can, add can, -ve can. */
1107 product_middle = ahigh * blow;
1108 if (!(product_middle & topmask)) {
1109 /* OK, (ahigh * blow) won't lose bits when we shift it. */
1111 product_middle <<= (4 * sizeof (UV));
1112 product_low = alow * blow;
1114 /* as for pp_add, UV + something mustn't get smaller.
1115 IIRC ANSI mandates this wrapping *behaviour* for
1116 unsigned whatever the actual representation*/
1117 product_low += product_middle;
1118 if (product_low >= product_middle) {
1119 /* didn't overflow */
1120 if (auvok == buvok) {
1121 /* -ve * -ve or +ve * +ve gives a +ve result. */
1123 SETu( product_low );
1125 } else if (product_low <= (UV)IV_MIN) {
1126 /* 2s complement assumption again */
1127 /* -ve result, which could overflow an IV */
1129 SETi( -(IV)product_low );
1131 } /* else drop to NVs below. */
1133 } /* product_middle too large */
1134 } /* ahigh && bhigh */
1135 } /* SvIOK(TOPm1s) */
1140 SETn( left * right );
1147 dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
1148 /* Only try to do UV divide first
1149 if ((SLOPPYDIVIDE is true) or
1150 (PERL_PRESERVE_IVUV is true and one or both SV is a UV too large
1152 The assumption is that it is better to use floating point divide
1153 whenever possible, only doing integer divide first if we can't be sure.
1154 If NV_PRESERVES_UV is true then we know at compile time that no UV
1155 can be too large to preserve, so don't need to compile the code to
1156 test the size of UVs. */
1159 # define PERL_TRY_UV_DIVIDE
1160 /* ensure that 20./5. == 4. */
1162 # ifdef PERL_PRESERVE_IVUV
1163 # ifndef NV_PRESERVES_UV
1164 # define PERL_TRY_UV_DIVIDE
1169 #ifdef PERL_TRY_UV_DIVIDE
1172 SvIV_please(TOPm1s);
1173 if (SvIOK(TOPm1s)) {
1174 bool left_non_neg = SvUOK(TOPm1s);
1175 bool right_non_neg = SvUOK(TOPs);
1179 if (right_non_neg) {
1180 right = SvUVX(TOPs);
1183 IV biv = SvIVX(TOPs);
1186 right_non_neg = TRUE; /* effectively it's a UV now */
1192 /* historically undef()/0 gives a "Use of uninitialized value"
1193 warning before dieing, hence this test goes here.
1194 If it were immediately before the second SvIV_please, then
1195 DIE() would be invoked before left was even inspected, so
1196 no inpsection would give no warning. */
1198 DIE(aTHX_ "Illegal division by zero");
1201 left = SvUVX(TOPm1s);
1204 IV aiv = SvIVX(TOPm1s);
1207 left_non_neg = TRUE; /* effectively it's a UV now */
1216 /* For sloppy divide we always attempt integer division. */
1218 /* Otherwise we only attempt it if either or both operands
1219 would not be preserved by an NV. If both fit in NVs
1220 we fall through to the NV divide code below. However,
1221 as left >= right to ensure integer result here, we know that
1222 we can skip the test on the right operand - right big
1223 enough not to be preserved can't get here unless left is
1226 && (left > ((UV)1 << NV_PRESERVES_UV_BITS))
1229 /* Integer division can't overflow, but it can be imprecise. */
1230 UV result = left / right;
1231 if (result * right == left) {
1232 SP--; /* result is valid */
1233 if (left_non_neg == right_non_neg) {
1234 /* signs identical, result is positive. */
1238 /* 2s complement assumption */
1239 if (result <= (UV)IV_MIN)
1240 SETi( -(IV)result );
1242 /* It's exact but too negative for IV. */
1243 SETn( -(NV)result );
1246 } /* tried integer divide but it was not an integer result */
1247 } /* else (PERL_ABS(result) < 1.0) or (both UVs in range for NV) */
1248 } /* left wasn't SvIOK */
1249 } /* right wasn't SvIOK */
1250 #endif /* PERL_TRY_UV_DIVIDE */
1254 DIE(aTHX_ "Illegal division by zero");
1255 PUSHn( left / right );
1262 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1266 bool left_neg = FALSE;
1267 bool right_neg = FALSE;
1268 bool use_double = FALSE;
1269 bool dright_valid = FALSE;
1275 right_neg = !SvUOK(TOPs);
1277 right = SvUVX(POPs);
1279 IV biv = SvIVX(POPs);
1282 right_neg = FALSE; /* effectively it's a UV now */
1290 right_neg = dright < 0;
1293 if (dright < UV_MAX_P1) {
1294 right = U_V(dright);
1295 dright_valid = TRUE; /* In case we need to use double below. */
1301 /* At this point use_double is only true if right is out of range for
1302 a UV. In range NV has been rounded down to nearest UV and
1303 use_double false. */
1305 if (!use_double && SvIOK(TOPs)) {
1307 left_neg = !SvUOK(TOPs);
1311 IV aiv = SvIVX(POPs);
1314 left_neg = FALSE; /* effectively it's a UV now */
1323 left_neg = dleft < 0;
1327 /* This should be exactly the 5.6 behaviour - if left and right are
1328 both in range for UV then use U_V() rather than floor. */
1330 if (dleft < UV_MAX_P1) {
1331 /* right was in range, so is dleft, so use UVs not double.
1335 /* left is out of range for UV, right was in range, so promote
1336 right (back) to double. */
1338 /* The +0.5 is used in 5.6 even though it is not strictly
1339 consistent with the implicit +0 floor in the U_V()
1340 inside the #if 1. */
1341 dleft = Perl_floor(dleft + 0.5);
1344 dright = Perl_floor(dright + 0.5);
1354 DIE(aTHX_ "Illegal modulus zero");
1356 dans = Perl_fmod(dleft, dright);
1357 if ((left_neg != right_neg) && dans)
1358 dans = dright - dans;
1361 sv_setnv(TARG, dans);
1367 DIE(aTHX_ "Illegal modulus zero");
1370 if ((left_neg != right_neg) && ans)
1373 /* XXX may warn: unary minus operator applied to unsigned type */
1374 /* could change -foo to be (~foo)+1 instead */
1375 if (ans <= ~((UV)IV_MAX)+1)
1376 sv_setiv(TARG, ~ans+1);
1378 sv_setnv(TARG, -(NV)ans);
1381 sv_setuv(TARG, ans);
1390 dSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
1392 register IV count = POPi;
1393 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1395 I32 items = SP - MARK;
1398 max = items * count;
1403 /* This code was intended to fix 20010809.028:
1406 for (($x =~ /./g) x 2) {
1407 print chop; # "abcdabcd" expected as output.
1410 * but that change (#11635) broke this code:
1412 $x = [("foo")x2]; # only one "foo" ended up in the anonlist.
1414 * I can't think of a better fix that doesn't introduce
1415 * an efficiency hit by copying the SVs. The stack isn't
1416 * refcounted, and mortalisation obviously doesn't
1417 * Do The Right Thing when the stack has more than
1418 * one pointer to the same mortal value.
1422 *SP = sv_2mortal(newSVsv(*SP));
1432 repeatcpy((char*)(MARK + items), (char*)MARK,
1433 items * sizeof(SV*), count - 1);
1436 else if (count <= 0)
1439 else { /* Note: mark already snarfed by pp_list */
1444 SvSetSV(TARG, tmpstr);
1445 SvPV_force(TARG, len);
1446 isutf = DO_UTF8(TARG);
1451 SvGROW(TARG, (count * len) + 1);
1452 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1453 SvCUR(TARG) *= count;
1455 *SvEND(TARG) = '\0';
1458 (void)SvPOK_only_UTF8(TARG);
1460 (void)SvPOK_only(TARG);
1462 if (PL_op->op_private & OPpREPEAT_DOLIST) {
1463 /* The parser saw this as a list repeat, and there
1464 are probably several items on the stack. But we're
1465 in scalar context, and there's no pp_list to save us
1466 now. So drop the rest of the items -- robin@kitsite.com
1479 dSP; dATARGET; bool useleft; tryAMAGICbin(subtr,opASSIGN);
1480 useleft = USE_LEFT(TOPm1s);
1481 #ifdef PERL_PRESERVE_IVUV
1482 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1483 "bad things" happen if you rely on signed integers wrapping. */
1486 /* Unless the left argument is integer in range we are going to have to
1487 use NV maths. Hence only attempt to coerce the right argument if
1488 we know the left is integer. */
1489 register UV auv = 0;
1495 a_valid = auvok = 1;
1496 /* left operand is undef, treat as zero. */
1498 /* Left operand is defined, so is it IV? */
1499 SvIV_please(TOPm1s);
1500 if (SvIOK(TOPm1s)) {
1501 if ((auvok = SvUOK(TOPm1s)))
1502 auv = SvUVX(TOPm1s);
1504 register IV aiv = SvIVX(TOPm1s);
1507 auvok = 1; /* Now acting as a sign flag. */
1508 } else { /* 2s complement assumption for IV_MIN */
1516 bool result_good = 0;
1519 bool buvok = SvUOK(TOPs);
1524 register IV biv = SvIVX(TOPs);
1531 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1532 else "IV" now, independent of how it came in.
1533 if a, b represents positive, A, B negative, a maps to -A etc
1538 all UV maths. negate result if A negative.
1539 subtract if signs same, add if signs differ. */
1541 if (auvok ^ buvok) {
1550 /* Must get smaller */
1555 if (result <= buv) {
1556 /* result really should be -(auv-buv). as its negation
1557 of true value, need to swap our result flag */
1569 if (result <= (UV)IV_MIN)
1570 SETi( -(IV)result );
1572 /* result valid, but out of range for IV. */
1573 SETn( -(NV)result );
1577 } /* Overflow, drop through to NVs. */
1581 useleft = USE_LEFT(TOPm1s);
1585 /* left operand is undef, treat as zero - value */
1589 SETn( TOPn - value );
1596 dSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1599 if (PL_op->op_private & HINT_INTEGER) {
1613 dSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1616 if (PL_op->op_private & HINT_INTEGER) {
1630 dSP; tryAMAGICbinSET(lt,0);
1631 #ifdef PERL_PRESERVE_IVUV
1634 SvIV_please(TOPm1s);
1635 if (SvIOK(TOPm1s)) {
1636 bool auvok = SvUOK(TOPm1s);
1637 bool buvok = SvUOK(TOPs);
1639 if (!auvok && !buvok) { /* ## IV < IV ## */
1640 IV aiv = SvIVX(TOPm1s);
1641 IV biv = SvIVX(TOPs);
1644 SETs(boolSV(aiv < biv));
1647 if (auvok && buvok) { /* ## UV < UV ## */
1648 UV auv = SvUVX(TOPm1s);
1649 UV buv = SvUVX(TOPs);
1652 SETs(boolSV(auv < buv));
1655 if (auvok) { /* ## UV < IV ## */
1662 /* As (a) is a UV, it's >=0, so it cannot be < */
1667 SETs(boolSV(auv < (UV)biv));
1670 { /* ## IV < UV ## */
1674 aiv = SvIVX(TOPm1s);
1676 /* As (b) is a UV, it's >=0, so it must be < */
1683 SETs(boolSV((UV)aiv < buv));
1689 #ifndef NV_PRESERVES_UV
1690 #ifdef PERL_PRESERVE_IVUV
1693 if (SvROK(TOPs) && SvROK(TOPm1s)) {
1695 SETs(boolSV(SvRV(TOPs) < SvRV(TOPp1s)));
1701 SETs(boolSV(TOPn < value));
1708 dSP; tryAMAGICbinSET(gt,0);
1709 #ifdef PERL_PRESERVE_IVUV
1712 SvIV_please(TOPm1s);
1713 if (SvIOK(TOPm1s)) {
1714 bool auvok = SvUOK(TOPm1s);
1715 bool buvok = SvUOK(TOPs);
1717 if (!auvok && !buvok) { /* ## IV > IV ## */
1718 IV aiv = SvIVX(TOPm1s);
1719 IV biv = SvIVX(TOPs);
1722 SETs(boolSV(aiv > biv));
1725 if (auvok && buvok) { /* ## UV > UV ## */
1726 UV auv = SvUVX(TOPm1s);
1727 UV buv = SvUVX(TOPs);
1730 SETs(boolSV(auv > buv));
1733 if (auvok) { /* ## UV > IV ## */
1740 /* As (a) is a UV, it's >=0, so it must be > */
1745 SETs(boolSV(auv > (UV)biv));
1748 { /* ## IV > UV ## */
1752 aiv = SvIVX(TOPm1s);
1754 /* As (b) is a UV, it's >=0, so it cannot be > */
1761 SETs(boolSV((UV)aiv > buv));
1767 #ifndef NV_PRESERVES_UV
1768 #ifdef PERL_PRESERVE_IVUV
1771 if (SvROK(TOPs) && SvROK(TOPm1s)) {
1773 SETs(boolSV(SvRV(TOPs) > SvRV(TOPp1s)));
1779 SETs(boolSV(TOPn > value));
1786 dSP; tryAMAGICbinSET(le,0);
1787 #ifdef PERL_PRESERVE_IVUV
1790 SvIV_please(TOPm1s);
1791 if (SvIOK(TOPm1s)) {
1792 bool auvok = SvUOK(TOPm1s);
1793 bool buvok = SvUOK(TOPs);
1795 if (!auvok && !buvok) { /* ## IV <= IV ## */
1796 IV aiv = SvIVX(TOPm1s);
1797 IV biv = SvIVX(TOPs);
1800 SETs(boolSV(aiv <= biv));
1803 if (auvok && buvok) { /* ## UV <= UV ## */
1804 UV auv = SvUVX(TOPm1s);
1805 UV buv = SvUVX(TOPs);
1808 SETs(boolSV(auv <= buv));
1811 if (auvok) { /* ## UV <= IV ## */
1818 /* As (a) is a UV, it's >=0, so a cannot be <= */
1823 SETs(boolSV(auv <= (UV)biv));
1826 { /* ## IV <= UV ## */
1830 aiv = SvIVX(TOPm1s);
1832 /* As (b) is a UV, it's >=0, so a must be <= */
1839 SETs(boolSV((UV)aiv <= buv));
1845 #ifndef NV_PRESERVES_UV
1846 #ifdef PERL_PRESERVE_IVUV
1849 if (SvROK(TOPs) && SvROK(TOPm1s)) {
1851 SETs(boolSV(SvRV(TOPs) <= SvRV(TOPp1s)));
1857 SETs(boolSV(TOPn <= value));
1864 dSP; tryAMAGICbinSET(ge,0);
1865 #ifdef PERL_PRESERVE_IVUV
1868 SvIV_please(TOPm1s);
1869 if (SvIOK(TOPm1s)) {
1870 bool auvok = SvUOK(TOPm1s);
1871 bool buvok = SvUOK(TOPs);
1873 if (!auvok && !buvok) { /* ## IV >= IV ## */
1874 IV aiv = SvIVX(TOPm1s);
1875 IV biv = SvIVX(TOPs);
1878 SETs(boolSV(aiv >= biv));
1881 if (auvok && buvok) { /* ## UV >= UV ## */
1882 UV auv = SvUVX(TOPm1s);
1883 UV buv = SvUVX(TOPs);
1886 SETs(boolSV(auv >= buv));
1889 if (auvok) { /* ## UV >= IV ## */
1896 /* As (a) is a UV, it's >=0, so it must be >= */
1901 SETs(boolSV(auv >= (UV)biv));
1904 { /* ## IV >= UV ## */
1908 aiv = SvIVX(TOPm1s);
1910 /* As (b) is a UV, it's >=0, so a cannot be >= */
1917 SETs(boolSV((UV)aiv >= buv));
1923 #ifndef NV_PRESERVES_UV
1924 #ifdef PERL_PRESERVE_IVUV
1927 if (SvROK(TOPs) && SvROK(TOPm1s)) {
1929 SETs(boolSV(SvRV(TOPs) >= SvRV(TOPp1s)));
1935 SETs(boolSV(TOPn >= value));
1942 dSP; tryAMAGICbinSET(ne,0);
1943 #ifndef NV_PRESERVES_UV
1944 if (SvROK(TOPs) && SvROK(TOPm1s)) {
1946 SETs(boolSV(SvRV(TOPs) != SvRV(TOPp1s)));
1950 #ifdef PERL_PRESERVE_IVUV
1953 SvIV_please(TOPm1s);
1954 if (SvIOK(TOPm1s)) {
1955 bool auvok = SvUOK(TOPm1s);
1956 bool buvok = SvUOK(TOPs);
1958 if (auvok == buvok) { /* ## IV == IV or UV == UV ## */
1959 /* Casting IV to UV before comparison isn't going to matter
1960 on 2s complement. On 1s complement or sign&magnitude
1961 (if we have any of them) it could make negative zero
1962 differ from normal zero. As I understand it. (Need to
1963 check - is negative zero implementation defined behaviour
1965 UV buv = SvUVX(POPs);
1966 UV auv = SvUVX(TOPs);
1968 SETs(boolSV(auv != buv));
1971 { /* ## Mixed IV,UV ## */
1975 /* != is commutative so swap if needed (save code) */
1977 /* swap. top of stack (b) is the iv */
1981 /* As (a) is a UV, it's >0, so it cannot be == */
1990 /* As (b) is a UV, it's >0, so it cannot be == */
1994 uv = SvUVX(*(SP+1)); /* Do I want TOPp1s() ? */
1996 SETs(boolSV((UV)iv != uv));
2004 SETs(boolSV(TOPn != value));
2011 dSP; dTARGET; tryAMAGICbin(ncmp,0);
2012 #ifndef NV_PRESERVES_UV
2013 if (SvROK(TOPs) && SvROK(TOPm1s)) {
2014 UV right = PTR2UV(SvRV(POPs));
2015 UV left = PTR2UV(SvRV(TOPs));
2016 SETi((left > right) - (left < right));
2020 #ifdef PERL_PRESERVE_IVUV
2021 /* Fortunately it seems NaN isn't IOK */
2024 SvIV_please(TOPm1s);
2025 if (SvIOK(TOPm1s)) {
2026 bool leftuvok = SvUOK(TOPm1s);
2027 bool rightuvok = SvUOK(TOPs);
2029 if (!leftuvok && !rightuvok) { /* ## IV <=> IV ## */
2030 IV leftiv = SvIVX(TOPm1s);
2031 IV rightiv = SvIVX(TOPs);
2033 if (leftiv > rightiv)
2035 else if (leftiv < rightiv)
2039 } else if (leftuvok && rightuvok) { /* ## UV <=> UV ## */
2040 UV leftuv = SvUVX(TOPm1s);
2041 UV rightuv = SvUVX(TOPs);
2043 if (leftuv > rightuv)
2045 else if (leftuv < rightuv)
2049 } else if (leftuvok) { /* ## UV <=> IV ## */
2053 rightiv = SvIVX(TOPs);
2055 /* As (a) is a UV, it's >=0, so it cannot be < */
2058 leftuv = SvUVX(TOPm1s);
2059 if (leftuv > (UV)rightiv) {
2061 } else if (leftuv < (UV)rightiv) {
2067 } else { /* ## IV <=> UV ## */
2071 leftiv = SvIVX(TOPm1s);
2073 /* As (b) is a UV, it's >=0, so it must be < */
2076 rightuv = SvUVX(TOPs);
2077 if ((UV)leftiv > rightuv) {
2079 } else if ((UV)leftiv < rightuv) {
2097 if (Perl_isnan(left) || Perl_isnan(right)) {
2101 value = (left > right) - (left < right);
2105 else if (left < right)
2107 else if (left > right)
2121 dSP; tryAMAGICbinSET(slt,0);
2124 int cmp = (IN_LOCALE_RUNTIME
2125 ? sv_cmp_locale(left, right)
2126 : sv_cmp(left, right));
2127 SETs(boolSV(cmp < 0));
2134 dSP; tryAMAGICbinSET(sgt,0);
2137 int cmp = (IN_LOCALE_RUNTIME
2138 ? sv_cmp_locale(left, right)
2139 : sv_cmp(left, right));
2140 SETs(boolSV(cmp > 0));
2147 dSP; tryAMAGICbinSET(sle,0);
2150 int cmp = (IN_LOCALE_RUNTIME
2151 ? sv_cmp_locale(left, right)
2152 : sv_cmp(left, right));
2153 SETs(boolSV(cmp <= 0));
2160 dSP; tryAMAGICbinSET(sge,0);
2163 int cmp = (IN_LOCALE_RUNTIME
2164 ? sv_cmp_locale(left, right)
2165 : sv_cmp(left, right));
2166 SETs(boolSV(cmp >= 0));
2173 dSP; tryAMAGICbinSET(seq,0);
2176 SETs(boolSV(sv_eq(left, right)));
2183 dSP; tryAMAGICbinSET(sne,0);
2186 SETs(boolSV(!sv_eq(left, right)));
2193 dSP; dTARGET; tryAMAGICbin(scmp,0);
2196 int cmp = (IN_LOCALE_RUNTIME
2197 ? sv_cmp_locale(left, right)
2198 : sv_cmp(left, right));
2206 dSP; dATARGET; tryAMAGICbin(band,opASSIGN);
2209 if (SvNIOKp(left) || SvNIOKp(right)) {
2210 if (PL_op->op_private & HINT_INTEGER) {
2211 IV i = SvIV(left) & SvIV(right);
2215 UV u = SvUV(left) & SvUV(right);
2220 do_vop(PL_op->op_type, TARG, left, right);
2229 dSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
2232 if (SvNIOKp(left) || SvNIOKp(right)) {
2233 if (PL_op->op_private & HINT_INTEGER) {
2234 IV i = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right);
2238 UV u = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right);
2243 do_vop(PL_op->op_type, TARG, left, right);
2252 dSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
2255 if (SvNIOKp(left) || SvNIOKp(right)) {
2256 if (PL_op->op_private & HINT_INTEGER) {
2257 IV i = (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right);
2261 UV u = (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right);
2266 do_vop(PL_op->op_type, TARG, left, right);
2275 dSP; dTARGET; tryAMAGICun(neg);
2278 int flags = SvFLAGS(sv);
2281 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
2282 /* It's publicly an integer, or privately an integer-not-float */
2285 if (SvIVX(sv) == IV_MIN) {
2286 /* 2s complement assumption. */
2287 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
2290 else if (SvUVX(sv) <= IV_MAX) {
2295 else if (SvIVX(sv) != IV_MIN) {
2299 #ifdef PERL_PRESERVE_IVUV
2308 else if (SvPOKp(sv)) {
2310 char *s = SvPV(sv, len);
2311 if (isIDFIRST(*s)) {
2312 sv_setpvn(TARG, "-", 1);
2315 else if (*s == '+' || *s == '-') {
2317 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
2319 else if (DO_UTF8(sv)) {
2322 goto oops_its_an_int;
2324 sv_setnv(TARG, -SvNV(sv));
2326 sv_setpvn(TARG, "-", 1);
2333 goto oops_its_an_int;
2334 sv_setnv(TARG, -SvNV(sv));
2346 dSP; tryAMAGICunSET(not);
2347 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
2353 dSP; dTARGET; tryAMAGICun(compl);
2357 if (PL_op->op_private & HINT_INTEGER) {
2372 tmps = (U8*)SvPV_force(TARG, len);
2375 /* Calculate exact length, let's not estimate. */
2384 while (tmps < send) {
2385 UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2386 tmps += UTF8SKIP(tmps);
2387 targlen += UNISKIP(~c);
2393 /* Now rewind strings and write them. */
2397 Newz(0, result, targlen + 1, U8);
2398 while (tmps < send) {
2399 UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2400 tmps += UTF8SKIP(tmps);
2401 result = uvchr_to_utf8_flags(result, ~c, UNICODE_ALLOW_ANY);
2405 sv_setpvn(TARG, (char*)result, targlen);
2409 Newz(0, result, nchar + 1, U8);
2410 while (tmps < send) {
2411 U8 c = (U8)utf8n_to_uvchr(tmps, 0, &l, UTF8_ALLOW_ANY);
2412 tmps += UTF8SKIP(tmps);
2417 sv_setpvn(TARG, (char*)result, nchar);
2425 register long *tmpl;
2426 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2429 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
2434 for ( ; anum > 0; anum--, tmps++)
2443 /* integer versions of some of the above */
2447 dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
2450 SETi( left * right );
2457 dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
2461 DIE(aTHX_ "Illegal division by zero");
2462 value = POPi / value;
2471 /* This is the vanilla old i_modulo. */
2472 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2476 DIE(aTHX_ "Illegal modulus zero");
2477 SETi( left % right );
2482 #if defined(__GLIBC__) && IVSIZE == 8
2486 /* This is the i_modulo with the workaround for the _moddi3 bug
2487 * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
2488 * See below for pp_i_modulo. */
2489 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2493 DIE(aTHX_ "Illegal modulus zero");
2494 SETi( left % PERL_ABS(right) );
2502 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2506 DIE(aTHX_ "Illegal modulus zero");
2507 /* The assumption is to use hereafter the old vanilla version... */
2509 PL_ppaddr[OP_I_MODULO] =
2510 &Perl_pp_i_modulo_0;
2511 /* .. but if we have glibc, we might have a buggy _moddi3
2512 * (at least glicb 2.2.5 is known to have this bug), in other
2513 * words our integer modulus with negative quad as the second
2514 * argument might be broken. Test for this and re-patch the
2515 * opcode dispatch table if that is the case, remembering to
2516 * also apply the workaround so that this first round works
2517 * right, too. See [perl #9402] for more information. */
2518 #if defined(__GLIBC__) && IVSIZE == 8
2522 /* Cannot do this check with inlined IV constants since
2523 * that seems to work correctly even with the buggy glibc. */
2525 /* Yikes, we have the bug.
2526 * Patch in the workaround version. */
2528 PL_ppaddr[OP_I_MODULO] =
2529 &Perl_pp_i_modulo_1;
2530 /* Make certain we work right this time, too. */
2531 right = PERL_ABS(right);
2535 SETi( left % right );
2542 dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
2545 SETi( left + right );
2552 dSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
2555 SETi( left - right );
2562 dSP; tryAMAGICbinSET(lt,0);
2565 SETs(boolSV(left < right));
2572 dSP; tryAMAGICbinSET(gt,0);
2575 SETs(boolSV(left > right));
2582 dSP; tryAMAGICbinSET(le,0);
2585 SETs(boolSV(left <= right));
2592 dSP; tryAMAGICbinSET(ge,0);
2595 SETs(boolSV(left >= right));
2602 dSP; tryAMAGICbinSET(eq,0);
2605 SETs(boolSV(left == right));
2612 dSP; tryAMAGICbinSET(ne,0);
2615 SETs(boolSV(left != right));
2622 dSP; dTARGET; tryAMAGICbin(ncmp,0);
2629 else if (left < right)
2640 dSP; dTARGET; tryAMAGICun(neg);
2645 /* High falutin' math. */
2649 dSP; dTARGET; tryAMAGICbin(atan2,0);
2652 SETn(Perl_atan2(left, right));
2659 dSP; dTARGET; tryAMAGICun(sin);
2663 value = Perl_sin(value);
2671 dSP; dTARGET; tryAMAGICun(cos);
2675 value = Perl_cos(value);
2681 /* Support Configure command-line overrides for rand() functions.
2682 After 5.005, perhaps we should replace this by Configure support
2683 for drand48(), random(), or rand(). For 5.005, though, maintain
2684 compatibility by calling rand() but allow the user to override it.
2685 See INSTALL for details. --Andy Dougherty 15 July 1998
2687 /* Now it's after 5.005, and Configure supports drand48() and random(),
2688 in addition to rand(). So the overrides should not be needed any more.
2689 --Jarkko Hietaniemi 27 September 1998
2692 #ifndef HAS_DRAND48_PROTO
2693 extern double drand48 (void);
2706 if (!PL_srand_called) {
2707 (void)seedDrand01((Rand_seed_t)seed());
2708 PL_srand_called = TRUE;
2723 (void)seedDrand01((Rand_seed_t)anum);
2724 PL_srand_called = TRUE;
2733 * This is really just a quick hack which grabs various garbage
2734 * values. It really should be a real hash algorithm which
2735 * spreads the effect of every input bit onto every output bit,
2736 * if someone who knows about such things would bother to write it.
2737 * Might be a good idea to add that function to CORE as well.
2738 * No numbers below come from careful analysis or anything here,
2739 * except they are primes and SEED_C1 > 1E6 to get a full-width
2740 * value from (tv_sec * SEED_C1 + tv_usec). The multipliers should
2741 * probably be bigger too.
2744 # define SEED_C1 1000003
2745 #define SEED_C4 73819
2747 # define SEED_C1 25747
2748 #define SEED_C4 20639
2752 #define SEED_C5 26107
2754 #ifndef PERL_NO_DEV_RANDOM
2759 # include <starlet.h>
2760 /* when[] = (low 32 bits, high 32 bits) of time since epoch
2761 * in 100-ns units, typically incremented ever 10 ms. */
2762 unsigned int when[2];
2764 # ifdef HAS_GETTIMEOFDAY
2765 struct timeval when;
2771 /* This test is an escape hatch, this symbol isn't set by Configure. */
2772 #ifndef PERL_NO_DEV_RANDOM
2773 #ifndef PERL_RANDOM_DEVICE
2774 /* /dev/random isn't used by default because reads from it will block
2775 * if there isn't enough entropy available. You can compile with
2776 * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
2777 * is enough real entropy to fill the seed. */
2778 # define PERL_RANDOM_DEVICE "/dev/urandom"
2780 fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0);
2782 if (PerlLIO_read(fd, &u, sizeof u) != sizeof u)
2791 _ckvmssts(sys$gettim(when));
2792 u = (U32)SEED_C1 * when[0] + (U32)SEED_C2 * when[1];
2794 # ifdef HAS_GETTIMEOFDAY
2795 PerlProc_gettimeofday(&when,NULL);
2796 u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
2799 u = (U32)SEED_C1 * when;
2802 u += SEED_C3 * (U32)PerlProc_getpid();
2803 u += SEED_C4 * (U32)PTR2UV(PL_stack_sp);
2804 #ifndef PLAN9 /* XXX Plan9 assembler chokes on this; fix needed */
2805 u += SEED_C5 * (U32)PTR2UV(&when);
2812 dSP; dTARGET; tryAMAGICun(exp);
2816 value = Perl_exp(value);
2824 dSP; dTARGET; tryAMAGICun(log);
2829 SET_NUMERIC_STANDARD();
2830 DIE(aTHX_ "Can't take log of %"NVgf, value);
2832 value = Perl_log(value);
2840 dSP; dTARGET; tryAMAGICun(sqrt);
2845 SET_NUMERIC_STANDARD();
2846 DIE(aTHX_ "Can't take sqrt of %"NVgf, value);
2848 value = Perl_sqrt(value);
2855 * There are strange code-generation bugs caused on sparc64 by gcc-2.95.2.
2856 * These need to be revisited when a newer toolchain becomes available.
2858 #if defined(__sparc64__) && defined(__GNUC__)
2859 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
2860 # undef SPARC64_MODF_WORKAROUND
2861 # define SPARC64_MODF_WORKAROUND 1
2865 #if defined(SPARC64_MODF_WORKAROUND)
2867 sparc64_workaround_modf(NV theVal, NV *theIntRes)
2870 ret = Perl_modf(theVal, &res);
2878 dSP; dTARGET; tryAMAGICun(int);
2881 IV iv = TOPi; /* attempt to convert to IV if possible. */
2882 /* XXX it's arguable that compiler casting to IV might be subtly
2883 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2884 else preferring IV has introduced a subtle behaviour change bug. OTOH
2885 relying on floating point to be accurate is a bug. */
2896 if (value < (NV)UV_MAX + 0.5) {
2899 #if defined(SPARC64_MODF_WORKAROUND)
2900 (void)sparc64_workaround_modf(value, &value);
2901 #elif defined(HAS_MODFL_POW32_BUG)
2902 /* some versions of glibc split (i + d) into (i-1, d+1) for 2^32 <= i < 2^64 */
2903 NV offset = Perl_modf(value, &value);
2904 (void)Perl_modf(offset, &offset);
2907 (void)Perl_modf(value, &value);
2913 if (value > (NV)IV_MIN - 0.5) {
2916 #if defined(SPARC64_MODF_WORKAROUND)
2917 (void)sparc64_workaround_modf(-value, &value);
2918 #elif defined(HAS_MODFL_POW32_BUG)
2919 /* some versions of glibc split (i + d) into (i-1, d+1) for 2^32 <= i < 2^64 */
2920 NV offset = Perl_modf(-value, &value);
2921 (void)Perl_modf(offset, &offset);
2924 (void)Perl_modf(-value, &value);
2936 dSP; dTARGET; tryAMAGICun(abs);
2938 /* This will cache the NV value if string isn't actually integer */
2942 /* IVX is precise */
2944 SETu(TOPu); /* force it to be numeric only */
2952 /* 2s complement assumption. Also, not really needed as
2953 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
2973 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2979 tmps = (SvPVx(sv, len));
2981 /* If Unicode, try to downgrade
2982 * If not possible, croak. */
2983 SV* tsv = sv_2mortal(newSVsv(sv));
2986 sv_utf8_downgrade(tsv, FALSE);
2989 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2990 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
3003 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
3009 tmps = (SvPVx(sv, len));
3011 /* If Unicode, try to downgrade
3012 * If not possible, croak. */
3013 SV* tsv = sv_2mortal(newSVsv(sv));
3016 sv_utf8_downgrade(tsv, FALSE);
3019 while (*tmps && len && isSPACE(*tmps))
3024 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
3025 else if (*tmps == 'b')
3026 result_uv = grok_bin (tmps, &len, &flags, &result_nv);
3028 result_uv = grok_oct (tmps, &len, &flags, &result_nv);
3030 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
3047 SETi(sv_len_utf8(sv));
3063 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3065 I32 arybase = PL_curcop->cop_arybase;
3069 int num_args = PL_op->op_private & 7;
3070 bool repl_need_utf8_upgrade = FALSE;
3071 bool repl_is_utf8 = FALSE;
3073 SvTAINTED_off(TARG); /* decontaminate */
3074 SvUTF8_off(TARG); /* decontaminate */
3078 repl = SvPV(repl_sv, repl_len);
3079 repl_is_utf8 = DO_UTF8(repl_sv) && SvCUR(repl_sv);
3089 sv_utf8_upgrade(sv);
3091 else if (DO_UTF8(sv))
3092 repl_need_utf8_upgrade = TRUE;
3094 tmps = SvPV(sv, curlen);
3096 utf8_curlen = sv_len_utf8(sv);
3097 if (utf8_curlen == curlen)
3100 curlen = utf8_curlen;
3105 if (pos >= arybase) {
3123 else if (len >= 0) {
3125 if (rem > (I32)curlen)
3140 Perl_croak(aTHX_ "substr outside of string");
3141 if (ckWARN(WARN_SUBSTR))
3142 Perl_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3149 sv_pos_u2b(sv, &pos, &rem);
3151 sv_setpvn(TARG, tmps, rem);
3152 #ifdef USE_LOCALE_COLLATE
3153 sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3158 SV* repl_sv_copy = NULL;
3160 if (repl_need_utf8_upgrade) {
3161 repl_sv_copy = newSVsv(repl_sv);
3162 sv_utf8_upgrade(repl_sv_copy);
3163 repl = SvPV(repl_sv_copy, repl_len);
3164 repl_is_utf8 = DO_UTF8(repl_sv_copy) && SvCUR(sv);
3166 sv_insert(sv, pos, rem, repl, repl_len);
3170 SvREFCNT_dec(repl_sv_copy);
3172 else if (lvalue) { /* it's an lvalue! */
3173 if (!SvGMAGICAL(sv)) {
3177 if (ckWARN(WARN_SUBSTR))
3178 Perl_warner(aTHX_ packWARN(WARN_SUBSTR),
3179 "Attempt to use reference as lvalue in substr");
3181 if (SvOK(sv)) /* is it defined ? */
3182 (void)SvPOK_only_UTF8(sv);
3184 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
3187 if (SvREFCNT(TARG) > 1) /* don't share the TARG (#20933) */
3188 TARG = sv_newmortal();
3189 if (SvTYPE(TARG) < SVt_PVLV) {
3190 sv_upgrade(TARG, SVt_PVLV);
3191 sv_magic(TARG, Nullsv, PERL_MAGIC_substr, Nullch, 0);
3195 if (LvTARG(TARG) != sv) {
3197 SvREFCNT_dec(LvTARG(TARG));
3198 LvTARG(TARG) = SvREFCNT_inc(sv);
3200 LvTARGOFF(TARG) = upos;
3201 LvTARGLEN(TARG) = urem;
3205 PUSHs(TARG); /* avoid SvSETMAGIC here */
3212 register IV size = POPi;
3213 register IV offset = POPi;
3214 register SV *src = POPs;
3215 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3217 SvTAINTED_off(TARG); /* decontaminate */
3218 if (lvalue) { /* it's an lvalue! */
3219 if (SvREFCNT(TARG) > 1) /* don't share the TARG (#20933) */
3220 TARG = sv_newmortal();
3221 if (SvTYPE(TARG) < SVt_PVLV) {
3222 sv_upgrade(TARG, SVt_PVLV);
3223 sv_magic(TARG, Nullsv, PERL_MAGIC_vec, Nullch, 0);
3226 if (LvTARG(TARG) != src) {
3228 SvREFCNT_dec(LvTARG(TARG));
3229 LvTARG(TARG) = SvREFCNT_inc(src);
3231 LvTARGOFF(TARG) = offset;
3232 LvTARGLEN(TARG) = size;
3235 sv_setuv(TARG, do_vecget(src, offset, size));
3250 I32 arybase = PL_curcop->cop_arybase;
3255 offset = POPi - arybase;
3258 tmps = SvPV(big, biglen);
3259 if (offset > 0 && DO_UTF8(big))
3260 sv_pos_u2b(big, &offset, 0);
3263 else if (offset > (I32)biglen)
3265 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
3266 (unsigned char*)tmps + biglen, little, 0)))
3269 retval = tmps2 - tmps;
3270 if (retval > 0 && DO_UTF8(big))
3271 sv_pos_b2u(big, &retval);
3272 PUSHi(retval + arybase);
3287 I32 arybase = PL_curcop->cop_arybase;
3293 tmps2 = SvPV(little, llen);
3294 tmps = SvPV(big, blen);
3298 if (offset > 0 && DO_UTF8(big))
3299 sv_pos_u2b(big, &offset, 0);
3300 offset = offset - arybase + llen;
3304 else if (offset > (I32)blen)
3306 if (!(tmps2 = rninstr(tmps, tmps + offset,
3307 tmps2, tmps2 + llen)))
3310 retval = tmps2 - tmps;
3311 if (retval > 0 && DO_UTF8(big))
3312 sv_pos_b2u(big, &retval);
3313 PUSHi(retval + arybase);
3319 dSP; dMARK; dORIGMARK; dTARGET;
3320 do_sprintf(TARG, SP-MARK, MARK+1);
3321 TAINT_IF(SvTAINTED(TARG));
3322 if (DO_UTF8(*(MARK+1)))
3334 U8 *s = (U8*)SvPVx(argsv, len);
3337 if (PL_encoding && SvPOK(argsv) && !DO_UTF8(argsv)) {
3338 tmpsv = sv_2mortal(newSVsv(argsv));
3339 s = (U8*)sv_recode_to_utf8(tmpsv, PL_encoding);
3343 XPUSHu(DO_UTF8(argsv) ?
3344 utf8n_to_uvchr(s, UTF8_MAXLEN, 0, UTF8_ALLOW_ANYUV) :
3356 (void)SvUPGRADE(TARG,SVt_PV);
3358 if (value > 255 && !IN_BYTES) {
3359 SvGROW(TARG, (STRLEN)UNISKIP(value)+1);
3360 tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3361 SvCUR_set(TARG, tmps - SvPVX(TARG));
3363 (void)SvPOK_only(TARG);
3372 *tmps++ = (char)value;
3374 (void)SvPOK_only(TARG);
3375 if (PL_encoding && !IN_BYTES) {
3376 sv_recode_to_utf8(TARG, PL_encoding);
3378 if (SvCUR(TARG) == 0 || !is_utf8_string((U8*)tmps, SvCUR(TARG)) ||
3379 memEQ(tmps, "\xef\xbf\xbd\0", 4)) {
3383 *tmps++ = (U8)UTF8_EIGHT_BIT_HI(value);
3384 *tmps++ = (U8)UTF8_EIGHT_BIT_LO(value);
3400 char *tmps = SvPV(left, len);
3402 if (DO_UTF8(left)) {
3403 /* If Unicode, try to downgrade.
3404 * If not possible, croak.
3405 * Yes, we made this up. */
3406 SV* tsv = sv_2mortal(newSVsv(left));
3409 sv_utf8_downgrade(tsv, FALSE);
3412 # ifdef USE_ITHREADS
3414 if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3415 /* This should be threadsafe because in ithreads there is only
3416 * one thread per interpreter. If this would not be true,
3417 * we would need a mutex to protect this malloc. */
3418 PL_reentrant_buffer->_crypt_struct_buffer =
3419 (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3420 #if defined(__GLIBC__) || defined(__EMX__)
3421 if (PL_reentrant_buffer->_crypt_struct_buffer) {
3422 PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3423 /* work around glibc-2.2.5 bug */
3424 PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3428 # endif /* HAS_CRYPT_R */
3429 # endif /* USE_ITHREADS */
3431 sv_setpv(TARG, fcrypt(tmps, SvPV(right, n_a)));
3433 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV(right, n_a)));
3439 "The crypt() function is unimplemented due to excessive paranoia.");
3452 (s = (U8*)SvPV_nomg(sv, slen)) && slen &&
3453 UTF8_IS_START(*s)) {
3454 U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3458 utf8_to_uvchr(s, &ulen);
3459 toTITLE_utf8(s, tmpbuf, &tculen);
3460 utf8_to_uvchr(tmpbuf, 0);
3462 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3464 /* slen is the byte length of the whole SV.
3465 * ulen is the byte length of the original Unicode character
3466 * stored as UTF-8 at s.
3467 * tculen is the byte length of the freshly titlecased
3468 * Unicode character stored as UTF-8 at tmpbuf.
3469 * We first set the result to be the titlecased character,
3470 * and then append the rest of the SV data. */
3471 sv_setpvn(TARG, (char*)tmpbuf, tculen);
3473 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3478 s = (U8*)SvPV_force_nomg(sv, slen);
3479 Copy(tmpbuf, s, tculen, U8);
3483 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3485 SvUTF8_off(TARG); /* decontaminate */
3486 sv_setsv_nomg(TARG, sv);
3490 s = (U8*)SvPV_force_nomg(sv, slen);
3492 if (IN_LOCALE_RUNTIME) {
3495 *s = toUPPER_LC(*s);
3514 (s = (U8*)SvPV_nomg(sv, slen)) && slen &&
3515 UTF8_IS_START(*s)) {
3517 U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3521 toLOWER_utf8(s, tmpbuf, &ulen);
3522 uv = utf8_to_uvchr(tmpbuf, 0);
3523 tend = uvchr_to_utf8(tmpbuf, uv);
3525 if (!SvPADTMP(sv) || (STRLEN)(tend - tmpbuf) != ulen || SvREADONLY(sv)) {
3527 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
3529 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3534 s = (U8*)SvPV_force_nomg(sv, slen);
3535 Copy(tmpbuf, s, ulen, U8);
3539 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3541 SvUTF8_off(TARG); /* decontaminate */
3542 sv_setsv_nomg(TARG, sv);
3546 s = (U8*)SvPV_force_nomg(sv, slen);
3548 if (IN_LOCALE_RUNTIME) {
3551 *s = toLOWER_LC(*s);
3574 U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3576 s = (U8*)SvPV_nomg(sv,len);
3578 SvUTF8_off(TARG); /* decontaminate */
3579 sv_setpvn(TARG, "", 0);
3583 STRLEN nchar = utf8_length(s, s + len);
3585 (void)SvUPGRADE(TARG, SVt_PV);
3586 SvGROW(TARG, (nchar * UTF8_MAXLEN_UCLC) + 1);
3587 (void)SvPOK_only(TARG);
3588 d = (U8*)SvPVX(TARG);
3591 toUPPER_utf8(s, tmpbuf, &ulen);
3592 Copy(tmpbuf, d, ulen, U8);
3598 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
3603 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3605 SvUTF8_off(TARG); /* decontaminate */
3606 sv_setsv_nomg(TARG, sv);
3610 s = (U8*)SvPV_force_nomg(sv, len);
3612 register U8 *send = s + len;
3614 if (IN_LOCALE_RUNTIME) {
3617 for (; s < send; s++)
3618 *s = toUPPER_LC(*s);
3621 for (; s < send; s++)
3643 U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3645 s = (U8*)SvPV_nomg(sv,len);
3647 SvUTF8_off(TARG); /* decontaminate */
3648 sv_setpvn(TARG, "", 0);
3652 STRLEN nchar = utf8_length(s, s + len);
3654 (void)SvUPGRADE(TARG, SVt_PV);
3655 SvGROW(TARG, (nchar * UTF8_MAXLEN_UCLC) + 1);
3656 (void)SvPOK_only(TARG);
3657 d = (U8*)SvPVX(TARG);
3660 UV uv = toLOWER_utf8(s, tmpbuf, &ulen);
3661 #define GREEK_CAPITAL_LETTER_SIGMA 0x03A3 /* Unicode */
3662 if (uv == GREEK_CAPITAL_LETTER_SIGMA) {
3664 * Now if the sigma is NOT followed by
3665 * /$ignorable_sequence$cased_letter/;
3666 * and it IS preceded by
3667 * /$cased_letter$ignorable_sequence/;
3668 * where $ignorable_sequence is
3669 * [\x{2010}\x{AD}\p{Mn}]*
3670 * and $cased_letter is
3671 * [\p{Ll}\p{Lo}\p{Lt}]
3672 * then it should be mapped to 0x03C2,
3673 * (GREEK SMALL LETTER FINAL SIGMA),
3674 * instead of staying 0x03A3.
3675 * See lib/unicore/SpecCase.txt.
3678 Copy(tmpbuf, d, ulen, U8);
3684 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
3689 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3691 SvUTF8_off(TARG); /* decontaminate */
3692 sv_setsv_nomg(TARG, sv);
3697 s = (U8*)SvPV_force_nomg(sv, len);
3699 register U8 *send = s + len;
3701 if (IN_LOCALE_RUNTIME) {
3704 for (; s < send; s++)
3705 *s = toLOWER_LC(*s);
3708 for (; s < send; s++)
3722 register char *s = SvPV(sv,len);
3725 SvUTF8_off(TARG); /* decontaminate */
3727 (void)SvUPGRADE(TARG, SVt_PV);
3728 SvGROW(TARG, (len * 2) + 1);
3732 if (UTF8_IS_CONTINUED(*s)) {
3733 STRLEN ulen = UTF8SKIP(s);
3757 SvCUR_set(TARG, d - SvPVX(TARG));
3758 (void)SvPOK_only_UTF8(TARG);
3761 sv_setpvn(TARG, s, len);
3763 if (SvSMAGICAL(TARG))
3772 dSP; dMARK; dORIGMARK;
3774 register AV* av = (AV*)POPs;
3775 register I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3776 I32 arybase = PL_curcop->cop_arybase;
3779 if (SvTYPE(av) == SVt_PVAV) {
3780 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
3782 for (svp = MARK + 1; svp <= SP; svp++) {
3787 if (max > AvMAX(av))
3790 while (++MARK <= SP) {
3791 elem = SvIVx(*MARK);
3795 svp = av_fetch(av, elem, lval);
3797 if (!svp || *svp == &PL_sv_undef)
3798 DIE(aTHX_ PL_no_aelem, elem);
3799 if (PL_op->op_private & OPpLVAL_INTRO)
3800 save_aelem(av, elem, svp);
3802 *MARK = svp ? *svp : &PL_sv_undef;
3805 if (GIMME != G_ARRAY) {
3813 /* Associative arrays. */
3818 HV *hash = (HV*)POPs;
3820 I32 gimme = GIMME_V;
3823 /* might clobber stack_sp */
3824 entry = hv_iternext(hash);
3829 SV* sv = hv_iterkeysv(entry);
3830 PUSHs(sv); /* won't clobber stack_sp */
3831 if (gimme == G_ARRAY) {
3834 /* might clobber stack_sp */
3835 val = hv_iterval(hash, entry);
3840 else if (gimme == G_SCALAR)
3859 I32 gimme = GIMME_V;
3860 I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
3864 if (PL_op->op_private & OPpSLICE) {
3868 hvtype = SvTYPE(hv);
3869 if (hvtype == SVt_PVHV) { /* hash element */
3870 while (++MARK <= SP) {
3871 sv = hv_delete_ent(hv, *MARK, discard, 0);
3872 *MARK = sv ? sv : &PL_sv_undef;
3875 else if (hvtype == SVt_PVAV) { /* array element */
3876 if (PL_op->op_flags & OPf_SPECIAL) {
3877 while (++MARK <= SP) {
3878 sv = av_delete((AV*)hv, SvIV(*MARK), discard);
3879 *MARK = sv ? sv : &PL_sv_undef;
3884 DIE(aTHX_ "Not a HASH reference");
3887 else if (gimme == G_SCALAR) {
3896 if (SvTYPE(hv) == SVt_PVHV)
3897 sv = hv_delete_ent(hv, keysv, discard, 0);
3898 else if (SvTYPE(hv) == SVt_PVAV) {
3899 if (PL_op->op_flags & OPf_SPECIAL)
3900 sv = av_delete((AV*)hv, SvIV(keysv), discard);
3902 DIE(aTHX_ "panic: avhv_delete no longer supported");
3905 DIE(aTHX_ "Not a HASH reference");
3920 if (PL_op->op_private & OPpEXISTS_SUB) {
3924 cv = sv_2cv(sv, &hv, &gv, FALSE);
3927 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
3933 if (SvTYPE(hv) == SVt_PVHV) {
3934 if (hv_exists_ent(hv, tmpsv, 0))
3937 else if (SvTYPE(hv) == SVt_PVAV) {
3938 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
3939 if (av_exists((AV*)hv, SvIV(tmpsv)))
3944 DIE(aTHX_ "Not a HASH reference");
3951 dSP; dMARK; dORIGMARK;
3952 register HV *hv = (HV*)POPs;
3953 register I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3954 bool localizing = PL_op->op_private & OPpLVAL_INTRO ? TRUE : FALSE;
3955 bool other_magic = FALSE;
3961 other_magic = mg_find((SV*)hv, PERL_MAGIC_env) ||
3962 ((mg = mg_find((SV*)hv, PERL_MAGIC_tied))
3963 /* Try to preserve the existenceness of a tied hash
3964 * element by using EXISTS and DELETE if possible.
3965 * Fallback to FETCH and STORE otherwise */
3966 && (stash = SvSTASH(SvRV(SvTIED_obj((SV*)hv, mg))))
3967 && gv_fetchmethod_autoload(stash, "EXISTS", TRUE)
3968 && gv_fetchmethod_autoload(stash, "DELETE", TRUE));
3971 while (++MARK <= SP) {
3975 bool preeminent = FALSE;
3978 preeminent = SvRMAGICAL(hv) && !other_magic ? 1 :
3979 hv_exists_ent(hv, keysv, 0);
3982 he = hv_fetch_ent(hv, keysv, lval, 0);
3983 svp = he ? &HeVAL(he) : 0;
3986 if (!svp || *svp == &PL_sv_undef) {
3988 DIE(aTHX_ PL_no_helem, SvPV(keysv, n_a));
3992 save_helem(hv, keysv, svp);
3995 char *key = SvPV(keysv, keylen);
3996 SAVEDELETE(hv, savepvn(key,keylen), keylen);
4000 *MARK = svp ? *svp : &PL_sv_undef;
4002 if (GIMME != G_ARRAY) {
4010 /* List operators. */
4015 if (GIMME != G_ARRAY) {
4017 *MARK = *SP; /* unwanted list, return last item */
4019 *MARK = &PL_sv_undef;
4028 SV **lastrelem = PL_stack_sp;
4029 SV **lastlelem = PL_stack_base + POPMARK;
4030 SV **firstlelem = PL_stack_base + POPMARK + 1;
4031 register SV **firstrelem = lastlelem + 1;
4032 I32 arybase = PL_curcop->cop_arybase;
4033 I32 lval = PL_op->op_flags & OPf_MOD;
4034 I32 is_something_there = lval;
4036 register I32 max = lastrelem - lastlelem;
4037 register SV **lelem;
4040 if (GIMME != G_ARRAY) {
4041 ix = SvIVx(*lastlelem);
4046 if (ix < 0 || ix >= max)
4047 *firstlelem = &PL_sv_undef;
4049 *firstlelem = firstrelem[ix];
4055 SP = firstlelem - 1;
4059 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
4065 if (ix < 0 || ix >= max)
4066 *lelem = &PL_sv_undef;
4068 is_something_there = TRUE;
4069 if (!(*lelem = firstrelem[ix]))
4070 *lelem = &PL_sv_undef;
4073 if (is_something_there)
4076 SP = firstlelem - 1;
4082 dSP; dMARK; dORIGMARK;
4083 I32 items = SP - MARK;
4084 SV *av = sv_2mortal((SV*)av_make(items, MARK+1));
4085 SP = ORIGMARK; /* av_make() might realloc stack_sp */
4092 dSP; dMARK; dORIGMARK;
4093 HV* hv = (HV*)sv_2mortal((SV*)newHV());
4097 SV *val = NEWSV(46, 0);
4099 sv_setsv(val, *++MARK);
4100 else if (ckWARN(WARN_MISC))
4101 Perl_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
4102 (void)hv_store_ent(hv,key,val,0);
4111 dSP; dMARK; dORIGMARK;
4112 register AV *ary = (AV*)*++MARK;
4116 register I32 offset;
4117 register I32 length;
4124 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4125 *MARK-- = SvTIED_obj((SV*)ary, mg);
4129 call_method("SPLICE",GIMME_V);
4138 offset = i = SvIVx(*MARK);
4140 offset += AvFILLp(ary) + 1;
4142 offset -= PL_curcop->cop_arybase;
4144 DIE(aTHX_ PL_no_aelem, i);
4146 length = SvIVx(*MARK++);
4148 length += AvFILLp(ary) - offset + 1;
4154 length = AvMAX(ary) + 1; /* close enough to infinity */
4158 length = AvMAX(ary) + 1;
4160 if (offset > AvFILLp(ary) + 1) {
4161 if (ckWARN(WARN_MISC))
4162 Perl_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
4163 offset = AvFILLp(ary) + 1;
4165 after = AvFILLp(ary) + 1 - (offset + length);
4166 if (after < 0) { /* not that much array */
4167 length += after; /* offset+length now in array */
4173 /* At this point, MARK .. SP-1 is our new LIST */
4176 diff = newlen - length;
4177 if (newlen && !AvREAL(ary) && AvREIFY(ary))
4180 if (diff < 0) { /* shrinking the area */
4182 New(451, tmparyval, newlen, SV*); /* so remember insertion */
4183 Copy(MARK, tmparyval, newlen, SV*);
4186 MARK = ORIGMARK + 1;
4187 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4188 MEXTEND(MARK, length);
4189 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
4191 EXTEND_MORTAL(length);
4192 for (i = length, dst = MARK; i; i--) {
4193 sv_2mortal(*dst); /* free them eventualy */
4200 *MARK = AvARRAY(ary)[offset+length-1];
4203 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
4204 SvREFCNT_dec(*dst++); /* free them now */
4207 AvFILLp(ary) += diff;
4209 /* pull up or down? */
4211 if (offset < after) { /* easier to pull up */
4212 if (offset) { /* esp. if nothing to pull */
4213 src = &AvARRAY(ary)[offset-1];
4214 dst = src - diff; /* diff is negative */
4215 for (i = offset; i > 0; i--) /* can't trust Copy */
4219 SvPVX(ary) = (char*)(AvARRAY(ary) - diff); /* diff is negative */
4223 if (after) { /* anything to pull down? */
4224 src = AvARRAY(ary) + offset + length;
4225 dst = src + diff; /* diff is negative */
4226 Move(src, dst, after, SV*);
4228 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
4229 /* avoid later double free */
4233 dst[--i] = &PL_sv_undef;
4236 for (src = tmparyval, dst = AvARRAY(ary) + offset;
4238 *dst = NEWSV(46, 0);
4239 sv_setsv(*dst++, *src++);
4241 Safefree(tmparyval);
4244 else { /* no, expanding (or same) */
4246 New(452, tmparyval, length, SV*); /* so remember deletion */
4247 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
4250 if (diff > 0) { /* expanding */
4252 /* push up or down? */
4254 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
4258 Move(src, dst, offset, SV*);
4260 SvPVX(ary) = (char*)(AvARRAY(ary) - diff);/* diff is positive */
4262 AvFILLp(ary) += diff;
4265 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
4266 av_extend(ary, AvFILLp(ary) + diff);
4267 AvFILLp(ary) += diff;
4270 dst = AvARRAY(ary) + AvFILLp(ary);
4272 for (i = after; i; i--) {
4279 for (src = MARK, dst = AvARRAY(ary) + offset; newlen; newlen--) {
4280 *dst = NEWSV(46, 0);
4281 sv_setsv(*dst++, *src++);
4283 MARK = ORIGMARK + 1;
4284 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4286 Copy(tmparyval, MARK, length, SV*);
4288 EXTEND_MORTAL(length);
4289 for (i = length, dst = MARK; i; i--) {
4290 sv_2mortal(*dst); /* free them eventualy */
4294 Safefree(tmparyval);
4298 else if (length--) {
4299 *MARK = tmparyval[length];
4302 while (length-- > 0)
4303 SvREFCNT_dec(tmparyval[length]);
4305 Safefree(tmparyval);
4308 *MARK = &PL_sv_undef;
4316 dSP; dMARK; dORIGMARK; dTARGET;
4317 register AV *ary = (AV*)*++MARK;
4318 register SV *sv = &PL_sv_undef;
4321 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4322 *MARK-- = SvTIED_obj((SV*)ary, mg);
4326 call_method("PUSH",G_SCALAR|G_DISCARD);
4331 /* Why no pre-extend of ary here ? */
4332 for (++MARK; MARK <= SP; MARK++) {
4335 sv_setsv(sv, *MARK);
4340 PUSHi( AvFILL(ary) + 1 );
4348 SV *sv = av_pop(av);
4350 (void)sv_2mortal(sv);
4359 SV *sv = av_shift(av);
4364 (void)sv_2mortal(sv);
4371 dSP; dMARK; dORIGMARK; dTARGET;
4372 register AV *ary = (AV*)*++MARK;
4377 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4378 *MARK-- = SvTIED_obj((SV*)ary, mg);
4382 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
4387 av_unshift(ary, SP - MARK);
4390 sv_setsv(sv, *++MARK);
4391 (void)av_store(ary, i++, sv);
4395 PUSHi( AvFILL(ary) + 1 );
4405 if (GIMME == G_ARRAY) {
4412 /* safe as long as stack cannot get extended in the above */
4417 register char *down;
4422 SvUTF8_off(TARG); /* decontaminate */
4424 do_join(TARG, &PL_sv_no, MARK, SP);
4426 sv_setsv(TARG, (SP > MARK) ? *SP : DEFSV);
4427 up = SvPV_force(TARG, len);
4429 if (DO_UTF8(TARG)) { /* first reverse each character */
4430 U8* s = (U8*)SvPVX(TARG);
4431 U8* send = (U8*)(s + len);
4433 if (UTF8_IS_INVARIANT(*s)) {
4438 if (!utf8_to_uvchr(s, 0))
4442 down = (char*)(s - 1);
4443 /* reverse this character */
4447 *down-- = (char)tmp;
4453 down = SvPVX(TARG) + len - 1;
4457 *down-- = (char)tmp;
4459 (void)SvPOK_only_UTF8(TARG);
4471 register IV limit = POPi; /* note, negative is forever */
4474 register char *s = SvPV(sv, len);
4475 bool do_utf8 = DO_UTF8(sv);
4476 char *strend = s + len;
4478 register REGEXP *rx;
4482 STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (strend - s);
4483 I32 maxiters = slen + 10;
4486 I32 origlimit = limit;
4489 AV *oldstack = PL_curstack;
4490 I32 gimme = GIMME_V;
4491 I32 oldsave = PL_savestack_ix;
4492 I32 make_mortal = 1;
4493 MAGIC *mg = (MAGIC *) NULL;
4496 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4501 DIE(aTHX_ "panic: pp_split");
4504 TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
4505 (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
4507 RX_MATCH_UTF8_set(rx, do_utf8);
4509 if (pm->op_pmreplroot) {
4511 ary = GvAVn((GV*)PAD_SVl(INT2PTR(PADOFFSET, pm->op_pmreplroot)));
4513 ary = GvAVn((GV*)pm->op_pmreplroot);
4516 else if (gimme != G_ARRAY)
4517 ary = GvAVn(PL_defgv);
4520 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4526 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4528 XPUSHs(SvTIED_obj((SV*)ary, mg));
4534 for (i = AvFILLp(ary); i >= 0; i--)
4535 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
4537 /* temporarily switch stacks */
4538 SWITCHSTACK(PL_curstack, ary);
4539 PL_curstackinfo->si_stack = ary;
4543 base = SP - PL_stack_base;
4545 if (pm->op_pmflags & PMf_SKIPWHITE) {
4546 if (pm->op_pmflags & PMf_LOCALE) {
4547 while (isSPACE_LC(*s))
4555 if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
4556 SAVEINT(PL_multiline);
4557 PL_multiline = pm->op_pmflags & PMf_MULTILINE;
4561 limit = maxiters + 2;
4562 if (pm->op_pmflags & PMf_WHITE) {
4565 while (m < strend &&
4566 !((pm->op_pmflags & PMf_LOCALE)
4567 ? isSPACE_LC(*m) : isSPACE(*m)))
4572 dstr = NEWSV(30, m-s);
4573 sv_setpvn(dstr, s, m-s);
4577 (void)SvUTF8_on(dstr);
4581 while (s < strend &&
4582 ((pm->op_pmflags & PMf_LOCALE)
4583 ? isSPACE_LC(*s) : isSPACE(*s)))
4587 else if (strEQ("^", rx->precomp)) {
4590 for (m = s; m < strend && *m != '\n'; m++) ;
4594 dstr = NEWSV(30, m-s);
4595 sv_setpvn(dstr, s, m-s);
4599 (void)SvUTF8_on(dstr);
4604 else if (do_utf8 == ((rx->reganch & ROPT_UTF8) != 0) &&
4605 (rx->reganch & RE_USE_INTUIT) && !rx->nparens
4606 && (rx->reganch & ROPT_CHECK_ALL)
4607 && !(rx->reganch & ROPT_ANCH)) {
4608 int tail = (rx->reganch & RE_INTUIT_TAIL);
4609 SV *csv = CALLREG_INTUIT_STRING(aTHX_ rx);
4612 if (len == 1 && !(rx->reganch & ROPT_UTF8) && !tail) {
4614 char c = *SvPV(csv, n_a);
4617 for (m = s; m < strend && *m != c; m++) ;
4620 dstr = NEWSV(30, m-s);
4621 sv_setpvn(dstr, s, m-s);
4625 (void)SvUTF8_on(dstr);
4627 /* The rx->minlen is in characters but we want to step
4628 * s ahead by bytes. */
4630 s = (char*)utf8_hop((U8*)m, len);
4632 s = m + len; /* Fake \n at the end */
4637 while (s < strend && --limit &&
4638 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
4639 csv, PL_multiline ? FBMrf_MULTILINE : 0)) )
4642 dstr = NEWSV(31, m-s);
4643 sv_setpvn(dstr, s, m-s);
4647 (void)SvUTF8_on(dstr);
4649 /* The rx->minlen is in characters but we want to step
4650 * s ahead by bytes. */
4652 s = (char*)utf8_hop((U8*)m, len);
4654 s = m + len; /* Fake \n at the end */
4659 maxiters += slen * rx->nparens;
4660 while (s < strend && --limit
4661 /* && (!rx->check_substr
4662 || ((s = CALLREG_INTUIT_START(aTHX_ rx, sv, s, strend,
4664 */ && CALLREGEXEC(aTHX_ rx, s, strend, orig,
4665 1 /* minend */, sv, NULL, 0))
4667 TAINT_IF(RX_MATCH_TAINTED(rx));
4668 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
4673 strend = s + (strend - m);
4675 m = rx->startp[0] + orig;
4676 dstr = NEWSV(32, m-s);
4677 sv_setpvn(dstr, s, m-s);
4681 (void)SvUTF8_on(dstr);
4684 for (i = 1; i <= (I32)rx->nparens; i++) {
4685 s = rx->startp[i] + orig;
4686 m = rx->endp[i] + orig;
4688 /* japhy (07/27/01) -- the (m && s) test doesn't catch
4689 parens that didn't match -- they should be set to
4690 undef, not the empty string */
4691 if (m >= orig && s >= orig) {
4692 dstr = NEWSV(33, m-s);
4693 sv_setpvn(dstr, s, m-s);
4696 dstr = &PL_sv_undef; /* undef, not "" */
4700 (void)SvUTF8_on(dstr);
4704 s = rx->endp[0] + orig;
4709 LEAVE_SCOPE(oldsave);
4710 iters = (SP - PL_stack_base) - base;
4711 if (iters > maxiters)
4712 DIE(aTHX_ "Split loop");
4714 /* keep field after final delim? */
4715 if (s < strend || (iters && origlimit)) {
4716 STRLEN l = strend - s;
4717 dstr = NEWSV(34, l);
4718 sv_setpvn(dstr, s, l);
4722 (void)SvUTF8_on(dstr);
4726 else if (!origlimit) {
4727 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
4728 if (TOPs && !make_mortal)
4737 SWITCHSTACK(ary, oldstack);
4738 PL_curstackinfo->si_stack = oldstack;
4739 if (SvSMAGICAL(ary)) {
4744 if (gimme == G_ARRAY) {
4746 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4754 call_method("PUSH",G_SCALAR|G_DISCARD);
4757 if (gimme == G_ARRAY) {
4758 /* EXTEND should not be needed - we just popped them */
4760 for (i=0; i < iters; i++) {
4761 SV **svp = av_fetch(ary, i, FALSE);
4762 PUSHs((svp) ? *svp : &PL_sv_undef);
4769 if (gimme == G_ARRAY)
4784 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
4785 || SvTYPE(retsv) == SVt_PVCV) {
4786 retsv = refto(retsv);
4794 DIE(aTHX_ "tried to access per-thread data in non-threaded perl");