3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 2005, by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * "It's a big house this, and very peculiar. Always a bit more to discover,
13 * and no knowing what you'll find around a corner. And Elves, sir!" --Samwise
16 /* This file contains general pp ("push/pop") functions that execute the
17 * opcodes that make up a perl program. A typical pp function expects to
18 * find its arguments on the stack, and usually pushes its results onto
19 * the stack, hence the 'pp' terminology. Each OP structure contains
20 * a pointer to the relevant pp_foo() function.
30 /* XXX I can't imagine anyone who doesn't have this actually _needs_
31 it, since pid_t is an integral type.
34 #ifdef NEED_GETPID_PROTO
35 extern Pid_t getpid (void);
38 /* variations on pp_null */
43 if (GIMME_V == G_SCALAR)
59 if (PL_op->op_private & OPpLVAL_INTRO)
60 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
62 if (PL_op->op_flags & OPf_REF) {
66 if (GIMME == G_SCALAR)
67 Perl_croak(aTHX_ "Can't return array to lvalue scalar context");
72 if (gimme == G_ARRAY) {
73 I32 maxarg = AvFILL((AV*)TARG) + 1;
75 if (SvMAGICAL(TARG)) {
77 for (i=0; i < (U32)maxarg; i++) {
78 SV **svp = av_fetch((AV*)TARG, i, FALSE);
79 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
83 Copy(AvARRAY((AV*)TARG), SP+1, maxarg, SV*);
87 else if (gimme == G_SCALAR) {
88 SV* sv = sv_newmortal();
89 I32 maxarg = AvFILL((AV*)TARG) + 1;
102 if (PL_op->op_private & OPpLVAL_INTRO)
103 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
104 if (PL_op->op_flags & OPf_REF)
107 if (GIMME == G_SCALAR)
108 Perl_croak(aTHX_ "Can't return hash to lvalue scalar context");
112 if (gimme == G_ARRAY) {
115 else if (gimme == G_SCALAR) {
116 SV* sv = Perl_hv_scalar(aTHX_ (HV*)TARG);
124 DIE(aTHX_ "NOT IMPL LINE %d",__LINE__);
135 tryAMAGICunDEREF(to_gv);
138 if (SvTYPE(sv) == SVt_PVIO) {
139 GV *gv = (GV*) sv_newmortal();
140 gv_init(gv, 0, "", 0, 0);
141 GvIOp(gv) = (IO *)sv;
142 (void)SvREFCNT_inc(sv);
145 else if (SvTYPE(sv) != SVt_PVGV)
146 DIE(aTHX_ "Not a GLOB reference");
149 if (SvTYPE(sv) != SVt_PVGV) {
153 if (SvGMAGICAL(sv)) {
158 if (!SvOK(sv) && sv != &PL_sv_undef) {
159 /* If this is a 'my' scalar and flag is set then vivify
163 Perl_croak(aTHX_ PL_no_modify);
164 if (PL_op->op_private & OPpDEREF) {
167 if (cUNOP->op_targ) {
169 SV *namesv = PAD_SV(cUNOP->op_targ);
170 name = SvPV(namesv, len);
171 gv = (GV*)NEWSV(0,0);
172 gv_init(gv, CopSTASH(PL_curcop), name, len, 0);
175 name = CopSTASHPV(PL_curcop);
178 if (SvTYPE(sv) < SVt_RV)
179 sv_upgrade(sv, SVt_RV);
185 SvRV_set(sv, (SV*)gv);
190 if (PL_op->op_flags & OPf_REF ||
191 PL_op->op_private & HINT_STRICT_REFS)
192 DIE(aTHX_ PL_no_usym, "a symbol");
193 if (ckWARN(WARN_UNINITIALIZED))
198 if ((PL_op->op_flags & OPf_SPECIAL) &&
199 !(PL_op->op_flags & OPf_MOD))
201 sv = (SV*)gv_fetchpv(sym, FALSE, SVt_PVGV);
203 && (!is_gv_magical(sym,len,0)
204 || !(sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV))))
210 if (PL_op->op_private & HINT_STRICT_REFS)
211 DIE(aTHX_ PL_no_symref, sym, "a symbol");
212 sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV);
216 if (PL_op->op_private & OPpLVAL_INTRO)
217 save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
229 tryAMAGICunDEREF(to_sv);
232 switch (SvTYPE(sv)) {
236 DIE(aTHX_ "Not a SCALAR reference");
244 if (SvTYPE(gv) != SVt_PVGV) {
245 if (SvGMAGICAL(sv)) {
251 if (PL_op->op_flags & OPf_REF ||
252 PL_op->op_private & HINT_STRICT_REFS)
253 DIE(aTHX_ PL_no_usym, "a SCALAR");
254 if (ckWARN(WARN_UNINITIALIZED))
259 if ((PL_op->op_flags & OPf_SPECIAL) &&
260 !(PL_op->op_flags & OPf_MOD))
262 gv = (GV*)gv_fetchpv(sym, FALSE, SVt_PV);
264 && (!is_gv_magical(sym,len,0)
265 || !(gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV))))
271 if (PL_op->op_private & HINT_STRICT_REFS)
272 DIE(aTHX_ PL_no_symref, sym, "a SCALAR");
273 gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV);
278 if (PL_op->op_flags & OPf_MOD) {
279 if (PL_op->op_private & OPpLVAL_INTRO) {
280 if (cUNOP->op_first->op_type == OP_NULL)
281 sv = save_scalar((GV*)TOPs);
283 sv = save_scalar(gv);
285 Perl_croak(aTHX_ PL_no_localize_ref);
287 else if (PL_op->op_private & OPpDEREF)
288 vivify_ref(sv, PL_op->op_private & OPpDEREF);
298 SV *sv = AvARYLEN(av);
300 AvARYLEN(av) = sv = NEWSV(0,0);
301 sv_upgrade(sv, SVt_IV);
302 sv_magic(sv, (SV*)av, PERL_MAGIC_arylen, Nullch, 0);
310 dSP; dTARGET; dPOPss;
312 if (PL_op->op_flags & OPf_MOD || LVRET) {
313 if (SvTYPE(TARG) < SVt_PVLV) {
314 sv_upgrade(TARG, SVt_PVLV);
315 sv_magic(TARG, Nullsv, PERL_MAGIC_pos, Nullch, 0);
319 if (LvTARG(TARG) != sv) {
321 SvREFCNT_dec(LvTARG(TARG));
322 LvTARG(TARG) = SvREFCNT_inc(sv);
324 PUSHs(TARG); /* no SvSETMAGIC */
330 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
331 mg = mg_find(sv, PERL_MAGIC_regex_global);
332 if (mg && mg->mg_len >= 0) {
336 PUSHi(i + PL_curcop->cop_arybase);
350 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
351 /* (But not in defined().) */
352 CV *cv = sv_2cv(TOPs, &stash, &gv, !(PL_op->op_flags & OPf_SPECIAL));
355 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
356 if ((PL_op->op_private & OPpLVAL_INTRO)) {
357 if (gv && GvCV(gv) == cv && (gv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv), FALSE)))
360 DIE(aTHX_ "Can't modify non-lvalue subroutine call");
364 cv = (CV*)&PL_sv_undef;
378 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
379 char *s = SvPVX(TOPs);
380 if (strnEQ(s, "CORE::", 6)) {
383 code = keyword(s + 6, SvCUR(TOPs) - 6);
384 if (code < 0) { /* Overridable. */
385 #define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
386 int i = 0, n = 0, seen_question = 0;
388 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
390 if (code == -KEY_chop || code == -KEY_chomp)
392 while (i < MAXO) { /* The slow way. */
393 if (strEQ(s + 6, PL_op_name[i])
394 || strEQ(s + 6, PL_op_desc[i]))
400 goto nonesuch; /* Should not happen... */
402 oa = PL_opargs[i] >> OASHIFT;
404 if (oa & OA_OPTIONAL && !seen_question) {
408 else if (n && str[0] == ';' && seen_question)
409 goto set; /* XXXX system, exec */
410 if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
411 && (oa & (OA_OPTIONAL - 1)) <= OA_SCALARREF
412 /* But globs are already references (kinda) */
413 && (oa & (OA_OPTIONAL - 1)) != OA_FILEREF
417 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
421 ret = sv_2mortal(newSVpvn(str, n - 1));
423 else if (code) /* Non-Overridable */
425 else { /* None such */
427 DIE(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
431 cv = sv_2cv(TOPs, &stash, &gv, FALSE);
433 ret = sv_2mortal(newSVpvn(SvPVX(cv), SvCUR(cv)));
442 CV* cv = (CV*)PAD_SV(PL_op->op_targ);
444 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
460 if (GIMME != G_ARRAY) {
464 *MARK = &PL_sv_undef;
465 *MARK = refto(*MARK);
469 EXTEND_MORTAL(SP - MARK);
471 *MARK = refto(*MARK);
476 S_refto(pTHX_ SV *sv)
480 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
483 if (!(sv = LvTARG(sv)))
486 (void)SvREFCNT_inc(sv);
488 else if (SvTYPE(sv) == SVt_PVAV) {
489 if (!AvREAL((AV*)sv) && AvREIFY((AV*)sv))
492 (void)SvREFCNT_inc(sv);
494 else if (SvPADTMP(sv) && !IS_PADGV(sv))
498 (void)SvREFCNT_inc(sv);
501 sv_upgrade(rv, SVt_RV);
515 if (sv && SvGMAGICAL(sv))
518 if (!sv || !SvROK(sv))
522 pv = sv_reftype(sv,TRUE);
523 PUSHp(pv, strlen(pv));
533 stash = CopSTASH(PL_curcop);
539 if (ssv && !SvGMAGICAL(ssv) && !SvAMAGIC(ssv) && SvROK(ssv))
540 Perl_croak(aTHX_ "Attempt to bless into a reference");
542 if (ckWARN(WARN_MISC) && len == 0)
543 Perl_warner(aTHX_ packWARN(WARN_MISC),
544 "Explicit blessing to '' (assuming package main)");
545 stash = gv_stashpvn(ptr, len, TRUE);
548 (void)sv_bless(TOPs, stash);
562 elem = SvPV(sv, n_a);
567 /* elem will always be NUL terminated. */
568 const char *elem2 = elem + 1;
571 if (strEQ(elem2, "RRAY"))
572 tmpRef = (SV*)GvAV(gv);
575 if (strEQ(elem2, "ODE"))
576 tmpRef = (SV*)GvCVu(gv);
579 if (strEQ(elem2, "ILEHANDLE")) {
580 /* finally deprecated in 5.8.0 */
581 deprecate("*glob{FILEHANDLE}");
582 tmpRef = (SV*)GvIOp(gv);
585 if (strEQ(elem2, "ORMAT"))
586 tmpRef = (SV*)GvFORM(gv);
589 if (strEQ(elem2, "LOB"))
593 if (strEQ(elem2, "ASH"))
594 tmpRef = (SV*)GvHV(gv);
597 if (*elem2 == 'O' && !elem[2])
598 tmpRef = (SV*)GvIOp(gv);
601 if (strEQ(elem2, "AME"))
602 sv = newSVpvn(GvNAME(gv), GvNAMELEN(gv));
605 if (strEQ(elem2, "ACKAGE")) {
606 char *name = HvNAME(GvSTASH(gv));
607 sv = newSVpv(name ? name : "__ANON__", 0);
611 if (strEQ(elem2, "CALAR"))
626 /* Pattern matching */
631 register unsigned char *s;
634 register I32 *sfirst;
638 if (sv == PL_lastscream) {
644 SvSCREAM_off(PL_lastscream);
645 SvREFCNT_dec(PL_lastscream);
647 PL_lastscream = SvREFCNT_inc(sv);
650 s = (unsigned char*)(SvPV(sv, len));
654 if (pos > PL_maxscream) {
655 if (PL_maxscream < 0) {
656 PL_maxscream = pos + 80;
657 New(301, PL_screamfirst, 256, I32);
658 New(302, PL_screamnext, PL_maxscream, I32);
661 PL_maxscream = pos + pos / 4;
662 Renew(PL_screamnext, PL_maxscream, I32);
666 sfirst = PL_screamfirst;
667 snext = PL_screamnext;
669 if (!sfirst || !snext)
670 DIE(aTHX_ "do_study: out of memory");
672 for (ch = 256; ch; --ch)
679 snext[pos] = sfirst[ch] - pos;
686 /* piggyback on m//g magic */
687 sv_magic(sv, Nullsv, PERL_MAGIC_regex_global, Nullch, 0);
696 if (PL_op->op_flags & OPf_STACKED)
702 TARG = sv_newmortal();
707 /* Lvalue operators. */
719 dSP; dMARK; dTARGET; dORIGMARK;
721 do_chop(TARG, *++MARK);
730 SETi(do_chomp(TOPs));
737 register I32 count = 0;
740 count += do_chomp(POPs);
751 if (!sv || !SvANY(sv))
753 switch (SvTYPE(sv)) {
755 if (AvMAX(sv) >= 0 || SvGMAGICAL(sv)
756 || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
760 if (HvARRAY(sv) || SvGMAGICAL(sv)
761 || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
765 if (CvROOT(sv) || CvXSUB(sv))
782 if (!PL_op->op_private) {
791 if (SvTHINKFIRST(sv))
794 switch (SvTYPE(sv)) {
804 if (ckWARN(WARN_MISC) && cv_const_sv((CV*)sv))
805 Perl_warner(aTHX_ packWARN(WARN_MISC), "Constant subroutine %s undefined",
806 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
810 /* let user-undef'd sub keep its identity */
811 GV* gv = CvGV((CV*)sv);
818 SvSetMagicSV(sv, &PL_sv_undef);
822 Newz(602, gp, 1, GP);
823 GvGP(sv) = gp_ref(gp);
824 GvSV(sv) = NEWSV(72,0);
825 GvLINE(sv) = CopLINE(PL_curcop);
831 if (SvTYPE(sv) >= SVt_PV && SvPVX(sv) && SvLEN(sv)) {
833 SvPV_set(sv, Nullch);
846 if (SvTYPE(TOPs) > SVt_PVLV)
847 DIE(aTHX_ PL_no_modify);
848 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
849 && SvIVX(TOPs) != IV_MIN)
851 SvIV_set(TOPs, SvIVX(TOPs) - 1);
852 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
863 if (SvTYPE(TOPs) > SVt_PVLV)
864 DIE(aTHX_ PL_no_modify);
865 sv_setsv(TARG, TOPs);
866 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
867 && SvIVX(TOPs) != IV_MAX)
869 SvIV_set(TOPs, SvIVX(TOPs) + 1);
870 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
875 /* special case for undef: see thread at 2003-03/msg00536.html in archive */
885 if (SvTYPE(TOPs) > SVt_PVLV)
886 DIE(aTHX_ PL_no_modify);
887 sv_setsv(TARG, TOPs);
888 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
889 && SvIVX(TOPs) != IV_MIN)
891 SvIV_set(TOPs, SvIVX(TOPs) - 1);
892 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
901 /* Ordinary operators. */
906 #ifdef PERL_PRESERVE_IVUV
909 tryAMAGICbin(pow,opASSIGN);
910 #ifdef PERL_PRESERVE_IVUV
911 /* For integer to integer power, we do the calculation by hand wherever
912 we're sure it is safe; otherwise we call pow() and try to convert to
913 integer afterwards. */
917 bool baseuok = SvUOK(TOPm1s);
921 baseuv = SvUVX(TOPm1s);
923 IV iv = SvIVX(TOPm1s);
926 baseuok = TRUE; /* effectively it's a UV now */
928 baseuv = -iv; /* abs, baseuok == false records sign */
942 goto float_it; /* Can't do negative powers this way. */
945 /* now we have integer ** positive integer. */
948 /* foo & (foo - 1) is zero only for a power of 2. */
949 if (!(baseuv & (baseuv - 1))) {
950 /* We are raising power-of-2 to a positive integer.
951 The logic here will work for any base (even non-integer
952 bases) but it can be less accurate than
953 pow (base,power) or exp (power * log (base)) when the
954 intermediate values start to spill out of the mantissa.
955 With powers of 2 we know this can't happen.
956 And powers of 2 are the favourite thing for perl
957 programmers to notice ** not doing what they mean. */
959 NV base = baseuok ? baseuv : -(NV)baseuv;
962 for (; power; base *= base, n++) {
963 /* Do I look like I trust gcc with long longs here?
965 UV bit = (UV)1 << (UV)n;
968 /* Only bother to clear the bit if it is set. */
970 /* Avoid squaring base again if we're done. */
971 if (power == 0) break;
979 register unsigned int highbit = 8 * sizeof(UV);
980 register unsigned int lowbit = 0;
981 register unsigned int diff;
982 bool odd_power = (bool)(power & 1);
983 while ((diff = (highbit - lowbit) >> 1)) {
984 if (baseuv & ~((1 << (lowbit + diff)) - 1))
989 /* we now have baseuv < 2 ** highbit */
990 if (power * highbit <= 8 * sizeof(UV)) {
991 /* result will definitely fit in UV, so use UV math
992 on same algorithm as above */
993 register UV result = 1;
994 register UV base = baseuv;
996 for (; power; base *= base, n++) {
997 register UV bit = (UV)1 << (UV)n;
1001 if (power == 0) break;
1005 if (baseuok || !odd_power)
1006 /* answer is positive */
1008 else if (result <= (UV)IV_MAX)
1009 /* answer negative, fits in IV */
1010 SETi( -(IV)result );
1011 else if (result == (UV)IV_MIN)
1012 /* 2's complement assumption: special case IV_MIN */
1015 /* answer negative, doesn't fit */
1016 SETn( -(NV)result );
1027 SETn( Perl_pow( left, right) );
1028 #ifdef PERL_PRESERVE_IVUV
1038 dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
1039 #ifdef PERL_PRESERVE_IVUV
1042 /* Unless the left argument is integer in range we are going to have to
1043 use NV maths. Hence only attempt to coerce the right argument if
1044 we know the left is integer. */
1045 /* Left operand is defined, so is it IV? */
1046 SvIV_please(TOPm1s);
1047 if (SvIOK(TOPm1s)) {
1048 bool auvok = SvUOK(TOPm1s);
1049 bool buvok = SvUOK(TOPs);
1050 const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
1051 const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
1058 alow = SvUVX(TOPm1s);
1060 IV aiv = SvIVX(TOPm1s);
1063 auvok = TRUE; /* effectively it's a UV now */
1065 alow = -aiv; /* abs, auvok == false records sign */
1071 IV biv = SvIVX(TOPs);
1074 buvok = TRUE; /* effectively it's a UV now */
1076 blow = -biv; /* abs, buvok == false records sign */
1080 /* If this does sign extension on unsigned it's time for plan B */
1081 ahigh = alow >> (4 * sizeof (UV));
1083 bhigh = blow >> (4 * sizeof (UV));
1085 if (ahigh && bhigh) {
1086 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
1087 which is overflow. Drop to NVs below. */
1088 } else if (!ahigh && !bhigh) {
1089 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
1090 so the unsigned multiply cannot overflow. */
1091 UV product = alow * blow;
1092 if (auvok == buvok) {
1093 /* -ve * -ve or +ve * +ve gives a +ve result. */
1097 } else if (product <= (UV)IV_MIN) {
1098 /* 2s complement assumption that (UV)-IV_MIN is correct. */
1099 /* -ve result, which could overflow an IV */
1101 SETi( -(IV)product );
1103 } /* else drop to NVs below. */
1105 /* One operand is large, 1 small */
1108 /* swap the operands */
1110 bhigh = blow; /* bhigh now the temp var for the swap */
1114 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1115 multiplies can't overflow. shift can, add can, -ve can. */
1116 product_middle = ahigh * blow;
1117 if (!(product_middle & topmask)) {
1118 /* OK, (ahigh * blow) won't lose bits when we shift it. */
1120 product_middle <<= (4 * sizeof (UV));
1121 product_low = alow * blow;
1123 /* as for pp_add, UV + something mustn't get smaller.
1124 IIRC ANSI mandates this wrapping *behaviour* for
1125 unsigned whatever the actual representation*/
1126 product_low += product_middle;
1127 if (product_low >= product_middle) {
1128 /* didn't overflow */
1129 if (auvok == buvok) {
1130 /* -ve * -ve or +ve * +ve gives a +ve result. */
1132 SETu( product_low );
1134 } else if (product_low <= (UV)IV_MIN) {
1135 /* 2s complement assumption again */
1136 /* -ve result, which could overflow an IV */
1138 SETi( -(IV)product_low );
1140 } /* else drop to NVs below. */
1142 } /* product_middle too large */
1143 } /* ahigh && bhigh */
1144 } /* SvIOK(TOPm1s) */
1149 SETn( left * right );
1156 dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
1157 /* Only try to do UV divide first
1158 if ((SLOPPYDIVIDE is true) or
1159 (PERL_PRESERVE_IVUV is true and one or both SV is a UV too large
1161 The assumption is that it is better to use floating point divide
1162 whenever possible, only doing integer divide first if we can't be sure.
1163 If NV_PRESERVES_UV is true then we know at compile time that no UV
1164 can be too large to preserve, so don't need to compile the code to
1165 test the size of UVs. */
1168 # define PERL_TRY_UV_DIVIDE
1169 /* ensure that 20./5. == 4. */
1171 # ifdef PERL_PRESERVE_IVUV
1172 # ifndef NV_PRESERVES_UV
1173 # define PERL_TRY_UV_DIVIDE
1178 #ifdef PERL_TRY_UV_DIVIDE
1181 SvIV_please(TOPm1s);
1182 if (SvIOK(TOPm1s)) {
1183 bool left_non_neg = SvUOK(TOPm1s);
1184 bool right_non_neg = SvUOK(TOPs);
1188 if (right_non_neg) {
1189 right = SvUVX(TOPs);
1192 IV biv = SvIVX(TOPs);
1195 right_non_neg = TRUE; /* effectively it's a UV now */
1201 /* historically undef()/0 gives a "Use of uninitialized value"
1202 warning before dieing, hence this test goes here.
1203 If it were immediately before the second SvIV_please, then
1204 DIE() would be invoked before left was even inspected, so
1205 no inpsection would give no warning. */
1207 DIE(aTHX_ "Illegal division by zero");
1210 left = SvUVX(TOPm1s);
1213 IV aiv = SvIVX(TOPm1s);
1216 left_non_neg = TRUE; /* effectively it's a UV now */
1225 /* For sloppy divide we always attempt integer division. */
1227 /* Otherwise we only attempt it if either or both operands
1228 would not be preserved by an NV. If both fit in NVs
1229 we fall through to the NV divide code below. However,
1230 as left >= right to ensure integer result here, we know that
1231 we can skip the test on the right operand - right big
1232 enough not to be preserved can't get here unless left is
1235 && (left > ((UV)1 << NV_PRESERVES_UV_BITS))
1238 /* Integer division can't overflow, but it can be imprecise. */
1239 UV result = left / right;
1240 if (result * right == left) {
1241 SP--; /* result is valid */
1242 if (left_non_neg == right_non_neg) {
1243 /* signs identical, result is positive. */
1247 /* 2s complement assumption */
1248 if (result <= (UV)IV_MIN)
1249 SETi( -(IV)result );
1251 /* It's exact but too negative for IV. */
1252 SETn( -(NV)result );
1255 } /* tried integer divide but it was not an integer result */
1256 } /* else (PERL_ABS(result) < 1.0) or (both UVs in range for NV) */
1257 } /* left wasn't SvIOK */
1258 } /* right wasn't SvIOK */
1259 #endif /* PERL_TRY_UV_DIVIDE */
1263 DIE(aTHX_ "Illegal division by zero");
1264 PUSHn( left / right );
1271 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1275 bool left_neg = FALSE;
1276 bool right_neg = FALSE;
1277 bool use_double = FALSE;
1278 bool dright_valid = FALSE;
1284 right_neg = !SvUOK(TOPs);
1286 right = SvUVX(POPs);
1288 IV biv = SvIVX(POPs);
1291 right_neg = FALSE; /* effectively it's a UV now */
1299 right_neg = dright < 0;
1302 if (dright < UV_MAX_P1) {
1303 right = U_V(dright);
1304 dright_valid = TRUE; /* In case we need to use double below. */
1310 /* At this point use_double is only true if right is out of range for
1311 a UV. In range NV has been rounded down to nearest UV and
1312 use_double false. */
1314 if (!use_double && SvIOK(TOPs)) {
1316 left_neg = !SvUOK(TOPs);
1320 IV aiv = SvIVX(POPs);
1323 left_neg = FALSE; /* effectively it's a UV now */
1332 left_neg = dleft < 0;
1336 /* This should be exactly the 5.6 behaviour - if left and right are
1337 both in range for UV then use U_V() rather than floor. */
1339 if (dleft < UV_MAX_P1) {
1340 /* right was in range, so is dleft, so use UVs not double.
1344 /* left is out of range for UV, right was in range, so promote
1345 right (back) to double. */
1347 /* The +0.5 is used in 5.6 even though it is not strictly
1348 consistent with the implicit +0 floor in the U_V()
1349 inside the #if 1. */
1350 dleft = Perl_floor(dleft + 0.5);
1353 dright = Perl_floor(dright + 0.5);
1363 DIE(aTHX_ "Illegal modulus zero");
1365 dans = Perl_fmod(dleft, dright);
1366 if ((left_neg != right_neg) && dans)
1367 dans = dright - dans;
1370 sv_setnv(TARG, dans);
1376 DIE(aTHX_ "Illegal modulus zero");
1379 if ((left_neg != right_neg) && ans)
1382 /* XXX may warn: unary minus operator applied to unsigned type */
1383 /* could change -foo to be (~foo)+1 instead */
1384 if (ans <= ~((UV)IV_MAX)+1)
1385 sv_setiv(TARG, ~ans+1);
1387 sv_setnv(TARG, -(NV)ans);
1390 sv_setuv(TARG, ans);
1399 dSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
1409 count = IV_MAX; /* The best we can do? */
1420 else if (SvNOKp(sv)) {
1429 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1431 I32 items = SP - MARK;
1433 static const char oom_list_extend[] =
1434 "Out of memory during list extend";
1436 max = items * count;
1437 MEM_WRAP_CHECK_1(max, SV*, oom_list_extend);
1438 /* Did the max computation overflow? */
1439 if (items > 0 && max > 0 && (max < items || max < count))
1440 Perl_croak(aTHX_ oom_list_extend);
1445 /* This code was intended to fix 20010809.028:
1448 for (($x =~ /./g) x 2) {
1449 print chop; # "abcdabcd" expected as output.
1452 * but that change (#11635) broke this code:
1454 $x = [("foo")x2]; # only one "foo" ended up in the anonlist.
1456 * I can't think of a better fix that doesn't introduce
1457 * an efficiency hit by copying the SVs. The stack isn't
1458 * refcounted, and mortalisation obviously doesn't
1459 * Do The Right Thing when the stack has more than
1460 * one pointer to the same mortal value.
1464 *SP = sv_2mortal(newSVsv(*SP));
1474 repeatcpy((char*)(MARK + items), (char*)MARK,
1475 items * sizeof(SV*), count - 1);
1478 else if (count <= 0)
1481 else { /* Note: mark already snarfed by pp_list */
1485 static const char oom_string_extend[] =
1486 "Out of memory during string extend";
1488 SvSetSV(TARG, tmpstr);
1489 SvPV_force(TARG, len);
1490 isutf = DO_UTF8(TARG);
1495 STRLEN max = (UV)count * len;
1496 if (len > ((MEM_SIZE)~0)/count)
1497 Perl_croak(aTHX_ oom_string_extend);
1498 MEM_WRAP_CHECK_1(max, char, oom_string_extend);
1499 SvGROW(TARG, max + 1);
1500 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1501 SvCUR_set(TARG, SvCUR(TARG) * count);
1503 *SvEND(TARG) = '\0';
1506 (void)SvPOK_only_UTF8(TARG);
1508 (void)SvPOK_only(TARG);
1510 if (PL_op->op_private & OPpREPEAT_DOLIST) {
1511 /* The parser saw this as a list repeat, and there
1512 are probably several items on the stack. But we're
1513 in scalar context, and there's no pp_list to save us
1514 now. So drop the rest of the items -- robin@kitsite.com
1527 dSP; dATARGET; bool useleft; tryAMAGICbin(subtr,opASSIGN);
1528 useleft = USE_LEFT(TOPm1s);
1529 #ifdef PERL_PRESERVE_IVUV
1530 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1531 "bad things" happen if you rely on signed integers wrapping. */
1534 /* Unless the left argument is integer in range we are going to have to
1535 use NV maths. Hence only attempt to coerce the right argument if
1536 we know the left is integer. */
1537 register UV auv = 0;
1543 a_valid = auvok = 1;
1544 /* left operand is undef, treat as zero. */
1546 /* Left operand is defined, so is it IV? */
1547 SvIV_please(TOPm1s);
1548 if (SvIOK(TOPm1s)) {
1549 if ((auvok = SvUOK(TOPm1s)))
1550 auv = SvUVX(TOPm1s);
1552 register IV aiv = SvIVX(TOPm1s);
1555 auvok = 1; /* Now acting as a sign flag. */
1556 } else { /* 2s complement assumption for IV_MIN */
1564 bool result_good = 0;
1567 bool buvok = SvUOK(TOPs);
1572 register IV biv = SvIVX(TOPs);
1579 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1580 else "IV" now, independent of how it came in.
1581 if a, b represents positive, A, B negative, a maps to -A etc
1586 all UV maths. negate result if A negative.
1587 subtract if signs same, add if signs differ. */
1589 if (auvok ^ buvok) {
1598 /* Must get smaller */
1603 if (result <= buv) {
1604 /* result really should be -(auv-buv). as its negation
1605 of true value, need to swap our result flag */
1617 if (result <= (UV)IV_MIN)
1618 SETi( -(IV)result );
1620 /* result valid, but out of range for IV. */
1621 SETn( -(NV)result );
1625 } /* Overflow, drop through to NVs. */
1629 useleft = USE_LEFT(TOPm1s);
1633 /* left operand is undef, treat as zero - value */
1637 SETn( TOPn - value );
1644 dSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1647 if (PL_op->op_private & HINT_INTEGER) {
1661 dSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1664 if (PL_op->op_private & HINT_INTEGER) {
1678 dSP; tryAMAGICbinSET(lt,0);
1679 #ifdef PERL_PRESERVE_IVUV
1682 SvIV_please(TOPm1s);
1683 if (SvIOK(TOPm1s)) {
1684 bool auvok = SvUOK(TOPm1s);
1685 bool buvok = SvUOK(TOPs);
1687 if (!auvok && !buvok) { /* ## IV < IV ## */
1688 IV aiv = SvIVX(TOPm1s);
1689 IV biv = SvIVX(TOPs);
1692 SETs(boolSV(aiv < biv));
1695 if (auvok && buvok) { /* ## UV < UV ## */
1696 UV auv = SvUVX(TOPm1s);
1697 UV buv = SvUVX(TOPs);
1700 SETs(boolSV(auv < buv));
1703 if (auvok) { /* ## UV < IV ## */
1710 /* As (a) is a UV, it's >=0, so it cannot be < */
1715 SETs(boolSV(auv < (UV)biv));
1718 { /* ## IV < UV ## */
1722 aiv = SvIVX(TOPm1s);
1724 /* As (b) is a UV, it's >=0, so it must be < */
1731 SETs(boolSV((UV)aiv < buv));
1737 #ifndef NV_PRESERVES_UV
1738 #ifdef PERL_PRESERVE_IVUV
1741 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1743 SETs(boolSV(SvRV(TOPs) < SvRV(TOPp1s)));
1749 SETs(boolSV(TOPn < value));
1756 dSP; tryAMAGICbinSET(gt,0);
1757 #ifdef PERL_PRESERVE_IVUV
1760 SvIV_please(TOPm1s);
1761 if (SvIOK(TOPm1s)) {
1762 bool auvok = SvUOK(TOPm1s);
1763 bool buvok = SvUOK(TOPs);
1765 if (!auvok && !buvok) { /* ## IV > IV ## */
1766 IV aiv = SvIVX(TOPm1s);
1767 IV biv = SvIVX(TOPs);
1770 SETs(boolSV(aiv > biv));
1773 if (auvok && buvok) { /* ## UV > UV ## */
1774 UV auv = SvUVX(TOPm1s);
1775 UV buv = SvUVX(TOPs);
1778 SETs(boolSV(auv > buv));
1781 if (auvok) { /* ## UV > IV ## */
1788 /* As (a) is a UV, it's >=0, so it must be > */
1793 SETs(boolSV(auv > (UV)biv));
1796 { /* ## IV > UV ## */
1800 aiv = SvIVX(TOPm1s);
1802 /* As (b) is a UV, it's >=0, so it cannot be > */
1809 SETs(boolSV((UV)aiv > buv));
1815 #ifndef NV_PRESERVES_UV
1816 #ifdef PERL_PRESERVE_IVUV
1819 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1821 SETs(boolSV(SvRV(TOPs) > SvRV(TOPp1s)));
1827 SETs(boolSV(TOPn > value));
1834 dSP; tryAMAGICbinSET(le,0);
1835 #ifdef PERL_PRESERVE_IVUV
1838 SvIV_please(TOPm1s);
1839 if (SvIOK(TOPm1s)) {
1840 bool auvok = SvUOK(TOPm1s);
1841 bool buvok = SvUOK(TOPs);
1843 if (!auvok && !buvok) { /* ## IV <= IV ## */
1844 IV aiv = SvIVX(TOPm1s);
1845 IV biv = SvIVX(TOPs);
1848 SETs(boolSV(aiv <= biv));
1851 if (auvok && buvok) { /* ## UV <= UV ## */
1852 UV auv = SvUVX(TOPm1s);
1853 UV buv = SvUVX(TOPs);
1856 SETs(boolSV(auv <= buv));
1859 if (auvok) { /* ## UV <= IV ## */
1866 /* As (a) is a UV, it's >=0, so a cannot be <= */
1871 SETs(boolSV(auv <= (UV)biv));
1874 { /* ## IV <= UV ## */
1878 aiv = SvIVX(TOPm1s);
1880 /* As (b) is a UV, it's >=0, so a must be <= */
1887 SETs(boolSV((UV)aiv <= buv));
1893 #ifndef NV_PRESERVES_UV
1894 #ifdef PERL_PRESERVE_IVUV
1897 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1899 SETs(boolSV(SvRV(TOPs) <= SvRV(TOPp1s)));
1905 SETs(boolSV(TOPn <= value));
1912 dSP; tryAMAGICbinSET(ge,0);
1913 #ifdef PERL_PRESERVE_IVUV
1916 SvIV_please(TOPm1s);
1917 if (SvIOK(TOPm1s)) {
1918 bool auvok = SvUOK(TOPm1s);
1919 bool buvok = SvUOK(TOPs);
1921 if (!auvok && !buvok) { /* ## IV >= IV ## */
1922 IV aiv = SvIVX(TOPm1s);
1923 IV biv = SvIVX(TOPs);
1926 SETs(boolSV(aiv >= biv));
1929 if (auvok && buvok) { /* ## UV >= UV ## */
1930 UV auv = SvUVX(TOPm1s);
1931 UV buv = SvUVX(TOPs);
1934 SETs(boolSV(auv >= buv));
1937 if (auvok) { /* ## UV >= IV ## */
1944 /* As (a) is a UV, it's >=0, so it must be >= */
1949 SETs(boolSV(auv >= (UV)biv));
1952 { /* ## IV >= UV ## */
1956 aiv = SvIVX(TOPm1s);
1958 /* As (b) is a UV, it's >=0, so a cannot be >= */
1965 SETs(boolSV((UV)aiv >= buv));
1971 #ifndef NV_PRESERVES_UV
1972 #ifdef PERL_PRESERVE_IVUV
1975 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1977 SETs(boolSV(SvRV(TOPs) >= SvRV(TOPp1s)));
1983 SETs(boolSV(TOPn >= value));
1990 dSP; tryAMAGICbinSET(ne,0);
1991 #ifndef NV_PRESERVES_UV
1992 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1994 SETs(boolSV(SvRV(TOPs) != SvRV(TOPp1s)));
1998 #ifdef PERL_PRESERVE_IVUV
2001 SvIV_please(TOPm1s);
2002 if (SvIOK(TOPm1s)) {
2003 bool auvok = SvUOK(TOPm1s);
2004 bool buvok = SvUOK(TOPs);
2006 if (auvok == buvok) { /* ## IV == IV or UV == UV ## */
2007 /* Casting IV to UV before comparison isn't going to matter
2008 on 2s complement. On 1s complement or sign&magnitude
2009 (if we have any of them) it could make negative zero
2010 differ from normal zero. As I understand it. (Need to
2011 check - is negative zero implementation defined behaviour
2013 UV buv = SvUVX(POPs);
2014 UV auv = SvUVX(TOPs);
2016 SETs(boolSV(auv != buv));
2019 { /* ## Mixed IV,UV ## */
2023 /* != is commutative so swap if needed (save code) */
2025 /* swap. top of stack (b) is the iv */
2029 /* As (a) is a UV, it's >0, so it cannot be == */
2038 /* As (b) is a UV, it's >0, so it cannot be == */
2042 uv = SvUVX(*(SP+1)); /* Do I want TOPp1s() ? */
2044 SETs(boolSV((UV)iv != uv));
2052 SETs(boolSV(TOPn != value));
2059 dSP; dTARGET; tryAMAGICbin(ncmp,0);
2060 #ifndef NV_PRESERVES_UV
2061 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2062 UV right = PTR2UV(SvRV(POPs));
2063 UV left = PTR2UV(SvRV(TOPs));
2064 SETi((left > right) - (left < right));
2068 #ifdef PERL_PRESERVE_IVUV
2069 /* Fortunately it seems NaN isn't IOK */
2072 SvIV_please(TOPm1s);
2073 if (SvIOK(TOPm1s)) {
2074 bool leftuvok = SvUOK(TOPm1s);
2075 bool rightuvok = SvUOK(TOPs);
2077 if (!leftuvok && !rightuvok) { /* ## IV <=> IV ## */
2078 IV leftiv = SvIVX(TOPm1s);
2079 IV rightiv = SvIVX(TOPs);
2081 if (leftiv > rightiv)
2083 else if (leftiv < rightiv)
2087 } else if (leftuvok && rightuvok) { /* ## UV <=> UV ## */
2088 UV leftuv = SvUVX(TOPm1s);
2089 UV rightuv = SvUVX(TOPs);
2091 if (leftuv > rightuv)
2093 else if (leftuv < rightuv)
2097 } else if (leftuvok) { /* ## UV <=> IV ## */
2101 rightiv = SvIVX(TOPs);
2103 /* As (a) is a UV, it's >=0, so it cannot be < */
2106 leftuv = SvUVX(TOPm1s);
2107 if (leftuv > (UV)rightiv) {
2109 } else if (leftuv < (UV)rightiv) {
2115 } else { /* ## IV <=> UV ## */
2119 leftiv = SvIVX(TOPm1s);
2121 /* As (b) is a UV, it's >=0, so it must be < */
2124 rightuv = SvUVX(TOPs);
2125 if ((UV)leftiv > rightuv) {
2127 } else if ((UV)leftiv < rightuv) {
2145 if (Perl_isnan(left) || Perl_isnan(right)) {
2149 value = (left > right) - (left < right);
2153 else if (left < right)
2155 else if (left > right)
2169 dSP; tryAMAGICbinSET(slt,0);
2172 int cmp = (IN_LOCALE_RUNTIME
2173 ? sv_cmp_locale(left, right)
2174 : sv_cmp(left, right));
2175 SETs(boolSV(cmp < 0));
2182 dSP; tryAMAGICbinSET(sgt,0);
2185 int cmp = (IN_LOCALE_RUNTIME
2186 ? sv_cmp_locale(left, right)
2187 : sv_cmp(left, right));
2188 SETs(boolSV(cmp > 0));
2195 dSP; tryAMAGICbinSET(sle,0);
2198 int cmp = (IN_LOCALE_RUNTIME
2199 ? sv_cmp_locale(left, right)
2200 : sv_cmp(left, right));
2201 SETs(boolSV(cmp <= 0));
2208 dSP; tryAMAGICbinSET(sge,0);
2211 int cmp = (IN_LOCALE_RUNTIME
2212 ? sv_cmp_locale(left, right)
2213 : sv_cmp(left, right));
2214 SETs(boolSV(cmp >= 0));
2221 dSP; tryAMAGICbinSET(seq,0);
2224 SETs(boolSV(sv_eq(left, right)));
2231 dSP; tryAMAGICbinSET(sne,0);
2234 SETs(boolSV(!sv_eq(left, right)));
2241 dSP; dTARGET; tryAMAGICbin(scmp,0);
2244 int cmp = (IN_LOCALE_RUNTIME
2245 ? sv_cmp_locale(left, right)
2246 : sv_cmp(left, right));
2254 dSP; dATARGET; tryAMAGICbin(band,opASSIGN);
2257 if (SvNIOKp(left) || SvNIOKp(right)) {
2258 if (PL_op->op_private & HINT_INTEGER) {
2259 IV i = SvIV(left) & SvIV(right);
2263 UV u = SvUV(left) & SvUV(right);
2268 do_vop(PL_op->op_type, TARG, left, right);
2277 dSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
2280 if (SvNIOKp(left) || SvNIOKp(right)) {
2281 if (PL_op->op_private & HINT_INTEGER) {
2282 IV i = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right);
2286 UV u = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right);
2291 do_vop(PL_op->op_type, TARG, left, right);
2300 dSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
2303 if (SvNIOKp(left) || SvNIOKp(right)) {
2304 if (PL_op->op_private & HINT_INTEGER) {
2305 IV i = (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right);
2309 UV u = (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right);
2314 do_vop(PL_op->op_type, TARG, left, right);
2323 dSP; dTARGET; tryAMAGICun(neg);
2326 int flags = SvFLAGS(sv);
2329 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
2330 /* It's publicly an integer, or privately an integer-not-float */
2333 if (SvIVX(sv) == IV_MIN) {
2334 /* 2s complement assumption. */
2335 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
2338 else if (SvUVX(sv) <= IV_MAX) {
2343 else if (SvIVX(sv) != IV_MIN) {
2347 #ifdef PERL_PRESERVE_IVUV
2356 else if (SvPOKp(sv)) {
2358 char *s = SvPV(sv, len);
2359 if (isIDFIRST(*s)) {
2360 sv_setpvn(TARG, "-", 1);
2363 else if (*s == '+' || *s == '-') {
2365 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
2367 else if (DO_UTF8(sv)) {
2370 goto oops_its_an_int;
2372 sv_setnv(TARG, -SvNV(sv));
2374 sv_setpvn(TARG, "-", 1);
2381 goto oops_its_an_int;
2382 sv_setnv(TARG, -SvNV(sv));
2394 dSP; tryAMAGICunSET(not);
2395 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
2401 dSP; dTARGET; tryAMAGICun(compl);
2405 if (PL_op->op_private & HINT_INTEGER) {
2419 (void)SvPV_nomg(sv,len); /* force check for uninit var */
2421 tmps = (U8*)SvPV_force(TARG, len);
2424 /* Calculate exact length, let's not estimate. */
2433 while (tmps < send) {
2434 UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2435 tmps += UTF8SKIP(tmps);
2436 targlen += UNISKIP(~c);
2442 /* Now rewind strings and write them. */
2446 Newz(0, result, targlen + 1, U8);
2447 while (tmps < send) {
2448 UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2449 tmps += UTF8SKIP(tmps);
2450 result = uvchr_to_utf8_flags(result, ~c, UNICODE_ALLOW_ANY);
2454 sv_setpvn(TARG, (char*)result, targlen);
2458 Newz(0, result, nchar + 1, U8);
2459 while (tmps < send) {
2460 U8 c = (U8)utf8n_to_uvchr(tmps, 0, &l, UTF8_ALLOW_ANY);
2461 tmps += UTF8SKIP(tmps);
2466 sv_setpvn(TARG, (char*)result, nchar);
2475 register long *tmpl;
2476 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2479 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
2484 for ( ; anum > 0; anum--, tmps++)
2493 /* integer versions of some of the above */
2497 dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
2500 SETi( left * right );
2507 dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
2511 DIE(aTHX_ "Illegal division by zero");
2512 value = POPi / value;
2521 /* This is the vanilla old i_modulo. */
2522 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2526 DIE(aTHX_ "Illegal modulus zero");
2527 SETi( left % right );
2532 #if defined(__GLIBC__) && IVSIZE == 8
2536 /* This is the i_modulo with the workaround for the _moddi3 bug
2537 * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
2538 * See below for pp_i_modulo. */
2539 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2543 DIE(aTHX_ "Illegal modulus zero");
2544 SETi( left % PERL_ABS(right) );
2552 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2556 DIE(aTHX_ "Illegal modulus zero");
2557 /* The assumption is to use hereafter the old vanilla version... */
2559 PL_ppaddr[OP_I_MODULO] =
2560 &Perl_pp_i_modulo_0;
2561 /* .. but if we have glibc, we might have a buggy _moddi3
2562 * (at least glicb 2.2.5 is known to have this bug), in other
2563 * words our integer modulus with negative quad as the second
2564 * argument might be broken. Test for this and re-patch the
2565 * opcode dispatch table if that is the case, remembering to
2566 * also apply the workaround so that this first round works
2567 * right, too. See [perl #9402] for more information. */
2568 #if defined(__GLIBC__) && IVSIZE == 8
2572 /* Cannot do this check with inlined IV constants since
2573 * that seems to work correctly even with the buggy glibc. */
2575 /* Yikes, we have the bug.
2576 * Patch in the workaround version. */
2578 PL_ppaddr[OP_I_MODULO] =
2579 &Perl_pp_i_modulo_1;
2580 /* Make certain we work right this time, too. */
2581 right = PERL_ABS(right);
2585 SETi( left % right );
2592 dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
2595 SETi( left + right );
2602 dSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
2605 SETi( left - right );
2612 dSP; tryAMAGICbinSET(lt,0);
2615 SETs(boolSV(left < right));
2622 dSP; tryAMAGICbinSET(gt,0);
2625 SETs(boolSV(left > right));
2632 dSP; tryAMAGICbinSET(le,0);
2635 SETs(boolSV(left <= right));
2642 dSP; tryAMAGICbinSET(ge,0);
2645 SETs(boolSV(left >= right));
2652 dSP; tryAMAGICbinSET(eq,0);
2655 SETs(boolSV(left == right));
2662 dSP; tryAMAGICbinSET(ne,0);
2665 SETs(boolSV(left != right));
2672 dSP; dTARGET; tryAMAGICbin(ncmp,0);
2679 else if (left < right)
2690 dSP; dTARGET; tryAMAGICun(neg);
2695 /* High falutin' math. */
2699 dSP; dTARGET; tryAMAGICbin(atan2,0);
2702 SETn(Perl_atan2(left, right));
2709 dSP; dTARGET; tryAMAGICun(sin);
2713 value = Perl_sin(value);
2721 dSP; dTARGET; tryAMAGICun(cos);
2725 value = Perl_cos(value);
2731 /* Support Configure command-line overrides for rand() functions.
2732 After 5.005, perhaps we should replace this by Configure support
2733 for drand48(), random(), or rand(). For 5.005, though, maintain
2734 compatibility by calling rand() but allow the user to override it.
2735 See INSTALL for details. --Andy Dougherty 15 July 1998
2737 /* Now it's after 5.005, and Configure supports drand48() and random(),
2738 in addition to rand(). So the overrides should not be needed any more.
2739 --Jarkko Hietaniemi 27 September 1998
2742 #ifndef HAS_DRAND48_PROTO
2743 extern double drand48 (void);
2756 if (!PL_srand_called) {
2757 (void)seedDrand01((Rand_seed_t)seed());
2758 PL_srand_called = TRUE;
2773 (void)seedDrand01((Rand_seed_t)anum);
2774 PL_srand_called = TRUE;
2781 dSP; dTARGET; tryAMAGICun(exp);
2785 value = Perl_exp(value);
2793 dSP; dTARGET; tryAMAGICun(log);
2798 SET_NUMERIC_STANDARD();
2799 DIE(aTHX_ "Can't take log of %"NVgf, value);
2801 value = Perl_log(value);
2809 dSP; dTARGET; tryAMAGICun(sqrt);
2814 SET_NUMERIC_STANDARD();
2815 DIE(aTHX_ "Can't take sqrt of %"NVgf, value);
2817 value = Perl_sqrt(value);
2825 dSP; dTARGET; tryAMAGICun(int);
2828 IV iv = TOPi; /* attempt to convert to IV if possible. */
2829 /* XXX it's arguable that compiler casting to IV might be subtly
2830 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2831 else preferring IV has introduced a subtle behaviour change bug. OTOH
2832 relying on floating point to be accurate is a bug. */
2836 else if (SvIOK(TOPs)) {
2845 if (value < (NV)UV_MAX + 0.5) {
2848 SETn(Perl_floor(value));
2852 if (value > (NV)IV_MIN - 0.5) {
2855 SETn(Perl_ceil(value));
2865 dSP; dTARGET; tryAMAGICun(abs);
2867 /* This will cache the NV value if string isn't actually integer */
2872 else if (SvIOK(TOPs)) {
2873 /* IVX is precise */
2875 SETu(TOPu); /* force it to be numeric only */
2883 /* 2s complement assumption. Also, not really needed as
2884 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
2904 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2910 tmps = (SvPVx(sv, len));
2912 /* If Unicode, try to downgrade
2913 * If not possible, croak. */
2914 SV* tsv = sv_2mortal(newSVsv(sv));
2917 sv_utf8_downgrade(tsv, FALSE);
2920 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2921 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
2934 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2940 tmps = (SvPVx(sv, len));
2942 /* If Unicode, try to downgrade
2943 * If not possible, croak. */
2944 SV* tsv = sv_2mortal(newSVsv(sv));
2947 sv_utf8_downgrade(tsv, FALSE);
2950 while (*tmps && len && isSPACE(*tmps))
2955 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2956 else if (*tmps == 'b')
2957 result_uv = grok_bin (tmps, &len, &flags, &result_nv);
2959 result_uv = grok_oct (tmps, &len, &flags, &result_nv);
2961 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
2978 SETi(sv_len_utf8(sv));
2994 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
2996 I32 arybase = PL_curcop->cop_arybase;
3000 int num_args = PL_op->op_private & 7;
3001 bool repl_need_utf8_upgrade = FALSE;
3002 bool repl_is_utf8 = FALSE;
3004 SvTAINTED_off(TARG); /* decontaminate */
3005 SvUTF8_off(TARG); /* decontaminate */
3009 repl = SvPV(repl_sv, repl_len);
3010 repl_is_utf8 = DO_UTF8(repl_sv) && SvCUR(repl_sv);
3020 sv_utf8_upgrade(sv);
3022 else if (DO_UTF8(sv))
3023 repl_need_utf8_upgrade = TRUE;
3025 tmps = SvPV(sv, curlen);
3027 utf8_curlen = sv_len_utf8(sv);
3028 if (utf8_curlen == curlen)
3031 curlen = utf8_curlen;
3036 if (pos >= arybase) {
3054 else if (len >= 0) {
3056 if (rem > (I32)curlen)
3071 Perl_croak(aTHX_ "substr outside of string");
3072 if (ckWARN(WARN_SUBSTR))
3073 Perl_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3080 sv_pos_u2b(sv, &pos, &rem);
3082 /* we either return a PV or an LV. If the TARG hasn't been used
3083 * before, or is of that type, reuse it; otherwise use a mortal
3084 * instead. Note that LVs can have an extended lifetime, so also
3085 * dont reuse if refcount > 1 (bug #20933) */
3086 if (SvTYPE(TARG) > SVt_NULL) {
3087 if ( (SvTYPE(TARG) == SVt_PVLV)
3088 ? (!lvalue || SvREFCNT(TARG) > 1)
3091 TARG = sv_newmortal();
3095 sv_setpvn(TARG, tmps, rem);
3096 #ifdef USE_LOCALE_COLLATE
3097 sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3102 SV* repl_sv_copy = NULL;
3104 if (repl_need_utf8_upgrade) {
3105 repl_sv_copy = newSVsv(repl_sv);
3106 sv_utf8_upgrade(repl_sv_copy);
3107 repl = SvPV(repl_sv_copy, repl_len);
3108 repl_is_utf8 = DO_UTF8(repl_sv_copy) && SvCUR(sv);
3110 sv_insert(sv, pos, rem, repl, repl_len);
3114 SvREFCNT_dec(repl_sv_copy);
3116 else if (lvalue) { /* it's an lvalue! */
3117 if (!SvGMAGICAL(sv)) {
3121 if (ckWARN(WARN_SUBSTR))
3122 Perl_warner(aTHX_ packWARN(WARN_SUBSTR),
3123 "Attempt to use reference as lvalue in substr");
3125 if (SvOK(sv)) /* is it defined ? */
3126 (void)SvPOK_only_UTF8(sv);
3128 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
3131 if (SvTYPE(TARG) < SVt_PVLV) {
3132 sv_upgrade(TARG, SVt_PVLV);
3133 sv_magic(TARG, Nullsv, PERL_MAGIC_substr, Nullch, 0);
3139 if (LvTARG(TARG) != sv) {
3141 SvREFCNT_dec(LvTARG(TARG));
3142 LvTARG(TARG) = SvREFCNT_inc(sv);
3144 LvTARGOFF(TARG) = upos;
3145 LvTARGLEN(TARG) = urem;
3149 PUSHs(TARG); /* avoid SvSETMAGIC here */
3156 register IV size = POPi;
3157 register IV offset = POPi;
3158 register SV *src = POPs;
3159 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3161 SvTAINTED_off(TARG); /* decontaminate */
3162 if (lvalue) { /* it's an lvalue! */
3163 if (SvREFCNT(TARG) > 1) /* don't share the TARG (#20933) */
3164 TARG = sv_newmortal();
3165 if (SvTYPE(TARG) < SVt_PVLV) {
3166 sv_upgrade(TARG, SVt_PVLV);
3167 sv_magic(TARG, Nullsv, PERL_MAGIC_vec, Nullch, 0);
3170 if (LvTARG(TARG) != src) {
3172 SvREFCNT_dec(LvTARG(TARG));
3173 LvTARG(TARG) = SvREFCNT_inc(src);
3175 LvTARGOFF(TARG) = offset;
3176 LvTARGLEN(TARG) = size;
3179 sv_setuv(TARG, do_vecget(src, offset, size));
3195 I32 arybase = PL_curcop->cop_arybase;
3202 offset = POPi - arybase;
3205 big_utf8 = DO_UTF8(big);
3206 little_utf8 = DO_UTF8(little);
3207 if (big_utf8 ^ little_utf8) {
3208 /* One needs to be upgraded. */
3209 SV *bytes = little_utf8 ? big : little;
3211 char *p = SvPV(bytes, len);
3213 temp = newSVpvn(p, len);
3216 sv_recode_to_utf8(temp, PL_encoding);
3218 sv_utf8_upgrade(temp);
3227 if (big_utf8 && offset > 0)
3228 sv_pos_u2b(big, &offset, 0);
3229 tmps = SvPV(big, biglen);
3232 else if (offset > (I32)biglen)
3234 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
3235 (unsigned char*)tmps + biglen, little, 0)))
3238 retval = tmps2 - tmps;
3239 if (retval > 0 && big_utf8)
3240 sv_pos_b2u(big, &retval);
3243 PUSHi(retval + arybase);
3259 I32 arybase = PL_curcop->cop_arybase;
3267 big_utf8 = DO_UTF8(big);
3268 little_utf8 = DO_UTF8(little);
3269 if (big_utf8 ^ little_utf8) {
3270 /* One needs to be upgraded. */
3271 SV *bytes = little_utf8 ? big : little;
3273 char *p = SvPV(bytes, len);
3275 temp = newSVpvn(p, len);
3278 sv_recode_to_utf8(temp, PL_encoding);
3280 sv_utf8_upgrade(temp);
3289 tmps2 = SvPV(little, llen);
3290 tmps = SvPV(big, blen);
3295 if (offset > 0 && big_utf8)
3296 sv_pos_u2b(big, &offset, 0);
3297 offset = offset - arybase + llen;
3301 else if (offset > (I32)blen)
3303 if (!(tmps2 = rninstr(tmps, tmps + offset,
3304 tmps2, tmps2 + llen)))
3307 retval = tmps2 - tmps;
3308 if (retval > 0 && big_utf8)
3309 sv_pos_b2u(big, &retval);
3312 PUSHi(retval + arybase);
3318 dSP; dMARK; dORIGMARK; dTARGET;
3319 do_sprintf(TARG, SP-MARK, MARK+1);
3320 TAINT_IF(SvTAINTED(TARG));
3321 if (DO_UTF8(*(MARK+1)))
3333 U8 *s = (U8*)SvPVx(argsv, len);
3336 if (PL_encoding && SvPOK(argsv) && !DO_UTF8(argsv)) {
3337 tmpsv = sv_2mortal(newSVsv(argsv));
3338 s = (U8*)sv_recode_to_utf8(tmpsv, PL_encoding);
3342 XPUSHu(DO_UTF8(argsv) ?
3343 utf8n_to_uvchr(s, UTF8_MAXBYTES, 0, UTF8_ALLOW_ANYUV) :
3355 (void)SvUPGRADE(TARG,SVt_PV);
3357 if (value > 255 && !IN_BYTES) {
3358 SvGROW(TARG, (STRLEN)UNISKIP(value)+1);
3359 tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3360 SvCUR_set(TARG, tmps - SvPVX(TARG));
3362 (void)SvPOK_only(TARG);
3371 *tmps++ = (char)value;
3373 (void)SvPOK_only(TARG);
3374 if (PL_encoding && !IN_BYTES) {
3375 sv_recode_to_utf8(TARG, PL_encoding);
3377 if (SvCUR(TARG) == 0 || !is_utf8_string((U8*)tmps, SvCUR(TARG)) ||
3378 memEQ(tmps, "\xef\xbf\xbd\0", 4)) {
3382 *tmps++ = (U8)UTF8_EIGHT_BIT_HI(value);
3383 *tmps++ = (U8)UTF8_EIGHT_BIT_LO(value);
3399 char *tmps = SvPV(left, len);
3401 if (DO_UTF8(left)) {
3402 /* If Unicode, try to downgrade.
3403 * If not possible, croak.
3404 * Yes, we made this up. */
3405 SV* tsv = sv_2mortal(newSVsv(left));
3408 sv_utf8_downgrade(tsv, FALSE);
3411 # ifdef USE_ITHREADS
3413 if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3414 /* This should be threadsafe because in ithreads there is only
3415 * one thread per interpreter. If this would not be true,
3416 * we would need a mutex to protect this malloc. */
3417 PL_reentrant_buffer->_crypt_struct_buffer =
3418 (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3419 #if defined(__GLIBC__) || defined(__EMX__)
3420 if (PL_reentrant_buffer->_crypt_struct_buffer) {
3421 PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3422 /* work around glibc-2.2.5 bug */
3423 PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3427 # endif /* HAS_CRYPT_R */
3428 # endif /* USE_ITHREADS */
3430 sv_setpv(TARG, fcrypt(tmps, SvPV(right, n_a)));
3432 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV(right, n_a)));
3438 "The crypt() function is unimplemented due to excessive paranoia.");
3451 (s = (U8*)SvPV_nomg(sv, slen)) && slen &&
3452 UTF8_IS_START(*s)) {
3453 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3457 utf8_to_uvchr(s, &ulen);
3458 toTITLE_utf8(s, tmpbuf, &tculen);
3459 utf8_to_uvchr(tmpbuf, 0);
3461 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3463 /* slen is the byte length of the whole SV.
3464 * ulen is the byte length of the original Unicode character
3465 * stored as UTF-8 at s.
3466 * tculen is the byte length of the freshly titlecased
3467 * Unicode character stored as UTF-8 at tmpbuf.
3468 * We first set the result to be the titlecased character,
3469 * and then append the rest of the SV data. */
3470 sv_setpvn(TARG, (char*)tmpbuf, tculen);
3472 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3477 s = (U8*)SvPV_force_nomg(sv, slen);
3478 Copy(tmpbuf, s, tculen, U8);
3482 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3484 SvUTF8_off(TARG); /* decontaminate */
3485 sv_setsv_nomg(TARG, sv);
3489 s = (U8*)SvPV_force_nomg(sv, slen);
3491 if (IN_LOCALE_RUNTIME) {
3494 *s = toUPPER_LC(*s);
3513 (s = (U8*)SvPV_nomg(sv, slen)) && slen &&
3514 UTF8_IS_START(*s)) {
3516 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3520 toLOWER_utf8(s, tmpbuf, &ulen);
3521 uv = utf8_to_uvchr(tmpbuf, 0);
3522 tend = uvchr_to_utf8(tmpbuf, uv);
3524 if (!SvPADTMP(sv) || (STRLEN)(tend - tmpbuf) != ulen || SvREADONLY(sv)) {
3526 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
3528 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3533 s = (U8*)SvPV_force_nomg(sv, slen);
3534 Copy(tmpbuf, s, ulen, U8);
3538 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3540 SvUTF8_off(TARG); /* decontaminate */
3541 sv_setsv_nomg(TARG, sv);
3545 s = (U8*)SvPV_force_nomg(sv, slen);
3547 if (IN_LOCALE_RUNTIME) {
3550 *s = toLOWER_LC(*s);
3573 U8 tmpbuf[UTF8_MAXBYTES+1];
3575 s = (U8*)SvPV_nomg(sv,len);
3577 SvUTF8_off(TARG); /* decontaminate */
3578 sv_setpvn(TARG, "", 0);
3582 STRLEN min = len + 1;
3584 (void)SvUPGRADE(TARG, SVt_PV);
3586 (void)SvPOK_only(TARG);
3587 d = (U8*)SvPVX(TARG);
3590 STRLEN u = UTF8SKIP(s);
3592 toUPPER_utf8(s, tmpbuf, &ulen);
3593 if (ulen > u && (SvLEN(TARG) < (min += ulen - u))) {
3594 /* If the eventually required minimum size outgrows
3595 * the available space, we need to grow. */
3596 UV o = d - (U8*)SvPVX(TARG);
3598 /* If someone uppercases one million U+03B0s we
3599 * SvGROW() one million times. Or we could try
3600 * guessing how much to allocate without allocating
3601 * too much. Such is life. */
3603 d = (U8*)SvPVX(TARG) + o;
3605 Copy(tmpbuf, d, ulen, U8);
3611 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
3616 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3618 SvUTF8_off(TARG); /* decontaminate */
3619 sv_setsv_nomg(TARG, sv);
3623 s = (U8*)SvPV_force_nomg(sv, len);
3625 register U8 *send = s + len;
3627 if (IN_LOCALE_RUNTIME) {
3630 for (; s < send; s++)
3631 *s = toUPPER_LC(*s);
3634 for (; s < send; s++)
3656 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3658 s = (U8*)SvPV_nomg(sv,len);
3660 SvUTF8_off(TARG); /* decontaminate */
3661 sv_setpvn(TARG, "", 0);
3665 STRLEN min = len + 1;
3667 (void)SvUPGRADE(TARG, SVt_PV);
3669 (void)SvPOK_only(TARG);
3670 d = (U8*)SvPVX(TARG);
3673 STRLEN u = UTF8SKIP(s);
3674 UV uv = toLOWER_utf8(s, tmpbuf, &ulen);
3676 #define GREEK_CAPITAL_LETTER_SIGMA 0x03A3 /* Unicode U+03A3 */
3677 if (uv == GREEK_CAPITAL_LETTER_SIGMA) {
3679 * Now if the sigma is NOT followed by
3680 * /$ignorable_sequence$cased_letter/;
3681 * and it IS preceded by
3682 * /$cased_letter$ignorable_sequence/;
3683 * where $ignorable_sequence is
3684 * [\x{2010}\x{AD}\p{Mn}]*
3685 * and $cased_letter is
3686 * [\p{Ll}\p{Lo}\p{Lt}]
3687 * then it should be mapped to 0x03C2,
3688 * (GREEK SMALL LETTER FINAL SIGMA),
3689 * instead of staying 0x03A3.
3690 * "should be": in other words,
3691 * this is not implemented yet.
3692 * See lib/unicore/SpecialCasing.txt.
3695 if (ulen > u && (SvLEN(TARG) < (min += ulen - u))) {
3696 /* If the eventually required minimum size outgrows
3697 * the available space, we need to grow. */
3698 UV o = d - (U8*)SvPVX(TARG);
3700 /* If someone lowercases one million U+0130s we
3701 * SvGROW() one million times. Or we could try
3702 * guessing how much to allocate without allocating.
3703 * too much. Such is life. */
3705 d = (U8*)SvPVX(TARG) + o;
3707 Copy(tmpbuf, d, ulen, U8);
3713 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
3718 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3720 SvUTF8_off(TARG); /* decontaminate */
3721 sv_setsv_nomg(TARG, sv);
3726 s = (U8*)SvPV_force_nomg(sv, len);
3728 register U8 *send = s + len;
3730 if (IN_LOCALE_RUNTIME) {
3733 for (; s < send; s++)
3734 *s = toLOWER_LC(*s);
3737 for (; s < send; s++)
3751 register char *s = SvPV(sv,len);
3754 SvUTF8_off(TARG); /* decontaminate */
3756 (void)SvUPGRADE(TARG, SVt_PV);
3757 SvGROW(TARG, (len * 2) + 1);
3761 if (UTF8_IS_CONTINUED(*s)) {
3762 STRLEN ulen = UTF8SKIP(s);
3786 SvCUR_set(TARG, d - SvPVX(TARG));
3787 (void)SvPOK_only_UTF8(TARG);
3790 sv_setpvn(TARG, s, len);
3792 if (SvSMAGICAL(TARG))
3801 dSP; dMARK; dORIGMARK;
3803 register AV* av = (AV*)POPs;
3804 register I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3805 I32 arybase = PL_curcop->cop_arybase;
3808 if (SvTYPE(av) == SVt_PVAV) {
3809 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
3811 for (svp = MARK + 1; svp <= SP; svp++) {
3816 if (max > AvMAX(av))
3819 while (++MARK <= SP) {
3820 elem = SvIVx(*MARK);
3824 svp = av_fetch(av, elem, lval);
3826 if (!svp || *svp == &PL_sv_undef)
3827 DIE(aTHX_ PL_no_aelem, elem);
3828 if (PL_op->op_private & OPpLVAL_INTRO)
3829 save_aelem(av, elem, svp);
3831 *MARK = svp ? *svp : &PL_sv_undef;
3834 if (GIMME != G_ARRAY) {
3836 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
3842 /* Associative arrays. */
3847 HV *hash = (HV*)POPs;
3849 I32 gimme = GIMME_V;
3850 I32 realhv = (SvTYPE(hash) == SVt_PVHV);
3853 /* might clobber stack_sp */
3854 entry = realhv ? hv_iternext(hash) : avhv_iternext((AV*)hash);
3859 SV* sv = hv_iterkeysv(entry);
3860 PUSHs(sv); /* won't clobber stack_sp */
3861 if (gimme == G_ARRAY) {
3864 /* might clobber stack_sp */
3866 hv_iterval(hash, entry) : avhv_iterval((AV*)hash, entry);
3871 else if (gimme == G_SCALAR)
3890 I32 gimme = GIMME_V;
3891 I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
3895 if (PL_op->op_private & OPpSLICE) {
3899 hvtype = SvTYPE(hv);
3900 if (hvtype == SVt_PVHV) { /* hash element */
3901 while (++MARK <= SP) {
3902 sv = hv_delete_ent(hv, *MARK, discard, 0);
3903 *MARK = sv ? sv : &PL_sv_undef;
3906 else if (hvtype == SVt_PVAV) {
3907 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
3908 while (++MARK <= SP) {
3909 sv = av_delete((AV*)hv, SvIV(*MARK), discard);
3910 *MARK = sv ? sv : &PL_sv_undef;
3913 else { /* pseudo-hash element */
3914 while (++MARK <= SP) {
3915 sv = avhv_delete_ent((AV*)hv, *MARK, discard, 0);
3916 *MARK = sv ? sv : &PL_sv_undef;
3921 DIE(aTHX_ "Not a HASH reference");
3924 else if (gimme == G_SCALAR) {
3929 *++MARK = &PL_sv_undef;
3936 if (SvTYPE(hv) == SVt_PVHV)
3937 sv = hv_delete_ent(hv, keysv, discard, 0);
3938 else if (SvTYPE(hv) == SVt_PVAV) {
3939 if (PL_op->op_flags & OPf_SPECIAL)
3940 sv = av_delete((AV*)hv, SvIV(keysv), discard);
3942 sv = avhv_delete_ent((AV*)hv, keysv, discard, 0);
3945 DIE(aTHX_ "Not a HASH reference");
3960 if (PL_op->op_private & OPpEXISTS_SUB) {
3964 cv = sv_2cv(sv, &hv, &gv, FALSE);
3967 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
3973 if (SvTYPE(hv) == SVt_PVHV) {
3974 if (hv_exists_ent(hv, tmpsv, 0))
3977 else if (SvTYPE(hv) == SVt_PVAV) {
3978 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
3979 if (av_exists((AV*)hv, SvIV(tmpsv)))
3982 else if (avhv_exists_ent((AV*)hv, tmpsv, 0)) /* pseudo-hash element */
3986 DIE(aTHX_ "Not a HASH reference");
3993 dSP; dMARK; dORIGMARK;
3994 register HV *hv = (HV*)POPs;
3995 register I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3996 I32 realhv = (SvTYPE(hv) == SVt_PVHV);
3997 bool localizing = PL_op->op_private & OPpLVAL_INTRO ? TRUE : FALSE;
3998 bool other_magic = FALSE;
4004 other_magic = mg_find((SV*)hv, PERL_MAGIC_env) ||
4005 ((mg = mg_find((SV*)hv, PERL_MAGIC_tied))
4006 /* Try to preserve the existenceness of a tied hash
4007 * element by using EXISTS and DELETE if possible.
4008 * Fallback to FETCH and STORE otherwise */
4009 && (stash = SvSTASH(SvRV(SvTIED_obj((SV*)hv, mg))))
4010 && gv_fetchmethod_autoload(stash, "EXISTS", TRUE)
4011 && gv_fetchmethod_autoload(stash, "DELETE", TRUE));
4014 if (!realhv && localizing)
4015 DIE(aTHX_ "Can't localize pseudo-hash element");
4017 if (realhv || SvTYPE(hv) == SVt_PVAV) {
4018 while (++MARK <= SP) {
4021 bool preeminent = FALSE;
4024 preeminent = SvRMAGICAL(hv) && !other_magic ? 1 :
4025 realhv ? hv_exists_ent(hv, keysv, 0)
4026 : avhv_exists_ent((AV*)hv, keysv, 0);
4030 HE *he = hv_fetch_ent(hv, keysv, lval, 0);
4031 svp = he ? &HeVAL(he) : 0;
4034 svp = avhv_fetch_ent((AV*)hv, keysv, lval, 0);
4037 if (!svp || *svp == &PL_sv_undef) {
4039 DIE(aTHX_ PL_no_helem, SvPV(keysv, n_a));
4043 save_helem(hv, keysv, svp);
4046 char *key = SvPV(keysv, keylen);
4047 SAVEDELETE(hv, savepvn(key,keylen), keylen);
4051 *MARK = svp ? *svp : &PL_sv_undef;
4054 if (GIMME != G_ARRAY) {
4056 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
4062 /* List operators. */
4067 if (GIMME != G_ARRAY) {
4069 *MARK = *SP; /* unwanted list, return last item */
4071 *MARK = &PL_sv_undef;
4080 SV **lastrelem = PL_stack_sp;
4081 SV **lastlelem = PL_stack_base + POPMARK;
4082 SV **firstlelem = PL_stack_base + POPMARK + 1;
4083 register SV **firstrelem = lastlelem + 1;
4084 I32 arybase = PL_curcop->cop_arybase;
4085 I32 lval = PL_op->op_flags & OPf_MOD;
4086 I32 is_something_there = lval;
4088 register I32 max = lastrelem - lastlelem;
4089 register SV **lelem;
4092 if (GIMME != G_ARRAY) {
4093 ix = SvIVx(*lastlelem);
4098 if (ix < 0 || ix >= max)
4099 *firstlelem = &PL_sv_undef;
4101 *firstlelem = firstrelem[ix];
4107 SP = firstlelem - 1;
4111 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
4117 if (ix < 0 || ix >= max)
4118 *lelem = &PL_sv_undef;
4120 is_something_there = TRUE;
4121 if (!(*lelem = firstrelem[ix]))
4122 *lelem = &PL_sv_undef;
4125 if (is_something_there)
4128 SP = firstlelem - 1;
4134 dSP; dMARK; dORIGMARK;
4135 I32 items = SP - MARK;
4136 SV *av = sv_2mortal((SV*)av_make(items, MARK+1));
4137 SP = ORIGMARK; /* av_make() might realloc stack_sp */
4144 dSP; dMARK; dORIGMARK;
4145 HV* hv = (HV*)sv_2mortal((SV*)newHV());
4149 SV *val = NEWSV(46, 0);
4151 sv_setsv(val, *++MARK);
4152 else if (ckWARN(WARN_MISC))
4153 Perl_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
4154 (void)hv_store_ent(hv,key,val,0);
4163 dSP; dMARK; dORIGMARK;
4164 register AV *ary = (AV*)*++MARK;
4168 register I32 offset;
4169 register I32 length;
4176 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4177 *MARK-- = SvTIED_obj((SV*)ary, mg);
4181 call_method("SPLICE",GIMME_V);
4190 offset = i = SvIVx(*MARK);
4192 offset += AvFILLp(ary) + 1;
4194 offset -= PL_curcop->cop_arybase;
4196 DIE(aTHX_ PL_no_aelem, i);
4198 length = SvIVx(*MARK++);
4200 length += AvFILLp(ary) - offset + 1;
4206 length = AvMAX(ary) + 1; /* close enough to infinity */
4210 length = AvMAX(ary) + 1;
4212 if (offset > AvFILLp(ary) + 1) {
4213 if (ckWARN(WARN_MISC))
4214 Perl_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
4215 offset = AvFILLp(ary) + 1;
4217 after = AvFILLp(ary) + 1 - (offset + length);
4218 if (after < 0) { /* not that much array */
4219 length += after; /* offset+length now in array */
4225 /* At this point, MARK .. SP-1 is our new LIST */
4228 diff = newlen - length;
4229 if (newlen && !AvREAL(ary) && AvREIFY(ary))
4232 /* make new elements SVs now: avoid problems if they're from the array */
4233 for (dst = MARK, i = newlen; i; i--) {
4235 *dst++ = newSVsv(h);
4238 if (diff < 0) { /* shrinking the area */
4240 New(451, tmparyval, newlen, SV*); /* so remember insertion */
4241 Copy(MARK, tmparyval, newlen, SV*);
4244 MARK = ORIGMARK + 1;
4245 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4246 MEXTEND(MARK, length);
4247 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
4249 EXTEND_MORTAL(length);
4250 for (i = length, dst = MARK; i; i--) {
4251 sv_2mortal(*dst); /* free them eventualy */
4258 *MARK = AvARRAY(ary)[offset+length-1];
4261 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
4262 SvREFCNT_dec(*dst++); /* free them now */
4265 AvFILLp(ary) += diff;
4267 /* pull up or down? */
4269 if (offset < after) { /* easier to pull up */
4270 if (offset) { /* esp. if nothing to pull */
4271 src = &AvARRAY(ary)[offset-1];
4272 dst = src - diff; /* diff is negative */
4273 for (i = offset; i > 0; i--) /* can't trust Copy */
4277 SvPV_set(ary, (char*)(AvARRAY(ary) - diff)); /* diff is negative */
4281 if (after) { /* anything to pull down? */
4282 src = AvARRAY(ary) + offset + length;
4283 dst = src + diff; /* diff is negative */
4284 Move(src, dst, after, SV*);
4286 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
4287 /* avoid later double free */
4291 dst[--i] = &PL_sv_undef;
4294 Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
4295 Safefree(tmparyval);
4298 else { /* no, expanding (or same) */
4300 New(452, tmparyval, length, SV*); /* so remember deletion */
4301 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
4304 if (diff > 0) { /* expanding */
4306 /* push up or down? */
4308 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
4312 Move(src, dst, offset, SV*);
4314 SvPV_set(ary, (char*)(AvARRAY(ary) - diff));/* diff is positive */
4316 AvFILLp(ary) += diff;
4319 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
4320 av_extend(ary, AvFILLp(ary) + diff);
4321 AvFILLp(ary) += diff;
4324 dst = AvARRAY(ary) + AvFILLp(ary);
4326 for (i = after; i; i--) {
4334 Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
4337 MARK = ORIGMARK + 1;
4338 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4340 Copy(tmparyval, MARK, length, SV*);
4342 EXTEND_MORTAL(length);
4343 for (i = length, dst = MARK; i; i--) {
4344 sv_2mortal(*dst); /* free them eventualy */
4348 Safefree(tmparyval);
4352 else if (length--) {
4353 *MARK = tmparyval[length];
4356 while (length-- > 0)
4357 SvREFCNT_dec(tmparyval[length]);
4359 Safefree(tmparyval);
4362 *MARK = &PL_sv_undef;
4370 dSP; dMARK; dORIGMARK; dTARGET;
4371 register AV *ary = (AV*)*++MARK;
4372 register SV *sv = &PL_sv_undef;
4375 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4376 *MARK-- = SvTIED_obj((SV*)ary, mg);
4380 call_method("PUSH",G_SCALAR|G_DISCARD);
4385 /* Why no pre-extend of ary here ? */
4386 for (++MARK; MARK <= SP; MARK++) {
4389 sv_setsv(sv, *MARK);
4394 PUSHi( AvFILL(ary) + 1 );
4402 SV *sv = av_pop(av);
4404 (void)sv_2mortal(sv);
4413 SV *sv = av_shift(av);
4418 (void)sv_2mortal(sv);
4425 dSP; dMARK; dORIGMARK; dTARGET;
4426 register AV *ary = (AV*)*++MARK;
4431 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4432 *MARK-- = SvTIED_obj((SV*)ary, mg);
4436 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
4441 av_unshift(ary, SP - MARK);
4443 sv = newSVsv(*++MARK);
4444 (void)av_store(ary, i++, sv);
4448 PUSHi( AvFILL(ary) + 1 );
4458 if (GIMME == G_ARRAY) {
4465 /* safe as long as stack cannot get extended in the above */
4470 register char *down;
4475 SvUTF8_off(TARG); /* decontaminate */
4477 do_join(TARG, &PL_sv_no, MARK, SP);
4479 sv_setsv(TARG, (SP > MARK) ? *SP : DEFSV);
4480 up = SvPV_force(TARG, len);
4482 if (DO_UTF8(TARG)) { /* first reverse each character */
4483 U8* s = (U8*)SvPVX(TARG);
4484 U8* send = (U8*)(s + len);
4486 if (UTF8_IS_INVARIANT(*s)) {
4491 if (!utf8_to_uvchr(s, 0))
4495 down = (char*)(s - 1);
4496 /* reverse this character */
4500 *down-- = (char)tmp;
4506 down = SvPVX(TARG) + len - 1;
4510 *down-- = (char)tmp;
4512 (void)SvPOK_only_UTF8(TARG);
4524 register IV limit = POPi; /* note, negative is forever */
4527 register char *s = SvPV(sv, len);
4528 bool do_utf8 = DO_UTF8(sv);
4529 char *strend = s + len;
4531 register REGEXP *rx;
4535 STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (strend - s);
4536 I32 maxiters = slen + 10;
4539 I32 origlimit = limit;
4542 I32 gimme = GIMME_V;
4543 I32 oldsave = PL_savestack_ix;
4544 I32 make_mortal = 1;
4545 MAGIC *mg = (MAGIC *) NULL;
4548 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4553 DIE(aTHX_ "panic: pp_split");
4556 TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
4557 (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
4559 RX_MATCH_UTF8_set(rx, do_utf8);
4561 if (pm->op_pmreplroot) {
4563 ary = GvAVn((GV*)PAD_SVl(INT2PTR(PADOFFSET, pm->op_pmreplroot)));
4565 ary = GvAVn((GV*)pm->op_pmreplroot);
4568 else if (gimme != G_ARRAY)
4569 #ifdef USE_5005THREADS
4570 ary = (AV*)PAD_SVl(0);
4572 ary = GvAVn(PL_defgv);
4573 #endif /* USE_5005THREADS */
4576 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4582 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4584 XPUSHs(SvTIED_obj((SV*)ary, mg));
4590 for (i = AvFILLp(ary); i >= 0; i--)
4591 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
4593 /* temporarily switch stacks */
4594 SAVESWITCHSTACK(PL_curstack, ary);
4598 base = SP - PL_stack_base;
4600 if (pm->op_pmflags & PMf_SKIPWHITE) {
4601 if (pm->op_pmflags & PMf_LOCALE) {
4602 while (isSPACE_LC(*s))
4610 if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
4611 SAVEINT(PL_multiline);
4612 PL_multiline = pm->op_pmflags & PMf_MULTILINE;
4616 limit = maxiters + 2;
4617 if (pm->op_pmflags & PMf_WHITE) {
4620 while (m < strend &&
4621 !((pm->op_pmflags & PMf_LOCALE)
4622 ? isSPACE_LC(*m) : isSPACE(*m)))
4627 dstr = newSVpvn(s, m-s);
4631 (void)SvUTF8_on(dstr);
4635 while (s < strend &&
4636 ((pm->op_pmflags & PMf_LOCALE)
4637 ? isSPACE_LC(*s) : isSPACE(*s)))
4641 else if (rx->precomp[0] == '^' && rx->precomp[1] == '\0') {
4644 for (m = s; m < strend && *m != '\n'; m++) ;
4648 dstr = newSVpvn(s, m-s);
4652 (void)SvUTF8_on(dstr);
4657 else if (do_utf8 == ((rx->reganch & ROPT_UTF8) != 0) &&
4658 (rx->reganch & RE_USE_INTUIT) && !rx->nparens
4659 && (rx->reganch & ROPT_CHECK_ALL)
4660 && !(rx->reganch & ROPT_ANCH)) {
4661 int tail = (rx->reganch & RE_INTUIT_TAIL);
4662 SV *csv = CALLREG_INTUIT_STRING(aTHX_ rx);
4665 if (len == 1 && !(rx->reganch & ROPT_UTF8) && !tail) {
4667 char c = *SvPV(csv, n_a);
4670 for (m = s; m < strend && *m != c; m++) ;
4673 dstr = newSVpvn(s, m-s);
4677 (void)SvUTF8_on(dstr);
4679 /* The rx->minlen is in characters but we want to step
4680 * s ahead by bytes. */
4682 s = (char*)utf8_hop((U8*)m, len);
4684 s = m + len; /* Fake \n at the end */
4689 while (s < strend && --limit &&
4690 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
4691 csv, PL_multiline ? FBMrf_MULTILINE : 0)) )
4694 dstr = newSVpvn(s, m-s);
4698 (void)SvUTF8_on(dstr);
4700 /* The rx->minlen is in characters but we want to step
4701 * s ahead by bytes. */
4703 s = (char*)utf8_hop((U8*)m, len);
4705 s = m + len; /* Fake \n at the end */
4710 maxiters += slen * rx->nparens;
4711 while (s < strend && --limit)
4714 i = CALLREGEXEC(aTHX_ rx, s, strend, orig, 1 , sv, NULL, 0);
4718 TAINT_IF(RX_MATCH_TAINTED(rx));
4719 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
4724 strend = s + (strend - m);
4726 m = rx->startp[0] + orig;
4727 dstr = newSVpvn(s, m-s);
4731 (void)SvUTF8_on(dstr);
4734 for (i = 1; i <= (I32)rx->nparens; i++) {
4735 s = rx->startp[i] + orig;
4736 m = rx->endp[i] + orig;
4738 /* japhy (07/27/01) -- the (m && s) test doesn't catch
4739 parens that didn't match -- they should be set to
4740 undef, not the empty string */
4741 if (m >= orig && s >= orig) {
4742 dstr = newSVpvn(s, m-s);
4745 dstr = &PL_sv_undef; /* undef, not "" */
4749 (void)SvUTF8_on(dstr);
4753 s = rx->endp[0] + orig;
4757 iters = (SP - PL_stack_base) - base;
4758 if (iters > maxiters)
4759 DIE(aTHX_ "Split loop");
4761 /* keep field after final delim? */
4762 if (s < strend || (iters && origlimit)) {
4763 STRLEN l = strend - s;
4764 dstr = newSVpvn(s, l);
4768 (void)SvUTF8_on(dstr);
4772 else if (!origlimit) {
4773 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
4774 if (TOPs && !make_mortal)
4777 *SP-- = &PL_sv_undef;
4782 LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */
4786 if (SvSMAGICAL(ary)) {
4791 if (gimme == G_ARRAY) {
4793 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4801 call_method("PUSH",G_SCALAR|G_DISCARD);
4804 if (gimme == G_ARRAY) {
4805 /* EXTEND should not be needed - we just popped them */
4807 for (i=0; i < iters; i++) {
4808 SV **svp = av_fetch(ary, i, FALSE);
4809 PUSHs((svp) ? *svp : &PL_sv_undef);
4816 if (gimme == G_ARRAY)
4825 #ifdef USE_5005THREADS
4827 Perl_unlock_condpair(pTHX_ void *svv)
4829 MAGIC *mg = mg_find((SV*)svv, PERL_MAGIC_mutex);
4832 Perl_croak(aTHX_ "panic: unlock_condpair unlocking non-mutex");
4833 MUTEX_LOCK(MgMUTEXP(mg));
4834 if (MgOWNER(mg) != thr)
4835 Perl_croak(aTHX_ "panic: unlock_condpair unlocking mutex that we don't own");
4837 COND_SIGNAL(MgOWNERCONDP(mg));
4838 DEBUG_S(PerlIO_printf(Perl_debug_log, "0x%"UVxf": unlock 0x%"UVxf"\n",
4839 PTR2UV(thr), PTR2UV(svv)));
4840 MUTEX_UNLOCK(MgMUTEXP(mg));
4842 #endif /* USE_5005THREADS */
4850 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
4851 || SvTYPE(retsv) == SVt_PVCV) {
4852 retsv = refto(retsv);
4860 #ifdef USE_5005THREADS
4863 if (PL_op->op_private & OPpLVAL_INTRO)
4864 PUSHs(*save_threadsv(PL_op->op_targ));
4866 PUSHs(THREADSV(PL_op->op_targ));
4869 DIE(aTHX_ "tried to access per-thread data in non-threaded perl");
4870 #endif /* USE_5005THREADS */
4875 * c-indentation-style: bsd
4877 * indent-tabs-mode: t
4880 * vim: shiftwidth=4: