3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 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 = Perl_hv_scalar(aTHX_ (HV*)TARG);
117 DIE(aTHX_ "NOT IMPL LINE %d",__LINE__);
128 tryAMAGICunDEREF(to_gv);
131 if (SvTYPE(sv) == SVt_PVIO) {
132 GV *gv = (GV*) sv_newmortal();
133 gv_init(gv, 0, "", 0, 0);
134 GvIOp(gv) = (IO *)sv;
135 (void)SvREFCNT_inc(sv);
138 else if (SvTYPE(sv) != SVt_PVGV)
139 DIE(aTHX_ "Not a GLOB reference");
142 if (SvTYPE(sv) != SVt_PVGV) {
146 if (SvGMAGICAL(sv)) {
151 if (!SvOK(sv) && sv != &PL_sv_undef) {
152 /* If this is a 'my' scalar and flag is set then vivify
155 if (PL_op->op_private & OPpDEREF) {
158 if (cUNOP->op_targ) {
160 SV *namesv = PAD_SV(cUNOP->op_targ);
161 name = SvPV(namesv, len);
162 gv = (GV*)NEWSV(0,0);
163 gv_init(gv, CopSTASH(PL_curcop), name, len, 0);
166 name = CopSTASHPV(PL_curcop);
169 if (SvTYPE(sv) < SVt_RV)
170 sv_upgrade(sv, SVt_RV);
176 if (PL_op->op_flags & OPf_REF ||
177 PL_op->op_private & HINT_STRICT_REFS)
178 DIE(aTHX_ PL_no_usym, "a symbol");
179 if (ckWARN(WARN_UNINITIALIZED))
184 if ((PL_op->op_flags & OPf_SPECIAL) &&
185 !(PL_op->op_flags & OPf_MOD))
187 sv = (SV*)gv_fetchpv(sym, FALSE, SVt_PVGV);
189 && (!is_gv_magical(sym,len,0)
190 || !(sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV))))
196 if (PL_op->op_private & HINT_STRICT_REFS)
197 DIE(aTHX_ PL_no_symref, sym, "a symbol");
198 sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV);
202 if (PL_op->op_private & OPpLVAL_INTRO)
203 save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
215 tryAMAGICunDEREF(to_sv);
218 switch (SvTYPE(sv)) {
222 DIE(aTHX_ "Not a SCALAR reference");
230 if (SvTYPE(gv) != SVt_PVGV) {
231 if (SvGMAGICAL(sv)) {
237 if (PL_op->op_flags & OPf_REF ||
238 PL_op->op_private & HINT_STRICT_REFS)
239 DIE(aTHX_ PL_no_usym, "a SCALAR");
240 if (ckWARN(WARN_UNINITIALIZED))
245 if ((PL_op->op_flags & OPf_SPECIAL) &&
246 !(PL_op->op_flags & OPf_MOD))
248 gv = (GV*)gv_fetchpv(sym, FALSE, SVt_PV);
250 && (!is_gv_magical(sym,len,0)
251 || !(gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV))))
257 if (PL_op->op_private & HINT_STRICT_REFS)
258 DIE(aTHX_ PL_no_symref, sym, "a SCALAR");
259 gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV);
264 if (PL_op->op_flags & OPf_MOD) {
265 if (PL_op->op_private & OPpLVAL_INTRO) {
266 if (cUNOP->op_first->op_type == OP_NULL)
267 sv = save_scalar((GV*)TOPs);
269 sv = save_scalar(gv);
271 Perl_croak(aTHX_ PL_no_localize_ref);
273 else if (PL_op->op_private & OPpDEREF)
274 vivify_ref(sv, PL_op->op_private & OPpDEREF);
284 SV *sv = AvARYLEN(av);
286 AvARYLEN(av) = sv = NEWSV(0,0);
287 sv_upgrade(sv, SVt_IV);
288 sv_magic(sv, (SV*)av, PERL_MAGIC_arylen, Nullch, 0);
296 dSP; dTARGET; dPOPss;
298 if (PL_op->op_flags & OPf_MOD || LVRET) {
299 if (SvTYPE(TARG) < SVt_PVLV) {
300 sv_upgrade(TARG, SVt_PVLV);
301 sv_magic(TARG, Nullsv, PERL_MAGIC_pos, Nullch, 0);
305 if (LvTARG(TARG) != sv) {
307 SvREFCNT_dec(LvTARG(TARG));
308 LvTARG(TARG) = SvREFCNT_inc(sv);
310 PUSHs(TARG); /* no SvSETMAGIC */
316 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
317 mg = mg_find(sv, PERL_MAGIC_regex_global);
318 if (mg && mg->mg_len >= 0) {
322 PUSHi(i + PL_curcop->cop_arybase);
336 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
337 /* (But not in defined().) */
338 CV *cv = sv_2cv(TOPs, &stash, &gv, !(PL_op->op_flags & OPf_SPECIAL));
341 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
342 if ((PL_op->op_private & OPpLVAL_INTRO)) {
343 if (gv && GvCV(gv) == cv && (gv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv), FALSE)))
346 DIE(aTHX_ "Can't modify non-lvalue subroutine call");
350 cv = (CV*)&PL_sv_undef;
364 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
365 char *s = SvPVX(TOPs);
366 if (strnEQ(s, "CORE::", 6)) {
369 code = keyword(s + 6, SvCUR(TOPs) - 6);
370 if (code < 0) { /* Overridable. */
371 #define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
372 int i = 0, n = 0, seen_question = 0;
374 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
376 if (code == -KEY_chop || code == -KEY_chomp)
378 while (i < MAXO) { /* The slow way. */
379 if (strEQ(s + 6, PL_op_name[i])
380 || strEQ(s + 6, PL_op_desc[i]))
386 goto nonesuch; /* Should not happen... */
388 oa = PL_opargs[i] >> OASHIFT;
390 if (oa & OA_OPTIONAL && !seen_question) {
394 else if (n && str[0] == ';' && seen_question)
395 goto set; /* XXXX system, exec */
396 if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
397 && (oa & (OA_OPTIONAL - 1)) <= OA_SCALARREF
398 /* But globs are already references (kinda) */
399 && (oa & (OA_OPTIONAL - 1)) != OA_FILEREF
403 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
407 ret = sv_2mortal(newSVpvn(str, n - 1));
409 else if (code) /* Non-Overridable */
411 else { /* None such */
413 DIE(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
417 cv = sv_2cv(TOPs, &stash, &gv, FALSE);
419 ret = sv_2mortal(newSVpvn(SvPVX(cv), SvCUR(cv)));
428 CV* cv = (CV*)PAD_SV(PL_op->op_targ);
430 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
446 if (GIMME != G_ARRAY) {
450 *MARK = &PL_sv_undef;
451 *MARK = refto(*MARK);
455 EXTEND_MORTAL(SP - MARK);
457 *MARK = refto(*MARK);
462 S_refto(pTHX_ SV *sv)
466 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
469 if (!(sv = LvTARG(sv)))
472 (void)SvREFCNT_inc(sv);
474 else if (SvTYPE(sv) == SVt_PVAV) {
475 if (!AvREAL((AV*)sv) && AvREIFY((AV*)sv))
478 (void)SvREFCNT_inc(sv);
480 else if (SvPADTMP(sv) && !IS_PADGV(sv))
484 (void)SvREFCNT_inc(sv);
487 sv_upgrade(rv, SVt_RV);
501 if (sv && SvGMAGICAL(sv))
504 if (!sv || !SvROK(sv))
508 pv = sv_reftype(sv,TRUE);
509 PUSHp(pv, strlen(pv));
519 stash = CopSTASH(PL_curcop);
525 if (ssv && !SvGMAGICAL(ssv) && !SvAMAGIC(ssv) && SvROK(ssv))
526 Perl_croak(aTHX_ "Attempt to bless into a reference");
528 if (ckWARN(WARN_MISC) && len == 0)
529 Perl_warner(aTHX_ packWARN(WARN_MISC),
530 "Explicit blessing to '' (assuming package main)");
531 stash = gv_stashpvn(ptr, len, TRUE);
534 (void)sv_bless(TOPs, stash);
548 elem = SvPV(sv, n_a);
552 switch (elem ? *elem : '\0')
555 if (strEQ(elem, "ARRAY"))
556 tmpRef = (SV*)GvAV(gv);
559 if (strEQ(elem, "CODE"))
560 tmpRef = (SV*)GvCVu(gv);
563 if (strEQ(elem, "FILEHANDLE")) {
564 /* finally deprecated in 5.8.0 */
565 deprecate("*glob{FILEHANDLE}");
566 tmpRef = (SV*)GvIOp(gv);
569 if (strEQ(elem, "FORMAT"))
570 tmpRef = (SV*)GvFORM(gv);
573 if (strEQ(elem, "GLOB"))
577 if (strEQ(elem, "HASH"))
578 tmpRef = (SV*)GvHV(gv);
581 if (strEQ(elem, "IO"))
582 tmpRef = (SV*)GvIOp(gv);
585 if (strEQ(elem, "NAME"))
586 sv = newSVpvn(GvNAME(gv), GvNAMELEN(gv));
589 if (strEQ(elem, "PACKAGE")) {
590 if (HvNAME(GvSTASH(gv)))
591 sv = newSVpv(HvNAME(GvSTASH(gv)), 0);
593 sv = newSVpv("__ANON__",0);
597 if (strEQ(elem, "SCALAR"))
611 /* Pattern matching */
616 register unsigned char *s;
619 register I32 *sfirst;
623 if (sv == PL_lastscream) {
629 SvSCREAM_off(PL_lastscream);
630 SvREFCNT_dec(PL_lastscream);
632 PL_lastscream = SvREFCNT_inc(sv);
635 s = (unsigned char*)(SvPV(sv, len));
639 if (pos > PL_maxscream) {
640 if (PL_maxscream < 0) {
641 PL_maxscream = pos + 80;
642 New(301, PL_screamfirst, 256, I32);
643 New(302, PL_screamnext, PL_maxscream, I32);
646 PL_maxscream = pos + pos / 4;
647 Renew(PL_screamnext, PL_maxscream, I32);
651 sfirst = PL_screamfirst;
652 snext = PL_screamnext;
654 if (!sfirst || !snext)
655 DIE(aTHX_ "do_study: out of memory");
657 for (ch = 256; ch; --ch)
664 snext[pos] = sfirst[ch] - pos;
671 /* piggyback on m//g magic */
672 sv_magic(sv, Nullsv, PERL_MAGIC_regex_global, Nullch, 0);
681 if (PL_op->op_flags & OPf_STACKED)
683 else if (PL_op->op_private & OPpTARGET_MY)
689 TARG = sv_newmortal();
694 /* Lvalue operators. */
706 dSP; dMARK; dTARGET; dORIGMARK;
708 do_chop(TARG, *++MARK);
717 SETi(do_chomp(TOPs));
724 register I32 count = 0;
727 count += do_chomp(POPs);
738 if (!sv || !SvANY(sv))
740 switch (SvTYPE(sv)) {
742 if (AvMAX(sv) >= 0 || SvGMAGICAL(sv)
743 || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
747 if (HvARRAY(sv) || SvGMAGICAL(sv)
748 || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
752 if (CvROOT(sv) || CvXSUB(sv))
769 if (!PL_op->op_private) {
778 SV_CHECK_THINKFIRST_COW_DROP(sv);
780 switch (SvTYPE(sv)) {
790 if (ckWARN(WARN_MISC) && cv_const_sv((CV*)sv))
791 Perl_warner(aTHX_ packWARN(WARN_MISC), "Constant subroutine %s undefined",
792 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
796 /* let user-undef'd sub keep its identity */
797 GV* gv = CvGV((CV*)sv);
804 SvSetMagicSV(sv, &PL_sv_undef);
808 Newz(602, gp, 1, GP);
809 GvGP(sv) = gp_ref(gp);
810 GvSV(sv) = NEWSV(72,0);
811 GvLINE(sv) = CopLINE(PL_curcop);
817 if (SvTYPE(sv) >= SVt_PV && SvPVX(sv) && SvLEN(sv)) {
820 SvPV_set(sv, Nullch);
833 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
834 DIE(aTHX_ PL_no_modify);
835 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
836 && SvIVX(TOPs) != IV_MIN)
839 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
850 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
851 DIE(aTHX_ PL_no_modify);
852 sv_setsv(TARG, TOPs);
853 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
854 && SvIVX(TOPs) != IV_MAX)
857 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
862 /* special case for undef: see thread at 2003-03/msg00536.html in archive */
872 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
873 DIE(aTHX_ PL_no_modify);
874 sv_setsv(TARG, TOPs);
875 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
876 && SvIVX(TOPs) != IV_MIN)
879 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
888 /* Ordinary operators. */
893 #ifdef PERL_PRESERVE_IVUV
896 tryAMAGICbin(pow,opASSIGN);
897 #ifdef PERL_PRESERVE_IVUV
898 /* For integer to integer power, we do the calculation by hand wherever
899 we're sure it is safe; otherwise we call pow() and try to convert to
900 integer afterwards. */
904 bool baseuok = SvUOK(TOPm1s);
908 baseuv = SvUVX(TOPm1s);
910 IV iv = SvIVX(TOPm1s);
913 baseuok = TRUE; /* effectively it's a UV now */
915 baseuv = -iv; /* abs, baseuok == false records sign */
929 goto float_it; /* Can't do negative powers this way. */
932 /* now we have integer ** positive integer. */
935 /* foo & (foo - 1) is zero only for a power of 2. */
936 if (!(baseuv & (baseuv - 1))) {
937 /* We are raising power-of-2 to a positive integer.
938 The logic here will work for any base (even non-integer
939 bases) but it can be less accurate than
940 pow (base,power) or exp (power * log (base)) when the
941 intermediate values start to spill out of the mantissa.
942 With powers of 2 we know this can't happen.
943 And powers of 2 are the favourite thing for perl
944 programmers to notice ** not doing what they mean. */
946 NV base = baseuok ? baseuv : -(NV)baseuv;
949 for (; power; base *= base, n++) {
950 /* Do I look like I trust gcc with long longs here?
952 UV bit = (UV)1 << (UV)n;
955 /* Only bother to clear the bit if it is set. */
957 /* Avoid squaring base again if we're done. */
958 if (power == 0) break;
966 register unsigned int highbit = 8 * sizeof(UV);
967 register unsigned int lowbit = 0;
968 register unsigned int diff;
969 bool odd_power = (bool)(power & 1);
970 while ((diff = (highbit - lowbit) >> 1)) {
971 if (baseuv & ~((1 << (lowbit + diff)) - 1))
976 /* we now have baseuv < 2 ** highbit */
977 if (power * highbit <= 8 * sizeof(UV)) {
978 /* result will definitely fit in UV, so use UV math
979 on same algorithm as above */
980 register UV result = 1;
981 register UV base = baseuv;
983 for (; power; base *= base, n++) {
984 register UV bit = (UV)1 << (UV)n;
988 if (power == 0) break;
992 if (baseuok || !odd_power)
993 /* answer is positive */
995 else if (result <= (UV)IV_MAX)
996 /* answer negative, fits in IV */
998 else if (result == (UV)IV_MIN)
999 /* 2's complement assumption: special case IV_MIN */
1002 /* answer negative, doesn't fit */
1003 SETn( -(NV)result );
1014 SETn( Perl_pow( left, right) );
1015 #ifdef PERL_PRESERVE_IVUV
1025 dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
1026 #ifdef PERL_PRESERVE_IVUV
1029 /* Unless the left argument is integer in range we are going to have to
1030 use NV maths. Hence only attempt to coerce the right argument if
1031 we know the left is integer. */
1032 /* Left operand is defined, so is it IV? */
1033 SvIV_please(TOPm1s);
1034 if (SvIOK(TOPm1s)) {
1035 bool auvok = SvUOK(TOPm1s);
1036 bool buvok = SvUOK(TOPs);
1037 const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
1038 const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
1045 alow = SvUVX(TOPm1s);
1047 IV aiv = SvIVX(TOPm1s);
1050 auvok = TRUE; /* effectively it's a UV now */
1052 alow = -aiv; /* abs, auvok == false records sign */
1058 IV biv = SvIVX(TOPs);
1061 buvok = TRUE; /* effectively it's a UV now */
1063 blow = -biv; /* abs, buvok == false records sign */
1067 /* If this does sign extension on unsigned it's time for plan B */
1068 ahigh = alow >> (4 * sizeof (UV));
1070 bhigh = blow >> (4 * sizeof (UV));
1072 if (ahigh && bhigh) {
1073 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
1074 which is overflow. Drop to NVs below. */
1075 } else if (!ahigh && !bhigh) {
1076 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
1077 so the unsigned multiply cannot overflow. */
1078 UV product = alow * blow;
1079 if (auvok == buvok) {
1080 /* -ve * -ve or +ve * +ve gives a +ve result. */
1084 } else if (product <= (UV)IV_MIN) {
1085 /* 2s complement assumption that (UV)-IV_MIN is correct. */
1086 /* -ve result, which could overflow an IV */
1088 SETi( -(IV)product );
1090 } /* else drop to NVs below. */
1092 /* One operand is large, 1 small */
1095 /* swap the operands */
1097 bhigh = blow; /* bhigh now the temp var for the swap */
1101 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1102 multiplies can't overflow. shift can, add can, -ve can. */
1103 product_middle = ahigh * blow;
1104 if (!(product_middle & topmask)) {
1105 /* OK, (ahigh * blow) won't lose bits when we shift it. */
1107 product_middle <<= (4 * sizeof (UV));
1108 product_low = alow * blow;
1110 /* as for pp_add, UV + something mustn't get smaller.
1111 IIRC ANSI mandates this wrapping *behaviour* for
1112 unsigned whatever the actual representation*/
1113 product_low += product_middle;
1114 if (product_low >= product_middle) {
1115 /* didn't overflow */
1116 if (auvok == buvok) {
1117 /* -ve * -ve or +ve * +ve gives a +ve result. */
1119 SETu( product_low );
1121 } else if (product_low <= (UV)IV_MIN) {
1122 /* 2s complement assumption again */
1123 /* -ve result, which could overflow an IV */
1125 SETi( -(IV)product_low );
1127 } /* else drop to NVs below. */
1129 } /* product_middle too large */
1130 } /* ahigh && bhigh */
1131 } /* SvIOK(TOPm1s) */
1136 SETn( left * right );
1143 dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
1144 /* Only try to do UV divide first
1145 if ((SLOPPYDIVIDE is true) or
1146 (PERL_PRESERVE_IVUV is true and one or both SV is a UV too large
1148 The assumption is that it is better to use floating point divide
1149 whenever possible, only doing integer divide first if we can't be sure.
1150 If NV_PRESERVES_UV is true then we know at compile time that no UV
1151 can be too large to preserve, so don't need to compile the code to
1152 test the size of UVs. */
1155 # define PERL_TRY_UV_DIVIDE
1156 /* ensure that 20./5. == 4. */
1158 # ifdef PERL_PRESERVE_IVUV
1159 # ifndef NV_PRESERVES_UV
1160 # define PERL_TRY_UV_DIVIDE
1165 #ifdef PERL_TRY_UV_DIVIDE
1168 SvIV_please(TOPm1s);
1169 if (SvIOK(TOPm1s)) {
1170 bool left_non_neg = SvUOK(TOPm1s);
1171 bool right_non_neg = SvUOK(TOPs);
1175 if (right_non_neg) {
1176 right = SvUVX(TOPs);
1179 IV biv = SvIVX(TOPs);
1182 right_non_neg = TRUE; /* effectively it's a UV now */
1188 /* historically undef()/0 gives a "Use of uninitialized value"
1189 warning before dieing, hence this test goes here.
1190 If it were immediately before the second SvIV_please, then
1191 DIE() would be invoked before left was even inspected, so
1192 no inpsection would give no warning. */
1194 DIE(aTHX_ "Illegal division by zero");
1197 left = SvUVX(TOPm1s);
1200 IV aiv = SvIVX(TOPm1s);
1203 left_non_neg = TRUE; /* effectively it's a UV now */
1212 /* For sloppy divide we always attempt integer division. */
1214 /* Otherwise we only attempt it if either or both operands
1215 would not be preserved by an NV. If both fit in NVs
1216 we fall through to the NV divide code below. However,
1217 as left >= right to ensure integer result here, we know that
1218 we can skip the test on the right operand - right big
1219 enough not to be preserved can't get here unless left is
1222 && (left > ((UV)1 << NV_PRESERVES_UV_BITS))
1225 /* Integer division can't overflow, but it can be imprecise. */
1226 UV result = left / right;
1227 if (result * right == left) {
1228 SP--; /* result is valid */
1229 if (left_non_neg == right_non_neg) {
1230 /* signs identical, result is positive. */
1234 /* 2s complement assumption */
1235 if (result <= (UV)IV_MIN)
1236 SETi( -(IV)result );
1238 /* It's exact but too negative for IV. */
1239 SETn( -(NV)result );
1242 } /* tried integer divide but it was not an integer result */
1243 } /* else (PERL_ABS(result) < 1.0) or (both UVs in range for NV) */
1244 } /* left wasn't SvIOK */
1245 } /* right wasn't SvIOK */
1246 #endif /* PERL_TRY_UV_DIVIDE */
1250 DIE(aTHX_ "Illegal division by zero");
1251 PUSHn( left / right );
1258 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1262 bool left_neg = FALSE;
1263 bool right_neg = FALSE;
1264 bool use_double = FALSE;
1265 bool dright_valid = FALSE;
1271 right_neg = !SvUOK(TOPs);
1273 right = SvUVX(POPs);
1275 IV biv = SvIVX(POPs);
1278 right_neg = FALSE; /* effectively it's a UV now */
1286 right_neg = dright < 0;
1289 if (dright < UV_MAX_P1) {
1290 right = U_V(dright);
1291 dright_valid = TRUE; /* In case we need to use double below. */
1297 /* At this point use_double is only true if right is out of range for
1298 a UV. In range NV has been rounded down to nearest UV and
1299 use_double false. */
1301 if (!use_double && SvIOK(TOPs)) {
1303 left_neg = !SvUOK(TOPs);
1307 IV aiv = SvIVX(POPs);
1310 left_neg = FALSE; /* effectively it's a UV now */
1319 left_neg = dleft < 0;
1323 /* This should be exactly the 5.6 behaviour - if left and right are
1324 both in range for UV then use U_V() rather than floor. */
1326 if (dleft < UV_MAX_P1) {
1327 /* right was in range, so is dleft, so use UVs not double.
1331 /* left is out of range for UV, right was in range, so promote
1332 right (back) to double. */
1334 /* The +0.5 is used in 5.6 even though it is not strictly
1335 consistent with the implicit +0 floor in the U_V()
1336 inside the #if 1. */
1337 dleft = Perl_floor(dleft + 0.5);
1340 dright = Perl_floor(dright + 0.5);
1350 DIE(aTHX_ "Illegal modulus zero");
1352 dans = Perl_fmod(dleft, dright);
1353 if ((left_neg != right_neg) && dans)
1354 dans = dright - dans;
1357 sv_setnv(TARG, dans);
1363 DIE(aTHX_ "Illegal modulus zero");
1366 if ((left_neg != right_neg) && ans)
1369 /* XXX may warn: unary minus operator applied to unsigned type */
1370 /* could change -foo to be (~foo)+1 instead */
1371 if (ans <= ~((UV)IV_MAX)+1)
1372 sv_setiv(TARG, ~ans+1);
1374 sv_setnv(TARG, -(NV)ans);
1377 sv_setuv(TARG, ans);
1386 dSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
1388 register IV count = POPi;
1390 if (ckWARN(WARN_MISC))
1391 Perl_warner(aTHX_ packWARN(WARN_MISC), "Negative repeat count");
1394 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1396 I32 items = SP - MARK;
1398 static const char list_extend[] = "panic: list extend";
1400 max = items * count;
1401 MEM_WRAP_CHECK_1(max, SV*, list_extend);
1402 if (items > 0 && max > 0 && (max < items || max < count))
1403 Perl_croak(aTHX_ list_extend);
1408 /* This code was intended to fix 20010809.028:
1411 for (($x =~ /./g) x 2) {
1412 print chop; # "abcdabcd" expected as output.
1415 * but that change (#11635) broke this code:
1417 $x = [("foo")x2]; # only one "foo" ended up in the anonlist.
1419 * I can't think of a better fix that doesn't introduce
1420 * an efficiency hit by copying the SVs. The stack isn't
1421 * refcounted, and mortalisation obviously doesn't
1422 * Do The Right Thing when the stack has more than
1423 * one pointer to the same mortal value.
1427 *SP = sv_2mortal(newSVsv(*SP));
1437 repeatcpy((char*)(MARK + items), (char*)MARK,
1438 items * sizeof(SV*), count - 1);
1441 else if (count <= 0)
1444 else { /* Note: mark already snarfed by pp_list */
1449 SvSetSV(TARG, tmpstr);
1450 SvPV_force(TARG, len);
1451 isutf = DO_UTF8(TARG);
1456 MEM_WRAP_CHECK_1(count, len, "panic: string extend");
1457 SvGROW(TARG, (count * len) + 1);
1458 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1459 SvCUR(TARG) *= count;
1461 *SvEND(TARG) = '\0';
1464 (void)SvPOK_only_UTF8(TARG);
1466 (void)SvPOK_only(TARG);
1468 if (PL_op->op_private & OPpREPEAT_DOLIST) {
1469 /* The parser saw this as a list repeat, and there
1470 are probably several items on the stack. But we're
1471 in scalar context, and there's no pp_list to save us
1472 now. So drop the rest of the items -- robin@kitsite.com
1485 dSP; dATARGET; bool useleft; tryAMAGICbin(subtr,opASSIGN);
1486 useleft = USE_LEFT(TOPm1s);
1487 #ifdef PERL_PRESERVE_IVUV
1488 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1489 "bad things" happen if you rely on signed integers wrapping. */
1492 /* Unless the left argument is integer in range we are going to have to
1493 use NV maths. Hence only attempt to coerce the right argument if
1494 we know the left is integer. */
1495 register UV auv = 0;
1501 a_valid = auvok = 1;
1502 /* left operand is undef, treat as zero. */
1504 /* Left operand is defined, so is it IV? */
1505 SvIV_please(TOPm1s);
1506 if (SvIOK(TOPm1s)) {
1507 if ((auvok = SvUOK(TOPm1s)))
1508 auv = SvUVX(TOPm1s);
1510 register IV aiv = SvIVX(TOPm1s);
1513 auvok = 1; /* Now acting as a sign flag. */
1514 } else { /* 2s complement assumption for IV_MIN */
1522 bool result_good = 0;
1525 bool buvok = SvUOK(TOPs);
1530 register IV biv = SvIVX(TOPs);
1537 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1538 else "IV" now, independent of how it came in.
1539 if a, b represents positive, A, B negative, a maps to -A etc
1544 all UV maths. negate result if A negative.
1545 subtract if signs same, add if signs differ. */
1547 if (auvok ^ buvok) {
1556 /* Must get smaller */
1561 if (result <= buv) {
1562 /* result really should be -(auv-buv). as its negation
1563 of true value, need to swap our result flag */
1575 if (result <= (UV)IV_MIN)
1576 SETi( -(IV)result );
1578 /* result valid, but out of range for IV. */
1579 SETn( -(NV)result );
1583 } /* Overflow, drop through to NVs. */
1587 useleft = USE_LEFT(TOPm1s);
1591 /* left operand is undef, treat as zero - value */
1595 SETn( TOPn - value );
1602 dSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1605 if (PL_op->op_private & HINT_INTEGER) {
1619 dSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1622 if (PL_op->op_private & HINT_INTEGER) {
1636 dSP; tryAMAGICbinSET(lt,0);
1637 #ifdef PERL_PRESERVE_IVUV
1640 SvIV_please(TOPm1s);
1641 if (SvIOK(TOPm1s)) {
1642 bool auvok = SvUOK(TOPm1s);
1643 bool buvok = SvUOK(TOPs);
1645 if (!auvok && !buvok) { /* ## IV < IV ## */
1646 IV aiv = SvIVX(TOPm1s);
1647 IV biv = SvIVX(TOPs);
1650 SETs(boolSV(aiv < biv));
1653 if (auvok && buvok) { /* ## UV < UV ## */
1654 UV auv = SvUVX(TOPm1s);
1655 UV buv = SvUVX(TOPs);
1658 SETs(boolSV(auv < buv));
1661 if (auvok) { /* ## UV < IV ## */
1668 /* As (a) is a UV, it's >=0, so it cannot be < */
1673 SETs(boolSV(auv < (UV)biv));
1676 { /* ## IV < UV ## */
1680 aiv = SvIVX(TOPm1s);
1682 /* As (b) is a UV, it's >=0, so it must be < */
1689 SETs(boolSV((UV)aiv < buv));
1695 #ifndef NV_PRESERVES_UV
1696 #ifdef PERL_PRESERVE_IVUV
1699 if (SvROK(TOPs) && SvROK(TOPm1s)) {
1701 SETs(boolSV(SvRV(TOPs) < SvRV(TOPp1s)));
1707 SETs(boolSV(TOPn < value));
1714 dSP; tryAMAGICbinSET(gt,0);
1715 #ifdef PERL_PRESERVE_IVUV
1718 SvIV_please(TOPm1s);
1719 if (SvIOK(TOPm1s)) {
1720 bool auvok = SvUOK(TOPm1s);
1721 bool buvok = SvUOK(TOPs);
1723 if (!auvok && !buvok) { /* ## IV > IV ## */
1724 IV aiv = SvIVX(TOPm1s);
1725 IV biv = SvIVX(TOPs);
1728 SETs(boolSV(aiv > biv));
1731 if (auvok && buvok) { /* ## UV > UV ## */
1732 UV auv = SvUVX(TOPm1s);
1733 UV buv = SvUVX(TOPs);
1736 SETs(boolSV(auv > buv));
1739 if (auvok) { /* ## UV > IV ## */
1746 /* As (a) is a UV, it's >=0, so it must be > */
1751 SETs(boolSV(auv > (UV)biv));
1754 { /* ## IV > UV ## */
1758 aiv = SvIVX(TOPm1s);
1760 /* As (b) is a UV, it's >=0, so it cannot be > */
1767 SETs(boolSV((UV)aiv > buv));
1773 #ifndef NV_PRESERVES_UV
1774 #ifdef PERL_PRESERVE_IVUV
1777 if (SvROK(TOPs) && SvROK(TOPm1s)) {
1779 SETs(boolSV(SvRV(TOPs) > SvRV(TOPp1s)));
1785 SETs(boolSV(TOPn > value));
1792 dSP; tryAMAGICbinSET(le,0);
1793 #ifdef PERL_PRESERVE_IVUV
1796 SvIV_please(TOPm1s);
1797 if (SvIOK(TOPm1s)) {
1798 bool auvok = SvUOK(TOPm1s);
1799 bool buvok = SvUOK(TOPs);
1801 if (!auvok && !buvok) { /* ## IV <= IV ## */
1802 IV aiv = SvIVX(TOPm1s);
1803 IV biv = SvIVX(TOPs);
1806 SETs(boolSV(aiv <= biv));
1809 if (auvok && buvok) { /* ## UV <= UV ## */
1810 UV auv = SvUVX(TOPm1s);
1811 UV buv = SvUVX(TOPs);
1814 SETs(boolSV(auv <= buv));
1817 if (auvok) { /* ## UV <= IV ## */
1824 /* As (a) is a UV, it's >=0, so a cannot be <= */
1829 SETs(boolSV(auv <= (UV)biv));
1832 { /* ## IV <= UV ## */
1836 aiv = SvIVX(TOPm1s);
1838 /* As (b) is a UV, it's >=0, so a must be <= */
1845 SETs(boolSV((UV)aiv <= buv));
1851 #ifndef NV_PRESERVES_UV
1852 #ifdef PERL_PRESERVE_IVUV
1855 if (SvROK(TOPs) && SvROK(TOPm1s)) {
1857 SETs(boolSV(SvRV(TOPs) <= SvRV(TOPp1s)));
1863 SETs(boolSV(TOPn <= value));
1870 dSP; tryAMAGICbinSET(ge,0);
1871 #ifdef PERL_PRESERVE_IVUV
1874 SvIV_please(TOPm1s);
1875 if (SvIOK(TOPm1s)) {
1876 bool auvok = SvUOK(TOPm1s);
1877 bool buvok = SvUOK(TOPs);
1879 if (!auvok && !buvok) { /* ## IV >= IV ## */
1880 IV aiv = SvIVX(TOPm1s);
1881 IV biv = SvIVX(TOPs);
1884 SETs(boolSV(aiv >= biv));
1887 if (auvok && buvok) { /* ## UV >= UV ## */
1888 UV auv = SvUVX(TOPm1s);
1889 UV buv = SvUVX(TOPs);
1892 SETs(boolSV(auv >= buv));
1895 if (auvok) { /* ## UV >= IV ## */
1902 /* As (a) is a UV, it's >=0, so it must be >= */
1907 SETs(boolSV(auv >= (UV)biv));
1910 { /* ## IV >= UV ## */
1914 aiv = SvIVX(TOPm1s);
1916 /* As (b) is a UV, it's >=0, so a cannot be >= */
1923 SETs(boolSV((UV)aiv >= buv));
1929 #ifndef NV_PRESERVES_UV
1930 #ifdef PERL_PRESERVE_IVUV
1933 if (SvROK(TOPs) && SvROK(TOPm1s)) {
1935 SETs(boolSV(SvRV(TOPs) >= SvRV(TOPp1s)));
1941 SETs(boolSV(TOPn >= value));
1948 dSP; tryAMAGICbinSET(ne,0);
1949 #ifndef NV_PRESERVES_UV
1950 if (SvROK(TOPs) && SvROK(TOPm1s)) {
1952 SETs(boolSV(SvRV(TOPs) != SvRV(TOPp1s)));
1956 #ifdef PERL_PRESERVE_IVUV
1959 SvIV_please(TOPm1s);
1960 if (SvIOK(TOPm1s)) {
1961 bool auvok = SvUOK(TOPm1s);
1962 bool buvok = SvUOK(TOPs);
1964 if (auvok == buvok) { /* ## IV == IV or UV == UV ## */
1965 /* Casting IV to UV before comparison isn't going to matter
1966 on 2s complement. On 1s complement or sign&magnitude
1967 (if we have any of them) it could make negative zero
1968 differ from normal zero. As I understand it. (Need to
1969 check - is negative zero implementation defined behaviour
1971 UV buv = SvUVX(POPs);
1972 UV auv = SvUVX(TOPs);
1974 SETs(boolSV(auv != buv));
1977 { /* ## Mixed IV,UV ## */
1981 /* != is commutative so swap if needed (save code) */
1983 /* swap. top of stack (b) is the iv */
1987 /* As (a) is a UV, it's >0, so it cannot be == */
1996 /* As (b) is a UV, it's >0, so it cannot be == */
2000 uv = SvUVX(*(SP+1)); /* Do I want TOPp1s() ? */
2002 SETs(boolSV((UV)iv != uv));
2010 SETs(boolSV(TOPn != value));
2017 dSP; dTARGET; tryAMAGICbin(ncmp,0);
2018 #ifndef NV_PRESERVES_UV
2019 if (SvROK(TOPs) && SvROK(TOPm1s)) {
2020 UV right = PTR2UV(SvRV(POPs));
2021 UV left = PTR2UV(SvRV(TOPs));
2022 SETi((left > right) - (left < right));
2026 #ifdef PERL_PRESERVE_IVUV
2027 /* Fortunately it seems NaN isn't IOK */
2030 SvIV_please(TOPm1s);
2031 if (SvIOK(TOPm1s)) {
2032 bool leftuvok = SvUOK(TOPm1s);
2033 bool rightuvok = SvUOK(TOPs);
2035 if (!leftuvok && !rightuvok) { /* ## IV <=> IV ## */
2036 IV leftiv = SvIVX(TOPm1s);
2037 IV rightiv = SvIVX(TOPs);
2039 if (leftiv > rightiv)
2041 else if (leftiv < rightiv)
2045 } else if (leftuvok && rightuvok) { /* ## UV <=> UV ## */
2046 UV leftuv = SvUVX(TOPm1s);
2047 UV rightuv = SvUVX(TOPs);
2049 if (leftuv > rightuv)
2051 else if (leftuv < rightuv)
2055 } else if (leftuvok) { /* ## UV <=> IV ## */
2059 rightiv = SvIVX(TOPs);
2061 /* As (a) is a UV, it's >=0, so it cannot be < */
2064 leftuv = SvUVX(TOPm1s);
2065 if (leftuv > (UV)rightiv) {
2067 } else if (leftuv < (UV)rightiv) {
2073 } else { /* ## IV <=> UV ## */
2077 leftiv = SvIVX(TOPm1s);
2079 /* As (b) is a UV, it's >=0, so it must be < */
2082 rightuv = SvUVX(TOPs);
2083 if ((UV)leftiv > rightuv) {
2085 } else if ((UV)leftiv < rightuv) {
2103 if (Perl_isnan(left) || Perl_isnan(right)) {
2107 value = (left > right) - (left < right);
2111 else if (left < right)
2113 else if (left > right)
2127 dSP; tryAMAGICbinSET(slt,0);
2130 int cmp = (IN_LOCALE_RUNTIME
2131 ? sv_cmp_locale(left, right)
2132 : sv_cmp(left, right));
2133 SETs(boolSV(cmp < 0));
2140 dSP; tryAMAGICbinSET(sgt,0);
2143 int cmp = (IN_LOCALE_RUNTIME
2144 ? sv_cmp_locale(left, right)
2145 : sv_cmp(left, right));
2146 SETs(boolSV(cmp > 0));
2153 dSP; tryAMAGICbinSET(sle,0);
2156 int cmp = (IN_LOCALE_RUNTIME
2157 ? sv_cmp_locale(left, right)
2158 : sv_cmp(left, right));
2159 SETs(boolSV(cmp <= 0));
2166 dSP; tryAMAGICbinSET(sge,0);
2169 int cmp = (IN_LOCALE_RUNTIME
2170 ? sv_cmp_locale(left, right)
2171 : sv_cmp(left, right));
2172 SETs(boolSV(cmp >= 0));
2179 dSP; tryAMAGICbinSET(seq,0);
2182 SETs(boolSV(sv_eq(left, right)));
2189 dSP; tryAMAGICbinSET(sne,0);
2192 SETs(boolSV(!sv_eq(left, right)));
2199 dSP; dTARGET; tryAMAGICbin(scmp,0);
2202 int cmp = (IN_LOCALE_RUNTIME
2203 ? sv_cmp_locale(left, right)
2204 : sv_cmp(left, right));
2212 dSP; dATARGET; tryAMAGICbin(band,opASSIGN);
2215 if (SvGMAGICAL(left)) mg_get(left);
2216 if (SvGMAGICAL(right)) mg_get(right);
2217 if (SvNIOKp(left) || SvNIOKp(right)) {
2218 if (PL_op->op_private & HINT_INTEGER) {
2219 IV i = SvIV_nomg(left) & SvIV_nomg(right);
2223 UV u = SvUV_nomg(left) & SvUV_nomg(right);
2228 do_vop(PL_op->op_type, TARG, left, right);
2237 dSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
2240 if (SvGMAGICAL(left)) mg_get(left);
2241 if (SvGMAGICAL(right)) mg_get(right);
2242 if (SvNIOKp(left) || SvNIOKp(right)) {
2243 if (PL_op->op_private & HINT_INTEGER) {
2244 IV i = (USE_LEFT(left) ? SvIV_nomg(left) : 0) ^ SvIV_nomg(right);
2248 UV u = (USE_LEFT(left) ? SvUV_nomg(left) : 0) ^ SvUV_nomg(right);
2253 do_vop(PL_op->op_type, TARG, left, right);
2262 dSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
2265 if (SvGMAGICAL(left)) mg_get(left);
2266 if (SvGMAGICAL(right)) mg_get(right);
2267 if (SvNIOKp(left) || SvNIOKp(right)) {
2268 if (PL_op->op_private & HINT_INTEGER) {
2269 IV i = (USE_LEFT(left) ? SvIV_nomg(left) : 0) | SvIV_nomg(right);
2273 UV u = (USE_LEFT(left) ? SvUV_nomg(left) : 0) | SvUV_nomg(right);
2278 do_vop(PL_op->op_type, TARG, left, right);
2287 dSP; dTARGET; tryAMAGICun(neg);
2290 int flags = SvFLAGS(sv);
2293 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
2294 /* It's publicly an integer, or privately an integer-not-float */
2297 if (SvIVX(sv) == IV_MIN) {
2298 /* 2s complement assumption. */
2299 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
2302 else if (SvUVX(sv) <= IV_MAX) {
2307 else if (SvIVX(sv) != IV_MIN) {
2311 #ifdef PERL_PRESERVE_IVUV
2320 else if (SvPOKp(sv)) {
2322 char *s = SvPV(sv, len);
2323 if (isIDFIRST(*s)) {
2324 sv_setpvn(TARG, "-", 1);
2327 else if (*s == '+' || *s == '-') {
2329 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
2331 else if (DO_UTF8(sv)) {
2334 goto oops_its_an_int;
2336 sv_setnv(TARG, -SvNV(sv));
2338 sv_setpvn(TARG, "-", 1);
2345 goto oops_its_an_int;
2346 sv_setnv(TARG, -SvNV(sv));
2358 dSP; tryAMAGICunSET(not);
2359 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
2365 dSP; dTARGET; tryAMAGICun(compl);
2371 if (PL_op->op_private & HINT_INTEGER) {
2372 IV i = ~SvIV_nomg(sv);
2376 UV u = ~SvUV_nomg(sv);
2385 (void)SvPV_nomg(sv,len); /* force check for uninit var */
2386 sv_setsv_nomg(TARG, sv);
2387 tmps = (U8*)SvPV_force(TARG, len);
2390 /* Calculate exact length, let's not estimate. */
2399 while (tmps < send) {
2400 UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2401 tmps += UTF8SKIP(tmps);
2402 targlen += UNISKIP(~c);
2408 /* Now rewind strings and write them. */
2412 Newz(0, result, targlen + 1, U8);
2413 while (tmps < send) {
2414 UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2415 tmps += UTF8SKIP(tmps);
2416 result = uvchr_to_utf8_flags(result, ~c, UNICODE_ALLOW_ANY);
2420 sv_setpvn(TARG, (char*)result, targlen);
2424 Newz(0, result, nchar + 1, U8);
2425 while (tmps < send) {
2426 U8 c = (U8)utf8n_to_uvchr(tmps, 0, &l, UTF8_ALLOW_ANY);
2427 tmps += UTF8SKIP(tmps);
2432 sv_setpvn(TARG, (char*)result, nchar);
2441 register long *tmpl;
2442 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2445 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
2450 for ( ; anum > 0; anum--, tmps++)
2459 /* integer versions of some of the above */
2463 dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
2466 SETi( left * right );
2473 dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
2477 DIE(aTHX_ "Illegal division by zero");
2478 value = POPi / value;
2487 /* This is the vanilla old i_modulo. */
2488 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2492 DIE(aTHX_ "Illegal modulus zero");
2493 SETi( left % right );
2498 #if defined(__GLIBC__) && IVSIZE == 8
2502 /* This is the i_modulo with the workaround for the _moddi3 bug
2503 * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
2504 * See below for pp_i_modulo. */
2505 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2509 DIE(aTHX_ "Illegal modulus zero");
2510 SETi( left % PERL_ABS(right) );
2518 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2522 DIE(aTHX_ "Illegal modulus zero");
2523 /* The assumption is to use hereafter the old vanilla version... */
2525 PL_ppaddr[OP_I_MODULO] =
2526 &Perl_pp_i_modulo_0;
2527 /* .. but if we have glibc, we might have a buggy _moddi3
2528 * (at least glicb 2.2.5 is known to have this bug), in other
2529 * words our integer modulus with negative quad as the second
2530 * argument might be broken. Test for this and re-patch the
2531 * opcode dispatch table if that is the case, remembering to
2532 * also apply the workaround so that this first round works
2533 * right, too. See [perl #9402] for more information. */
2534 #if defined(__GLIBC__) && IVSIZE == 8
2538 /* Cannot do this check with inlined IV constants since
2539 * that seems to work correctly even with the buggy glibc. */
2541 /* Yikes, we have the bug.
2542 * Patch in the workaround version. */
2544 PL_ppaddr[OP_I_MODULO] =
2545 &Perl_pp_i_modulo_1;
2546 /* Make certain we work right this time, too. */
2547 right = PERL_ABS(right);
2551 SETi( left % right );
2558 dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
2561 SETi( left + right );
2568 dSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
2571 SETi( left - right );
2578 dSP; tryAMAGICbinSET(lt,0);
2581 SETs(boolSV(left < right));
2588 dSP; tryAMAGICbinSET(gt,0);
2591 SETs(boolSV(left > right));
2598 dSP; tryAMAGICbinSET(le,0);
2601 SETs(boolSV(left <= right));
2608 dSP; tryAMAGICbinSET(ge,0);
2611 SETs(boolSV(left >= right));
2618 dSP; tryAMAGICbinSET(eq,0);
2621 SETs(boolSV(left == right));
2628 dSP; tryAMAGICbinSET(ne,0);
2631 SETs(boolSV(left != right));
2638 dSP; dTARGET; tryAMAGICbin(ncmp,0);
2645 else if (left < right)
2656 dSP; dTARGET; tryAMAGICun(neg);
2661 /* High falutin' math. */
2665 dSP; dTARGET; tryAMAGICbin(atan2,0);
2668 SETn(Perl_atan2(left, right));
2675 dSP; dTARGET; tryAMAGICun(sin);
2679 value = Perl_sin(value);
2687 dSP; dTARGET; tryAMAGICun(cos);
2691 value = Perl_cos(value);
2697 /* Support Configure command-line overrides for rand() functions.
2698 After 5.005, perhaps we should replace this by Configure support
2699 for drand48(), random(), or rand(). For 5.005, though, maintain
2700 compatibility by calling rand() but allow the user to override it.
2701 See INSTALL for details. --Andy Dougherty 15 July 1998
2703 /* Now it's after 5.005, and Configure supports drand48() and random(),
2704 in addition to rand(). So the overrides should not be needed any more.
2705 --Jarkko Hietaniemi 27 September 1998
2708 #ifndef HAS_DRAND48_PROTO
2709 extern double drand48 (void);
2722 if (!PL_srand_called) {
2723 (void)seedDrand01((Rand_seed_t)seed());
2724 PL_srand_called = TRUE;
2739 (void)seedDrand01((Rand_seed_t)anum);
2740 PL_srand_called = TRUE;
2747 dSP; dTARGET; tryAMAGICun(exp);
2751 value = Perl_exp(value);
2759 dSP; dTARGET; tryAMAGICun(log);
2764 SET_NUMERIC_STANDARD();
2765 DIE(aTHX_ "Can't take log of %"NVgf, value);
2767 value = Perl_log(value);
2775 dSP; dTARGET; tryAMAGICun(sqrt);
2780 SET_NUMERIC_STANDARD();
2781 DIE(aTHX_ "Can't take sqrt of %"NVgf, value);
2783 value = Perl_sqrt(value);
2791 dSP; dTARGET; tryAMAGICun(int);
2794 IV iv = TOPi; /* attempt to convert to IV if possible. */
2795 /* XXX it's arguable that compiler casting to IV might be subtly
2796 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2797 else preferring IV has introduced a subtle behaviour change bug. OTOH
2798 relying on floating point to be accurate is a bug. */
2809 if (value < (NV)UV_MAX + 0.5) {
2812 SETn(Perl_floor(value));
2816 if (value > (NV)IV_MIN - 0.5) {
2819 SETn(Perl_ceil(value));
2829 dSP; dTARGET; tryAMAGICun(abs);
2831 /* This will cache the NV value if string isn't actually integer */
2835 /* IVX is precise */
2837 SETu(TOPu); /* force it to be numeric only */
2845 /* 2s complement assumption. Also, not really needed as
2846 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
2866 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2872 tmps = (SvPVx(sv, len));
2874 /* If Unicode, try to downgrade
2875 * If not possible, croak. */
2876 SV* tsv = sv_2mortal(newSVsv(sv));
2879 sv_utf8_downgrade(tsv, FALSE);
2882 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2883 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
2896 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2902 tmps = (SvPVx(sv, len));
2904 /* If Unicode, try to downgrade
2905 * If not possible, croak. */
2906 SV* tsv = sv_2mortal(newSVsv(sv));
2909 sv_utf8_downgrade(tsv, FALSE);
2912 while (*tmps && len && isSPACE(*tmps))
2917 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2918 else if (*tmps == 'b')
2919 result_uv = grok_bin (tmps, &len, &flags, &result_nv);
2921 result_uv = grok_oct (tmps, &len, &flags, &result_nv);
2923 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
2940 SETi(sv_len_utf8(sv));
2956 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
2958 I32 arybase = PL_curcop->cop_arybase;
2962 int num_args = PL_op->op_private & 7;
2963 bool repl_need_utf8_upgrade = FALSE;
2964 bool repl_is_utf8 = FALSE;
2966 SvTAINTED_off(TARG); /* decontaminate */
2967 SvUTF8_off(TARG); /* decontaminate */
2971 repl = SvPV(repl_sv, repl_len);
2972 repl_is_utf8 = DO_UTF8(repl_sv) && SvCUR(repl_sv);
2982 sv_utf8_upgrade(sv);
2984 else if (DO_UTF8(sv))
2985 repl_need_utf8_upgrade = TRUE;
2987 tmps = SvPV(sv, curlen);
2989 utf8_curlen = sv_len_utf8(sv);
2990 if (utf8_curlen == curlen)
2993 curlen = utf8_curlen;
2998 if (pos >= arybase) {
3016 else if (len >= 0) {
3018 if (rem > (I32)curlen)
3033 Perl_croak(aTHX_ "substr outside of string");
3034 if (ckWARN(WARN_SUBSTR))
3035 Perl_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3042 sv_pos_u2b(sv, &pos, &rem);
3044 sv_setpvn(TARG, tmps, rem);
3045 #ifdef USE_LOCALE_COLLATE
3046 sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3051 SV* repl_sv_copy = NULL;
3053 if (repl_need_utf8_upgrade) {
3054 repl_sv_copy = newSVsv(repl_sv);
3055 sv_utf8_upgrade(repl_sv_copy);
3056 repl = SvPV(repl_sv_copy, repl_len);
3057 repl_is_utf8 = DO_UTF8(repl_sv_copy) && SvCUR(sv);
3059 sv_insert(sv, pos, rem, repl, repl_len);
3063 SvREFCNT_dec(repl_sv_copy);
3065 else if (lvalue) { /* it's an lvalue! */
3066 if (!SvGMAGICAL(sv)) {
3070 if (ckWARN(WARN_SUBSTR))
3071 Perl_warner(aTHX_ packWARN(WARN_SUBSTR),
3072 "Attempt to use reference as lvalue in substr");
3074 if (SvOK(sv)) /* is it defined ? */
3075 (void)SvPOK_only_UTF8(sv);
3077 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
3080 if (SvREFCNT(TARG) > 1) /* don't share the TARG (#20933) */
3081 TARG = sv_newmortal();
3082 if (SvTYPE(TARG) < SVt_PVLV) {
3083 sv_upgrade(TARG, SVt_PVLV);
3084 sv_magic(TARG, Nullsv, PERL_MAGIC_substr, Nullch, 0);
3087 (void)SvOK_off(TARG);
3090 if (LvTARG(TARG) != sv) {
3092 SvREFCNT_dec(LvTARG(TARG));
3093 LvTARG(TARG) = SvREFCNT_inc(sv);
3095 LvTARGOFF(TARG) = upos;
3096 LvTARGLEN(TARG) = urem;
3100 PUSHs(TARG); /* avoid SvSETMAGIC here */
3107 register IV size = POPi;
3108 register IV offset = POPi;
3109 register SV *src = POPs;
3110 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3112 SvTAINTED_off(TARG); /* decontaminate */
3113 if (lvalue) { /* it's an lvalue! */
3114 if (SvREFCNT(TARG) > 1) /* don't share the TARG (#20933) */
3115 TARG = sv_newmortal();
3116 if (SvTYPE(TARG) < SVt_PVLV) {
3117 sv_upgrade(TARG, SVt_PVLV);
3118 sv_magic(TARG, Nullsv, PERL_MAGIC_vec, Nullch, 0);
3121 if (LvTARG(TARG) != src) {
3123 SvREFCNT_dec(LvTARG(TARG));
3124 LvTARG(TARG) = SvREFCNT_inc(src);
3126 LvTARGOFF(TARG) = offset;
3127 LvTARGLEN(TARG) = size;
3130 sv_setuv(TARG, do_vecget(src, offset, size));
3145 I32 arybase = PL_curcop->cop_arybase;
3150 offset = POPi - arybase;
3153 tmps = SvPV(big, biglen);
3154 if (offset > 0 && DO_UTF8(big))
3155 sv_pos_u2b(big, &offset, 0);
3158 else if (offset > (I32)biglen)
3160 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
3161 (unsigned char*)tmps + biglen, little, 0)))
3164 retval = tmps2 - tmps;
3165 if (retval > 0 && DO_UTF8(big))
3166 sv_pos_b2u(big, &retval);
3167 PUSHi(retval + arybase);
3182 I32 arybase = PL_curcop->cop_arybase;
3188 tmps2 = SvPV(little, llen);
3189 tmps = SvPV(big, blen);
3193 if (offset > 0 && DO_UTF8(big))
3194 sv_pos_u2b(big, &offset, 0);
3195 offset = offset - arybase + llen;
3199 else if (offset > (I32)blen)
3201 if (!(tmps2 = rninstr(tmps, tmps + offset,
3202 tmps2, tmps2 + llen)))
3205 retval = tmps2 - tmps;
3206 if (retval > 0 && DO_UTF8(big))
3207 sv_pos_b2u(big, &retval);
3208 PUSHi(retval + arybase);
3214 dSP; dMARK; dORIGMARK; dTARGET;
3215 do_sprintf(TARG, SP-MARK, MARK+1);
3216 TAINT_IF(SvTAINTED(TARG));
3217 if (DO_UTF8(*(MARK+1)))
3229 U8 *s = (U8*)SvPVx(argsv, len);
3232 if (PL_encoding && SvPOK(argsv) && !DO_UTF8(argsv)) {
3233 tmpsv = sv_2mortal(newSVsv(argsv));
3234 s = (U8*)sv_recode_to_utf8(tmpsv, PL_encoding);
3238 XPUSHu(DO_UTF8(argsv) ?
3239 utf8n_to_uvchr(s, UTF8_MAXLEN, 0, UTF8_ALLOW_ANYUV) :
3251 (void)SvUPGRADE(TARG,SVt_PV);
3253 if (value > 255 && !IN_BYTES) {
3254 SvGROW(TARG, (STRLEN)UNISKIP(value)+1);
3255 tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3256 SvCUR_set(TARG, tmps - SvPVX(TARG));
3258 (void)SvPOK_only(TARG);
3267 *tmps++ = (char)value;
3269 (void)SvPOK_only(TARG);
3270 if (PL_encoding && !IN_BYTES) {
3271 sv_recode_to_utf8(TARG, PL_encoding);
3273 if (SvCUR(TARG) == 0 || !is_utf8_string((U8*)tmps, SvCUR(TARG)) ||
3274 memEQ(tmps, "\xef\xbf\xbd\0", 4)) {
3278 *tmps++ = (U8)UTF8_EIGHT_BIT_HI(value);
3279 *tmps++ = (U8)UTF8_EIGHT_BIT_LO(value);
3295 char *tmps = SvPV(left, len);
3297 if (DO_UTF8(left)) {
3298 /* If Unicode, try to downgrade.
3299 * If not possible, croak.
3300 * Yes, we made this up. */
3301 SV* tsv = sv_2mortal(newSVsv(left));
3304 sv_utf8_downgrade(tsv, FALSE);
3307 # ifdef USE_ITHREADS
3309 if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3310 /* This should be threadsafe because in ithreads there is only
3311 * one thread per interpreter. If this would not be true,
3312 * we would need a mutex to protect this malloc. */
3313 PL_reentrant_buffer->_crypt_struct_buffer =
3314 (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3315 #if defined(__GLIBC__) || defined(__EMX__)
3316 if (PL_reentrant_buffer->_crypt_struct_buffer) {
3317 PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3318 /* work around glibc-2.2.5 bug */
3319 PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3323 # endif /* HAS_CRYPT_R */
3324 # endif /* USE_ITHREADS */
3326 sv_setpv(TARG, fcrypt(tmps, SvPV(right, n_a)));
3328 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV(right, n_a)));
3334 "The crypt() function is unimplemented due to excessive paranoia.");
3347 (s = (U8*)SvPV_nomg(sv, slen)) && slen &&
3348 UTF8_IS_START(*s)) {
3349 U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3353 utf8_to_uvchr(s, &ulen);
3354 toTITLE_utf8(s, tmpbuf, &tculen);
3355 utf8_to_uvchr(tmpbuf, 0);
3357 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3359 /* slen is the byte length of the whole SV.
3360 * ulen is the byte length of the original Unicode character
3361 * stored as UTF-8 at s.
3362 * tculen is the byte length of the freshly titlecased
3363 * Unicode character stored as UTF-8 at tmpbuf.
3364 * We first set the result to be the titlecased character,
3365 * and then append the rest of the SV data. */
3366 sv_setpvn(TARG, (char*)tmpbuf, tculen);
3368 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3373 s = (U8*)SvPV_force_nomg(sv, slen);
3374 Copy(tmpbuf, s, tculen, U8);
3378 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3380 SvUTF8_off(TARG); /* decontaminate */
3381 sv_setsv_nomg(TARG, sv);
3385 s = (U8*)SvPV_force_nomg(sv, slen);
3387 if (IN_LOCALE_RUNTIME) {
3390 *s = toUPPER_LC(*s);
3409 (s = (U8*)SvPV_nomg(sv, slen)) && slen &&
3410 UTF8_IS_START(*s)) {
3412 U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3416 toLOWER_utf8(s, tmpbuf, &ulen);
3417 uv = utf8_to_uvchr(tmpbuf, 0);
3418 tend = uvchr_to_utf8(tmpbuf, uv);
3420 if (!SvPADTMP(sv) || (STRLEN)(tend - tmpbuf) != ulen || SvREADONLY(sv)) {
3422 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
3424 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3429 s = (U8*)SvPV_force_nomg(sv, slen);
3430 Copy(tmpbuf, s, ulen, U8);
3434 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3436 SvUTF8_off(TARG); /* decontaminate */
3437 sv_setsv_nomg(TARG, sv);
3441 s = (U8*)SvPV_force_nomg(sv, slen);
3443 if (IN_LOCALE_RUNTIME) {
3446 *s = toLOWER_LC(*s);
3469 U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3471 s = (U8*)SvPV_nomg(sv,len);
3473 SvUTF8_off(TARG); /* decontaminate */
3474 sv_setpvn(TARG, "", 0);
3478 STRLEN nchar = utf8_length(s, s + len);
3480 (void)SvUPGRADE(TARG, SVt_PV);
3481 SvGROW(TARG, (nchar * UTF8_MAXLEN_UCLC) + 1);
3482 (void)SvPOK_only(TARG);
3483 d = (U8*)SvPVX(TARG);
3486 toUPPER_utf8(s, tmpbuf, &ulen);
3487 Copy(tmpbuf, d, ulen, U8);
3493 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
3498 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3500 SvUTF8_off(TARG); /* decontaminate */
3501 sv_setsv_nomg(TARG, sv);
3505 s = (U8*)SvPV_force_nomg(sv, len);
3507 register U8 *send = s + len;
3509 if (IN_LOCALE_RUNTIME) {
3512 for (; s < send; s++)
3513 *s = toUPPER_LC(*s);
3516 for (; s < send; s++)
3538 U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3540 s = (U8*)SvPV_nomg(sv,len);
3542 SvUTF8_off(TARG); /* decontaminate */
3543 sv_setpvn(TARG, "", 0);
3547 STRLEN nchar = utf8_length(s, s + len);
3549 (void)SvUPGRADE(TARG, SVt_PV);
3550 SvGROW(TARG, (nchar * UTF8_MAXLEN_UCLC) + 1);
3551 (void)SvPOK_only(TARG);
3552 d = (U8*)SvPVX(TARG);
3555 UV uv = toLOWER_utf8(s, tmpbuf, &ulen);
3556 #define GREEK_CAPITAL_LETTER_SIGMA 0x03A3 /* Unicode */
3557 if (uv == GREEK_CAPITAL_LETTER_SIGMA) {
3559 * Now if the sigma is NOT followed by
3560 * /$ignorable_sequence$cased_letter/;
3561 * and it IS preceded by
3562 * /$cased_letter$ignorable_sequence/;
3563 * where $ignorable_sequence is
3564 * [\x{2010}\x{AD}\p{Mn}]*
3565 * and $cased_letter is
3566 * [\p{Ll}\p{Lo}\p{Lt}]
3567 * then it should be mapped to 0x03C2,
3568 * (GREEK SMALL LETTER FINAL SIGMA),
3569 * instead of staying 0x03A3.
3570 * See lib/unicore/SpecCase.txt.
3573 Copy(tmpbuf, d, ulen, U8);
3579 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
3584 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3586 SvUTF8_off(TARG); /* decontaminate */
3587 sv_setsv_nomg(TARG, sv);
3592 s = (U8*)SvPV_force_nomg(sv, len);
3594 register U8 *send = s + len;
3596 if (IN_LOCALE_RUNTIME) {
3599 for (; s < send; s++)
3600 *s = toLOWER_LC(*s);
3603 for (; s < send; s++)
3617 register char *s = SvPV(sv,len);
3620 SvUTF8_off(TARG); /* decontaminate */
3622 (void)SvUPGRADE(TARG, SVt_PV);
3623 SvGROW(TARG, (len * 2) + 1);
3627 if (UTF8_IS_CONTINUED(*s)) {
3628 STRLEN ulen = UTF8SKIP(s);
3652 SvCUR_set(TARG, d - SvPVX(TARG));
3653 (void)SvPOK_only_UTF8(TARG);
3656 sv_setpvn(TARG, s, len);
3658 if (SvSMAGICAL(TARG))
3667 dSP; dMARK; dORIGMARK;
3669 register AV* av = (AV*)POPs;
3670 register I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3671 I32 arybase = PL_curcop->cop_arybase;
3674 if (SvTYPE(av) == SVt_PVAV) {
3675 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
3677 for (svp = MARK + 1; svp <= SP; svp++) {
3682 if (max > AvMAX(av))
3685 while (++MARK <= SP) {
3686 elem = SvIVx(*MARK);
3690 svp = av_fetch(av, elem, lval);
3692 if (!svp || *svp == &PL_sv_undef)
3693 DIE(aTHX_ PL_no_aelem, elem);
3694 if (PL_op->op_private & OPpLVAL_INTRO)
3695 save_aelem(av, elem, svp);
3697 *MARK = svp ? *svp : &PL_sv_undef;
3700 if (GIMME != G_ARRAY) {
3708 /* Associative arrays. */
3713 HV *hash = (HV*)POPs;
3715 I32 gimme = GIMME_V;
3718 /* might clobber stack_sp */
3719 entry = hv_iternext(hash);
3724 SV* sv = hv_iterkeysv(entry);
3725 PUSHs(sv); /* won't clobber stack_sp */
3726 if (gimme == G_ARRAY) {
3729 /* might clobber stack_sp */
3730 val = hv_iterval(hash, entry);
3735 else if (gimme == G_SCALAR)
3754 I32 gimme = GIMME_V;
3755 I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
3759 if (PL_op->op_private & OPpSLICE) {
3763 hvtype = SvTYPE(hv);
3764 if (hvtype == SVt_PVHV) { /* hash element */
3765 while (++MARK <= SP) {
3766 sv = hv_delete_ent(hv, *MARK, discard, 0);
3767 *MARK = sv ? sv : &PL_sv_undef;
3770 else if (hvtype == SVt_PVAV) { /* array element */
3771 if (PL_op->op_flags & OPf_SPECIAL) {
3772 while (++MARK <= SP) {
3773 sv = av_delete((AV*)hv, SvIV(*MARK), discard);
3774 *MARK = sv ? sv : &PL_sv_undef;
3779 DIE(aTHX_ "Not a HASH reference");
3782 else if (gimme == G_SCALAR) {
3791 if (SvTYPE(hv) == SVt_PVHV)
3792 sv = hv_delete_ent(hv, keysv, discard, 0);
3793 else if (SvTYPE(hv) == SVt_PVAV) {
3794 if (PL_op->op_flags & OPf_SPECIAL)
3795 sv = av_delete((AV*)hv, SvIV(keysv), discard);
3797 DIE(aTHX_ "panic: avhv_delete no longer supported");
3800 DIE(aTHX_ "Not a HASH reference");
3815 if (PL_op->op_private & OPpEXISTS_SUB) {
3819 cv = sv_2cv(sv, &hv, &gv, FALSE);
3822 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
3828 if (SvTYPE(hv) == SVt_PVHV) {
3829 if (hv_exists_ent(hv, tmpsv, 0))
3832 else if (SvTYPE(hv) == SVt_PVAV) {
3833 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
3834 if (av_exists((AV*)hv, SvIV(tmpsv)))
3839 DIE(aTHX_ "Not a HASH reference");
3846 dSP; dMARK; dORIGMARK;
3847 register HV *hv = (HV*)POPs;
3848 register I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3849 bool localizing = PL_op->op_private & OPpLVAL_INTRO ? TRUE : FALSE;
3850 bool other_magic = FALSE;
3856 other_magic = mg_find((SV*)hv, PERL_MAGIC_env) ||
3857 ((mg = mg_find((SV*)hv, PERL_MAGIC_tied))
3858 /* Try to preserve the existenceness of a tied hash
3859 * element by using EXISTS and DELETE if possible.
3860 * Fallback to FETCH and STORE otherwise */
3861 && (stash = SvSTASH(SvRV(SvTIED_obj((SV*)hv, mg))))
3862 && gv_fetchmethod_autoload(stash, "EXISTS", TRUE)
3863 && gv_fetchmethod_autoload(stash, "DELETE", TRUE));
3866 while (++MARK <= SP) {
3870 bool preeminent = FALSE;
3873 preeminent = SvRMAGICAL(hv) && !other_magic ? 1 :
3874 hv_exists_ent(hv, keysv, 0);
3877 he = hv_fetch_ent(hv, keysv, lval, 0);
3878 svp = he ? &HeVAL(he) : 0;
3881 if (!svp || *svp == &PL_sv_undef) {
3883 DIE(aTHX_ PL_no_helem, SvPV(keysv, n_a));
3887 save_helem(hv, keysv, svp);
3890 char *key = SvPV(keysv, keylen);
3891 SAVEDELETE(hv, savepvn(key,keylen), keylen);
3895 *MARK = svp ? *svp : &PL_sv_undef;
3897 if (GIMME != G_ARRAY) {
3905 /* List operators. */
3910 if (GIMME != G_ARRAY) {
3912 *MARK = *SP; /* unwanted list, return last item */
3914 *MARK = &PL_sv_undef;
3923 SV **lastrelem = PL_stack_sp;
3924 SV **lastlelem = PL_stack_base + POPMARK;
3925 SV **firstlelem = PL_stack_base + POPMARK + 1;
3926 register SV **firstrelem = lastlelem + 1;
3927 I32 arybase = PL_curcop->cop_arybase;
3928 I32 lval = PL_op->op_flags & OPf_MOD;
3929 I32 is_something_there = lval;
3931 register I32 max = lastrelem - lastlelem;
3932 register SV **lelem;
3935 if (GIMME != G_ARRAY) {
3936 ix = SvIVx(*lastlelem);
3941 if (ix < 0 || ix >= max)
3942 *firstlelem = &PL_sv_undef;
3944 *firstlelem = firstrelem[ix];
3950 SP = firstlelem - 1;
3954 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
3960 if (ix < 0 || ix >= max)
3961 *lelem = &PL_sv_undef;
3963 is_something_there = TRUE;
3964 if (!(*lelem = firstrelem[ix]))
3965 *lelem = &PL_sv_undef;
3968 if (is_something_there)
3971 SP = firstlelem - 1;
3977 dSP; dMARK; dORIGMARK;
3978 I32 items = SP - MARK;
3979 SV *av = sv_2mortal((SV*)av_make(items, MARK+1));
3980 SP = ORIGMARK; /* av_make() might realloc stack_sp */
3987 dSP; dMARK; dORIGMARK;
3988 HV* hv = (HV*)sv_2mortal((SV*)newHV());
3992 SV *val = NEWSV(46, 0);
3994 sv_setsv(val, *++MARK);
3995 else if (ckWARN(WARN_MISC))
3996 Perl_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
3997 (void)hv_store_ent(hv,key,val,0);
4006 dSP; dMARK; dORIGMARK;
4007 register AV *ary = (AV*)*++MARK;
4011 register I32 offset;
4012 register I32 length;
4019 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4020 *MARK-- = SvTIED_obj((SV*)ary, mg);
4024 call_method("SPLICE",GIMME_V);
4033 offset = i = SvIVx(*MARK);
4035 offset += AvFILLp(ary) + 1;
4037 offset -= PL_curcop->cop_arybase;
4039 DIE(aTHX_ PL_no_aelem, i);
4041 length = SvIVx(*MARK++);
4043 length += AvFILLp(ary) - offset + 1;
4049 length = AvMAX(ary) + 1; /* close enough to infinity */
4053 length = AvMAX(ary) + 1;
4055 if (offset > AvFILLp(ary) + 1) {
4056 if (ckWARN(WARN_MISC))
4057 Perl_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
4058 offset = AvFILLp(ary) + 1;
4060 after = AvFILLp(ary) + 1 - (offset + length);
4061 if (after < 0) { /* not that much array */
4062 length += after; /* offset+length now in array */
4068 /* At this point, MARK .. SP-1 is our new LIST */
4071 diff = newlen - length;
4072 if (newlen && !AvREAL(ary) && AvREIFY(ary))
4075 if (diff < 0) { /* shrinking the area */
4077 New(451, tmparyval, newlen, SV*); /* so remember insertion */
4078 Copy(MARK, tmparyval, newlen, SV*);
4081 MARK = ORIGMARK + 1;
4082 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4083 MEXTEND(MARK, length);
4084 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
4086 EXTEND_MORTAL(length);
4087 for (i = length, dst = MARK; i; i--) {
4088 sv_2mortal(*dst); /* free them eventualy */
4095 *MARK = AvARRAY(ary)[offset+length-1];
4098 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
4099 SvREFCNT_dec(*dst++); /* free them now */
4102 AvFILLp(ary) += diff;
4104 /* pull up or down? */
4106 if (offset < after) { /* easier to pull up */
4107 if (offset) { /* esp. if nothing to pull */
4108 src = &AvARRAY(ary)[offset-1];
4109 dst = src - diff; /* diff is negative */
4110 for (i = offset; i > 0; i--) /* can't trust Copy */
4114 SvPVX(ary) = (char*)(AvARRAY(ary) - diff); /* diff is negative */
4118 if (after) { /* anything to pull down? */
4119 src = AvARRAY(ary) + offset + length;
4120 dst = src + diff; /* diff is negative */
4121 Move(src, dst, after, SV*);
4123 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
4124 /* avoid later double free */
4128 dst[--i] = &PL_sv_undef;
4131 for (src = tmparyval, dst = AvARRAY(ary) + offset;
4133 *dst = NEWSV(46, 0);
4134 sv_setsv(*dst++, *src++);
4136 Safefree(tmparyval);
4139 else { /* no, expanding (or same) */
4141 New(452, tmparyval, length, SV*); /* so remember deletion */
4142 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
4145 if (diff > 0) { /* expanding */
4147 /* push up or down? */
4149 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
4153 Move(src, dst, offset, SV*);
4155 SvPVX(ary) = (char*)(AvARRAY(ary) - diff);/* diff is positive */
4157 AvFILLp(ary) += diff;
4160 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
4161 av_extend(ary, AvFILLp(ary) + diff);
4162 AvFILLp(ary) += diff;
4165 dst = AvARRAY(ary) + AvFILLp(ary);
4167 for (i = after; i; i--) {
4174 for (src = MARK, dst = AvARRAY(ary) + offset; newlen; newlen--) {
4175 *dst = NEWSV(46, 0);
4176 sv_setsv(*dst++, *src++);
4178 MARK = ORIGMARK + 1;
4179 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4181 Copy(tmparyval, MARK, length, SV*);
4183 EXTEND_MORTAL(length);
4184 for (i = length, dst = MARK; i; i--) {
4185 sv_2mortal(*dst); /* free them eventualy */
4189 Safefree(tmparyval);
4193 else if (length--) {
4194 *MARK = tmparyval[length];
4197 while (length-- > 0)
4198 SvREFCNT_dec(tmparyval[length]);
4200 Safefree(tmparyval);
4203 *MARK = &PL_sv_undef;
4211 dSP; dMARK; dORIGMARK; dTARGET;
4212 register AV *ary = (AV*)*++MARK;
4213 register SV *sv = &PL_sv_undef;
4216 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4217 *MARK-- = SvTIED_obj((SV*)ary, mg);
4221 call_method("PUSH",G_SCALAR|G_DISCARD);
4226 /* Why no pre-extend of ary here ? */
4227 for (++MARK; MARK <= SP; MARK++) {
4230 sv_setsv(sv, *MARK);
4235 PUSHi( AvFILL(ary) + 1 );
4243 SV *sv = av_pop(av);
4245 (void)sv_2mortal(sv);
4254 SV *sv = av_shift(av);
4259 (void)sv_2mortal(sv);
4266 dSP; dMARK; dORIGMARK; dTARGET;
4267 register AV *ary = (AV*)*++MARK;
4272 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4273 *MARK-- = SvTIED_obj((SV*)ary, mg);
4277 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
4282 av_unshift(ary, SP - MARK);
4285 sv_setsv(sv, *++MARK);
4286 (void)av_store(ary, i++, sv);
4290 PUSHi( AvFILL(ary) + 1 );
4300 if (GIMME == G_ARRAY) {
4307 /* safe as long as stack cannot get extended in the above */
4312 register char *down;
4317 SvUTF8_off(TARG); /* decontaminate */
4319 do_join(TARG, &PL_sv_no, MARK, SP);
4321 sv_setsv(TARG, (SP > MARK) ? *SP : DEFSV);
4322 up = SvPV_force(TARG, len);
4324 if (DO_UTF8(TARG)) { /* first reverse each character */
4325 U8* s = (U8*)SvPVX(TARG);
4326 U8* send = (U8*)(s + len);
4328 if (UTF8_IS_INVARIANT(*s)) {
4333 if (!utf8_to_uvchr(s, 0))
4337 down = (char*)(s - 1);
4338 /* reverse this character */
4342 *down-- = (char)tmp;
4348 down = SvPVX(TARG) + len - 1;
4352 *down-- = (char)tmp;
4354 (void)SvPOK_only_UTF8(TARG);
4366 register IV limit = POPi; /* note, negative is forever */
4369 register char *s = SvPV(sv, len);
4370 bool do_utf8 = DO_UTF8(sv);
4371 char *strend = s + len;
4373 register REGEXP *rx;
4377 STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (strend - s);
4378 I32 maxiters = slen + 10;
4381 I32 origlimit = limit;
4384 AV *oldstack = PL_curstack;
4385 I32 gimme = GIMME_V;
4386 I32 oldsave = PL_savestack_ix;
4387 I32 make_mortal = 1;
4388 MAGIC *mg = (MAGIC *) NULL;
4391 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4396 DIE(aTHX_ "panic: pp_split");
4399 TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
4400 (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
4402 RX_MATCH_UTF8_set(rx, do_utf8);
4404 if (pm->op_pmreplroot) {
4406 ary = GvAVn((GV*)PAD_SVl(INT2PTR(PADOFFSET, pm->op_pmreplroot)));
4408 ary = GvAVn((GV*)pm->op_pmreplroot);
4411 else if (gimme != G_ARRAY)
4412 ary = GvAVn(PL_defgv);
4415 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4421 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4423 XPUSHs(SvTIED_obj((SV*)ary, mg));
4429 for (i = AvFILLp(ary); i >= 0; i--)
4430 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
4432 /* temporarily switch stacks */
4433 SWITCHSTACK(PL_curstack, ary);
4434 PL_curstackinfo->si_stack = ary;
4438 base = SP - PL_stack_base;
4440 if (pm->op_pmflags & PMf_SKIPWHITE) {
4441 if (pm->op_pmflags & PMf_LOCALE) {
4442 while (isSPACE_LC(*s))
4450 if ((int)(pm->op_pmflags & PMf_MULTILINE) != PL_multiline) {
4451 SAVEINT(PL_multiline);
4452 PL_multiline = pm->op_pmflags & PMf_MULTILINE;
4456 limit = maxiters + 2;
4457 if (pm->op_pmflags & PMf_WHITE) {
4460 while (m < strend &&
4461 !((pm->op_pmflags & PMf_LOCALE)
4462 ? isSPACE_LC(*m) : isSPACE(*m)))
4467 dstr = NEWSV(30, m-s);
4468 sv_setpvn(dstr, s, m-s);
4472 (void)SvUTF8_on(dstr);
4476 while (s < strend &&
4477 ((pm->op_pmflags & PMf_LOCALE)
4478 ? isSPACE_LC(*s) : isSPACE(*s)))
4482 else if (strEQ("^", rx->precomp)) {
4485 for (m = s; m < strend && *m != '\n'; m++) ;
4489 dstr = NEWSV(30, m-s);
4490 sv_setpvn(dstr, s, m-s);
4494 (void)SvUTF8_on(dstr);
4499 else if (do_utf8 == ((rx->reganch & ROPT_UTF8) != 0) &&
4500 (rx->reganch & RE_USE_INTUIT) && !rx->nparens
4501 && (rx->reganch & ROPT_CHECK_ALL)
4502 && !(rx->reganch & ROPT_ANCH)) {
4503 int tail = (rx->reganch & RE_INTUIT_TAIL);
4504 SV *csv = CALLREG_INTUIT_STRING(aTHX_ rx);
4507 if (len == 1 && !(rx->reganch & ROPT_UTF8) && !tail) {
4509 char c = *SvPV(csv, n_a);
4512 for (m = s; m < strend && *m != c; m++) ;
4515 dstr = NEWSV(30, m-s);
4516 sv_setpvn(dstr, s, m-s);
4520 (void)SvUTF8_on(dstr);
4522 /* The rx->minlen is in characters but we want to step
4523 * s ahead by bytes. */
4525 s = (char*)utf8_hop((U8*)m, len);
4527 s = m + len; /* Fake \n at the end */
4532 while (s < strend && --limit &&
4533 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
4534 csv, PL_multiline ? FBMrf_MULTILINE : 0)) )
4537 dstr = NEWSV(31, m-s);
4538 sv_setpvn(dstr, s, m-s);
4542 (void)SvUTF8_on(dstr);
4544 /* The rx->minlen is in characters but we want to step
4545 * s ahead by bytes. */
4547 s = (char*)utf8_hop((U8*)m, len);
4549 s = m + len; /* Fake \n at the end */
4554 maxiters += slen * rx->nparens;
4555 while (s < strend && --limit)
4558 i = CALLREGEXEC(aTHX_ rx, s, strend, orig, 1 , sv, NULL, 0);
4562 TAINT_IF(RX_MATCH_TAINTED(rx));
4563 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
4568 strend = s + (strend - m);
4570 m = rx->startp[0] + orig;
4571 dstr = NEWSV(32, m-s);
4572 sv_setpvn(dstr, s, m-s);
4576 (void)SvUTF8_on(dstr);
4579 for (i = 1; i <= (I32)rx->nparens; i++) {
4580 s = rx->startp[i] + orig;
4581 m = rx->endp[i] + orig;
4583 /* japhy (07/27/01) -- the (m && s) test doesn't catch
4584 parens that didn't match -- they should be set to
4585 undef, not the empty string */
4586 if (m >= orig && s >= orig) {
4587 dstr = NEWSV(33, m-s);
4588 sv_setpvn(dstr, s, m-s);
4591 dstr = &PL_sv_undef; /* undef, not "" */
4595 (void)SvUTF8_on(dstr);
4599 s = rx->endp[0] + orig;
4603 LEAVE_SCOPE(oldsave);
4604 iters = (SP - PL_stack_base) - base;
4605 if (iters > maxiters)
4606 DIE(aTHX_ "Split loop");
4608 /* keep field after final delim? */
4609 if (s < strend || (iters && origlimit)) {
4610 STRLEN l = strend - s;
4611 dstr = NEWSV(34, l);
4612 sv_setpvn(dstr, s, l);
4616 (void)SvUTF8_on(dstr);
4620 else if (!origlimit) {
4621 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
4622 if (TOPs && !make_mortal)
4631 SWITCHSTACK(ary, oldstack);
4632 PL_curstackinfo->si_stack = oldstack;
4633 if (SvSMAGICAL(ary)) {
4638 if (gimme == G_ARRAY) {
4640 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4648 call_method("PUSH",G_SCALAR|G_DISCARD);
4651 if (gimme == G_ARRAY) {
4652 /* EXTEND should not be needed - we just popped them */
4654 for (i=0; i < iters; i++) {
4655 SV **svp = av_fetch(ary, i, FALSE);
4656 PUSHs((svp) ? *svp : &PL_sv_undef);
4663 if (gimme == G_ARRAY)
4678 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
4679 || SvTYPE(retsv) == SVt_PVCV) {
4680 retsv = refto(retsv);
4688 DIE(aTHX_ "tried to access per-thread data in non-threaded perl");