3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * "It's a big house this, and very peculiar. Always a bit more to discover,
13 * and no knowing what you'll find around a corner. And Elves, sir!" --Samwise
16 /* This file contains general pp ("push/pop") functions that execute the
17 * opcodes that make up a perl program. A typical pp function expects to
18 * find its arguments on the stack, and usually pushes its results onto
19 * the stack, hence the 'pp' terminology. Each OP structure contains
20 * a pointer to the relevant pp_foo() function.
30 /* XXX I can't imagine anyone who doesn't have this actually _needs_
31 it, since pid_t is an integral type.
34 #ifdef NEED_GETPID_PROTO
35 extern Pid_t getpid (void);
39 * Some BSDs and Cygwin default to POSIX math instead of IEEE.
40 * This switches them over to IEEE.
42 #if defined(LIBM_LIB_VERSION)
43 _LIB_VERSION_TYPE _LIB_VERSION = _IEEE_;
46 /* variations on pp_null */
52 if (GIMME_V == G_SCALAR)
63 if (PL_op->op_private & OPpLVAL_INTRO)
64 if (!(PL_op->op_private & OPpPAD_STATE))
65 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
67 if (PL_op->op_flags & OPf_REF) {
71 if (GIMME == G_SCALAR)
72 Perl_croak(aTHX_ "Can't return array to lvalue scalar context");
77 if (gimme == G_ARRAY) {
78 const I32 maxarg = AvFILL((AV*)TARG) + 1;
80 if (SvMAGICAL(TARG)) {
82 for (i=0; i < (U32)maxarg; i++) {
83 SV * const * const svp = av_fetch((AV*)TARG, i, FALSE);
84 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
88 Copy(AvARRAY((AV*)TARG), SP+1, maxarg, SV*);
92 else if (gimme == G_SCALAR) {
93 SV* const sv = sv_newmortal();
94 const I32 maxarg = AvFILL((AV*)TARG) + 1;
107 if (PL_op->op_private & OPpLVAL_INTRO)
108 if (!(PL_op->op_private & OPpPAD_STATE))
109 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
110 if (PL_op->op_flags & OPf_REF)
113 if (GIMME == G_SCALAR)
114 Perl_croak(aTHX_ "Can't return hash to lvalue scalar context");
118 if (gimme == G_ARRAY) {
121 else if (gimme == G_SCALAR) {
122 SV* const sv = Perl_hv_scalar(aTHX_ (HV*)TARG);
136 tryAMAGICunDEREF(to_gv);
139 if (SvTYPE(sv) == SVt_PVIO) {
140 GV * const gv = (GV*) sv_newmortal();
141 gv_init(gv, 0, "", 0, 0);
142 GvIOp(gv) = (IO *)sv;
143 SvREFCNT_inc_void_NN(sv);
146 else if (SvTYPE(sv) != SVt_PVGV)
147 DIE(aTHX_ "Not a GLOB reference");
150 if (SvTYPE(sv) != SVt_PVGV) {
151 if (SvGMAGICAL(sv)) {
156 if (!SvOK(sv) && sv != &PL_sv_undef) {
157 /* If this is a 'my' scalar and flag is set then vivify
161 Perl_croak(aTHX_ PL_no_modify);
162 if (PL_op->op_private & OPpDEREF) {
164 if (cUNOP->op_targ) {
166 SV * const namesv = PAD_SV(cUNOP->op_targ);
167 const char * const name = SvPV(namesv, len);
169 gv_init(gv, CopSTASH(PL_curcop), name, len, 0);
172 const char * const name = CopSTASHPV(PL_curcop);
175 prepare_SV_for_RV(sv);
176 SvRV_set(sv, (SV*)gv);
181 if (PL_op->op_flags & OPf_REF ||
182 PL_op->op_private & HINT_STRICT_REFS)
183 DIE(aTHX_ PL_no_usym, "a symbol");
184 if (ckWARN(WARN_UNINITIALIZED))
188 if ((PL_op->op_flags & OPf_SPECIAL) &&
189 !(PL_op->op_flags & OPf_MOD))
191 SV * const temp = (SV*)gv_fetchsv(sv, 0, SVt_PVGV);
193 && (!is_gv_magical_sv(sv,0)
194 || !(sv = (SV*)gv_fetchsv(sv, GV_ADD, SVt_PVGV)))) {
200 if (PL_op->op_private & HINT_STRICT_REFS)
201 DIE(aTHX_ PL_no_symref_sv, sv, "a symbol");
202 if ((PL_op->op_private & (OPpLVAL_INTRO|OPpDONT_INIT_GV))
203 == OPpDONT_INIT_GV) {
204 /* We are the target of a coderef assignment. Return
205 the scalar unchanged, and let pp_sasssign deal with
209 sv = (SV*)gv_fetchsv(sv, GV_ADD, SVt_PVGV);
213 if (PL_op->op_private & OPpLVAL_INTRO)
214 save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
219 /* Helper function for pp_rv2sv and pp_rv2av */
221 Perl_softref2xv(pTHX_ SV *const sv, const char *const what,
222 const svtype type, SV ***spp)
227 PERL_ARGS_ASSERT_SOFTREF2XV;
229 if (PL_op->op_private & HINT_STRICT_REFS) {
231 Perl_die(aTHX_ PL_no_symref_sv, sv, what);
233 Perl_die(aTHX_ PL_no_usym, what);
236 if (PL_op->op_flags & OPf_REF)
237 Perl_die(aTHX_ PL_no_usym, what);
238 if (ckWARN(WARN_UNINITIALIZED))
240 if (type != SVt_PV && GIMME_V == G_ARRAY) {
244 **spp = &PL_sv_undef;
247 if ((PL_op->op_flags & OPf_SPECIAL) &&
248 !(PL_op->op_flags & OPf_MOD))
250 gv = gv_fetchsv(sv, 0, type);
252 && (!is_gv_magical_sv(sv,0)
253 || !(gv = gv_fetchsv(sv, GV_ADD, type))))
255 **spp = &PL_sv_undef;
260 gv = gv_fetchsv(sv, GV_ADD, type);
272 tryAMAGICunDEREF(to_sv);
275 switch (SvTYPE(sv)) {
281 DIE(aTHX_ "Not a SCALAR reference");
288 if (SvTYPE(gv) != SVt_PVGV) {
289 if (SvGMAGICAL(sv)) {
294 gv = Perl_softref2xv(aTHX_ sv, "a SCALAR", SVt_PV, &sp);
300 if (PL_op->op_flags & OPf_MOD) {
301 if (PL_op->op_private & OPpLVAL_INTRO) {
302 if (cUNOP->op_first->op_type == OP_NULL)
303 sv = save_scalar((GV*)TOPs);
305 sv = save_scalar(gv);
307 Perl_croak(aTHX_ PL_no_localize_ref);
309 else if (PL_op->op_private & OPpDEREF)
310 vivify_ref(sv, PL_op->op_private & OPpDEREF);
319 AV * const av = (AV*)TOPs;
320 SV ** const sv = Perl_av_arylen_p(aTHX_ (AV*)av);
322 *sv = newSV_type(SVt_PVMG);
323 sv_magic(*sv, (SV*)av, PERL_MAGIC_arylen, NULL, 0);
331 dVAR; dSP; dTARGET; dPOPss;
333 if (PL_op->op_flags & OPf_MOD || LVRET) {
334 if (SvTYPE(TARG) < SVt_PVLV) {
335 sv_upgrade(TARG, SVt_PVLV);
336 sv_magic(TARG, NULL, PERL_MAGIC_pos, NULL, 0);
340 if (LvTARG(TARG) != sv) {
342 SvREFCNT_dec(LvTARG(TARG));
343 LvTARG(TARG) = SvREFCNT_inc_simple(sv);
345 PUSHs(TARG); /* no SvSETMAGIC */
349 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
350 const MAGIC * const mg = mg_find(sv, PERL_MAGIC_regex_global);
351 if (mg && mg->mg_len >= 0) {
355 PUSHi(i + CopARYBASE_get(PL_curcop));
368 const I32 flags = (PL_op->op_flags & OPf_SPECIAL)
370 : ((PL_op->op_private & (OPpLVAL_INTRO|OPpMAY_RETURN_CONSTANT)) == OPpMAY_RETURN_CONSTANT)
373 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
374 /* (But not in defined().) */
376 CV *cv = sv_2cv(TOPs, &stash_unused, &gv, flags);
379 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
380 if ((PL_op->op_private & OPpLVAL_INTRO)) {
381 if (gv && GvCV(gv) == cv && (gv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv), FALSE)))
384 DIE(aTHX_ "Can't modify non-lvalue subroutine call");
387 else if ((flags == (GV_ADD|GV_NOEXPAND)) && gv && SvROK(gv)) {
391 cv = (CV*)&PL_sv_undef;
402 SV *ret = &PL_sv_undef;
404 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
405 const char * s = SvPVX_const(TOPs);
406 if (strnEQ(s, "CORE::", 6)) {
407 const int code = keyword(s + 6, SvCUR(TOPs) - 6, 1);
408 if (code < 0) { /* Overridable. */
409 #define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
410 int i = 0, n = 0, seen_question = 0, defgv = 0;
412 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
414 if (code == -KEY_chop || code == -KEY_chomp
415 || code == -KEY_exec || code == -KEY_system)
417 if (code == -KEY_mkdir) {
418 ret = newSVpvs_flags("_;$", SVs_TEMP);
421 if (code == -KEY_readpipe) {
422 s = "CORE::backtick";
424 while (i < MAXO) { /* The slow way. */
425 if (strEQ(s + 6, PL_op_name[i])
426 || strEQ(s + 6, PL_op_desc[i]))
432 goto nonesuch; /* Should not happen... */
434 defgv = PL_opargs[i] & OA_DEFGV;
435 oa = PL_opargs[i] >> OASHIFT;
437 if (oa & OA_OPTIONAL && !seen_question && !defgv) {
441 if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
442 && (oa & (OA_OPTIONAL - 1)) <= OA_SCALARREF
443 /* But globs are already references (kinda) */
444 && (oa & (OA_OPTIONAL - 1)) != OA_FILEREF
448 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
451 if (defgv && str[n - 1] == '$')
454 ret = newSVpvn_flags(str, n - 1, SVs_TEMP);
456 else if (code) /* Non-Overridable */
458 else { /* None such */
460 DIE(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
464 cv = sv_2cv(TOPs, &stash, &gv, 0);
466 ret = newSVpvn_flags(SvPVX_const(cv), SvCUR(cv), SVs_TEMP);
475 CV* cv = (CV*)PAD_SV(PL_op->op_targ);
477 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
493 if (GIMME != G_ARRAY) {
497 *MARK = &PL_sv_undef;
498 *MARK = refto(*MARK);
502 EXTEND_MORTAL(SP - MARK);
504 *MARK = refto(*MARK);
509 S_refto(pTHX_ SV *sv)
514 PERL_ARGS_ASSERT_REFTO;
516 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
519 if (!(sv = LvTARG(sv)))
522 SvREFCNT_inc_void_NN(sv);
524 else if (SvTYPE(sv) == SVt_PVAV) {
525 if (!AvREAL((AV*)sv) && AvREIFY((AV*)sv))
528 SvREFCNT_inc_void_NN(sv);
530 else if (SvPADTMP(sv) && !IS_PADGV(sv))
534 SvREFCNT_inc_void_NN(sv);
537 sv_upgrade(rv, SVt_IV);
547 SV * const sv = POPs;
552 if (!sv || !SvROK(sv))
555 pv = sv_reftype(SvRV(sv),TRUE);
556 PUSHp(pv, strlen(pv));
566 stash = CopSTASH(PL_curcop);
568 SV * const ssv = POPs;
572 if (ssv && !SvGMAGICAL(ssv) && !SvAMAGIC(ssv) && SvROK(ssv))
573 Perl_croak(aTHX_ "Attempt to bless into a reference");
574 ptr = SvPV_const(ssv,len);
575 if (len == 0 && ckWARN(WARN_MISC))
576 Perl_warner(aTHX_ packWARN(WARN_MISC),
577 "Explicit blessing to '' (assuming package main)");
578 stash = gv_stashpvn(ptr, len, GV_ADD);
581 (void)sv_bless(TOPs, stash);
590 const char * const elem = SvPV_nolen_const(sv);
591 GV * const gv = (GV*)POPs;
596 /* elem will always be NUL terminated. */
597 const char * const second_letter = elem + 1;
600 if (strEQ(second_letter, "RRAY"))
601 tmpRef = (SV*)GvAV(gv);
604 if (strEQ(second_letter, "ODE"))
605 tmpRef = (SV*)GvCVu(gv);
608 if (strEQ(second_letter, "ILEHANDLE")) {
609 /* finally deprecated in 5.8.0 */
610 deprecate("*glob{FILEHANDLE}");
611 tmpRef = (SV*)GvIOp(gv);
614 if (strEQ(second_letter, "ORMAT"))
615 tmpRef = (SV*)GvFORM(gv);
618 if (strEQ(second_letter, "LOB"))
622 if (strEQ(second_letter, "ASH"))
623 tmpRef = (SV*)GvHV(gv);
626 if (*second_letter == 'O' && !elem[2])
627 tmpRef = (SV*)GvIOp(gv);
630 if (strEQ(second_letter, "AME"))
631 sv = newSVhek(GvNAME_HEK(gv));
634 if (strEQ(second_letter, "ACKAGE")) {
635 const HV * const stash = GvSTASH(gv);
636 const HEK * const hek = stash ? HvNAME_HEK(stash) : NULL;
637 sv = hek ? newSVhek(hek) : newSVpvs("__ANON__");
641 if (strEQ(second_letter, "CALAR"))
656 /* Pattern matching */
661 register unsigned char *s;
664 register I32 *sfirst;
668 if (sv == PL_lastscream) {
672 s = (unsigned char*)(SvPV(sv, len));
674 if (pos <= 0 || !SvPOK(sv) || SvUTF8(sv)) {
675 /* No point in studying a zero length string, and not safe to study
676 anything that doesn't appear to be a simple scalar (and hence might
677 change between now and when the regexp engine runs without our set
678 magic ever running) such as a reference to an object with overloaded
684 SvSCREAM_off(PL_lastscream);
685 SvREFCNT_dec(PL_lastscream);
687 PL_lastscream = SvREFCNT_inc_simple(sv);
689 s = (unsigned char*)(SvPV(sv, len));
693 if (pos > PL_maxscream) {
694 if (PL_maxscream < 0) {
695 PL_maxscream = pos + 80;
696 Newx(PL_screamfirst, 256, I32);
697 Newx(PL_screamnext, PL_maxscream, I32);
700 PL_maxscream = pos + pos / 4;
701 Renew(PL_screamnext, PL_maxscream, I32);
705 sfirst = PL_screamfirst;
706 snext = PL_screamnext;
708 if (!sfirst || !snext)
709 DIE(aTHX_ "do_study: out of memory");
711 for (ch = 256; ch; --ch)
716 register const I32 ch = s[pos];
718 snext[pos] = sfirst[ch] - pos;
725 /* piggyback on m//g magic */
726 sv_magic(sv, NULL, PERL_MAGIC_regex_global, NULL, 0);
735 if (PL_op->op_flags & OPf_STACKED)
737 else if (PL_op->op_private & OPpTARGET_MY)
743 TARG = sv_newmortal();
748 /* Lvalue operators. */
760 dVAR; dSP; dMARK; dTARGET; dORIGMARK;
762 do_chop(TARG, *++MARK);
771 SETi(do_chomp(TOPs));
777 dVAR; dSP; dMARK; dTARGET;
778 register I32 count = 0;
781 count += do_chomp(POPs);
791 if (!PL_op->op_private) {
800 SV_CHECK_THINKFIRST_COW_DROP(sv);
802 switch (SvTYPE(sv)) {
812 if (cv_const_sv((CV*)sv) && ckWARN(WARN_MISC))
813 Perl_warner(aTHX_ packWARN(WARN_MISC), "Constant subroutine %s undefined",
814 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
818 /* let user-undef'd sub keep its identity */
819 GV* const gv = CvGV((CV*)sv);
826 SvSetMagicSV(sv, &PL_sv_undef);
832 if((stash = GvHV((GV*)sv)) && HvNAME_get(stash))
833 mro_isa_changed_in(stash);
834 /* undef *Pkg::meth_name ... */
835 else if(GvCVu((GV*)sv) && (stash = GvSTASH((GV*)sv)) && HvNAME_get(stash))
836 mro_method_changed_in(stash);
840 GvGP(sv) = gp_ref(gp);
842 GvLINE(sv) = CopLINE(PL_curcop);
848 if (SvTYPE(sv) >= SVt_PV && SvPVX_const(sv) && SvLEN(sv)) {
863 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
864 DIE(aTHX_ PL_no_modify);
865 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
866 && SvIVX(TOPs) != IV_MIN)
868 SvIV_set(TOPs, SvIVX(TOPs) - 1);
869 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
880 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
881 DIE(aTHX_ PL_no_modify);
882 sv_setsv(TARG, TOPs);
883 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
884 && SvIVX(TOPs) != IV_MAX)
886 SvIV_set(TOPs, SvIVX(TOPs) + 1);
887 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
892 /* special case for undef: see thread at 2003-03/msg00536.html in archive */
902 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
903 DIE(aTHX_ PL_no_modify);
904 sv_setsv(TARG, TOPs);
905 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
906 && SvIVX(TOPs) != IV_MIN)
908 SvIV_set(TOPs, SvIVX(TOPs) - 1);
909 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
918 /* Ordinary operators. */
922 dVAR; dSP; dATARGET; SV *svl, *svr;
923 #ifdef PERL_PRESERVE_IVUV
926 tryAMAGICbin(pow,opASSIGN);
927 svl = sv_2num(TOPm1s);
929 #ifdef PERL_PRESERVE_IVUV
930 /* For integer to integer power, we do the calculation by hand wherever
931 we're sure it is safe; otherwise we call pow() and try to convert to
932 integer afterwards. */
945 const IV iv = SvIVX(svr);
949 goto float_it; /* Can't do negative powers this way. */
953 baseuok = SvUOK(svl);
957 const IV iv = SvIVX(svl);
960 baseuok = TRUE; /* effectively it's a UV now */
962 baseuv = -iv; /* abs, baseuok == false records sign */
965 /* now we have integer ** positive integer. */
968 /* foo & (foo - 1) is zero only for a power of 2. */
969 if (!(baseuv & (baseuv - 1))) {
970 /* We are raising power-of-2 to a positive integer.
971 The logic here will work for any base (even non-integer
972 bases) but it can be less accurate than
973 pow (base,power) or exp (power * log (base)) when the
974 intermediate values start to spill out of the mantissa.
975 With powers of 2 we know this can't happen.
976 And powers of 2 are the favourite thing for perl
977 programmers to notice ** not doing what they mean. */
979 NV base = baseuok ? baseuv : -(NV)baseuv;
984 while (power >>= 1) {
995 register unsigned int highbit = 8 * sizeof(UV);
996 register unsigned int diff = 8 * sizeof(UV);
999 if (baseuv >> highbit) {
1003 /* we now have baseuv < 2 ** highbit */
1004 if (power * highbit <= 8 * sizeof(UV)) {
1005 /* result will definitely fit in UV, so use UV math
1006 on same algorithm as above */
1007 register UV result = 1;
1008 register UV base = baseuv;
1009 const bool odd_power = (bool)(power & 1);
1013 while (power >>= 1) {
1020 if (baseuok || !odd_power)
1021 /* answer is positive */
1023 else if (result <= (UV)IV_MAX)
1024 /* answer negative, fits in IV */
1025 SETi( -(IV)result );
1026 else if (result == (UV)IV_MIN)
1027 /* 2's complement assumption: special case IV_MIN */
1030 /* answer negative, doesn't fit */
1031 SETn( -(NV)result );
1041 NV right = SvNV(svr);
1042 NV left = SvNV(svl);
1045 #if defined(USE_LONG_DOUBLE) && defined(HAS_AIX_POWL_NEG_BASE_BUG)
1047 We are building perl with long double support and are on an AIX OS
1048 afflicted with a powl() function that wrongly returns NaNQ for any
1049 negative base. This was reported to IBM as PMR #23047-379 on
1050 03/06/2006. The problem exists in at least the following versions
1051 of AIX and the libm fileset, and no doubt others as well:
1053 AIX 4.3.3-ML10 bos.adt.libm 4.3.3.50
1054 AIX 5.1.0-ML04 bos.adt.libm 5.1.0.29
1055 AIX 5.2.0 bos.adt.libm 5.2.0.85
1057 So, until IBM fixes powl(), we provide the following workaround to
1058 handle the problem ourselves. Our logic is as follows: for
1059 negative bases (left), we use fmod(right, 2) to check if the
1060 exponent is an odd or even integer:
1062 - if odd, powl(left, right) == -powl(-left, right)
1063 - if even, powl(left, right) == powl(-left, right)
1065 If the exponent is not an integer, the result is rightly NaNQ, so
1066 we just return that (as NV_NAN).
1070 NV mod2 = Perl_fmod( right, 2.0 );
1071 if (mod2 == 1.0 || mod2 == -1.0) { /* odd integer */
1072 SETn( -Perl_pow( -left, right) );
1073 } else if (mod2 == 0.0) { /* even integer */
1074 SETn( Perl_pow( -left, right) );
1075 } else { /* fractional power */
1079 SETn( Perl_pow( left, right) );
1082 SETn( Perl_pow( left, right) );
1083 #endif /* HAS_AIX_POWL_NEG_BASE_BUG */
1085 #ifdef PERL_PRESERVE_IVUV
1095 dVAR; dSP; dATARGET; SV *svl, *svr;
1096 tryAMAGICbin(mult,opASSIGN);
1097 svl = sv_2num(TOPm1s);
1098 svr = sv_2num(TOPs);
1099 #ifdef PERL_PRESERVE_IVUV
1102 /* Unless the left argument is integer in range we are going to have to
1103 use NV maths. Hence only attempt to coerce the right argument if
1104 we know the left is integer. */
1105 /* Left operand is defined, so is it IV? */
1108 bool auvok = SvUOK(svl);
1109 bool buvok = SvUOK(svr);
1110 const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
1111 const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
1120 const IV aiv = SvIVX(svl);
1123 auvok = TRUE; /* effectively it's a UV now */
1125 alow = -aiv; /* abs, auvok == false records sign */
1131 const IV biv = SvIVX(svr);
1134 buvok = TRUE; /* effectively it's a UV now */
1136 blow = -biv; /* abs, buvok == false records sign */
1140 /* If this does sign extension on unsigned it's time for plan B */
1141 ahigh = alow >> (4 * sizeof (UV));
1143 bhigh = blow >> (4 * sizeof (UV));
1145 if (ahigh && bhigh) {
1147 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
1148 which is overflow. Drop to NVs below. */
1149 } else if (!ahigh && !bhigh) {
1150 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
1151 so the unsigned multiply cannot overflow. */
1152 const UV product = alow * blow;
1153 if (auvok == buvok) {
1154 /* -ve * -ve or +ve * +ve gives a +ve result. */
1158 } else if (product <= (UV)IV_MIN) {
1159 /* 2s complement assumption that (UV)-IV_MIN is correct. */
1160 /* -ve result, which could overflow an IV */
1162 SETi( -(IV)product );
1164 } /* else drop to NVs below. */
1166 /* One operand is large, 1 small */
1169 /* swap the operands */
1171 bhigh = blow; /* bhigh now the temp var for the swap */
1175 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1176 multiplies can't overflow. shift can, add can, -ve can. */
1177 product_middle = ahigh * blow;
1178 if (!(product_middle & topmask)) {
1179 /* OK, (ahigh * blow) won't lose bits when we shift it. */
1181 product_middle <<= (4 * sizeof (UV));
1182 product_low = alow * blow;
1184 /* as for pp_add, UV + something mustn't get smaller.
1185 IIRC ANSI mandates this wrapping *behaviour* for
1186 unsigned whatever the actual representation*/
1187 product_low += product_middle;
1188 if (product_low >= product_middle) {
1189 /* didn't overflow */
1190 if (auvok == buvok) {
1191 /* -ve * -ve or +ve * +ve gives a +ve result. */
1193 SETu( product_low );
1195 } else if (product_low <= (UV)IV_MIN) {
1196 /* 2s complement assumption again */
1197 /* -ve result, which could overflow an IV */
1199 SETi( -(IV)product_low );
1201 } /* else drop to NVs below. */
1203 } /* product_middle too large */
1204 } /* ahigh && bhigh */
1209 NV right = SvNV(svr);
1210 NV left = SvNV(svl);
1212 SETn( left * right );
1219 dVAR; dSP; dATARGET; SV *svl, *svr;
1220 tryAMAGICbin(div,opASSIGN);
1221 svl = sv_2num(TOPm1s);
1222 svr = sv_2num(TOPs);
1223 /* Only try to do UV divide first
1224 if ((SLOPPYDIVIDE is true) or
1225 (PERL_PRESERVE_IVUV is true and one or both SV is a UV too large
1227 The assumption is that it is better to use floating point divide
1228 whenever possible, only doing integer divide first if we can't be sure.
1229 If NV_PRESERVES_UV is true then we know at compile time that no UV
1230 can be too large to preserve, so don't need to compile the code to
1231 test the size of UVs. */
1234 # define PERL_TRY_UV_DIVIDE
1235 /* ensure that 20./5. == 4. */
1237 # ifdef PERL_PRESERVE_IVUV
1238 # ifndef NV_PRESERVES_UV
1239 # define PERL_TRY_UV_DIVIDE
1244 #ifdef PERL_TRY_UV_DIVIDE
1249 bool left_non_neg = SvUOK(svl);
1250 bool right_non_neg = SvUOK(svr);
1254 if (right_non_neg) {
1258 const IV biv = SvIVX(svr);
1261 right_non_neg = TRUE; /* effectively it's a UV now */
1267 /* historically undef()/0 gives a "Use of uninitialized value"
1268 warning before dieing, hence this test goes here.
1269 If it were immediately before the second SvIV_please, then
1270 DIE() would be invoked before left was even inspected, so
1271 no inpsection would give no warning. */
1273 DIE(aTHX_ "Illegal division by zero");
1279 const IV aiv = SvIVX(svl);
1282 left_non_neg = TRUE; /* effectively it's a UV now */
1291 /* For sloppy divide we always attempt integer division. */
1293 /* Otherwise we only attempt it if either or both operands
1294 would not be preserved by an NV. If both fit in NVs
1295 we fall through to the NV divide code below. However,
1296 as left >= right to ensure integer result here, we know that
1297 we can skip the test on the right operand - right big
1298 enough not to be preserved can't get here unless left is
1301 && (left > ((UV)1 << NV_PRESERVES_UV_BITS))
1304 /* Integer division can't overflow, but it can be imprecise. */
1305 const UV result = left / right;
1306 if (result * right == left) {
1307 SP--; /* result is valid */
1308 if (left_non_neg == right_non_neg) {
1309 /* signs identical, result is positive. */
1313 /* 2s complement assumption */
1314 if (result <= (UV)IV_MIN)
1315 SETi( -(IV)result );
1317 /* It's exact but too negative for IV. */
1318 SETn( -(NV)result );
1321 } /* tried integer divide but it was not an integer result */
1322 } /* else (PERL_ABS(result) < 1.0) or (both UVs in range for NV) */
1323 } /* left wasn't SvIOK */
1324 } /* right wasn't SvIOK */
1325 #endif /* PERL_TRY_UV_DIVIDE */
1327 NV right = SvNV(svr);
1328 NV left = SvNV(svl);
1329 (void)POPs;(void)POPs;
1330 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1331 if (! Perl_isnan(right) && right == 0.0)
1335 DIE(aTHX_ "Illegal division by zero");
1336 PUSHn( left / right );
1343 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1347 bool left_neg = FALSE;
1348 bool right_neg = FALSE;
1349 bool use_double = FALSE;
1350 bool dright_valid = FALSE;
1354 SV * const svr = sv_2num(TOPs);
1357 right_neg = !SvUOK(svr);
1361 const IV biv = SvIVX(svr);
1364 right_neg = FALSE; /* effectively it's a UV now */
1372 right_neg = dright < 0;
1375 if (dright < UV_MAX_P1) {
1376 right = U_V(dright);
1377 dright_valid = TRUE; /* In case we need to use double below. */
1384 /* At this point use_double is only true if right is out of range for
1385 a UV. In range NV has been rounded down to nearest UV and
1386 use_double false. */
1387 svl = sv_2num(TOPs);
1389 if (!use_double && SvIOK(svl)) {
1391 left_neg = !SvUOK(svl);
1395 const IV aiv = SvIVX(svl);
1398 left_neg = FALSE; /* effectively it's a UV now */
1407 left_neg = dleft < 0;
1411 /* This should be exactly the 5.6 behaviour - if left and right are
1412 both in range for UV then use U_V() rather than floor. */
1414 if (dleft < UV_MAX_P1) {
1415 /* right was in range, so is dleft, so use UVs not double.
1419 /* left is out of range for UV, right was in range, so promote
1420 right (back) to double. */
1422 /* The +0.5 is used in 5.6 even though it is not strictly
1423 consistent with the implicit +0 floor in the U_V()
1424 inside the #if 1. */
1425 dleft = Perl_floor(dleft + 0.5);
1428 dright = Perl_floor(dright + 0.5);
1439 DIE(aTHX_ "Illegal modulus zero");
1441 dans = Perl_fmod(dleft, dright);
1442 if ((left_neg != right_neg) && dans)
1443 dans = dright - dans;
1446 sv_setnv(TARG, dans);
1452 DIE(aTHX_ "Illegal modulus zero");
1455 if ((left_neg != right_neg) && ans)
1458 /* XXX may warn: unary minus operator applied to unsigned type */
1459 /* could change -foo to be (~foo)+1 instead */
1460 if (ans <= ~((UV)IV_MAX)+1)
1461 sv_setiv(TARG, ~ans+1);
1463 sv_setnv(TARG, -(NV)ans);
1466 sv_setuv(TARG, ans);
1475 dVAR; dSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
1482 const UV uv = SvUV(sv);
1484 count = IV_MAX; /* The best we can do? */
1488 const IV iv = SvIV(sv);
1495 else if (SvNOKp(sv)) {
1496 const NV nv = SvNV(sv);
1504 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1506 static const char oom_list_extend[] = "Out of memory during list extend";
1507 const I32 items = SP - MARK;
1508 const I32 max = items * count;
1510 MEM_WRAP_CHECK_1(max, SV*, oom_list_extend);
1511 /* Did the max computation overflow? */
1512 if (items > 0 && max > 0 && (max < items || max < count))
1513 Perl_croak(aTHX_ oom_list_extend);
1518 /* This code was intended to fix 20010809.028:
1521 for (($x =~ /./g) x 2) {
1522 print chop; # "abcdabcd" expected as output.
1525 * but that change (#11635) broke this code:
1527 $x = [("foo")x2]; # only one "foo" ended up in the anonlist.
1529 * I can't think of a better fix that doesn't introduce
1530 * an efficiency hit by copying the SVs. The stack isn't
1531 * refcounted, and mortalisation obviously doesn't
1532 * Do The Right Thing when the stack has more than
1533 * one pointer to the same mortal value.
1537 *SP = sv_2mortal(newSVsv(*SP));
1547 repeatcpy((char*)(MARK + items), (char*)MARK,
1548 items * sizeof(SV*), count - 1);
1551 else if (count <= 0)
1554 else { /* Note: mark already snarfed by pp_list */
1555 SV * const tmpstr = POPs;
1558 static const char oom_string_extend[] =
1559 "Out of memory during string extend";
1561 SvSetSV(TARG, tmpstr);
1562 SvPV_force(TARG, len);
1563 isutf = DO_UTF8(TARG);
1568 const STRLEN max = (UV)count * len;
1569 if (len > MEM_SIZE_MAX / count)
1570 Perl_croak(aTHX_ oom_string_extend);
1571 MEM_WRAP_CHECK_1(max, char, oom_string_extend);
1572 SvGROW(TARG, max + 1);
1573 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1574 SvCUR_set(TARG, SvCUR(TARG) * count);
1576 *SvEND(TARG) = '\0';
1579 (void)SvPOK_only_UTF8(TARG);
1581 (void)SvPOK_only(TARG);
1583 if (PL_op->op_private & OPpREPEAT_DOLIST) {
1584 /* The parser saw this as a list repeat, and there
1585 are probably several items on the stack. But we're
1586 in scalar context, and there's no pp_list to save us
1587 now. So drop the rest of the items -- robin@kitsite.com
1600 dVAR; dSP; dATARGET; bool useleft; SV *svl, *svr;
1601 tryAMAGICbin(subtr,opASSIGN);
1602 svl = sv_2num(TOPm1s);
1603 svr = sv_2num(TOPs);
1604 useleft = USE_LEFT(svl);
1605 #ifdef PERL_PRESERVE_IVUV
1606 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1607 "bad things" happen if you rely on signed integers wrapping. */
1610 /* Unless the left argument is integer in range we are going to have to
1611 use NV maths. Hence only attempt to coerce the right argument if
1612 we know the left is integer. */
1613 register UV auv = 0;
1619 a_valid = auvok = 1;
1620 /* left operand is undef, treat as zero. */
1622 /* Left operand is defined, so is it IV? */
1625 if ((auvok = SvUOK(svl)))
1628 register const IV aiv = SvIVX(svl);
1631 auvok = 1; /* Now acting as a sign flag. */
1632 } else { /* 2s complement assumption for IV_MIN */
1640 bool result_good = 0;
1643 bool buvok = SvUOK(svr);
1648 register const IV biv = SvIVX(svr);
1655 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1656 else "IV" now, independent of how it came in.
1657 if a, b represents positive, A, B negative, a maps to -A etc
1662 all UV maths. negate result if A negative.
1663 subtract if signs same, add if signs differ. */
1665 if (auvok ^ buvok) {
1674 /* Must get smaller */
1679 if (result <= buv) {
1680 /* result really should be -(auv-buv). as its negation
1681 of true value, need to swap our result flag */
1693 if (result <= (UV)IV_MIN)
1694 SETi( -(IV)result );
1696 /* result valid, but out of range for IV. */
1697 SETn( -(NV)result );
1701 } /* Overflow, drop through to NVs. */
1706 NV value = SvNV(svr);
1710 /* left operand is undef, treat as zero - value */
1714 SETn( SvNV(svl) - value );
1721 dVAR; dSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1723 const IV shift = POPi;
1724 if (PL_op->op_private & HINT_INTEGER) {
1738 dVAR; dSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1740 const IV shift = POPi;
1741 if (PL_op->op_private & HINT_INTEGER) {
1755 dVAR; dSP; tryAMAGICbinSET(lt,0);
1756 #ifdef PERL_PRESERVE_IVUV
1759 SvIV_please(TOPm1s);
1760 if (SvIOK(TOPm1s)) {
1761 bool auvok = SvUOK(TOPm1s);
1762 bool buvok = SvUOK(TOPs);
1764 if (!auvok && !buvok) { /* ## IV < IV ## */
1765 const IV aiv = SvIVX(TOPm1s);
1766 const IV biv = SvIVX(TOPs);
1769 SETs(boolSV(aiv < biv));
1772 if (auvok && buvok) { /* ## UV < UV ## */
1773 const UV auv = SvUVX(TOPm1s);
1774 const UV buv = SvUVX(TOPs);
1777 SETs(boolSV(auv < buv));
1780 if (auvok) { /* ## UV < IV ## */
1782 const IV biv = SvIVX(TOPs);
1785 /* As (a) is a UV, it's >=0, so it cannot be < */
1790 SETs(boolSV(auv < (UV)biv));
1793 { /* ## IV < UV ## */
1794 const IV aiv = SvIVX(TOPm1s);
1798 /* As (b) is a UV, it's >=0, so it must be < */
1805 SETs(boolSV((UV)aiv < buv));
1811 #ifndef NV_PRESERVES_UV
1812 #ifdef PERL_PRESERVE_IVUV
1815 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1817 SETs(boolSV(SvRV(TOPs) < SvRV(TOPp1s)));
1822 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1824 if (Perl_isnan(left) || Perl_isnan(right))
1826 SETs(boolSV(left < right));
1829 SETs(boolSV(TOPn < value));
1837 dVAR; dSP; tryAMAGICbinSET(gt,0);
1838 #ifdef PERL_PRESERVE_IVUV
1841 SvIV_please(TOPm1s);
1842 if (SvIOK(TOPm1s)) {
1843 bool auvok = SvUOK(TOPm1s);
1844 bool buvok = SvUOK(TOPs);
1846 if (!auvok && !buvok) { /* ## IV > IV ## */
1847 const IV aiv = SvIVX(TOPm1s);
1848 const IV biv = SvIVX(TOPs);
1851 SETs(boolSV(aiv > biv));
1854 if (auvok && buvok) { /* ## UV > UV ## */
1855 const UV auv = SvUVX(TOPm1s);
1856 const UV buv = SvUVX(TOPs);
1859 SETs(boolSV(auv > buv));
1862 if (auvok) { /* ## UV > IV ## */
1864 const IV biv = SvIVX(TOPs);
1868 /* As (a) is a UV, it's >=0, so it must be > */
1873 SETs(boolSV(auv > (UV)biv));
1876 { /* ## IV > UV ## */
1877 const IV aiv = SvIVX(TOPm1s);
1881 /* As (b) is a UV, it's >=0, so it cannot be > */
1888 SETs(boolSV((UV)aiv > buv));
1894 #ifndef NV_PRESERVES_UV
1895 #ifdef PERL_PRESERVE_IVUV
1898 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1900 SETs(boolSV(SvRV(TOPs) > SvRV(TOPp1s)));
1905 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1907 if (Perl_isnan(left) || Perl_isnan(right))
1909 SETs(boolSV(left > right));
1912 SETs(boolSV(TOPn > value));
1920 dVAR; dSP; tryAMAGICbinSET(le,0);
1921 #ifdef PERL_PRESERVE_IVUV
1924 SvIV_please(TOPm1s);
1925 if (SvIOK(TOPm1s)) {
1926 bool auvok = SvUOK(TOPm1s);
1927 bool buvok = SvUOK(TOPs);
1929 if (!auvok && !buvok) { /* ## IV <= IV ## */
1930 const IV aiv = SvIVX(TOPm1s);
1931 const IV biv = SvIVX(TOPs);
1934 SETs(boolSV(aiv <= biv));
1937 if (auvok && buvok) { /* ## UV <= UV ## */
1938 UV auv = SvUVX(TOPm1s);
1939 UV buv = SvUVX(TOPs);
1942 SETs(boolSV(auv <= buv));
1945 if (auvok) { /* ## UV <= IV ## */
1947 const IV biv = SvIVX(TOPs);
1951 /* As (a) is a UV, it's >=0, so a cannot be <= */
1956 SETs(boolSV(auv <= (UV)biv));
1959 { /* ## IV <= UV ## */
1960 const IV aiv = SvIVX(TOPm1s);
1964 /* As (b) is a UV, it's >=0, so a must be <= */
1971 SETs(boolSV((UV)aiv <= buv));
1977 #ifndef NV_PRESERVES_UV
1978 #ifdef PERL_PRESERVE_IVUV
1981 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1983 SETs(boolSV(SvRV(TOPs) <= SvRV(TOPp1s)));
1988 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1990 if (Perl_isnan(left) || Perl_isnan(right))
1992 SETs(boolSV(left <= right));
1995 SETs(boolSV(TOPn <= value));
2003 dVAR; dSP; tryAMAGICbinSET(ge,0);
2004 #ifdef PERL_PRESERVE_IVUV
2007 SvIV_please(TOPm1s);
2008 if (SvIOK(TOPm1s)) {
2009 bool auvok = SvUOK(TOPm1s);
2010 bool buvok = SvUOK(TOPs);
2012 if (!auvok && !buvok) { /* ## IV >= IV ## */
2013 const IV aiv = SvIVX(TOPm1s);
2014 const IV biv = SvIVX(TOPs);
2017 SETs(boolSV(aiv >= biv));
2020 if (auvok && buvok) { /* ## UV >= UV ## */
2021 const UV auv = SvUVX(TOPm1s);
2022 const UV buv = SvUVX(TOPs);
2025 SETs(boolSV(auv >= buv));
2028 if (auvok) { /* ## UV >= IV ## */
2030 const IV biv = SvIVX(TOPs);
2034 /* As (a) is a UV, it's >=0, so it must be >= */
2039 SETs(boolSV(auv >= (UV)biv));
2042 { /* ## IV >= UV ## */
2043 const IV aiv = SvIVX(TOPm1s);
2047 /* As (b) is a UV, it's >=0, so a cannot be >= */
2054 SETs(boolSV((UV)aiv >= buv));
2060 #ifndef NV_PRESERVES_UV
2061 #ifdef PERL_PRESERVE_IVUV
2064 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2066 SETs(boolSV(SvRV(TOPs) >= SvRV(TOPp1s)));
2071 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2073 if (Perl_isnan(left) || Perl_isnan(right))
2075 SETs(boolSV(left >= right));
2078 SETs(boolSV(TOPn >= value));
2086 dVAR; dSP; tryAMAGICbinSET(ne,0);
2087 #ifndef NV_PRESERVES_UV
2088 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2090 SETs(boolSV(SvRV(TOPs) != SvRV(TOPp1s)));
2094 #ifdef PERL_PRESERVE_IVUV
2097 SvIV_please(TOPm1s);
2098 if (SvIOK(TOPm1s)) {
2099 const bool auvok = SvUOK(TOPm1s);
2100 const bool buvok = SvUOK(TOPs);
2102 if (auvok == buvok) { /* ## IV == IV or UV == UV ## */
2103 /* Casting IV to UV before comparison isn't going to matter
2104 on 2s complement. On 1s complement or sign&magnitude
2105 (if we have any of them) it could make negative zero
2106 differ from normal zero. As I understand it. (Need to
2107 check - is negative zero implementation defined behaviour
2109 const UV buv = SvUVX(POPs);
2110 const UV auv = SvUVX(TOPs);
2112 SETs(boolSV(auv != buv));
2115 { /* ## Mixed IV,UV ## */
2119 /* != is commutative so swap if needed (save code) */
2121 /* swap. top of stack (b) is the iv */
2125 /* As (a) is a UV, it's >0, so it cannot be == */
2134 /* As (b) is a UV, it's >0, so it cannot be == */
2138 uv = SvUVX(*(SP+1)); /* Do I want TOPp1s() ? */
2140 SETs(boolSV((UV)iv != uv));
2147 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2149 if (Perl_isnan(left) || Perl_isnan(right))
2151 SETs(boolSV(left != right));
2154 SETs(boolSV(TOPn != value));
2162 dVAR; dSP; dTARGET; tryAMAGICbin(ncmp,0);
2163 #ifndef NV_PRESERVES_UV
2164 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2165 const UV right = PTR2UV(SvRV(POPs));
2166 const UV left = PTR2UV(SvRV(TOPs));
2167 SETi((left > right) - (left < right));
2171 #ifdef PERL_PRESERVE_IVUV
2172 /* Fortunately it seems NaN isn't IOK */
2175 SvIV_please(TOPm1s);
2176 if (SvIOK(TOPm1s)) {
2177 const bool leftuvok = SvUOK(TOPm1s);
2178 const bool rightuvok = SvUOK(TOPs);
2180 if (!leftuvok && !rightuvok) { /* ## IV <=> IV ## */
2181 const IV leftiv = SvIVX(TOPm1s);
2182 const IV rightiv = SvIVX(TOPs);
2184 if (leftiv > rightiv)
2186 else if (leftiv < rightiv)
2190 } else if (leftuvok && rightuvok) { /* ## UV <=> UV ## */
2191 const UV leftuv = SvUVX(TOPm1s);
2192 const UV rightuv = SvUVX(TOPs);
2194 if (leftuv > rightuv)
2196 else if (leftuv < rightuv)
2200 } else if (leftuvok) { /* ## UV <=> IV ## */
2201 const IV rightiv = SvIVX(TOPs);
2203 /* As (a) is a UV, it's >=0, so it cannot be < */
2206 const UV leftuv = SvUVX(TOPm1s);
2207 if (leftuv > (UV)rightiv) {
2209 } else if (leftuv < (UV)rightiv) {
2215 } else { /* ## IV <=> UV ## */
2216 const IV leftiv = SvIVX(TOPm1s);
2218 /* As (b) is a UV, it's >=0, so it must be < */
2221 const UV rightuv = SvUVX(TOPs);
2222 if ((UV)leftiv > rightuv) {
2224 } else if ((UV)leftiv < rightuv) {
2242 if (Perl_isnan(left) || Perl_isnan(right)) {
2246 value = (left > right) - (left < right);
2250 else if (left < right)
2252 else if (left > right)
2268 int amg_type = sle_amg;
2272 switch (PL_op->op_type) {
2291 tryAMAGICbinSET_var(amg_type,0);
2294 const int cmp = (IN_LOCALE_RUNTIME
2295 ? sv_cmp_locale(left, right)
2296 : sv_cmp(left, right));
2297 SETs(boolSV(cmp * multiplier < rhs));
2304 dVAR; dSP; tryAMAGICbinSET(seq,0);
2307 SETs(boolSV(sv_eq(left, right)));
2314 dVAR; dSP; tryAMAGICbinSET(sne,0);
2317 SETs(boolSV(!sv_eq(left, right)));
2324 dVAR; dSP; dTARGET; tryAMAGICbin(scmp,0);
2327 const int cmp = (IN_LOCALE_RUNTIME
2328 ? sv_cmp_locale(left, right)
2329 : sv_cmp(left, right));
2337 dVAR; dSP; dATARGET; tryAMAGICbin(band,opASSIGN);
2342 if (SvNIOKp(left) || SvNIOKp(right)) {
2343 if (PL_op->op_private & HINT_INTEGER) {
2344 const IV i = SvIV_nomg(left) & SvIV_nomg(right);
2348 const UV u = SvUV_nomg(left) & SvUV_nomg(right);
2353 do_vop(PL_op->op_type, TARG, left, right);
2362 dVAR; dSP; dATARGET;
2363 const int op_type = PL_op->op_type;
2365 tryAMAGICbin_var((op_type == OP_BIT_OR ? bor_amg : bxor_amg), opASSIGN);
2370 if (SvNIOKp(left) || SvNIOKp(right)) {
2371 if (PL_op->op_private & HINT_INTEGER) {
2372 const IV l = (USE_LEFT(left) ? SvIV_nomg(left) : 0);
2373 const IV r = SvIV_nomg(right);
2374 const IV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2378 const UV l = (USE_LEFT(left) ? SvUV_nomg(left) : 0);
2379 const UV r = SvUV_nomg(right);
2380 const UV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2385 do_vop(op_type, TARG, left, right);
2394 dVAR; dSP; dTARGET; tryAMAGICun(neg);
2396 SV * const sv = sv_2num(TOPs);
2397 const int flags = SvFLAGS(sv);
2399 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
2400 /* It's publicly an integer, or privately an integer-not-float */
2403 if (SvIVX(sv) == IV_MIN) {
2404 /* 2s complement assumption. */
2405 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
2408 else if (SvUVX(sv) <= IV_MAX) {
2413 else if (SvIVX(sv) != IV_MIN) {
2417 #ifdef PERL_PRESERVE_IVUV
2426 else if (SvPOKp(sv)) {
2428 const char * const s = SvPV_const(sv, len);
2429 if (isIDFIRST(*s)) {
2430 sv_setpvn(TARG, "-", 1);
2433 else if (*s == '+' || *s == '-') {
2435 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
2437 else if (DO_UTF8(sv)) {
2440 goto oops_its_an_int;
2442 sv_setnv(TARG, -SvNV(sv));
2444 sv_setpvn(TARG, "-", 1);
2451 goto oops_its_an_int;
2452 sv_setnv(TARG, -SvNV(sv));
2464 dVAR; dSP; tryAMAGICunSET(not);
2465 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
2471 dVAR; dSP; dTARGET; tryAMAGICun(compl);
2476 if (PL_op->op_private & HINT_INTEGER) {
2477 const IV i = ~SvIV_nomg(sv);
2481 const UV u = ~SvUV_nomg(sv);
2490 (void)SvPV_nomg_const(sv,len); /* force check for uninit var */
2491 sv_setsv_nomg(TARG, sv);
2492 tmps = (U8*)SvPV_force(TARG, len);
2495 /* Calculate exact length, let's not estimate. */
2500 U8 * const send = tmps + len;
2501 U8 * const origtmps = tmps;
2502 const UV utf8flags = UTF8_ALLOW_ANYUV;
2504 while (tmps < send) {
2505 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2507 targlen += UNISKIP(~c);
2513 /* Now rewind strings and write them. */
2520 Newx(result, targlen + 1, U8);
2522 while (tmps < send) {
2523 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2525 p = uvchr_to_utf8_flags(p, ~c, UNICODE_ALLOW_ANY);
2528 sv_usepvn_flags(TARG, (char*)result, targlen,
2529 SV_HAS_TRAILING_NUL);
2536 Newx(result, nchar + 1, U8);
2538 while (tmps < send) {
2539 const U8 c = (U8)utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2544 sv_usepvn_flags(TARG, (char*)result, nchar, SV_HAS_TRAILING_NUL);
2552 register long *tmpl;
2553 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2556 for ( ; anum >= (I32)sizeof(long); anum -= (I32)sizeof(long), tmpl++)
2561 for ( ; anum > 0; anum--, tmps++)
2570 /* integer versions of some of the above */
2574 dVAR; dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
2577 SETi( left * right );
2585 dVAR; dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
2589 DIE(aTHX_ "Illegal division by zero");
2592 /* avoid FPE_INTOVF on some platforms when num is IV_MIN */
2596 value = num / value;
2602 #if defined(__GLIBC__) && IVSIZE == 8
2609 /* This is the vanilla old i_modulo. */
2610 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2614 DIE(aTHX_ "Illegal modulus zero");
2615 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2619 SETi( left % right );
2624 #if defined(__GLIBC__) && IVSIZE == 8
2629 /* This is the i_modulo with the workaround for the _moddi3 bug
2630 * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
2631 * See below for pp_i_modulo. */
2632 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2636 DIE(aTHX_ "Illegal modulus zero");
2637 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2641 SETi( left % PERL_ABS(right) );
2648 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2652 DIE(aTHX_ "Illegal modulus zero");
2653 /* The assumption is to use hereafter the old vanilla version... */
2655 PL_ppaddr[OP_I_MODULO] =
2657 /* .. but if we have glibc, we might have a buggy _moddi3
2658 * (at least glicb 2.2.5 is known to have this bug), in other
2659 * words our integer modulus with negative quad as the second
2660 * argument might be broken. Test for this and re-patch the
2661 * opcode dispatch table if that is the case, remembering to
2662 * also apply the workaround so that this first round works
2663 * right, too. See [perl #9402] for more information. */
2667 /* Cannot do this check with inlined IV constants since
2668 * that seems to work correctly even with the buggy glibc. */
2670 /* Yikes, we have the bug.
2671 * Patch in the workaround version. */
2673 PL_ppaddr[OP_I_MODULO] =
2674 &Perl_pp_i_modulo_1;
2675 /* Make certain we work right this time, too. */
2676 right = PERL_ABS(right);
2679 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2683 SETi( left % right );
2691 dVAR; dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
2694 SETi( left + right );
2701 dVAR; dSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
2704 SETi( left - right );
2711 dVAR; dSP; tryAMAGICbinSET(lt,0);
2714 SETs(boolSV(left < right));
2721 dVAR; dSP; tryAMAGICbinSET(gt,0);
2724 SETs(boolSV(left > right));
2731 dVAR; dSP; tryAMAGICbinSET(le,0);
2734 SETs(boolSV(left <= right));
2741 dVAR; dSP; tryAMAGICbinSET(ge,0);
2744 SETs(boolSV(left >= right));
2751 dVAR; dSP; tryAMAGICbinSET(eq,0);
2754 SETs(boolSV(left == right));
2761 dVAR; dSP; tryAMAGICbinSET(ne,0);
2764 SETs(boolSV(left != right));
2771 dVAR; dSP; dTARGET; tryAMAGICbin(ncmp,0);
2778 else if (left < right)
2789 dVAR; dSP; dTARGET; tryAMAGICun(neg);
2794 /* High falutin' math. */
2798 dVAR; dSP; dTARGET; tryAMAGICbin(atan2,0);
2801 SETn(Perl_atan2(left, right));
2809 int amg_type = sin_amg;
2810 const char *neg_report = NULL;
2811 NV (*func)(NV) = Perl_sin;
2812 const int op_type = PL_op->op_type;
2829 amg_type = sqrt_amg;
2831 neg_report = "sqrt";
2835 tryAMAGICun_var(amg_type);
2837 const NV value = POPn;
2839 if (op_type == OP_LOG ? (value <= 0.0) : (value < 0.0)) {
2840 SET_NUMERIC_STANDARD();
2841 DIE(aTHX_ "Can't take %s of %"NVgf, neg_report, value);
2844 XPUSHn(func(value));
2849 /* Support Configure command-line overrides for rand() functions.
2850 After 5.005, perhaps we should replace this by Configure support
2851 for drand48(), random(), or rand(). For 5.005, though, maintain
2852 compatibility by calling rand() but allow the user to override it.
2853 See INSTALL for details. --Andy Dougherty 15 July 1998
2855 /* Now it's after 5.005, and Configure supports drand48() and random(),
2856 in addition to rand(). So the overrides should not be needed any more.
2857 --Jarkko Hietaniemi 27 September 1998
2860 #ifndef HAS_DRAND48_PROTO
2861 extern double drand48 (void);
2874 if (!PL_srand_called) {
2875 (void)seedDrand01((Rand_seed_t)seed());
2876 PL_srand_called = TRUE;
2886 const UV anum = (MAXARG < 1) ? seed() : POPu;
2887 (void)seedDrand01((Rand_seed_t)anum);
2888 PL_srand_called = TRUE;
2895 dVAR; dSP; dTARGET; tryAMAGICun(int);
2897 SV * const sv = sv_2num(TOPs);
2898 const IV iv = SvIV(sv);
2899 /* XXX it's arguable that compiler casting to IV might be subtly
2900 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2901 else preferring IV has introduced a subtle behaviour change bug. OTOH
2902 relying on floating point to be accurate is a bug. */
2907 else if (SvIOK(sv)) {
2914 const NV value = SvNV(sv);
2916 if (value < (NV)UV_MAX + 0.5) {
2919 SETn(Perl_floor(value));
2923 if (value > (NV)IV_MIN - 0.5) {
2926 SETn(Perl_ceil(value));
2936 dVAR; dSP; dTARGET; tryAMAGICun(abs);
2938 SV * const sv = sv_2num(TOPs);
2939 /* This will cache the NV value if string isn't actually integer */
2940 const IV iv = SvIV(sv);
2945 else if (SvIOK(sv)) {
2946 /* IVX is precise */
2948 SETu(SvUV(sv)); /* force it to be numeric only */
2956 /* 2s complement assumption. Also, not really needed as
2957 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
2963 const NV value = SvNV(sv);
2977 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2981 SV* const sv = POPs;
2983 tmps = (SvPV_const(sv, len));
2985 /* If Unicode, try to downgrade
2986 * If not possible, croak. */
2987 SV* const tsv = sv_2mortal(newSVsv(sv));
2990 sv_utf8_downgrade(tsv, FALSE);
2991 tmps = SvPV_const(tsv, len);
2993 if (PL_op->op_type == OP_HEX)
2996 while (*tmps && len && isSPACE(*tmps))
3002 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
3004 else if (*tmps == 'b')
3005 result_uv = grok_bin (tmps, &len, &flags, &result_nv);
3007 result_uv = grok_oct (tmps, &len, &flags, &result_nv);
3009 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
3023 SV * const sv = TOPs;
3025 if (SvGAMAGIC(sv)) {
3026 /* For an overloaded or magic scalar, we can't know in advance if
3027 it's going to be UTF-8 or not. Also, we can't call sv_len_utf8 as
3028 it likes to cache the length. Maybe that should be a documented
3033 = sv_2pv_flags(sv, &len,
3034 SV_UNDEF_RETURNS_NULL|SV_CONST_RETURN|SV_GMAGIC);
3038 else if (DO_UTF8(sv)) {
3039 SETi(utf8_length((U8*)p, (U8*)p + len));
3043 } else if (SvOK(sv)) {
3044 /* Neither magic nor overloaded. */
3046 SETi(sv_len_utf8(sv));
3065 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3067 const I32 arybase = CopARYBASE_get(PL_curcop);
3069 const char *repl = NULL;
3071 const int num_args = PL_op->op_private & 7;
3072 bool repl_need_utf8_upgrade = FALSE;
3073 bool repl_is_utf8 = FALSE;
3075 SvTAINTED_off(TARG); /* decontaminate */
3076 SvUTF8_off(TARG); /* decontaminate */
3080 repl = SvPV_const(repl_sv, repl_len);
3081 repl_is_utf8 = DO_UTF8(repl_sv) && SvCUR(repl_sv);
3091 sv_utf8_upgrade(sv);
3093 else if (DO_UTF8(sv))
3094 repl_need_utf8_upgrade = TRUE;
3096 tmps = SvPV_const(sv, curlen);
3098 utf8_curlen = sv_len_utf8(sv);
3099 if (utf8_curlen == curlen)
3102 curlen = utf8_curlen;
3107 if (pos >= arybase) {
3125 else if (len >= 0) {
3127 if (rem > (I32)curlen)
3142 Perl_croak(aTHX_ "substr outside of string");
3143 if (ckWARN(WARN_SUBSTR))
3144 Perl_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3148 const I32 upos = pos;
3149 const I32 urem = rem;
3151 sv_pos_u2b(sv, &pos, &rem);
3153 /* we either return a PV or an LV. If the TARG hasn't been used
3154 * before, or is of that type, reuse it; otherwise use a mortal
3155 * instead. Note that LVs can have an extended lifetime, so also
3156 * dont reuse if refcount > 1 (bug #20933) */
3157 if (SvTYPE(TARG) > SVt_NULL) {
3158 if ( (SvTYPE(TARG) == SVt_PVLV)
3159 ? (!lvalue || SvREFCNT(TARG) > 1)
3162 TARG = sv_newmortal();
3166 sv_setpvn(TARG, tmps, rem);
3167 #ifdef USE_LOCALE_COLLATE
3168 sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3173 SV* repl_sv_copy = NULL;
3175 if (repl_need_utf8_upgrade) {
3176 repl_sv_copy = newSVsv(repl_sv);
3177 sv_utf8_upgrade(repl_sv_copy);
3178 repl = SvPV_const(repl_sv_copy, repl_len);
3179 repl_is_utf8 = DO_UTF8(repl_sv_copy) && SvCUR(sv);
3183 sv_insert_flags(sv, pos, rem, repl, repl_len, 0);
3187 SvREFCNT_dec(repl_sv_copy);
3189 else if (lvalue) { /* it's an lvalue! */
3190 if (!SvGMAGICAL(sv)) {
3192 SvPV_force_nolen(sv);
3193 if (ckWARN(WARN_SUBSTR))
3194 Perl_warner(aTHX_ packWARN(WARN_SUBSTR),
3195 "Attempt to use reference as lvalue in substr");
3197 if (isGV_with_GP(sv))
3198 SvPV_force_nolen(sv);
3199 else if (SvOK(sv)) /* is it defined ? */
3200 (void)SvPOK_only_UTF8(sv);
3202 sv_setpvs(sv, ""); /* avoid lexical reincarnation */
3205 if (SvTYPE(TARG) < SVt_PVLV) {
3206 sv_upgrade(TARG, SVt_PVLV);
3207 sv_magic(TARG, NULL, PERL_MAGIC_substr, NULL, 0);
3211 if (LvTARG(TARG) != sv) {
3213 SvREFCNT_dec(LvTARG(TARG));
3214 LvTARG(TARG) = SvREFCNT_inc_simple(sv);
3216 LvTARGOFF(TARG) = upos;
3217 LvTARGLEN(TARG) = urem;
3221 PUSHs(TARG); /* avoid SvSETMAGIC here */
3228 register const IV size = POPi;
3229 register const IV offset = POPi;
3230 register SV * const src = POPs;
3231 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3233 SvTAINTED_off(TARG); /* decontaminate */
3234 if (lvalue) { /* it's an lvalue! */
3235 if (SvREFCNT(TARG) > 1) /* don't share the TARG (#20933) */
3236 TARG = sv_newmortal();
3237 if (SvTYPE(TARG) < SVt_PVLV) {
3238 sv_upgrade(TARG, SVt_PVLV);
3239 sv_magic(TARG, NULL, PERL_MAGIC_vec, NULL, 0);
3242 if (LvTARG(TARG) != src) {
3244 SvREFCNT_dec(LvTARG(TARG));
3245 LvTARG(TARG) = SvREFCNT_inc_simple(src);
3247 LvTARGOFF(TARG) = offset;
3248 LvTARGLEN(TARG) = size;
3251 sv_setuv(TARG, do_vecget(src, offset, size));
3267 const char *little_p;
3268 const I32 arybase = CopARYBASE_get(PL_curcop);
3271 const bool is_index = PL_op->op_type == OP_INDEX;
3274 /* arybase is in characters, like offset, so combine prior to the
3275 UTF-8 to bytes calculation. */
3276 offset = POPi - arybase;
3280 big_p = SvPV_const(big, biglen);
3281 little_p = SvPV_const(little, llen);
3283 big_utf8 = DO_UTF8(big);
3284 little_utf8 = DO_UTF8(little);
3285 if (big_utf8 ^ little_utf8) {
3286 /* One needs to be upgraded. */
3287 if (little_utf8 && !PL_encoding) {
3288 /* Well, maybe instead we might be able to downgrade the small
3290 char * const pv = (char*)bytes_from_utf8((U8 *)little_p, &llen,
3293 /* If the large string is ISO-8859-1, and it's not possible to
3294 convert the small string to ISO-8859-1, then there is no
3295 way that it could be found anywhere by index. */
3300 /* At this point, pv is a malloc()ed string. So donate it to temp
3301 to ensure it will get free()d */
3302 little = temp = newSV(0);
3303 sv_usepvn(temp, pv, llen);
3304 little_p = SvPVX(little);
3307 ? newSVpvn(big_p, biglen) : newSVpvn(little_p, llen);
3310 sv_recode_to_utf8(temp, PL_encoding);
3312 sv_utf8_upgrade(temp);
3317 big_p = SvPV_const(big, biglen);
3320 little_p = SvPV_const(little, llen);
3324 if (SvGAMAGIC(big)) {
3325 /* Life just becomes a lot easier if I use a temporary here.
3326 Otherwise I need to avoid calls to sv_pos_u2b(), which (dangerously)
3327 will trigger magic and overloading again, as will fbm_instr()
3329 big = newSVpvn_flags(big_p, biglen,
3330 SVs_TEMP | (big_utf8 ? SVf_UTF8 : 0));
3333 if (SvGAMAGIC(little) || (is_index && !SvOK(little))) {
3334 /* index && SvOK() is a hack. fbm_instr() calls SvPV_const, which will
3335 warn on undef, and we've already triggered a warning with the
3336 SvPV_const some lines above. We can't remove that, as we need to
3337 call some SvPV to trigger overloading early and find out if the
3339 This is all getting to messy. The API isn't quite clean enough,
3340 because data access has side effects.
3342 little = newSVpvn_flags(little_p, llen,
3343 SVs_TEMP | (little_utf8 ? SVf_UTF8 : 0));
3344 little_p = SvPVX(little);
3348 offset = is_index ? 0 : biglen;
3350 if (big_utf8 && offset > 0)
3351 sv_pos_u2b(big, &offset, 0);
3357 else if (offset > (I32)biglen)
3359 if (!(little_p = is_index
3360 ? fbm_instr((unsigned char*)big_p + offset,
3361 (unsigned char*)big_p + biglen, little, 0)
3362 : rninstr(big_p, big_p + offset,
3363 little_p, little_p + llen)))
3366 retval = little_p - big_p;
3367 if (retval > 0 && big_utf8)
3368 sv_pos_b2u(big, &retval);
3373 PUSHi(retval + arybase);
3379 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
3380 if (SvTAINTED(MARK[1]))
3381 TAINT_PROPER("sprintf");
3382 do_sprintf(TARG, SP-MARK, MARK+1);
3383 TAINT_IF(SvTAINTED(TARG));
3395 const U8 *s = (U8*)SvPV_const(argsv, len);
3397 if (PL_encoding && SvPOK(argsv) && !DO_UTF8(argsv)) {
3398 SV * const tmpsv = sv_2mortal(newSVsv(argsv));
3399 s = (U8*)sv_recode_to_utf8(tmpsv, PL_encoding);
3403 XPUSHu(DO_UTF8(argsv) ?
3404 utf8n_to_uvchr(s, UTF8_MAXBYTES, 0, UTF8_ALLOW_ANYUV) :
3416 if (((SvIOK_notUV(TOPs) && SvIV(TOPs) < 0)
3418 (SvNOK(TOPs) && SvNV(TOPs) < 0.0))) {
3420 value = POPu; /* chr(-1) eq chr(0xff), etc. */
3422 (void) POPs; /* Ignore the argument value. */
3423 value = UNICODE_REPLACEMENT;
3429 SvUPGRADE(TARG,SVt_PV);
3431 if (value > 255 && !IN_BYTES) {
3432 SvGROW(TARG, (STRLEN)UNISKIP(value)+1);
3433 tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3434 SvCUR_set(TARG, tmps - SvPVX_const(TARG));
3436 (void)SvPOK_only(TARG);
3445 *tmps++ = (char)value;
3447 (void)SvPOK_only(TARG);
3449 if (PL_encoding && !IN_BYTES) {
3450 sv_recode_to_utf8(TARG, PL_encoding);
3452 if (SvCUR(TARG) == 0 || !is_utf8_string((U8*)tmps, SvCUR(TARG)) ||
3453 UNICODE_IS_REPLACEMENT(utf8_to_uvchr((U8*)tmps, NULL))) {
3457 *tmps++ = (char)value;
3473 const char *tmps = SvPV_const(left, len);
3475 if (DO_UTF8(left)) {
3476 /* If Unicode, try to downgrade.
3477 * If not possible, croak.
3478 * Yes, we made this up. */
3479 SV* const tsv = sv_2mortal(newSVsv(left));
3482 sv_utf8_downgrade(tsv, FALSE);
3483 tmps = SvPV_const(tsv, len);
3485 # ifdef USE_ITHREADS
3487 if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3488 /* This should be threadsafe because in ithreads there is only
3489 * one thread per interpreter. If this would not be true,
3490 * we would need a mutex to protect this malloc. */
3491 PL_reentrant_buffer->_crypt_struct_buffer =
3492 (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3493 #if defined(__GLIBC__) || defined(__EMX__)
3494 if (PL_reentrant_buffer->_crypt_struct_buffer) {
3495 PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3496 /* work around glibc-2.2.5 bug */
3497 PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3501 # endif /* HAS_CRYPT_R */
3502 # endif /* USE_ITHREADS */
3504 sv_setpv(TARG, fcrypt(tmps, SvPV_nolen_const(right)));
3506 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV_nolen_const(right)));
3512 "The crypt() function is unimplemented due to excessive paranoia.");
3524 bool inplace = TRUE;
3526 const int op_type = PL_op->op_type;
3529 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3535 s = (const U8*)SvPV_nomg_const(source, slen);
3537 if (ckWARN(WARN_UNINITIALIZED))
3538 report_uninit(source);
3543 if (slen && DO_UTF8(source) && UTF8_IS_START(*s)) {
3545 utf8_to_uvchr(s, &ulen);
3546 if (op_type == OP_UCFIRST) {
3547 toTITLE_utf8(s, tmpbuf, &tculen);
3549 toLOWER_utf8(s, tmpbuf, &tculen);
3551 /* If the two differ, we definately cannot do inplace. */
3552 inplace = (ulen == tculen);
3553 need = slen + 1 - ulen + tculen;
3559 if (SvPADTMP(source) && !SvREADONLY(source) && inplace && SvTEMP(source)) {
3560 /* We can convert in place. */
3563 s = d = (U8*)SvPV_force_nomg(source, slen);
3569 SvUPGRADE(dest, SVt_PV);
3570 d = (U8*)SvGROW(dest, need);
3571 (void)SvPOK_only(dest);
3580 /* slen is the byte length of the whole SV.
3581 * ulen is the byte length of the original Unicode character
3582 * stored as UTF-8 at s.
3583 * tculen is the byte length of the freshly titlecased (or
3584 * lowercased) Unicode character stored as UTF-8 at tmpbuf.
3585 * We first set the result to be the titlecased (/lowercased)
3586 * character, and then append the rest of the SV data. */
3587 sv_setpvn(dest, (char*)tmpbuf, tculen);
3589 sv_catpvn(dest, (char*)(s + ulen), slen - ulen);
3593 Copy(tmpbuf, d, tculen, U8);
3594 SvCUR_set(dest, need - 1);
3599 if (IN_LOCALE_RUNTIME) {
3602 *d = (op_type == OP_UCFIRST)
3603 ? toUPPER_LC(*s) : toLOWER_LC(*s);
3606 *d = (op_type == OP_UCFIRST) ? toUPPER(*s) : toLOWER(*s);
3608 /* See bug #39028 */
3616 /* This will copy the trailing NUL */
3617 Copy(s + 1, d + 1, slen, U8);
3618 SvCUR_set(dest, need - 1);
3625 /* There's so much setup/teardown code common between uc and lc, I wonder if
3626 it would be worth merging the two, and just having a switch outside each
3627 of the three tight loops. */
3641 if (SvPADTMP(source) && !SvREADONLY(source) && !SvAMAGIC(source)
3642 && SvTEMP(source) && !DO_UTF8(source)) {
3643 /* We can convert in place. */
3646 s = d = (U8*)SvPV_force_nomg(source, len);
3653 /* The old implementation would copy source into TARG at this point.
3654 This had the side effect that if source was undef, TARG was now
3655 an undefined SV with PADTMP set, and they don't warn inside
3656 sv_2pv_flags(). However, we're now getting the PV direct from
3657 source, which doesn't have PADTMP set, so it would warn. Hence the
3661 s = (const U8*)SvPV_nomg_const(source, len);
3663 if (ckWARN(WARN_UNINITIALIZED))
3664 report_uninit(source);
3670 SvUPGRADE(dest, SVt_PV);
3671 d = (U8*)SvGROW(dest, min);
3672 (void)SvPOK_only(dest);
3677 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
3678 to check DO_UTF8 again here. */
3680 if (DO_UTF8(source)) {
3681 const U8 *const send = s + len;
3682 U8 tmpbuf[UTF8_MAXBYTES+1];
3685 const STRLEN u = UTF8SKIP(s);
3688 toUPPER_utf8(s, tmpbuf, &ulen);
3689 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
3690 /* If the eventually required minimum size outgrows
3691 * the available space, we need to grow. */
3692 const UV o = d - (U8*)SvPVX_const(dest);
3694 /* If someone uppercases one million U+03B0s we SvGROW() one
3695 * million times. Or we could try guessing how much to
3696 allocate without allocating too much. Such is life. */
3698 d = (U8*)SvPVX(dest) + o;
3700 Copy(tmpbuf, d, ulen, U8);
3706 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3709 const U8 *const send = s + len;
3710 if (IN_LOCALE_RUNTIME) {
3713 for (; s < send; d++, s++)
3714 *d = toUPPER_LC(*s);
3717 for (; s < send; d++, s++)
3721 if (source != dest) {
3723 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3743 if (SvPADTMP(source) && !SvREADONLY(source) && !SvAMAGIC(source)
3744 && SvTEMP(source) && !DO_UTF8(source)) {
3745 /* We can convert in place. */
3748 s = d = (U8*)SvPV_force_nomg(source, len);
3755 /* The old implementation would copy source into TARG at this point.
3756 This had the side effect that if source was undef, TARG was now
3757 an undefined SV with PADTMP set, and they don't warn inside
3758 sv_2pv_flags(). However, we're now getting the PV direct from
3759 source, which doesn't have PADTMP set, so it would warn. Hence the
3763 s = (const U8*)SvPV_nomg_const(source, len);
3765 if (ckWARN(WARN_UNINITIALIZED))
3766 report_uninit(source);
3772 SvUPGRADE(dest, SVt_PV);
3773 d = (U8*)SvGROW(dest, min);
3774 (void)SvPOK_only(dest);
3779 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
3780 to check DO_UTF8 again here. */
3782 if (DO_UTF8(source)) {
3783 const U8 *const send = s + len;
3784 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3787 const STRLEN u = UTF8SKIP(s);
3789 const UV uv = toLOWER_utf8(s, tmpbuf, &ulen);
3791 #define GREEK_CAPITAL_LETTER_SIGMA 0x03A3 /* Unicode U+03A3 */
3792 if (uv == GREEK_CAPITAL_LETTER_SIGMA) {
3795 * Now if the sigma is NOT followed by
3796 * /$ignorable_sequence$cased_letter/;
3797 * and it IS preceded by /$cased_letter$ignorable_sequence/;
3798 * where $ignorable_sequence is [\x{2010}\x{AD}\p{Mn}]*
3799 * and $cased_letter is [\p{Ll}\p{Lo}\p{Lt}]
3800 * then it should be mapped to 0x03C2,
3801 * (GREEK SMALL LETTER FINAL SIGMA),
3802 * instead of staying 0x03A3.
3803 * "should be": in other words, this is not implemented yet.
3804 * See lib/unicore/SpecialCasing.txt.
3807 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
3808 /* If the eventually required minimum size outgrows
3809 * the available space, we need to grow. */
3810 const UV o = d - (U8*)SvPVX_const(dest);
3812 /* If someone lowercases one million U+0130s we SvGROW() one
3813 * million times. Or we could try guessing how much to
3814 allocate without allocating too much. Such is life. */
3816 d = (U8*)SvPVX(dest) + o;
3818 Copy(tmpbuf, d, ulen, U8);
3824 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3827 const U8 *const send = s + len;
3828 if (IN_LOCALE_RUNTIME) {
3831 for (; s < send; d++, s++)
3832 *d = toLOWER_LC(*s);
3835 for (; s < send; d++, s++)
3839 if (source != dest) {
3841 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3851 SV * const sv = TOPs;
3853 register const char *s = SvPV_const(sv,len);
3855 SvUTF8_off(TARG); /* decontaminate */
3858 SvUPGRADE(TARG, SVt_PV);
3859 SvGROW(TARG, (len * 2) + 1);
3863 if (UTF8_IS_CONTINUED(*s)) {
3864 STRLEN ulen = UTF8SKIP(s);
3888 SvCUR_set(TARG, d - SvPVX_const(TARG));
3889 (void)SvPOK_only_UTF8(TARG);
3892 sv_setpvn(TARG, s, len);
3894 if (SvSMAGICAL(TARG))
3903 dVAR; dSP; dMARK; dORIGMARK;
3904 register AV* const av = (AV*)POPs;
3905 register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3907 if (SvTYPE(av) == SVt_PVAV) {
3908 const I32 arybase = CopARYBASE_get(PL_curcop);
3909 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
3912 for (svp = MARK + 1; svp <= SP; svp++) {
3913 const I32 elem = SvIV(*svp);
3917 if (max > AvMAX(av))
3920 while (++MARK <= SP) {
3922 I32 elem = SvIV(*MARK);
3926 svp = av_fetch(av, elem, lval);
3928 if (!svp || *svp == &PL_sv_undef)
3929 DIE(aTHX_ PL_no_aelem, elem);
3930 if (PL_op->op_private & OPpLVAL_INTRO)
3931 save_aelem(av, elem, svp);
3933 *MARK = svp ? *svp : &PL_sv_undef;
3936 if (GIMME != G_ARRAY) {
3938 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
3948 AV *array = (AV*)POPs;
3949 const I32 gimme = GIMME_V;
3950 IV *iterp = Perl_av_iter_p(aTHX_ array);
3951 const IV current = (*iterp)++;
3953 if (current > av_len(array)) {
3955 if (gimme == G_SCALAR)
3962 mPUSHi(CopARYBASE_get(PL_curcop) + current);
3963 if (gimme == G_ARRAY) {
3964 SV **const element = av_fetch(array, current, 0);
3965 PUSHs(element ? *element : &PL_sv_undef);
3974 AV *array = (AV*)POPs;
3975 const I32 gimme = GIMME_V;
3977 *Perl_av_iter_p(aTHX_ array) = 0;
3979 if (gimme == G_SCALAR) {
3981 PUSHi(av_len(array) + 1);
3983 else if (gimme == G_ARRAY) {
3984 IV n = Perl_av_len(aTHX_ array);
3985 IV i = CopARYBASE_get(PL_curcop);
3989 if (PL_op->op_type == OP_AKEYS) {
3991 for (; i <= n; i++) {
3996 for (i = 0; i <= n; i++) {
3997 SV *const *const elem = Perl_av_fetch(aTHX_ array, i, 0);
3998 PUSHs(elem ? *elem : &PL_sv_undef);
4005 /* Associative arrays. */
4011 HV * hash = (HV*)POPs;
4013 const I32 gimme = GIMME_V;
4016 /* might clobber stack_sp */
4017 entry = hv_iternext(hash);
4022 SV* const sv = hv_iterkeysv(entry);
4023 PUSHs(sv); /* won't clobber stack_sp */
4024 if (gimme == G_ARRAY) {
4027 /* might clobber stack_sp */
4028 val = hv_iterval(hash, entry);
4033 else if (gimme == G_SCALAR)
4043 const I32 gimme = GIMME_V;
4044 const I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
4046 if (PL_op->op_private & OPpSLICE) {
4048 HV * const hv = (HV*)POPs;
4049 const U32 hvtype = SvTYPE(hv);
4050 if (hvtype == SVt_PVHV) { /* hash element */
4051 while (++MARK <= SP) {
4052 SV * const sv = hv_delete_ent(hv, *MARK, discard, 0);
4053 *MARK = sv ? sv : &PL_sv_undef;
4056 else if (hvtype == SVt_PVAV) { /* array element */
4057 if (PL_op->op_flags & OPf_SPECIAL) {
4058 while (++MARK <= SP) {
4059 SV * const sv = av_delete((AV*)hv, SvIV(*MARK), discard);
4060 *MARK = sv ? sv : &PL_sv_undef;
4065 DIE(aTHX_ "Not a HASH reference");
4068 else if (gimme == G_SCALAR) {
4073 *++MARK = &PL_sv_undef;
4079 HV * const hv = (HV*)POPs;
4081 if (SvTYPE(hv) == SVt_PVHV)
4082 sv = hv_delete_ent(hv, keysv, discard, 0);
4083 else if (SvTYPE(hv) == SVt_PVAV) {
4084 if (PL_op->op_flags & OPf_SPECIAL)
4085 sv = av_delete((AV*)hv, SvIV(keysv), discard);
4087 DIE(aTHX_ "panic: avhv_delete no longer supported");
4090 DIE(aTHX_ "Not a HASH reference");
4106 if (PL_op->op_private & OPpEXISTS_SUB) {
4108 SV * const sv = POPs;
4109 CV * const cv = sv_2cv(sv, &hv, &gv, 0);
4112 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
4118 if (SvTYPE(hv) == SVt_PVHV) {
4119 if (hv_exists_ent(hv, tmpsv, 0))
4122 else if (SvTYPE(hv) == SVt_PVAV) {
4123 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
4124 if (av_exists((AV*)hv, SvIV(tmpsv)))
4129 DIE(aTHX_ "Not a HASH reference");
4136 dVAR; dSP; dMARK; dORIGMARK;
4137 register HV * const hv = (HV*)POPs;
4138 register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
4139 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
4140 bool other_magic = FALSE;
4146 other_magic = mg_find((SV*)hv, PERL_MAGIC_env) ||
4147 ((mg = mg_find((SV*)hv, PERL_MAGIC_tied))
4148 /* Try to preserve the existenceness of a tied hash
4149 * element by using EXISTS and DELETE if possible.
4150 * Fallback to FETCH and STORE otherwise */
4151 && (stash = SvSTASH(SvRV(SvTIED_obj((SV*)hv, mg))))
4152 && gv_fetchmethod_autoload(stash, "EXISTS", TRUE)
4153 && gv_fetchmethod_autoload(stash, "DELETE", TRUE));
4156 while (++MARK <= SP) {
4157 SV * const keysv = *MARK;
4160 bool preeminent = FALSE;
4163 preeminent = SvRMAGICAL(hv) && !other_magic ? 1 :
4164 hv_exists_ent(hv, keysv, 0);
4167 he = hv_fetch_ent(hv, keysv, lval, 0);
4168 svp = he ? &HeVAL(he) : NULL;
4171 if (!svp || *svp == &PL_sv_undef) {
4172 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
4175 if (HvNAME_get(hv) && isGV(*svp))
4176 save_gp((GV*)*svp, !(PL_op->op_flags & OPf_SPECIAL));
4179 save_helem(hv, keysv, svp);
4182 const char * const key = SvPV_const(keysv, keylen);
4183 SAVEDELETE(hv, savepvn(key,keylen),
4184 SvUTF8(keysv) ? -(I32)keylen : (I32)keylen);
4189 *MARK = svp ? *svp : &PL_sv_undef;
4191 if (GIMME != G_ARRAY) {
4193 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
4199 /* List operators. */
4204 if (GIMME != G_ARRAY) {
4206 *MARK = *SP; /* unwanted list, return last item */
4208 *MARK = &PL_sv_undef;
4218 SV ** const lastrelem = PL_stack_sp;
4219 SV ** const lastlelem = PL_stack_base + POPMARK;
4220 SV ** const firstlelem = PL_stack_base + POPMARK + 1;
4221 register SV ** const firstrelem = lastlelem + 1;
4222 const I32 arybase = CopARYBASE_get(PL_curcop);
4223 I32 is_something_there = FALSE;
4225 register const I32 max = lastrelem - lastlelem;
4226 register SV **lelem;
4228 if (GIMME != G_ARRAY) {
4229 I32 ix = SvIV(*lastlelem);
4234 if (ix < 0 || ix >= max)
4235 *firstlelem = &PL_sv_undef;
4237 *firstlelem = firstrelem[ix];
4243 SP = firstlelem - 1;
4247 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
4248 I32 ix = SvIV(*lelem);
4253 if (ix < 0 || ix >= max)
4254 *lelem = &PL_sv_undef;
4256 is_something_there = TRUE;
4257 if (!(*lelem = firstrelem[ix]))
4258 *lelem = &PL_sv_undef;
4261 if (is_something_there)
4264 SP = firstlelem - 1;
4270 dVAR; dSP; dMARK; dORIGMARK;
4271 const I32 items = SP - MARK;
4272 SV * const av = (SV *) av_make(items, MARK+1);
4273 SP = ORIGMARK; /* av_make() might realloc stack_sp */
4274 mXPUSHs((PL_op->op_flags & OPf_SPECIAL)
4275 ? newRV_noinc(av) : av);
4281 dVAR; dSP; dMARK; dORIGMARK;
4282 HV* const hv = newHV();
4285 SV * const key = *++MARK;
4286 SV * const val = newSV(0);
4288 sv_setsv(val, *++MARK);
4289 else if (ckWARN(WARN_MISC))
4290 Perl_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
4291 (void)hv_store_ent(hv,key,val,0);
4294 mXPUSHs((PL_op->op_flags & OPf_SPECIAL)
4295 ? newRV_noinc((SV*) hv) : (SV*) hv);
4301 dVAR; dSP; dMARK; dORIGMARK;
4302 register AV *ary = (AV*)*++MARK;
4306 register I32 offset;
4307 register I32 length;
4311 const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4314 *MARK-- = SvTIED_obj((SV*)ary, mg);
4318 call_method("SPLICE",GIMME_V);
4327 offset = i = SvIV(*MARK);
4329 offset += AvFILLp(ary) + 1;
4331 offset -= CopARYBASE_get(PL_curcop);
4333 DIE(aTHX_ PL_no_aelem, i);
4335 length = SvIVx(*MARK++);
4337 length += AvFILLp(ary) - offset + 1;
4343 length = AvMAX(ary) + 1; /* close enough to infinity */
4347 length = AvMAX(ary) + 1;
4349 if (offset > AvFILLp(ary) + 1) {
4350 if (ckWARN(WARN_MISC))
4351 Perl_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
4352 offset = AvFILLp(ary) + 1;
4354 after = AvFILLp(ary) + 1 - (offset + length);
4355 if (after < 0) { /* not that much array */
4356 length += after; /* offset+length now in array */
4362 /* At this point, MARK .. SP-1 is our new LIST */
4365 diff = newlen - length;
4366 if (newlen && !AvREAL(ary) && AvREIFY(ary))
4369 /* make new elements SVs now: avoid problems if they're from the array */
4370 for (dst = MARK, i = newlen; i; i--) {
4371 SV * const h = *dst;
4372 *dst++ = newSVsv(h);
4375 if (diff < 0) { /* shrinking the area */
4376 SV **tmparyval = NULL;
4378 Newx(tmparyval, newlen, SV*); /* so remember insertion */
4379 Copy(MARK, tmparyval, newlen, SV*);
4382 MARK = ORIGMARK + 1;
4383 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4384 MEXTEND(MARK, length);
4385 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
4387 EXTEND_MORTAL(length);
4388 for (i = length, dst = MARK; i; i--) {
4389 sv_2mortal(*dst); /* free them eventualy */
4396 *MARK = AvARRAY(ary)[offset+length-1];
4399 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
4400 SvREFCNT_dec(*dst++); /* free them now */
4403 AvFILLp(ary) += diff;
4405 /* pull up or down? */
4407 if (offset < after) { /* easier to pull up */
4408 if (offset) { /* esp. if nothing to pull */
4409 src = &AvARRAY(ary)[offset-1];
4410 dst = src - diff; /* diff is negative */
4411 for (i = offset; i > 0; i--) /* can't trust Copy */
4415 AvARRAY(ary) = AvARRAY(ary) - diff; /* diff is negative */
4419 if (after) { /* anything to pull down? */
4420 src = AvARRAY(ary) + offset + length;
4421 dst = src + diff; /* diff is negative */
4422 Move(src, dst, after, SV*);
4424 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
4425 /* avoid later double free */
4429 dst[--i] = &PL_sv_undef;
4432 Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
4433 Safefree(tmparyval);
4436 else { /* no, expanding (or same) */
4437 SV** tmparyval = NULL;
4439 Newx(tmparyval, length, SV*); /* so remember deletion */
4440 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
4443 if (diff > 0) { /* expanding */
4444 /* push up or down? */
4445 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
4449 Move(src, dst, offset, SV*);
4451 AvARRAY(ary) = AvARRAY(ary) - diff;/* diff is positive */
4453 AvFILLp(ary) += diff;
4456 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
4457 av_extend(ary, AvFILLp(ary) + diff);
4458 AvFILLp(ary) += diff;
4461 dst = AvARRAY(ary) + AvFILLp(ary);
4463 for (i = after; i; i--) {
4471 Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
4474 MARK = ORIGMARK + 1;
4475 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4477 Copy(tmparyval, MARK, length, SV*);
4479 EXTEND_MORTAL(length);
4480 for (i = length, dst = MARK; i; i--) {
4481 sv_2mortal(*dst); /* free them eventualy */
4488 else if (length--) {
4489 *MARK = tmparyval[length];
4492 while (length-- > 0)
4493 SvREFCNT_dec(tmparyval[length]);
4497 *MARK = &PL_sv_undef;
4498 Safefree(tmparyval);
4506 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4507 register AV * const ary = (AV*)*++MARK;
4508 const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4511 *MARK-- = SvTIED_obj((SV*)ary, mg);
4515 call_method("PUSH",G_SCALAR|G_DISCARD);
4519 PUSHi( AvFILL(ary) + 1 );
4522 PL_delaymagic = DM_DELAY;
4523 for (++MARK; MARK <= SP; MARK++) {
4524 SV * const sv = newSV(0);
4526 sv_setsv(sv, *MARK);
4527 av_store(ary, AvFILLp(ary)+1, sv);
4529 if (PL_delaymagic & DM_ARRAY)
4534 PUSHi( AvFILLp(ary) + 1 );
4543 AV * const av = (AV*)POPs;
4544 SV * const sv = PL_op->op_type == OP_SHIFT ? av_shift(av) : av_pop(av);
4548 (void)sv_2mortal(sv);
4555 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4556 register AV *ary = (AV*)*++MARK;
4557 const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4560 *MARK-- = SvTIED_obj((SV*)ary, mg);
4564 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
4570 av_unshift(ary, SP - MARK);
4572 SV * const sv = newSVsv(*++MARK);
4573 (void)av_store(ary, i++, sv);
4577 PUSHi( AvFILL(ary) + 1 );
4584 SV ** const oldsp = SP;
4586 if (GIMME == G_ARRAY) {
4589 register SV * const tmp = *MARK;
4593 /* safe as long as stack cannot get extended in the above */
4598 register char *down;
4602 PADOFFSET padoff_du;
4604 SvUTF8_off(TARG); /* decontaminate */
4606 do_join(TARG, &PL_sv_no, MARK, SP);
4608 sv_setsv(TARG, (SP > MARK)
4610 : (padoff_du = find_rundefsvoffset(),
4611 (padoff_du == NOT_IN_PAD
4612 || PAD_COMPNAME_FLAGS_isOUR(padoff_du))
4613 ? DEFSV : PAD_SVl(padoff_du)));
4614 up = SvPV_force(TARG, len);
4616 if (DO_UTF8(TARG)) { /* first reverse each character */
4617 U8* s = (U8*)SvPVX(TARG);
4618 const U8* send = (U8*)(s + len);
4620 if (UTF8_IS_INVARIANT(*s)) {
4625 if (!utf8_to_uvchr(s, 0))
4629 down = (char*)(s - 1);
4630 /* reverse this character */
4634 *down-- = (char)tmp;
4640 down = SvPVX(TARG) + len - 1;
4644 *down-- = (char)tmp;
4646 (void)SvPOK_only_UTF8(TARG);
4658 register IV limit = POPi; /* note, negative is forever */
4659 SV * const sv = POPs;
4661 register const char *s = SvPV_const(sv, len);
4662 const bool do_utf8 = DO_UTF8(sv);
4663 const char *strend = s + len;
4665 register REGEXP *rx;
4667 register const char *m;
4669 const STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (STRLEN)(strend - s);
4670 I32 maxiters = slen + 10;
4672 const I32 origlimit = limit;
4675 const I32 gimme = GIMME_V;
4676 const I32 oldsave = PL_savestack_ix;
4677 U32 make_mortal = SVs_TEMP;
4682 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4687 DIE(aTHX_ "panic: pp_split");
4690 TAINT_IF((RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) &&
4691 (RX_EXTFLAGS(rx) & (RXf_WHITE | RXf_SKIPWHITE)));
4693 RX_MATCH_UTF8_set(rx, do_utf8);
4696 if (pm->op_pmreplrootu.op_pmtargetoff) {
4697 ary = GvAVn((GV*)PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff));
4700 if (pm->op_pmreplrootu.op_pmtargetgv) {
4701 ary = GvAVn(pm->op_pmreplrootu.op_pmtargetgv);
4704 else if (gimme != G_ARRAY)
4705 ary = GvAVn(PL_defgv);
4708 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4714 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4716 XPUSHs(SvTIED_obj((SV*)ary, mg));
4723 for (i = AvFILLp(ary); i >= 0; i--)
4724 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
4726 /* temporarily switch stacks */
4727 SAVESWITCHSTACK(PL_curstack, ary);
4731 base = SP - PL_stack_base;
4733 if (RX_EXTFLAGS(rx) & RXf_SKIPWHITE) {
4735 while (*s == ' ' || is_utf8_space((U8*)s))
4738 else if (RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) {
4739 while (isSPACE_LC(*s))
4747 if (RX_EXTFLAGS(rx) & PMf_MULTILINE) {
4752 limit = maxiters + 2;
4753 if (RX_EXTFLAGS(rx) & RXf_WHITE) {
4756 /* this one uses 'm' and is a negative test */
4758 while (m < strend && !( *m == ' ' || is_utf8_space((U8*)m) )) {
4759 const int t = UTF8SKIP(m);
4760 /* is_utf8_space returns FALSE for malform utf8 */
4766 } else if (RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) {
4767 while (m < strend && !isSPACE_LC(*m))
4770 while (m < strend && !isSPACE(*m))
4776 dstr = newSVpvn_flags(s, m-s,
4777 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
4780 /* skip the whitespace found last */
4782 s = m + UTF8SKIP(m);
4786 /* this one uses 's' and is a positive test */
4788 while (s < strend && ( *s == ' ' || is_utf8_space((U8*)s) ))
4790 } else if (RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) {
4791 while (s < strend && isSPACE_LC(*s))
4794 while (s < strend && isSPACE(*s))
4799 else if (RX_EXTFLAGS(rx) & RXf_START_ONLY) {
4801 for (m = s; m < strend && *m != '\n'; m++)
4806 dstr = newSVpvn_flags(s, m-s,
4807 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
4812 else if (RX_EXTFLAGS(rx) & RXf_NULL && !(s >= strend)) {
4814 Pre-extend the stack, either the number of bytes or
4815 characters in the string or a limited amount, triggered by:
4817 my ($x, $y) = split //, $str;
4821 const U32 items = limit - 1;
4829 /* keep track of how many bytes we skip over */
4832 dstr = newSVpvn_flags(m, s-m, SVf_UTF8 | make_mortal);
4841 dstr = newSVpvn(s, 1);
4855 else if (do_utf8 == (RX_UTF8(rx) != 0) &&
4856 (RX_EXTFLAGS(rx) & RXf_USE_INTUIT) && !RX_NPARENS(rx)
4857 && (RX_EXTFLAGS(rx) & RXf_CHECK_ALL)
4858 && !(RX_EXTFLAGS(rx) & RXf_ANCH)) {
4859 const int tail = (RX_EXTFLAGS(rx) & RXf_INTUIT_TAIL);
4860 SV * const csv = CALLREG_INTUIT_STRING(rx);
4862 len = RX_MINLENRET(rx);
4863 if (len == 1 && !RX_UTF8(rx) && !tail) {
4864 const char c = *SvPV_nolen_const(csv);
4866 for (m = s; m < strend && *m != c; m++)
4870 dstr = newSVpvn_flags(s, m-s,
4871 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
4873 /* The rx->minlen is in characters but we want to step
4874 * s ahead by bytes. */
4876 s = (char*)utf8_hop((U8*)m, len);
4878 s = m + len; /* Fake \n at the end */
4882 while (s < strend && --limit &&
4883 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
4884 csv, multiline ? FBMrf_MULTILINE : 0)) )
4886 dstr = newSVpvn_flags(s, m-s,
4887 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
4889 /* The rx->minlen is in characters but we want to step
4890 * s ahead by bytes. */
4892 s = (char*)utf8_hop((U8*)m, len);
4894 s = m + len; /* Fake \n at the end */
4899 maxiters += slen * RX_NPARENS(rx);
4900 while (s < strend && --limit)
4904 rex_return = CALLREGEXEC(rx, (char*)s, (char*)strend, (char*)orig, 1 ,
4907 if (rex_return == 0)
4909 TAINT_IF(RX_MATCH_TAINTED(rx));
4910 if (RX_MATCH_COPIED(rx) && RX_SUBBEG(rx) != orig) {
4913 orig = RX_SUBBEG(rx);
4915 strend = s + (strend - m);
4917 m = RX_OFFS(rx)[0].start + orig;
4918 dstr = newSVpvn_flags(s, m-s,
4919 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
4921 if (RX_NPARENS(rx)) {
4923 for (i = 1; i <= (I32)RX_NPARENS(rx); i++) {
4924 s = RX_OFFS(rx)[i].start + orig;
4925 m = RX_OFFS(rx)[i].end + orig;
4927 /* japhy (07/27/01) -- the (m && s) test doesn't catch
4928 parens that didn't match -- they should be set to
4929 undef, not the empty string */
4930 if (m >= orig && s >= orig) {
4931 dstr = newSVpvn_flags(s, m-s,
4932 (do_utf8 ? SVf_UTF8 : 0)
4936 dstr = &PL_sv_undef; /* undef, not "" */
4940 s = RX_OFFS(rx)[0].end + orig;
4944 iters = (SP - PL_stack_base) - base;
4945 if (iters > maxiters)
4946 DIE(aTHX_ "Split loop");
4948 /* keep field after final delim? */
4949 if (s < strend || (iters && origlimit)) {
4950 const STRLEN l = strend - s;
4951 dstr = newSVpvn_flags(s, l, (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
4955 else if (!origlimit) {
4956 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
4957 if (TOPs && !make_mortal)
4960 *SP-- = &PL_sv_undef;
4965 LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */
4969 if (SvSMAGICAL(ary)) {
4974 if (gimme == G_ARRAY) {
4976 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4984 call_method("PUSH",G_SCALAR|G_DISCARD);
4987 if (gimme == G_ARRAY) {
4989 /* EXTEND should not be needed - we just popped them */
4991 for (i=0; i < iters; i++) {
4992 SV **svp = av_fetch(ary, i, FALSE);
4993 PUSHs((svp) ? *svp : &PL_sv_undef);
5000 if (gimme == G_ARRAY)
5012 SV *const sv = PAD_SVl(PL_op->op_targ);
5014 if (SvPADSTALE(sv)) {
5017 RETURNOP(cLOGOP->op_other);
5019 RETURNOP(cLOGOP->op_next);
5029 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
5030 || SvTYPE(retsv) == SVt_PVCV) {
5031 retsv = refto(retsv);
5038 PP(unimplemented_op)
5041 DIE(aTHX_ "panic: unimplemented op %s (#%d) called", OP_NAME(PL_op),
5047 * c-indentation-style: bsd
5049 * indent-tabs-mode: t
5052 * ex: set ts=8 sts=4 sw=4 noet: