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 if (SvTYPE(sv) < SVt_RV)
176 sv_upgrade(sv, SVt_RV);
177 else if (SvPVX_const(sv)) {
182 SvRV_set(sv, (SV*)gv);
187 if (PL_op->op_flags & OPf_REF ||
188 PL_op->op_private & HINT_STRICT_REFS)
189 DIE(aTHX_ PL_no_usym, "a symbol");
190 if (ckWARN(WARN_UNINITIALIZED))
194 if ((PL_op->op_flags & OPf_SPECIAL) &&
195 !(PL_op->op_flags & OPf_MOD))
197 SV * const temp = (SV*)gv_fetchsv(sv, 0, SVt_PVGV);
199 && (!is_gv_magical_sv(sv,0)
200 || !(sv = (SV*)gv_fetchsv(sv, GV_ADD, SVt_PVGV)))) {
206 if (PL_op->op_private & HINT_STRICT_REFS)
207 DIE(aTHX_ PL_no_symref_sv, sv, "a symbol");
208 if ((PL_op->op_private & (OPpLVAL_INTRO|OPpDONT_INIT_GV))
209 == OPpDONT_INIT_GV) {
210 /* We are the target of a coderef assignment. Return
211 the scalar unchanged, and let pp_sasssign deal with
215 sv = (SV*)gv_fetchsv(sv, GV_ADD, SVt_PVGV);
219 if (PL_op->op_private & OPpLVAL_INTRO)
220 save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
225 /* Helper function for pp_rv2sv and pp_rv2av */
227 Perl_softref2xv(pTHX_ SV *const sv, const char *const what, const U32 type,
233 if (PL_op->op_private & HINT_STRICT_REFS) {
235 Perl_die(aTHX_ PL_no_symref_sv, sv, what);
237 Perl_die(aTHX_ PL_no_usym, what);
240 if (PL_op->op_flags & OPf_REF)
241 Perl_die(aTHX_ PL_no_usym, what);
242 if (ckWARN(WARN_UNINITIALIZED))
244 if (type != SVt_PV && GIMME_V == G_ARRAY) {
248 **spp = &PL_sv_undef;
251 if ((PL_op->op_flags & OPf_SPECIAL) &&
252 !(PL_op->op_flags & OPf_MOD))
254 gv = gv_fetchsv(sv, 0, type);
256 && (!is_gv_magical_sv(sv,0)
257 || !(gv = gv_fetchsv(sv, GV_ADD, type))))
259 **spp = &PL_sv_undef;
264 gv = gv_fetchsv(sv, GV_ADD, type);
276 tryAMAGICunDEREF(to_sv);
279 switch (SvTYPE(sv)) {
285 DIE(aTHX_ "Not a SCALAR reference");
292 if (SvTYPE(gv) != SVt_PVGV) {
293 if (SvGMAGICAL(sv)) {
298 gv = Perl_softref2xv(aTHX_ sv, "a SCALAR", SVt_PV, &sp);
304 if (PL_op->op_flags & OPf_MOD) {
305 if (PL_op->op_private & OPpLVAL_INTRO) {
306 if (cUNOP->op_first->op_type == OP_NULL)
307 sv = save_scalar((GV*)TOPs);
309 sv = save_scalar(gv);
311 Perl_croak(aTHX_ PL_no_localize_ref);
313 else if (PL_op->op_private & OPpDEREF)
314 vivify_ref(sv, PL_op->op_private & OPpDEREF);
323 AV * const av = (AV*)TOPs;
324 SV ** const sv = Perl_av_arylen_p(aTHX_ (AV*)av);
326 *sv = newSV_type(SVt_PVMG);
327 sv_magic(*sv, (SV*)av, PERL_MAGIC_arylen, NULL, 0);
335 dVAR; dSP; dTARGET; dPOPss;
337 if (PL_op->op_flags & OPf_MOD || LVRET) {
338 if (SvTYPE(TARG) < SVt_PVLV) {
339 sv_upgrade(TARG, SVt_PVLV);
340 sv_magic(TARG, NULL, PERL_MAGIC_pos, NULL, 0);
344 if (LvTARG(TARG) != sv) {
346 SvREFCNT_dec(LvTARG(TARG));
347 LvTARG(TARG) = SvREFCNT_inc_simple(sv);
349 PUSHs(TARG); /* no SvSETMAGIC */
353 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
354 const MAGIC * const mg = mg_find(sv, PERL_MAGIC_regex_global);
355 if (mg && mg->mg_len >= 0) {
359 PUSHi(i + CopARYBASE_get(PL_curcop));
372 const I32 flags = (PL_op->op_flags & OPf_SPECIAL)
374 : ((PL_op->op_private & (OPpLVAL_INTRO|OPpMAY_RETURN_CONSTANT)) == OPpMAY_RETURN_CONSTANT)
377 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
378 /* (But not in defined().) */
380 CV *cv = sv_2cv(TOPs, &stash_unused, &gv, flags);
383 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
384 if ((PL_op->op_private & OPpLVAL_INTRO)) {
385 if (gv && GvCV(gv) == cv && (gv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv), FALSE)))
388 DIE(aTHX_ "Can't modify non-lvalue subroutine call");
391 else if ((flags == (GV_ADD|GV_NOEXPAND)) && gv && SvROK(gv)) {
395 cv = (CV*)&PL_sv_undef;
406 SV *ret = &PL_sv_undef;
408 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
409 const char * s = SvPVX_const(TOPs);
410 if (strnEQ(s, "CORE::", 6)) {
411 const int code = keyword(s + 6, SvCUR(TOPs) - 6, 1);
412 if (code < 0) { /* Overridable. */
413 #define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
414 int i = 0, n = 0, seen_question = 0, defgv = 0;
416 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
418 if (code == -KEY_chop || code == -KEY_chomp
419 || code == -KEY_exec || code == -KEY_system || code == -KEY_err)
421 if (code == -KEY_mkdir) {
422 ret = sv_2mortal(newSVpvs("_;$"));
425 if (code == -KEY_readpipe) {
426 s = "CORE::backtick";
428 while (i < MAXO) { /* The slow way. */
429 if (strEQ(s + 6, PL_op_name[i])
430 || strEQ(s + 6, PL_op_desc[i]))
436 goto nonesuch; /* Should not happen... */
438 defgv = PL_opargs[i] & OA_DEFGV;
439 oa = PL_opargs[i] >> OASHIFT;
441 if (oa & OA_OPTIONAL && !seen_question && !defgv) {
445 if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
446 && (oa & (OA_OPTIONAL - 1)) <= OA_SCALARREF
447 /* But globs are already references (kinda) */
448 && (oa & (OA_OPTIONAL - 1)) != OA_FILEREF
452 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
455 if (defgv && str[n - 1] == '$')
458 ret = sv_2mortal(newSVpvn(str, n - 1));
460 else if (code) /* Non-Overridable */
462 else { /* None such */
464 DIE(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
468 cv = sv_2cv(TOPs, &stash, &gv, 0);
470 ret = sv_2mortal(newSVpvn(SvPVX_const(cv), SvCUR(cv)));
479 CV* cv = (CV*)PAD_SV(PL_op->op_targ);
481 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
497 if (GIMME != G_ARRAY) {
501 *MARK = &PL_sv_undef;
502 *MARK = refto(*MARK);
506 EXTEND_MORTAL(SP - MARK);
508 *MARK = refto(*MARK);
513 S_refto(pTHX_ SV *sv)
518 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
521 if (!(sv = LvTARG(sv)))
524 SvREFCNT_inc_void_NN(sv);
526 else if (SvTYPE(sv) == SVt_PVAV) {
527 if (!AvREAL((AV*)sv) && AvREIFY((AV*)sv))
530 SvREFCNT_inc_void_NN(sv);
532 else if (SvPADTMP(sv) && !IS_PADGV(sv))
536 SvREFCNT_inc_void_NN(sv);
539 sv_upgrade(rv, SVt_RV);
549 SV * const sv = POPs;
554 if (!sv || !SvROK(sv))
557 pv = sv_reftype(SvRV(sv),TRUE);
558 PUSHp(pv, strlen(pv));
568 stash = CopSTASH(PL_curcop);
570 SV * const ssv = POPs;
574 if (ssv && !SvGMAGICAL(ssv) && !SvAMAGIC(ssv) && SvROK(ssv))
575 Perl_croak(aTHX_ "Attempt to bless into a reference");
576 ptr = SvPV_const(ssv,len);
577 if (len == 0 && ckWARN(WARN_MISC))
578 Perl_warner(aTHX_ packWARN(WARN_MISC),
579 "Explicit blessing to '' (assuming package main)");
580 stash = gv_stashpvn(ptr, len, GV_ADD);
583 (void)sv_bless(TOPs, stash);
592 const char * const elem = SvPV_nolen_const(sv);
593 GV * const gv = (GV*)POPs;
598 /* elem will always be NUL terminated. */
599 const char * const second_letter = elem + 1;
602 if (strEQ(second_letter, "RRAY"))
603 tmpRef = (SV*)GvAV(gv);
606 if (strEQ(second_letter, "ODE"))
607 tmpRef = (SV*)GvCVu(gv);
610 if (strEQ(second_letter, "ILEHANDLE")) {
611 /* finally deprecated in 5.8.0 */
612 deprecate("*glob{FILEHANDLE}");
613 tmpRef = (SV*)GvIOp(gv);
616 if (strEQ(second_letter, "ORMAT"))
617 tmpRef = (SV*)GvFORM(gv);
620 if (strEQ(second_letter, "LOB"))
624 if (strEQ(second_letter, "ASH"))
625 tmpRef = (SV*)GvHV(gv);
628 if (*second_letter == 'O' && !elem[2])
629 tmpRef = (SV*)GvIOp(gv);
632 if (strEQ(second_letter, "AME"))
633 sv = newSVpvn(GvNAME(gv), GvNAMELEN(gv));
636 if (strEQ(second_letter, "ACKAGE")) {
637 const HV * const stash = GvSTASH(gv);
638 const HEK * const hek = stash ? HvNAME_HEK(stash) : NULL;
639 sv = hek ? newSVhek(hek) : newSVpvs("__ANON__");
643 if (strEQ(second_letter, "CALAR"))
658 /* Pattern matching */
663 register unsigned char *s;
666 register I32 *sfirst;
670 if (sv == PL_lastscream) {
674 s = (unsigned char*)(SvPV(sv, len));
676 if (pos <= 0 || !SvPOK(sv) || SvUTF8(sv)) {
677 /* No point in studying a zero length string, and not safe to study
678 anything that doesn't appear to be a simple scalar (and hence might
679 change between now and when the regexp engine runs without our set
680 magic ever running) such as a reference to an object with overloaded
686 SvSCREAM_off(PL_lastscream);
687 SvREFCNT_dec(PL_lastscream);
689 PL_lastscream = SvREFCNT_inc_simple(sv);
691 s = (unsigned char*)(SvPV(sv, len));
695 if (pos > PL_maxscream) {
696 if (PL_maxscream < 0) {
697 PL_maxscream = pos + 80;
698 Newx(PL_screamfirst, 256, I32);
699 Newx(PL_screamnext, PL_maxscream, I32);
702 PL_maxscream = pos + pos / 4;
703 Renew(PL_screamnext, PL_maxscream, I32);
707 sfirst = PL_screamfirst;
708 snext = PL_screamnext;
710 if (!sfirst || !snext)
711 DIE(aTHX_ "do_study: out of memory");
713 for (ch = 256; ch; --ch)
718 register const I32 ch = s[pos];
720 snext[pos] = sfirst[ch] - pos;
727 /* piggyback on m//g magic */
728 sv_magic(sv, NULL, PERL_MAGIC_regex_global, NULL, 0);
737 if (PL_op->op_flags & OPf_STACKED)
739 else if (PL_op->op_private & OPpTARGET_MY)
745 TARG = sv_newmortal();
750 /* Lvalue operators. */
762 dVAR; dSP; dMARK; dTARGET; dORIGMARK;
764 do_chop(TARG, *++MARK);
773 SETi(do_chomp(TOPs));
779 dVAR; dSP; dMARK; dTARGET;
780 register I32 count = 0;
783 count += do_chomp(POPs);
793 if (!PL_op->op_private) {
802 SV_CHECK_THINKFIRST_COW_DROP(sv);
804 switch (SvTYPE(sv)) {
814 if (cv_const_sv((CV*)sv) && ckWARN(WARN_MISC))
815 Perl_warner(aTHX_ packWARN(WARN_MISC), "Constant subroutine %s undefined",
816 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
820 /* let user-undef'd sub keep its identity */
821 GV* const gv = CvGV((CV*)sv);
828 SvSetMagicSV(sv, &PL_sv_undef);
833 GvGP(sv) = gp_ref(gp);
835 GvLINE(sv) = CopLINE(PL_curcop);
841 if (SvTYPE(sv) >= SVt_PV && SvPVX_const(sv) && SvLEN(sv)) {
856 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
857 DIE(aTHX_ PL_no_modify);
858 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
859 && SvIVX(TOPs) != IV_MIN)
861 SvIV_set(TOPs, SvIVX(TOPs) - 1);
862 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
873 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
874 DIE(aTHX_ PL_no_modify);
875 sv_setsv(TARG, TOPs);
876 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
877 && SvIVX(TOPs) != IV_MAX)
879 SvIV_set(TOPs, SvIVX(TOPs) + 1);
880 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
885 /* special case for undef: see thread at 2003-03/msg00536.html in archive */
895 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
896 DIE(aTHX_ PL_no_modify);
897 sv_setsv(TARG, TOPs);
898 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
899 && SvIVX(TOPs) != IV_MIN)
901 SvIV_set(TOPs, SvIVX(TOPs) - 1);
902 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
911 /* Ordinary operators. */
916 #ifdef PERL_PRESERVE_IVUV
919 tryAMAGICbin(pow,opASSIGN);
920 #ifdef PERL_PRESERVE_IVUV
921 /* For integer to integer power, we do the calculation by hand wherever
922 we're sure it is safe; otherwise we call pow() and try to convert to
923 integer afterwards. */
936 const IV iv = SvIVX(TOPs);
940 goto float_it; /* Can't do negative powers this way. */
944 baseuok = SvUOK(TOPm1s);
946 baseuv = SvUVX(TOPm1s);
948 const IV iv = SvIVX(TOPm1s);
951 baseuok = TRUE; /* effectively it's a UV now */
953 baseuv = -iv; /* abs, baseuok == false records sign */
956 /* now we have integer ** positive integer. */
959 /* foo & (foo - 1) is zero only for a power of 2. */
960 if (!(baseuv & (baseuv - 1))) {
961 /* We are raising power-of-2 to a positive integer.
962 The logic here will work for any base (even non-integer
963 bases) but it can be less accurate than
964 pow (base,power) or exp (power * log (base)) when the
965 intermediate values start to spill out of the mantissa.
966 With powers of 2 we know this can't happen.
967 And powers of 2 are the favourite thing for perl
968 programmers to notice ** not doing what they mean. */
970 NV base = baseuok ? baseuv : -(NV)baseuv;
975 while (power >>= 1) {
986 register unsigned int highbit = 8 * sizeof(UV);
987 register unsigned int diff = 8 * sizeof(UV);
990 if (baseuv >> highbit) {
994 /* we now have baseuv < 2 ** highbit */
995 if (power * highbit <= 8 * sizeof(UV)) {
996 /* result will definitely fit in UV, so use UV math
997 on same algorithm as above */
998 register UV result = 1;
999 register UV base = baseuv;
1000 const bool odd_power = (bool)(power & 1);
1004 while (power >>= 1) {
1011 if (baseuok || !odd_power)
1012 /* answer is positive */
1014 else if (result <= (UV)IV_MAX)
1015 /* answer negative, fits in IV */
1016 SETi( -(IV)result );
1017 else if (result == (UV)IV_MIN)
1018 /* 2's complement assumption: special case IV_MIN */
1021 /* answer negative, doesn't fit */
1022 SETn( -(NV)result );
1034 #if defined(USE_LONG_DOUBLE) && defined(HAS_AIX_POWL_NEG_BASE_BUG)
1036 We are building perl with long double support and are on an AIX OS
1037 afflicted with a powl() function that wrongly returns NaNQ for any
1038 negative base. This was reported to IBM as PMR #23047-379 on
1039 03/06/2006. The problem exists in at least the following versions
1040 of AIX and the libm fileset, and no doubt others as well:
1042 AIX 4.3.3-ML10 bos.adt.libm 4.3.3.50
1043 AIX 5.1.0-ML04 bos.adt.libm 5.1.0.29
1044 AIX 5.2.0 bos.adt.libm 5.2.0.85
1046 So, until IBM fixes powl(), we provide the following workaround to
1047 handle the problem ourselves. Our logic is as follows: for
1048 negative bases (left), we use fmod(right, 2) to check if the
1049 exponent is an odd or even integer:
1051 - if odd, powl(left, right) == -powl(-left, right)
1052 - if even, powl(left, right) == powl(-left, right)
1054 If the exponent is not an integer, the result is rightly NaNQ, so
1055 we just return that (as NV_NAN).
1059 NV mod2 = Perl_fmod( right, 2.0 );
1060 if (mod2 == 1.0 || mod2 == -1.0) { /* odd integer */
1061 SETn( -Perl_pow( -left, right) );
1062 } else if (mod2 == 0.0) { /* even integer */
1063 SETn( Perl_pow( -left, right) );
1064 } else { /* fractional power */
1068 SETn( Perl_pow( left, right) );
1071 SETn( Perl_pow( left, right) );
1072 #endif /* HAS_AIX_POWL_NEG_BASE_BUG */
1074 #ifdef PERL_PRESERVE_IVUV
1084 dVAR; dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
1085 #ifdef PERL_PRESERVE_IVUV
1088 /* Unless the left argument is integer in range we are going to have to
1089 use NV maths. Hence only attempt to coerce the right argument if
1090 we know the left is integer. */
1091 /* Left operand is defined, so is it IV? */
1092 SvIV_please(TOPm1s);
1093 if (SvIOK(TOPm1s)) {
1094 bool auvok = SvUOK(TOPm1s);
1095 bool buvok = SvUOK(TOPs);
1096 const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
1097 const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
1104 alow = SvUVX(TOPm1s);
1106 const IV aiv = SvIVX(TOPm1s);
1109 auvok = TRUE; /* effectively it's a UV now */
1111 alow = -aiv; /* abs, auvok == false records sign */
1117 const IV biv = SvIVX(TOPs);
1120 buvok = TRUE; /* effectively it's a UV now */
1122 blow = -biv; /* abs, buvok == false records sign */
1126 /* If this does sign extension on unsigned it's time for plan B */
1127 ahigh = alow >> (4 * sizeof (UV));
1129 bhigh = blow >> (4 * sizeof (UV));
1131 if (ahigh && bhigh) {
1133 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
1134 which is overflow. Drop to NVs below. */
1135 } else if (!ahigh && !bhigh) {
1136 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
1137 so the unsigned multiply cannot overflow. */
1138 const UV product = alow * blow;
1139 if (auvok == buvok) {
1140 /* -ve * -ve or +ve * +ve gives a +ve result. */
1144 } else if (product <= (UV)IV_MIN) {
1145 /* 2s complement assumption that (UV)-IV_MIN is correct. */
1146 /* -ve result, which could overflow an IV */
1148 SETi( -(IV)product );
1150 } /* else drop to NVs below. */
1152 /* One operand is large, 1 small */
1155 /* swap the operands */
1157 bhigh = blow; /* bhigh now the temp var for the swap */
1161 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1162 multiplies can't overflow. shift can, add can, -ve can. */
1163 product_middle = ahigh * blow;
1164 if (!(product_middle & topmask)) {
1165 /* OK, (ahigh * blow) won't lose bits when we shift it. */
1167 product_middle <<= (4 * sizeof (UV));
1168 product_low = alow * blow;
1170 /* as for pp_add, UV + something mustn't get smaller.
1171 IIRC ANSI mandates this wrapping *behaviour* for
1172 unsigned whatever the actual representation*/
1173 product_low += product_middle;
1174 if (product_low >= product_middle) {
1175 /* didn't overflow */
1176 if (auvok == buvok) {
1177 /* -ve * -ve or +ve * +ve gives a +ve result. */
1179 SETu( product_low );
1181 } else if (product_low <= (UV)IV_MIN) {
1182 /* 2s complement assumption again */
1183 /* -ve result, which could overflow an IV */
1185 SETi( -(IV)product_low );
1187 } /* else drop to NVs below. */
1189 } /* product_middle too large */
1190 } /* ahigh && bhigh */
1191 } /* SvIOK(TOPm1s) */
1196 SETn( left * right );
1203 dVAR; dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
1204 /* Only try to do UV divide first
1205 if ((SLOPPYDIVIDE is true) or
1206 (PERL_PRESERVE_IVUV is true and one or both SV is a UV too large
1208 The assumption is that it is better to use floating point divide
1209 whenever possible, only doing integer divide first if we can't be sure.
1210 If NV_PRESERVES_UV is true then we know at compile time that no UV
1211 can be too large to preserve, so don't need to compile the code to
1212 test the size of UVs. */
1215 # define PERL_TRY_UV_DIVIDE
1216 /* ensure that 20./5. == 4. */
1218 # ifdef PERL_PRESERVE_IVUV
1219 # ifndef NV_PRESERVES_UV
1220 # define PERL_TRY_UV_DIVIDE
1225 #ifdef PERL_TRY_UV_DIVIDE
1228 SvIV_please(TOPm1s);
1229 if (SvIOK(TOPm1s)) {
1230 bool left_non_neg = SvUOK(TOPm1s);
1231 bool right_non_neg = SvUOK(TOPs);
1235 if (right_non_neg) {
1236 right = SvUVX(TOPs);
1239 const IV biv = SvIVX(TOPs);
1242 right_non_neg = TRUE; /* effectively it's a UV now */
1248 /* historically undef()/0 gives a "Use of uninitialized value"
1249 warning before dieing, hence this test goes here.
1250 If it were immediately before the second SvIV_please, then
1251 DIE() would be invoked before left was even inspected, so
1252 no inpsection would give no warning. */
1254 DIE(aTHX_ "Illegal division by zero");
1257 left = SvUVX(TOPm1s);
1260 const IV aiv = SvIVX(TOPm1s);
1263 left_non_neg = TRUE; /* effectively it's a UV now */
1272 /* For sloppy divide we always attempt integer division. */
1274 /* Otherwise we only attempt it if either or both operands
1275 would not be preserved by an NV. If both fit in NVs
1276 we fall through to the NV divide code below. However,
1277 as left >= right to ensure integer result here, we know that
1278 we can skip the test on the right operand - right big
1279 enough not to be preserved can't get here unless left is
1282 && (left > ((UV)1 << NV_PRESERVES_UV_BITS))
1285 /* Integer division can't overflow, but it can be imprecise. */
1286 const UV result = left / right;
1287 if (result * right == left) {
1288 SP--; /* result is valid */
1289 if (left_non_neg == right_non_neg) {
1290 /* signs identical, result is positive. */
1294 /* 2s complement assumption */
1295 if (result <= (UV)IV_MIN)
1296 SETi( -(IV)result );
1298 /* It's exact but too negative for IV. */
1299 SETn( -(NV)result );
1302 } /* tried integer divide but it was not an integer result */
1303 } /* else (PERL_ABS(result) < 1.0) or (both UVs in range for NV) */
1304 } /* left wasn't SvIOK */
1305 } /* right wasn't SvIOK */
1306 #endif /* PERL_TRY_UV_DIVIDE */
1310 DIE(aTHX_ "Illegal division by zero");
1311 PUSHn( left / right );
1318 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1322 bool left_neg = FALSE;
1323 bool right_neg = FALSE;
1324 bool use_double = FALSE;
1325 bool dright_valid = FALSE;
1331 right_neg = !SvUOK(TOPs);
1333 right = SvUVX(POPs);
1335 const IV biv = SvIVX(POPs);
1338 right_neg = FALSE; /* effectively it's a UV now */
1346 right_neg = dright < 0;
1349 if (dright < UV_MAX_P1) {
1350 right = U_V(dright);
1351 dright_valid = TRUE; /* In case we need to use double below. */
1357 /* At this point use_double is only true if right is out of range for
1358 a UV. In range NV has been rounded down to nearest UV and
1359 use_double false. */
1361 if (!use_double && SvIOK(TOPs)) {
1363 left_neg = !SvUOK(TOPs);
1367 const IV aiv = SvIVX(POPs);
1370 left_neg = FALSE; /* effectively it's a UV now */
1379 left_neg = dleft < 0;
1383 /* This should be exactly the 5.6 behaviour - if left and right are
1384 both in range for UV then use U_V() rather than floor. */
1386 if (dleft < UV_MAX_P1) {
1387 /* right was in range, so is dleft, so use UVs not double.
1391 /* left is out of range for UV, right was in range, so promote
1392 right (back) to double. */
1394 /* The +0.5 is used in 5.6 even though it is not strictly
1395 consistent with the implicit +0 floor in the U_V()
1396 inside the #if 1. */
1397 dleft = Perl_floor(dleft + 0.5);
1400 dright = Perl_floor(dright + 0.5);
1410 DIE(aTHX_ "Illegal modulus zero");
1412 dans = Perl_fmod(dleft, dright);
1413 if ((left_neg != right_neg) && dans)
1414 dans = dright - dans;
1417 sv_setnv(TARG, dans);
1423 DIE(aTHX_ "Illegal modulus zero");
1426 if ((left_neg != right_neg) && ans)
1429 /* XXX may warn: unary minus operator applied to unsigned type */
1430 /* could change -foo to be (~foo)+1 instead */
1431 if (ans <= ~((UV)IV_MAX)+1)
1432 sv_setiv(TARG, ~ans+1);
1434 sv_setnv(TARG, -(NV)ans);
1437 sv_setuv(TARG, ans);
1446 dVAR; dSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
1453 const UV uv = SvUV(sv);
1455 count = IV_MAX; /* The best we can do? */
1459 const IV iv = SvIV(sv);
1466 else if (SvNOKp(sv)) {
1467 const NV nv = SvNV(sv);
1475 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1477 static const char oom_list_extend[] = "Out of memory during list extend";
1478 const I32 items = SP - MARK;
1479 const I32 max = items * count;
1481 MEM_WRAP_CHECK_1(max, SV*, oom_list_extend);
1482 /* Did the max computation overflow? */
1483 if (items > 0 && max > 0 && (max < items || max < count))
1484 Perl_croak(aTHX_ oom_list_extend);
1489 /* This code was intended to fix 20010809.028:
1492 for (($x =~ /./g) x 2) {
1493 print chop; # "abcdabcd" expected as output.
1496 * but that change (#11635) broke this code:
1498 $x = [("foo")x2]; # only one "foo" ended up in the anonlist.
1500 * I can't think of a better fix that doesn't introduce
1501 * an efficiency hit by copying the SVs. The stack isn't
1502 * refcounted, and mortalisation obviously doesn't
1503 * Do The Right Thing when the stack has more than
1504 * one pointer to the same mortal value.
1508 *SP = sv_2mortal(newSVsv(*SP));
1518 repeatcpy((char*)(MARK + items), (char*)MARK,
1519 items * sizeof(SV*), count - 1);
1522 else if (count <= 0)
1525 else { /* Note: mark already snarfed by pp_list */
1526 SV * const tmpstr = POPs;
1529 static const char oom_string_extend[] =
1530 "Out of memory during string extend";
1532 SvSetSV(TARG, tmpstr);
1533 SvPV_force(TARG, len);
1534 isutf = DO_UTF8(TARG);
1539 const STRLEN max = (UV)count * len;
1540 if (len > MEM_SIZE_MAX / count)
1541 Perl_croak(aTHX_ oom_string_extend);
1542 MEM_WRAP_CHECK_1(max, char, oom_string_extend);
1543 SvGROW(TARG, max + 1);
1544 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1545 SvCUR_set(TARG, SvCUR(TARG) * count);
1547 *SvEND(TARG) = '\0';
1550 (void)SvPOK_only_UTF8(TARG);
1552 (void)SvPOK_only(TARG);
1554 if (PL_op->op_private & OPpREPEAT_DOLIST) {
1555 /* The parser saw this as a list repeat, and there
1556 are probably several items on the stack. But we're
1557 in scalar context, and there's no pp_list to save us
1558 now. So drop the rest of the items -- robin@kitsite.com
1571 dVAR; dSP; dATARGET; bool useleft; tryAMAGICbin(subtr,opASSIGN);
1572 useleft = USE_LEFT(TOPm1s);
1573 #ifdef PERL_PRESERVE_IVUV
1574 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1575 "bad things" happen if you rely on signed integers wrapping. */
1578 /* Unless the left argument is integer in range we are going to have to
1579 use NV maths. Hence only attempt to coerce the right argument if
1580 we know the left is integer. */
1581 register UV auv = 0;
1587 a_valid = auvok = 1;
1588 /* left operand is undef, treat as zero. */
1590 /* Left operand is defined, so is it IV? */
1591 SvIV_please(TOPm1s);
1592 if (SvIOK(TOPm1s)) {
1593 if ((auvok = SvUOK(TOPm1s)))
1594 auv = SvUVX(TOPm1s);
1596 register const IV aiv = SvIVX(TOPm1s);
1599 auvok = 1; /* Now acting as a sign flag. */
1600 } else { /* 2s complement assumption for IV_MIN */
1608 bool result_good = 0;
1611 bool buvok = SvUOK(TOPs);
1616 register const IV biv = SvIVX(TOPs);
1623 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1624 else "IV" now, independent of how it came in.
1625 if a, b represents positive, A, B negative, a maps to -A etc
1630 all UV maths. negate result if A negative.
1631 subtract if signs same, add if signs differ. */
1633 if (auvok ^ buvok) {
1642 /* Must get smaller */
1647 if (result <= buv) {
1648 /* result really should be -(auv-buv). as its negation
1649 of true value, need to swap our result flag */
1661 if (result <= (UV)IV_MIN)
1662 SETi( -(IV)result );
1664 /* result valid, but out of range for IV. */
1665 SETn( -(NV)result );
1669 } /* Overflow, drop through to NVs. */
1673 useleft = USE_LEFT(TOPm1s);
1677 /* left operand is undef, treat as zero - value */
1681 SETn( TOPn - value );
1688 dVAR; dSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1690 const IV shift = POPi;
1691 if (PL_op->op_private & HINT_INTEGER) {
1705 dVAR; dSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1707 const IV shift = POPi;
1708 if (PL_op->op_private & HINT_INTEGER) {
1722 dVAR; dSP; tryAMAGICbinSET(lt,0);
1723 #ifdef PERL_PRESERVE_IVUV
1726 SvIV_please(TOPm1s);
1727 if (SvIOK(TOPm1s)) {
1728 bool auvok = SvUOK(TOPm1s);
1729 bool buvok = SvUOK(TOPs);
1731 if (!auvok && !buvok) { /* ## IV < IV ## */
1732 const IV aiv = SvIVX(TOPm1s);
1733 const IV biv = SvIVX(TOPs);
1736 SETs(boolSV(aiv < biv));
1739 if (auvok && buvok) { /* ## UV < UV ## */
1740 const UV auv = SvUVX(TOPm1s);
1741 const UV buv = SvUVX(TOPs);
1744 SETs(boolSV(auv < buv));
1747 if (auvok) { /* ## UV < IV ## */
1749 const IV biv = SvIVX(TOPs);
1752 /* As (a) is a UV, it's >=0, so it cannot be < */
1757 SETs(boolSV(auv < (UV)biv));
1760 { /* ## IV < UV ## */
1761 const IV aiv = SvIVX(TOPm1s);
1765 /* As (b) is a UV, it's >=0, so it must be < */
1772 SETs(boolSV((UV)aiv < buv));
1778 #ifndef NV_PRESERVES_UV
1779 #ifdef PERL_PRESERVE_IVUV
1782 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1784 SETs(boolSV(SvRV(TOPs) < SvRV(TOPp1s)));
1789 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1791 if (Perl_isnan(left) || Perl_isnan(right))
1793 SETs(boolSV(left < right));
1796 SETs(boolSV(TOPn < value));
1804 dVAR; dSP; tryAMAGICbinSET(gt,0);
1805 #ifdef PERL_PRESERVE_IVUV
1808 SvIV_please(TOPm1s);
1809 if (SvIOK(TOPm1s)) {
1810 bool auvok = SvUOK(TOPm1s);
1811 bool buvok = SvUOK(TOPs);
1813 if (!auvok && !buvok) { /* ## IV > IV ## */
1814 const IV aiv = SvIVX(TOPm1s);
1815 const IV biv = SvIVX(TOPs);
1818 SETs(boolSV(aiv > biv));
1821 if (auvok && buvok) { /* ## UV > UV ## */
1822 const UV auv = SvUVX(TOPm1s);
1823 const UV buv = SvUVX(TOPs);
1826 SETs(boolSV(auv > buv));
1829 if (auvok) { /* ## UV > IV ## */
1831 const IV biv = SvIVX(TOPs);
1835 /* As (a) is a UV, it's >=0, so it must be > */
1840 SETs(boolSV(auv > (UV)biv));
1843 { /* ## IV > UV ## */
1844 const IV aiv = SvIVX(TOPm1s);
1848 /* As (b) is a UV, it's >=0, so it cannot be > */
1855 SETs(boolSV((UV)aiv > buv));
1861 #ifndef NV_PRESERVES_UV
1862 #ifdef PERL_PRESERVE_IVUV
1865 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1867 SETs(boolSV(SvRV(TOPs) > SvRV(TOPp1s)));
1872 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1874 if (Perl_isnan(left) || Perl_isnan(right))
1876 SETs(boolSV(left > right));
1879 SETs(boolSV(TOPn > value));
1887 dVAR; dSP; tryAMAGICbinSET(le,0);
1888 #ifdef PERL_PRESERVE_IVUV
1891 SvIV_please(TOPm1s);
1892 if (SvIOK(TOPm1s)) {
1893 bool auvok = SvUOK(TOPm1s);
1894 bool buvok = SvUOK(TOPs);
1896 if (!auvok && !buvok) { /* ## IV <= IV ## */
1897 const IV aiv = SvIVX(TOPm1s);
1898 const IV biv = SvIVX(TOPs);
1901 SETs(boolSV(aiv <= biv));
1904 if (auvok && buvok) { /* ## UV <= UV ## */
1905 UV auv = SvUVX(TOPm1s);
1906 UV buv = SvUVX(TOPs);
1909 SETs(boolSV(auv <= buv));
1912 if (auvok) { /* ## UV <= IV ## */
1914 const IV biv = SvIVX(TOPs);
1918 /* As (a) is a UV, it's >=0, so a cannot be <= */
1923 SETs(boolSV(auv <= (UV)biv));
1926 { /* ## IV <= UV ## */
1927 const IV aiv = SvIVX(TOPm1s);
1931 /* As (b) is a UV, it's >=0, so a must be <= */
1938 SETs(boolSV((UV)aiv <= buv));
1944 #ifndef NV_PRESERVES_UV
1945 #ifdef PERL_PRESERVE_IVUV
1948 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1950 SETs(boolSV(SvRV(TOPs) <= SvRV(TOPp1s)));
1955 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1957 if (Perl_isnan(left) || Perl_isnan(right))
1959 SETs(boolSV(left <= right));
1962 SETs(boolSV(TOPn <= value));
1970 dVAR; dSP; tryAMAGICbinSET(ge,0);
1971 #ifdef PERL_PRESERVE_IVUV
1974 SvIV_please(TOPm1s);
1975 if (SvIOK(TOPm1s)) {
1976 bool auvok = SvUOK(TOPm1s);
1977 bool buvok = SvUOK(TOPs);
1979 if (!auvok && !buvok) { /* ## IV >= IV ## */
1980 const IV aiv = SvIVX(TOPm1s);
1981 const IV biv = SvIVX(TOPs);
1984 SETs(boolSV(aiv >= biv));
1987 if (auvok && buvok) { /* ## UV >= UV ## */
1988 const UV auv = SvUVX(TOPm1s);
1989 const UV buv = SvUVX(TOPs);
1992 SETs(boolSV(auv >= buv));
1995 if (auvok) { /* ## UV >= IV ## */
1997 const IV biv = SvIVX(TOPs);
2001 /* As (a) is a UV, it's >=0, so it must be >= */
2006 SETs(boolSV(auv >= (UV)biv));
2009 { /* ## IV >= UV ## */
2010 const IV aiv = SvIVX(TOPm1s);
2014 /* As (b) is a UV, it's >=0, so a cannot be >= */
2021 SETs(boolSV((UV)aiv >= buv));
2027 #ifndef NV_PRESERVES_UV
2028 #ifdef PERL_PRESERVE_IVUV
2031 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2033 SETs(boolSV(SvRV(TOPs) >= SvRV(TOPp1s)));
2038 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2040 if (Perl_isnan(left) || Perl_isnan(right))
2042 SETs(boolSV(left >= right));
2045 SETs(boolSV(TOPn >= value));
2053 dVAR; dSP; tryAMAGICbinSET(ne,0);
2054 #ifndef NV_PRESERVES_UV
2055 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2057 SETs(boolSV(SvRV(TOPs) != SvRV(TOPp1s)));
2061 #ifdef PERL_PRESERVE_IVUV
2064 SvIV_please(TOPm1s);
2065 if (SvIOK(TOPm1s)) {
2066 const bool auvok = SvUOK(TOPm1s);
2067 const bool buvok = SvUOK(TOPs);
2069 if (auvok == buvok) { /* ## IV == IV or UV == UV ## */
2070 /* Casting IV to UV before comparison isn't going to matter
2071 on 2s complement. On 1s complement or sign&magnitude
2072 (if we have any of them) it could make negative zero
2073 differ from normal zero. As I understand it. (Need to
2074 check - is negative zero implementation defined behaviour
2076 const UV buv = SvUVX(POPs);
2077 const UV auv = SvUVX(TOPs);
2079 SETs(boolSV(auv != buv));
2082 { /* ## Mixed IV,UV ## */
2086 /* != is commutative so swap if needed (save code) */
2088 /* swap. top of stack (b) is the iv */
2092 /* As (a) is a UV, it's >0, so it cannot be == */
2101 /* As (b) is a UV, it's >0, so it cannot be == */
2105 uv = SvUVX(*(SP+1)); /* Do I want TOPp1s() ? */
2107 SETs(boolSV((UV)iv != uv));
2114 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2116 if (Perl_isnan(left) || Perl_isnan(right))
2118 SETs(boolSV(left != right));
2121 SETs(boolSV(TOPn != value));
2129 dVAR; dSP; dTARGET; tryAMAGICbin(ncmp,0);
2130 #ifndef NV_PRESERVES_UV
2131 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2132 const UV right = PTR2UV(SvRV(POPs));
2133 const UV left = PTR2UV(SvRV(TOPs));
2134 SETi((left > right) - (left < right));
2138 #ifdef PERL_PRESERVE_IVUV
2139 /* Fortunately it seems NaN isn't IOK */
2142 SvIV_please(TOPm1s);
2143 if (SvIOK(TOPm1s)) {
2144 const bool leftuvok = SvUOK(TOPm1s);
2145 const bool rightuvok = SvUOK(TOPs);
2147 if (!leftuvok && !rightuvok) { /* ## IV <=> IV ## */
2148 const IV leftiv = SvIVX(TOPm1s);
2149 const IV rightiv = SvIVX(TOPs);
2151 if (leftiv > rightiv)
2153 else if (leftiv < rightiv)
2157 } else if (leftuvok && rightuvok) { /* ## UV <=> UV ## */
2158 const UV leftuv = SvUVX(TOPm1s);
2159 const UV rightuv = SvUVX(TOPs);
2161 if (leftuv > rightuv)
2163 else if (leftuv < rightuv)
2167 } else if (leftuvok) { /* ## UV <=> IV ## */
2168 const IV rightiv = SvIVX(TOPs);
2170 /* As (a) is a UV, it's >=0, so it cannot be < */
2173 const UV leftuv = SvUVX(TOPm1s);
2174 if (leftuv > (UV)rightiv) {
2176 } else if (leftuv < (UV)rightiv) {
2182 } else { /* ## IV <=> UV ## */
2183 const IV leftiv = SvIVX(TOPm1s);
2185 /* As (b) is a UV, it's >=0, so it must be < */
2188 const UV rightuv = SvUVX(TOPs);
2189 if ((UV)leftiv > rightuv) {
2191 } else if ((UV)leftiv < rightuv) {
2209 if (Perl_isnan(left) || Perl_isnan(right)) {
2213 value = (left > right) - (left < right);
2217 else if (left < right)
2219 else if (left > right)
2235 int amg_type = sle_amg;
2239 switch (PL_op->op_type) {
2258 tryAMAGICbinSET_var(amg_type,0);
2261 const int cmp = (IN_LOCALE_RUNTIME
2262 ? sv_cmp_locale(left, right)
2263 : sv_cmp(left, right));
2264 SETs(boolSV(cmp * multiplier < rhs));
2271 dVAR; dSP; tryAMAGICbinSET(seq,0);
2274 SETs(boolSV(sv_eq(left, right)));
2281 dVAR; dSP; tryAMAGICbinSET(sne,0);
2284 SETs(boolSV(!sv_eq(left, right)));
2291 dVAR; dSP; dTARGET; tryAMAGICbin(scmp,0);
2294 const int cmp = (IN_LOCALE_RUNTIME
2295 ? sv_cmp_locale(left, right)
2296 : sv_cmp(left, right));
2304 dVAR; dSP; dATARGET; tryAMAGICbin(band,opASSIGN);
2309 if (SvNIOKp(left) || SvNIOKp(right)) {
2310 if (PL_op->op_private & HINT_INTEGER) {
2311 const IV i = SvIV_nomg(left) & SvIV_nomg(right);
2315 const UV u = SvUV_nomg(left) & SvUV_nomg(right);
2320 do_vop(PL_op->op_type, TARG, left, right);
2329 dVAR; dSP; dATARGET;
2330 const int op_type = PL_op->op_type;
2332 tryAMAGICbin_var((op_type == OP_BIT_OR ? bor_amg : bxor_amg), opASSIGN);
2337 if (SvNIOKp(left) || SvNIOKp(right)) {
2338 if (PL_op->op_private & HINT_INTEGER) {
2339 const IV l = (USE_LEFT(left) ? SvIV_nomg(left) : 0);
2340 const IV r = SvIV_nomg(right);
2341 const IV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2345 const UV l = (USE_LEFT(left) ? SvUV_nomg(left) : 0);
2346 const UV r = SvUV_nomg(right);
2347 const UV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2352 do_vop(op_type, TARG, left, right);
2361 dVAR; dSP; dTARGET; tryAMAGICun(neg);
2364 const int flags = SvFLAGS(sv);
2366 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
2367 /* It's publicly an integer, or privately an integer-not-float */
2370 if (SvIVX(sv) == IV_MIN) {
2371 /* 2s complement assumption. */
2372 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
2375 else if (SvUVX(sv) <= IV_MAX) {
2380 else if (SvIVX(sv) != IV_MIN) {
2384 #ifdef PERL_PRESERVE_IVUV
2393 else if (SvPOKp(sv)) {
2395 const char * const s = SvPV_const(sv, len);
2396 if (isIDFIRST(*s)) {
2397 sv_setpvn(TARG, "-", 1);
2400 else if (*s == '+' || *s == '-') {
2402 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
2404 else if (DO_UTF8(sv)) {
2407 goto oops_its_an_int;
2409 sv_setnv(TARG, -SvNV(sv));
2411 sv_setpvn(TARG, "-", 1);
2418 goto oops_its_an_int;
2419 sv_setnv(TARG, -SvNV(sv));
2431 dVAR; dSP; tryAMAGICunSET(not);
2432 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
2438 dVAR; dSP; dTARGET; tryAMAGICun(compl);
2443 if (PL_op->op_private & HINT_INTEGER) {
2444 const IV i = ~SvIV_nomg(sv);
2448 const UV u = ~SvUV_nomg(sv);
2457 (void)SvPV_nomg_const(sv,len); /* force check for uninit var */
2458 sv_setsv_nomg(TARG, sv);
2459 tmps = (U8*)SvPV_force(TARG, len);
2462 /* Calculate exact length, let's not estimate. */
2467 U8 * const send = tmps + len;
2468 U8 * const origtmps = tmps;
2469 const UV utf8flags = UTF8_ALLOW_ANYUV;
2471 while (tmps < send) {
2472 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2474 targlen += UNISKIP(~c);
2480 /* Now rewind strings and write them. */
2487 Newx(result, targlen + 1, U8);
2489 while (tmps < send) {
2490 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2492 p = uvchr_to_utf8_flags(p, ~c, UNICODE_ALLOW_ANY);
2495 sv_usepvn_flags(TARG, (char*)result, targlen,
2496 SV_HAS_TRAILING_NUL);
2503 Newx(result, nchar + 1, U8);
2505 while (tmps < send) {
2506 const U8 c = (U8)utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2511 sv_usepvn_flags(TARG, (char*)result, nchar, SV_HAS_TRAILING_NUL);
2519 register long *tmpl;
2520 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2523 for ( ; anum >= (I32)sizeof(long); anum -= (I32)sizeof(long), tmpl++)
2528 for ( ; anum > 0; anum--, tmps++)
2537 /* integer versions of some of the above */
2541 dVAR; dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
2544 SETi( left * right );
2552 dVAR; dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
2556 DIE(aTHX_ "Illegal division by zero");
2559 /* avoid FPE_INTOVF on some platforms when num is IV_MIN */
2563 value = num / value;
2569 #if defined(__GLIBC__) && IVSIZE == 8
2576 /* This is the vanilla old i_modulo. */
2577 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2581 DIE(aTHX_ "Illegal modulus zero");
2582 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2586 SETi( left % right );
2591 #if defined(__GLIBC__) && IVSIZE == 8
2596 /* This is the i_modulo with the workaround for the _moddi3 bug
2597 * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
2598 * See below for pp_i_modulo. */
2599 dVAR; dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2603 DIE(aTHX_ "Illegal modulus zero");
2604 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2608 SETi( left % PERL_ABS(right) );
2615 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2619 DIE(aTHX_ "Illegal modulus zero");
2620 /* The assumption is to use hereafter the old vanilla version... */
2622 PL_ppaddr[OP_I_MODULO] =
2624 /* .. but if we have glibc, we might have a buggy _moddi3
2625 * (at least glicb 2.2.5 is known to have this bug), in other
2626 * words our integer modulus with negative quad as the second
2627 * argument might be broken. Test for this and re-patch the
2628 * opcode dispatch table if that is the case, remembering to
2629 * also apply the workaround so that this first round works
2630 * right, too. See [perl #9402] for more information. */
2634 /* Cannot do this check with inlined IV constants since
2635 * that seems to work correctly even with the buggy glibc. */
2637 /* Yikes, we have the bug.
2638 * Patch in the workaround version. */
2640 PL_ppaddr[OP_I_MODULO] =
2641 &Perl_pp_i_modulo_1;
2642 /* Make certain we work right this time, too. */
2643 right = PERL_ABS(right);
2646 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2650 SETi( left % right );
2658 dVAR; dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
2661 SETi( left + right );
2668 dVAR; dSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
2671 SETi( left - right );
2678 dVAR; dSP; tryAMAGICbinSET(lt,0);
2681 SETs(boolSV(left < right));
2688 dVAR; dSP; tryAMAGICbinSET(gt,0);
2691 SETs(boolSV(left > right));
2698 dVAR; dSP; tryAMAGICbinSET(le,0);
2701 SETs(boolSV(left <= right));
2708 dVAR; dSP; tryAMAGICbinSET(ge,0);
2711 SETs(boolSV(left >= right));
2718 dVAR; dSP; tryAMAGICbinSET(eq,0);
2721 SETs(boolSV(left == right));
2728 dVAR; dSP; tryAMAGICbinSET(ne,0);
2731 SETs(boolSV(left != right));
2738 dVAR; dSP; dTARGET; tryAMAGICbin(ncmp,0);
2745 else if (left < right)
2756 dVAR; dSP; dTARGET; tryAMAGICun(neg);
2761 /* High falutin' math. */
2765 dVAR; dSP; dTARGET; tryAMAGICbin(atan2,0);
2768 SETn(Perl_atan2(left, right));
2776 int amg_type = sin_amg;
2777 const char *neg_report = NULL;
2778 NV (*func)(NV) = Perl_sin;
2779 const int op_type = PL_op->op_type;
2796 amg_type = sqrt_amg;
2798 neg_report = "sqrt";
2802 tryAMAGICun_var(amg_type);
2804 const NV value = POPn;
2806 if (op_type == OP_LOG ? (value <= 0.0) : (value < 0.0)) {
2807 SET_NUMERIC_STANDARD();
2808 DIE(aTHX_ "Can't take %s of %"NVgf, neg_report, value);
2811 XPUSHn(func(value));
2816 /* Support Configure command-line overrides for rand() functions.
2817 After 5.005, perhaps we should replace this by Configure support
2818 for drand48(), random(), or rand(). For 5.005, though, maintain
2819 compatibility by calling rand() but allow the user to override it.
2820 See INSTALL for details. --Andy Dougherty 15 July 1998
2822 /* Now it's after 5.005, and Configure supports drand48() and random(),
2823 in addition to rand(). So the overrides should not be needed any more.
2824 --Jarkko Hietaniemi 27 September 1998
2827 #ifndef HAS_DRAND48_PROTO
2828 extern double drand48 (void);
2841 if (!PL_srand_called) {
2842 (void)seedDrand01((Rand_seed_t)seed());
2843 PL_srand_called = TRUE;
2853 const UV anum = (MAXARG < 1) ? seed() : POPu;
2854 (void)seedDrand01((Rand_seed_t)anum);
2855 PL_srand_called = TRUE;
2862 dVAR; dSP; dTARGET; tryAMAGICun(int);
2864 const IV iv = TOPi; /* attempt to convert to IV if possible. */
2865 /* XXX it's arguable that compiler casting to IV might be subtly
2866 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2867 else preferring IV has introduced a subtle behaviour change bug. OTOH
2868 relying on floating point to be accurate is a bug. */
2872 else if (SvIOK(TOPs)) {
2879 const NV value = TOPn;
2881 if (value < (NV)UV_MAX + 0.5) {
2884 SETn(Perl_floor(value));
2888 if (value > (NV)IV_MIN - 0.5) {
2891 SETn(Perl_ceil(value));
2901 dVAR; dSP; dTARGET; tryAMAGICun(abs);
2903 /* This will cache the NV value if string isn't actually integer */
2908 else if (SvIOK(TOPs)) {
2909 /* IVX is precise */
2911 SETu(TOPu); /* force it to be numeric only */
2919 /* 2s complement assumption. Also, not really needed as
2920 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
2926 const NV value = TOPn;
2940 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2944 SV* const sv = POPs;
2946 tmps = (SvPV_const(sv, len));
2948 /* If Unicode, try to downgrade
2949 * If not possible, croak. */
2950 SV* const tsv = sv_2mortal(newSVsv(sv));
2953 sv_utf8_downgrade(tsv, FALSE);
2954 tmps = SvPV_const(tsv, len);
2956 if (PL_op->op_type == OP_HEX)
2959 while (*tmps && len && isSPACE(*tmps))
2965 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2967 else if (*tmps == 'b')
2968 result_uv = grok_bin (tmps, &len, &flags, &result_nv);
2970 result_uv = grok_oct (tmps, &len, &flags, &result_nv);
2972 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
2986 SV * const sv = TOPs;
2989 /* For an overloaded scalar, we can't know in advance if it's going to
2990 be UTF-8 or not. Also, we can't call sv_len_utf8 as it likes to
2991 cache the length. Maybe that should be a documented feature of it.
2994 const char *const p = SvPV_const(sv, len);
2997 SETi(utf8_length((U8*)p, (U8*)p + len));
3003 else if (DO_UTF8(sv))
3004 SETi(sv_len_utf8(sv));
3020 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3022 const I32 arybase = CopARYBASE_get(PL_curcop);
3024 const char *repl = NULL;
3026 const int num_args = PL_op->op_private & 7;
3027 bool repl_need_utf8_upgrade = FALSE;
3028 bool repl_is_utf8 = FALSE;
3030 SvTAINTED_off(TARG); /* decontaminate */
3031 SvUTF8_off(TARG); /* decontaminate */
3035 repl = SvPV_const(repl_sv, repl_len);
3036 repl_is_utf8 = DO_UTF8(repl_sv) && SvCUR(repl_sv);
3046 sv_utf8_upgrade(sv);
3048 else if (DO_UTF8(sv))
3049 repl_need_utf8_upgrade = TRUE;
3051 tmps = SvPV_const(sv, curlen);
3053 utf8_curlen = sv_len_utf8(sv);
3054 if (utf8_curlen == curlen)
3057 curlen = utf8_curlen;
3062 if (pos >= arybase) {
3080 else if (len >= 0) {
3082 if (rem > (I32)curlen)
3097 Perl_croak(aTHX_ "substr outside of string");
3098 if (ckWARN(WARN_SUBSTR))
3099 Perl_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3103 const I32 upos = pos;
3104 const I32 urem = rem;
3106 sv_pos_u2b(sv, &pos, &rem);
3108 /* we either return a PV or an LV. If the TARG hasn't been used
3109 * before, or is of that type, reuse it; otherwise use a mortal
3110 * instead. Note that LVs can have an extended lifetime, so also
3111 * dont reuse if refcount > 1 (bug #20933) */
3112 if (SvTYPE(TARG) > SVt_NULL) {
3113 if ( (SvTYPE(TARG) == SVt_PVLV)
3114 ? (!lvalue || SvREFCNT(TARG) > 1)
3117 TARG = sv_newmortal();
3121 sv_setpvn(TARG, tmps, rem);
3122 #ifdef USE_LOCALE_COLLATE
3123 sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3128 SV* repl_sv_copy = NULL;
3130 if (repl_need_utf8_upgrade) {
3131 repl_sv_copy = newSVsv(repl_sv);
3132 sv_utf8_upgrade(repl_sv_copy);
3133 repl = SvPV_const(repl_sv_copy, repl_len);
3134 repl_is_utf8 = DO_UTF8(repl_sv_copy) && SvCUR(sv);
3136 sv_insert(sv, pos, rem, repl, repl_len);
3140 SvREFCNT_dec(repl_sv_copy);
3142 else if (lvalue) { /* it's an lvalue! */
3143 if (!SvGMAGICAL(sv)) {
3145 SvPV_force_nolen(sv);
3146 if (ckWARN(WARN_SUBSTR))
3147 Perl_warner(aTHX_ packWARN(WARN_SUBSTR),
3148 "Attempt to use reference as lvalue in substr");
3150 if (isGV_with_GP(sv))
3151 SvPV_force_nolen(sv);
3152 else if (SvOK(sv)) /* is it defined ? */
3153 (void)SvPOK_only_UTF8(sv);
3155 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
3158 if (SvTYPE(TARG) < SVt_PVLV) {
3159 sv_upgrade(TARG, SVt_PVLV);
3160 sv_magic(TARG, NULL, PERL_MAGIC_substr, NULL, 0);
3164 if (LvTARG(TARG) != sv) {
3166 SvREFCNT_dec(LvTARG(TARG));
3167 LvTARG(TARG) = SvREFCNT_inc_simple(sv);
3169 LvTARGOFF(TARG) = upos;
3170 LvTARGLEN(TARG) = urem;
3174 PUSHs(TARG); /* avoid SvSETMAGIC here */
3181 register const IV size = POPi;
3182 register const IV offset = POPi;
3183 register SV * const src = POPs;
3184 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3186 SvTAINTED_off(TARG); /* decontaminate */
3187 if (lvalue) { /* it's an lvalue! */
3188 if (SvREFCNT(TARG) > 1) /* don't share the TARG (#20933) */
3189 TARG = sv_newmortal();
3190 if (SvTYPE(TARG) < SVt_PVLV) {
3191 sv_upgrade(TARG, SVt_PVLV);
3192 sv_magic(TARG, NULL, PERL_MAGIC_vec, NULL, 0);
3195 if (LvTARG(TARG) != src) {
3197 SvREFCNT_dec(LvTARG(TARG));
3198 LvTARG(TARG) = SvREFCNT_inc_simple(src);
3200 LvTARGOFF(TARG) = offset;
3201 LvTARGLEN(TARG) = size;
3204 sv_setuv(TARG, do_vecget(src, offset, size));
3220 const char *little_p;
3221 const I32 arybase = CopARYBASE_get(PL_curcop);
3224 const bool is_index = PL_op->op_type == OP_INDEX;
3227 /* arybase is in characters, like offset, so combine prior to the
3228 UTF-8 to bytes calculation. */
3229 offset = POPi - arybase;
3233 big_p = SvPV_const(big, biglen);
3234 little_p = SvPV_const(little, llen);
3236 big_utf8 = DO_UTF8(big);
3237 little_utf8 = DO_UTF8(little);
3238 if (big_utf8 ^ little_utf8) {
3239 /* One needs to be upgraded. */
3240 if (little_utf8 && !PL_encoding) {
3241 /* Well, maybe instead we might be able to downgrade the small
3243 char * const pv = (char*)bytes_from_utf8((U8 *)little_p, &llen,
3246 /* If the large string is ISO-8859-1, and it's not possible to
3247 convert the small string to ISO-8859-1, then there is no
3248 way that it could be found anywhere by index. */
3253 /* At this point, pv is a malloc()ed string. So donate it to temp
3254 to ensure it will get free()d */
3255 little = temp = newSV(0);
3256 sv_usepvn(temp, pv, llen);
3257 little_p = SvPVX(little);
3260 ? newSVpvn(big_p, biglen) : newSVpvn(little_p, llen);
3263 sv_recode_to_utf8(temp, PL_encoding);
3265 sv_utf8_upgrade(temp);
3270 big_p = SvPV_const(big, biglen);
3273 little_p = SvPV_const(little, llen);
3277 if (SvGAMAGIC(big)) {
3278 /* Life just becomes a lot easier if I use a temporary here.
3279 Otherwise I need to avoid calls to sv_pos_u2b(), which (dangerously)
3280 will trigger magic and overloading again, as will fbm_instr()
3282 big = sv_2mortal(newSVpvn(big_p, biglen));
3287 if (SvGAMAGIC(little) || (is_index && !SvOK(little))) {
3288 /* index && SvOK() is a hack. fbm_instr() calls SvPV_const, which will
3289 warn on undef, and we've already triggered a warning with the
3290 SvPV_const some lines above. We can't remove that, as we need to
3291 call some SvPV to trigger overloading early and find out if the
3293 This is all getting to messy. The API isn't quite clean enough,
3294 because data access has side effects.
3296 little = sv_2mortal(newSVpvn(little_p, llen));
3299 little_p = SvPVX(little);
3303 offset = is_index ? 0 : biglen;
3305 if (big_utf8 && offset > 0)
3306 sv_pos_u2b(big, &offset, 0);
3312 else if (offset > (I32)biglen)
3314 if (!(little_p = is_index
3315 ? fbm_instr((unsigned char*)big_p + offset,
3316 (unsigned char*)big_p + biglen, little, 0)
3317 : rninstr(big_p, big_p + offset,
3318 little_p, little_p + llen)))
3321 retval = little_p - big_p;
3322 if (retval > 0 && big_utf8)
3323 sv_pos_b2u(big, &retval);
3328 PUSHi(retval + arybase);
3334 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
3335 if (SvTAINTED(MARK[1]))
3336 TAINT_PROPER("sprintf");
3337 do_sprintf(TARG, SP-MARK, MARK+1);
3338 TAINT_IF(SvTAINTED(TARG));
3350 const U8 *s = (U8*)SvPV_const(argsv, len);
3352 if (PL_encoding && SvPOK(argsv) && !DO_UTF8(argsv)) {
3353 SV * const tmpsv = sv_2mortal(newSVsv(argsv));
3354 s = (U8*)sv_recode_to_utf8(tmpsv, PL_encoding);
3358 XPUSHu(DO_UTF8(argsv) ?
3359 utf8n_to_uvchr(s, UTF8_MAXBYTES, 0, UTF8_ALLOW_ANYUV) :
3371 if (((SvIOK_notUV(TOPs) && SvIV(TOPs) < 0)
3373 (SvNOK(TOPs) && SvNV(TOPs) < 0.0))) {
3375 value = POPu; /* chr(-1) eq chr(0xff), etc. */
3377 (void) POPs; /* Ignore the argument value. */
3378 value = UNICODE_REPLACEMENT;
3384 SvUPGRADE(TARG,SVt_PV);
3386 if (value > 255 && !IN_BYTES) {
3387 SvGROW(TARG, (STRLEN)UNISKIP(value)+1);
3388 tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3389 SvCUR_set(TARG, tmps - SvPVX_const(TARG));
3391 (void)SvPOK_only(TARG);
3400 *tmps++ = (char)value;
3402 (void)SvPOK_only(TARG);
3404 if (PL_encoding && !IN_BYTES) {
3405 sv_recode_to_utf8(TARG, PL_encoding);
3407 if (SvCUR(TARG) == 0 || !is_utf8_string((U8*)tmps, SvCUR(TARG)) ||
3408 UNICODE_IS_REPLACEMENT(utf8_to_uvchr((U8*)tmps, NULL))) {
3412 *tmps++ = (char)value;
3428 const char *tmps = SvPV_const(left, len);
3430 if (DO_UTF8(left)) {
3431 /* If Unicode, try to downgrade.
3432 * If not possible, croak.
3433 * Yes, we made this up. */
3434 SV* const tsv = sv_2mortal(newSVsv(left));
3437 sv_utf8_downgrade(tsv, FALSE);
3438 tmps = SvPV_const(tsv, len);
3440 # ifdef USE_ITHREADS
3442 if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3443 /* This should be threadsafe because in ithreads there is only
3444 * one thread per interpreter. If this would not be true,
3445 * we would need a mutex to protect this malloc. */
3446 PL_reentrant_buffer->_crypt_struct_buffer =
3447 (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3448 #if defined(__GLIBC__) || defined(__EMX__)
3449 if (PL_reentrant_buffer->_crypt_struct_buffer) {
3450 PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3451 /* work around glibc-2.2.5 bug */
3452 PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3456 # endif /* HAS_CRYPT_R */
3457 # endif /* USE_ITHREADS */
3459 sv_setpv(TARG, fcrypt(tmps, SvPV_nolen_const(right)));
3461 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV_nolen_const(right)));
3467 "The crypt() function is unimplemented due to excessive paranoia.");
3479 bool inplace = TRUE;
3481 const int op_type = PL_op->op_type;
3484 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3490 s = (const U8*)SvPV_nomg_const(source, slen);
3496 if (slen && DO_UTF8(source) && UTF8_IS_START(*s)) {
3498 utf8_to_uvchr(s, &ulen);
3499 if (op_type == OP_UCFIRST) {
3500 toTITLE_utf8(s, tmpbuf, &tculen);
3502 toLOWER_utf8(s, tmpbuf, &tculen);
3504 /* If the two differ, we definately cannot do inplace. */
3505 inplace = (ulen == tculen);
3506 need = slen + 1 - ulen + tculen;
3512 if (SvPADTMP(source) && !SvREADONLY(source) && inplace) {
3513 /* We can convert in place. */
3516 s = d = (U8*)SvPV_force_nomg(source, slen);
3522 SvUPGRADE(dest, SVt_PV);
3523 d = (U8*)SvGROW(dest, need);
3524 (void)SvPOK_only(dest);
3533 /* slen is the byte length of the whole SV.
3534 * ulen is the byte length of the original Unicode character
3535 * stored as UTF-8 at s.
3536 * tculen is the byte length of the freshly titlecased (or
3537 * lowercased) Unicode character stored as UTF-8 at tmpbuf.
3538 * We first set the result to be the titlecased (/lowercased)
3539 * character, and then append the rest of the SV data. */
3540 sv_setpvn(dest, (char*)tmpbuf, tculen);
3542 sv_catpvn(dest, (char*)(s + ulen), slen - ulen);
3546 Copy(tmpbuf, d, tculen, U8);
3547 SvCUR_set(dest, need - 1);
3552 if (IN_LOCALE_RUNTIME) {
3555 *d = (op_type == OP_UCFIRST)
3556 ? toUPPER_LC(*s) : toLOWER_LC(*s);
3559 *d = (op_type == OP_UCFIRST) ? toUPPER(*s) : toLOWER(*s);
3561 /* See bug #39028 */
3569 /* This will copy the trailing NUL */
3570 Copy(s + 1, d + 1, slen, U8);
3571 SvCUR_set(dest, need - 1);
3578 /* There's so much setup/teardown code common between uc and lc, I wonder if
3579 it would be worth merging the two, and just having a switch outside each
3580 of the three tight loops. */
3594 if (SvPADTMP(source) && !SvREADONLY(source) && !SvAMAGIC(source)
3595 && !DO_UTF8(source)) {
3596 /* We can convert in place. */
3599 s = d = (U8*)SvPV_force_nomg(source, len);
3606 /* The old implementation would copy source into TARG at this point.
3607 This had the side effect that if source was undef, TARG was now
3608 an undefined SV with PADTMP set, and they don't warn inside
3609 sv_2pv_flags(). However, we're now getting the PV direct from
3610 source, which doesn't have PADTMP set, so it would warn. Hence the
3614 s = (const U8*)SvPV_nomg_const(source, len);
3621 SvUPGRADE(dest, SVt_PV);
3622 d = (U8*)SvGROW(dest, min);
3623 (void)SvPOK_only(dest);
3628 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
3629 to check DO_UTF8 again here. */
3631 if (DO_UTF8(source)) {
3632 const U8 *const send = s + len;
3633 U8 tmpbuf[UTF8_MAXBYTES+1];
3636 const STRLEN u = UTF8SKIP(s);
3639 toUPPER_utf8(s, tmpbuf, &ulen);
3640 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
3641 /* If the eventually required minimum size outgrows
3642 * the available space, we need to grow. */
3643 const UV o = d - (U8*)SvPVX_const(dest);
3645 /* If someone uppercases one million U+03B0s we SvGROW() one
3646 * million times. Or we could try guessing how much to
3647 allocate without allocating too much. Such is life. */
3649 d = (U8*)SvPVX(dest) + o;
3651 Copy(tmpbuf, d, ulen, U8);
3657 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3660 const U8 *const send = s + len;
3661 if (IN_LOCALE_RUNTIME) {
3664 for (; s < send; d++, s++)
3665 *d = toUPPER_LC(*s);
3668 for (; s < send; d++, s++)
3672 if (source != dest) {
3674 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3694 if (SvPADTMP(source) && !SvREADONLY(source) && !SvAMAGIC(source)
3695 && !DO_UTF8(source)) {
3696 /* We can convert in place. */
3699 s = d = (U8*)SvPV_force_nomg(source, len);
3706 /* The old implementation would copy source into TARG at this point.
3707 This had the side effect that if source was undef, TARG was now
3708 an undefined SV with PADTMP set, and they don't warn inside
3709 sv_2pv_flags(). However, we're now getting the PV direct from
3710 source, which doesn't have PADTMP set, so it would warn. Hence the
3714 s = (const U8*)SvPV_nomg_const(source, len);
3721 SvUPGRADE(dest, SVt_PV);
3722 d = (U8*)SvGROW(dest, min);
3723 (void)SvPOK_only(dest);
3728 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
3729 to check DO_UTF8 again here. */
3731 if (DO_UTF8(source)) {
3732 const U8 *const send = s + len;
3733 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3736 const STRLEN u = UTF8SKIP(s);
3738 const UV uv = toLOWER_utf8(s, tmpbuf, &ulen);
3740 #define GREEK_CAPITAL_LETTER_SIGMA 0x03A3 /* Unicode U+03A3 */
3741 if (uv == GREEK_CAPITAL_LETTER_SIGMA) {
3744 * Now if the sigma is NOT followed by
3745 * /$ignorable_sequence$cased_letter/;
3746 * and it IS preceded by /$cased_letter$ignorable_sequence/;
3747 * where $ignorable_sequence is [\x{2010}\x{AD}\p{Mn}]*
3748 * and $cased_letter is [\p{Ll}\p{Lo}\p{Lt}]
3749 * then it should be mapped to 0x03C2,
3750 * (GREEK SMALL LETTER FINAL SIGMA),
3751 * instead of staying 0x03A3.
3752 * "should be": in other words, this is not implemented yet.
3753 * See lib/unicore/SpecialCasing.txt.
3756 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
3757 /* If the eventually required minimum size outgrows
3758 * the available space, we need to grow. */
3759 const UV o = d - (U8*)SvPVX_const(dest);
3761 /* If someone lowercases one million U+0130s we SvGROW() one
3762 * million times. Or we could try guessing how much to
3763 allocate without allocating too much. Such is life. */
3765 d = (U8*)SvPVX(dest) + o;
3767 Copy(tmpbuf, d, ulen, U8);
3773 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3776 const U8 *const send = s + len;
3777 if (IN_LOCALE_RUNTIME) {
3780 for (; s < send; d++, s++)
3781 *d = toLOWER_LC(*s);
3784 for (; s < send; d++, s++)
3788 if (source != dest) {
3790 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3800 SV * const sv = TOPs;
3802 register const char *s = SvPV_const(sv,len);
3804 SvUTF8_off(TARG); /* decontaminate */
3807 SvUPGRADE(TARG, SVt_PV);
3808 SvGROW(TARG, (len * 2) + 1);
3812 if (UTF8_IS_CONTINUED(*s)) {
3813 STRLEN ulen = UTF8SKIP(s);
3837 SvCUR_set(TARG, d - SvPVX_const(TARG));
3838 (void)SvPOK_only_UTF8(TARG);
3841 sv_setpvn(TARG, s, len);
3843 if (SvSMAGICAL(TARG))
3852 dVAR; dSP; dMARK; dORIGMARK;
3853 register AV* const av = (AV*)POPs;
3854 register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3856 if (SvTYPE(av) == SVt_PVAV) {
3857 const I32 arybase = CopARYBASE_get(PL_curcop);
3858 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
3861 for (svp = MARK + 1; svp <= SP; svp++) {
3862 const I32 elem = SvIVx(*svp);
3866 if (max > AvMAX(av))
3869 while (++MARK <= SP) {
3871 I32 elem = SvIVx(*MARK);
3875 svp = av_fetch(av, elem, lval);
3877 if (!svp || *svp == &PL_sv_undef)
3878 DIE(aTHX_ PL_no_aelem, elem);
3879 if (PL_op->op_private & OPpLVAL_INTRO)
3880 save_aelem(av, elem, svp);
3882 *MARK = svp ? *svp : &PL_sv_undef;
3885 if (GIMME != G_ARRAY) {
3887 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
3893 /* Associative arrays. */
3899 HV * hash = (HV*)POPs;
3901 const I32 gimme = GIMME_V;
3904 /* might clobber stack_sp */
3905 entry = hv_iternext(hash);
3910 SV* const sv = hv_iterkeysv(entry);
3911 PUSHs(sv); /* won't clobber stack_sp */
3912 if (gimme == G_ARRAY) {
3915 /* might clobber stack_sp */
3916 val = hv_iterval(hash, entry);
3921 else if (gimme == G_SCALAR)
3931 const I32 gimme = GIMME_V;
3932 const I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
3934 if (PL_op->op_private & OPpSLICE) {
3936 HV * const hv = (HV*)POPs;
3937 const U32 hvtype = SvTYPE(hv);
3938 if (hvtype == SVt_PVHV) { /* hash element */
3939 while (++MARK <= SP) {
3940 SV * const sv = hv_delete_ent(hv, *MARK, discard, 0);
3941 *MARK = sv ? sv : &PL_sv_undef;
3944 else if (hvtype == SVt_PVAV) { /* array element */
3945 if (PL_op->op_flags & OPf_SPECIAL) {
3946 while (++MARK <= SP) {
3947 SV * const sv = av_delete((AV*)hv, SvIV(*MARK), discard);
3948 *MARK = sv ? sv : &PL_sv_undef;
3953 DIE(aTHX_ "Not a HASH reference");
3956 else if (gimme == G_SCALAR) {
3961 *++MARK = &PL_sv_undef;
3967 HV * const hv = (HV*)POPs;
3969 if (SvTYPE(hv) == SVt_PVHV)
3970 sv = hv_delete_ent(hv, keysv, discard, 0);
3971 else if (SvTYPE(hv) == SVt_PVAV) {
3972 if (PL_op->op_flags & OPf_SPECIAL)
3973 sv = av_delete((AV*)hv, SvIV(keysv), discard);
3975 DIE(aTHX_ "panic: avhv_delete no longer supported");
3978 DIE(aTHX_ "Not a HASH reference");
3994 if (PL_op->op_private & OPpEXISTS_SUB) {
3996 SV * const sv = POPs;
3997 CV * const cv = sv_2cv(sv, &hv, &gv, 0);
4000 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
4006 if (SvTYPE(hv) == SVt_PVHV) {
4007 if (hv_exists_ent(hv, tmpsv, 0))
4010 else if (SvTYPE(hv) == SVt_PVAV) {
4011 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
4012 if (av_exists((AV*)hv, SvIV(tmpsv)))
4017 DIE(aTHX_ "Not a HASH reference");
4024 dVAR; dSP; dMARK; dORIGMARK;
4025 register HV * const hv = (HV*)POPs;
4026 register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
4027 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
4028 bool other_magic = FALSE;
4034 other_magic = mg_find((SV*)hv, PERL_MAGIC_env) ||
4035 ((mg = mg_find((SV*)hv, PERL_MAGIC_tied))
4036 /* Try to preserve the existenceness of a tied hash
4037 * element by using EXISTS and DELETE if possible.
4038 * Fallback to FETCH and STORE otherwise */
4039 && (stash = SvSTASH(SvRV(SvTIED_obj((SV*)hv, mg))))
4040 && gv_fetchmethod_autoload(stash, "EXISTS", TRUE)
4041 && gv_fetchmethod_autoload(stash, "DELETE", TRUE));
4044 while (++MARK <= SP) {
4045 SV * const keysv = *MARK;
4048 bool preeminent = FALSE;
4051 preeminent = SvRMAGICAL(hv) && !other_magic ? 1 :
4052 hv_exists_ent(hv, keysv, 0);
4055 he = hv_fetch_ent(hv, keysv, lval, 0);
4056 svp = he ? &HeVAL(he) : 0;
4059 if (!svp || *svp == &PL_sv_undef) {
4060 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
4063 if (HvNAME_get(hv) && isGV(*svp))
4064 save_gp((GV*)*svp, !(PL_op->op_flags & OPf_SPECIAL));
4067 save_helem(hv, keysv, svp);
4070 const char * const key = SvPV_const(keysv, keylen);
4071 SAVEDELETE(hv, savepvn(key,keylen),
4072 SvUTF8(keysv) ? -(I32)keylen : (I32)keylen);
4077 *MARK = svp ? *svp : &PL_sv_undef;
4079 if (GIMME != G_ARRAY) {
4081 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
4087 /* List operators. */
4092 if (GIMME != G_ARRAY) {
4094 *MARK = *SP; /* unwanted list, return last item */
4096 *MARK = &PL_sv_undef;
4106 SV ** const lastrelem = PL_stack_sp;
4107 SV ** const lastlelem = PL_stack_base + POPMARK;
4108 SV ** const firstlelem = PL_stack_base + POPMARK + 1;
4109 register SV ** const firstrelem = lastlelem + 1;
4110 const I32 arybase = CopARYBASE_get(PL_curcop);
4111 I32 is_something_there = FALSE;
4113 register const I32 max = lastrelem - lastlelem;
4114 register SV **lelem;
4116 if (GIMME != G_ARRAY) {
4117 I32 ix = SvIVx(*lastlelem);
4122 if (ix < 0 || ix >= max)
4123 *firstlelem = &PL_sv_undef;
4125 *firstlelem = firstrelem[ix];
4131 SP = firstlelem - 1;
4135 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
4136 I32 ix = SvIVx(*lelem);
4141 if (ix < 0 || ix >= max)
4142 *lelem = &PL_sv_undef;
4144 is_something_there = TRUE;
4145 if (!(*lelem = firstrelem[ix]))
4146 *lelem = &PL_sv_undef;
4149 if (is_something_there)
4152 SP = firstlelem - 1;
4158 dVAR; dSP; dMARK; dORIGMARK;
4159 const I32 items = SP - MARK;
4160 SV * const av = (SV *) av_make(items, MARK+1);
4161 SP = ORIGMARK; /* av_make() might realloc stack_sp */
4162 XPUSHs(sv_2mortal((PL_op->op_flags & OPf_SPECIAL)
4163 ? newRV_noinc(av) : av));
4169 dVAR; dSP; dMARK; dORIGMARK;
4170 HV* const hv = newHV();
4173 SV * const key = *++MARK;
4174 SV * const val = newSV(0);
4176 sv_setsv(val, *++MARK);
4177 else if (ckWARN(WARN_MISC))
4178 Perl_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
4179 (void)hv_store_ent(hv,key,val,0);
4182 XPUSHs(sv_2mortal((PL_op->op_flags & OPf_SPECIAL)
4183 ? newRV_noinc((SV*) hv) : (SV*)hv));
4189 dVAR; dSP; dMARK; dORIGMARK;
4190 register AV *ary = (AV*)*++MARK;
4194 register I32 offset;
4195 register I32 length;
4199 const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4202 *MARK-- = SvTIED_obj((SV*)ary, mg);
4206 call_method("SPLICE",GIMME_V);
4215 offset = i = SvIVx(*MARK);
4217 offset += AvFILLp(ary) + 1;
4219 offset -= CopARYBASE_get(PL_curcop);
4221 DIE(aTHX_ PL_no_aelem, i);
4223 length = SvIVx(*MARK++);
4225 length += AvFILLp(ary) - offset + 1;
4231 length = AvMAX(ary) + 1; /* close enough to infinity */
4235 length = AvMAX(ary) + 1;
4237 if (offset > AvFILLp(ary) + 1) {
4238 if (ckWARN(WARN_MISC))
4239 Perl_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
4240 offset = AvFILLp(ary) + 1;
4242 after = AvFILLp(ary) + 1 - (offset + length);
4243 if (after < 0) { /* not that much array */
4244 length += after; /* offset+length now in array */
4250 /* At this point, MARK .. SP-1 is our new LIST */
4253 diff = newlen - length;
4254 if (newlen && !AvREAL(ary) && AvREIFY(ary))
4257 /* make new elements SVs now: avoid problems if they're from the array */
4258 for (dst = MARK, i = newlen; i; i--) {
4259 SV * const h = *dst;
4260 *dst++ = newSVsv(h);
4263 if (diff < 0) { /* shrinking the area */
4264 SV **tmparyval = NULL;
4266 Newx(tmparyval, newlen, SV*); /* so remember insertion */
4267 Copy(MARK, tmparyval, newlen, SV*);
4270 MARK = ORIGMARK + 1;
4271 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4272 MEXTEND(MARK, length);
4273 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
4275 EXTEND_MORTAL(length);
4276 for (i = length, dst = MARK; i; i--) {
4277 sv_2mortal(*dst); /* free them eventualy */
4284 *MARK = AvARRAY(ary)[offset+length-1];
4287 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
4288 SvREFCNT_dec(*dst++); /* free them now */
4291 AvFILLp(ary) += diff;
4293 /* pull up or down? */
4295 if (offset < after) { /* easier to pull up */
4296 if (offset) { /* esp. if nothing to pull */
4297 src = &AvARRAY(ary)[offset-1];
4298 dst = src - diff; /* diff is negative */
4299 for (i = offset; i > 0; i--) /* can't trust Copy */
4303 AvARRAY(ary) = AvARRAY(ary) - diff; /* diff is negative */
4307 if (after) { /* anything to pull down? */
4308 src = AvARRAY(ary) + offset + length;
4309 dst = src + diff; /* diff is negative */
4310 Move(src, dst, after, SV*);
4312 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
4313 /* avoid later double free */
4317 dst[--i] = &PL_sv_undef;
4320 Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
4321 Safefree(tmparyval);
4324 else { /* no, expanding (or same) */
4325 SV** tmparyval = NULL;
4327 Newx(tmparyval, length, SV*); /* so remember deletion */
4328 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
4331 if (diff > 0) { /* expanding */
4332 /* push up or down? */
4333 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
4337 Move(src, dst, offset, SV*);
4339 AvARRAY(ary) = AvARRAY(ary) - diff;/* diff is positive */
4341 AvFILLp(ary) += diff;
4344 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
4345 av_extend(ary, AvFILLp(ary) + diff);
4346 AvFILLp(ary) += diff;
4349 dst = AvARRAY(ary) + AvFILLp(ary);
4351 for (i = after; i; i--) {
4359 Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
4362 MARK = ORIGMARK + 1;
4363 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4365 Copy(tmparyval, MARK, length, SV*);
4367 EXTEND_MORTAL(length);
4368 for (i = length, dst = MARK; i; i--) {
4369 sv_2mortal(*dst); /* free them eventualy */
4376 else if (length--) {
4377 *MARK = tmparyval[length];
4380 while (length-- > 0)
4381 SvREFCNT_dec(tmparyval[length]);
4385 *MARK = &PL_sv_undef;
4386 Safefree(tmparyval);
4394 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4395 register AV * const ary = (AV*)*++MARK;
4396 const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4399 *MARK-- = SvTIED_obj((SV*)ary, mg);
4403 call_method("PUSH",G_SCALAR|G_DISCARD);
4407 PUSHi( AvFILL(ary) + 1 );
4410 for (++MARK; MARK <= SP; MARK++) {
4411 SV * const sv = newSV(0);
4413 sv_setsv(sv, *MARK);
4414 av_store(ary, AvFILLp(ary)+1, sv);
4417 PUSHi( AvFILLp(ary) + 1 );
4426 AV * const av = (AV*)POPs;
4427 SV * const sv = PL_op->op_type == OP_SHIFT ? av_shift(av) : av_pop(av);
4431 (void)sv_2mortal(sv);
4438 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4439 register AV *ary = (AV*)*++MARK;
4440 const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4443 *MARK-- = SvTIED_obj((SV*)ary, mg);
4447 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
4453 av_unshift(ary, SP - MARK);
4455 SV * const sv = newSVsv(*++MARK);
4456 (void)av_store(ary, i++, sv);
4460 PUSHi( AvFILL(ary) + 1 );
4467 SV ** const oldsp = SP;
4469 if (GIMME == G_ARRAY) {
4472 register SV * const tmp = *MARK;
4476 /* safe as long as stack cannot get extended in the above */
4481 register char *down;
4485 PADOFFSET padoff_du;
4487 SvUTF8_off(TARG); /* decontaminate */
4489 do_join(TARG, &PL_sv_no, MARK, SP);
4491 sv_setsv(TARG, (SP > MARK)
4493 : (padoff_du = find_rundefsvoffset(),
4494 (padoff_du == NOT_IN_PAD
4495 || PAD_COMPNAME_FLAGS_isOUR(padoff_du))
4496 ? DEFSV : PAD_SVl(padoff_du)));
4497 up = SvPV_force(TARG, len);
4499 if (DO_UTF8(TARG)) { /* first reverse each character */
4500 U8* s = (U8*)SvPVX(TARG);
4501 const U8* send = (U8*)(s + len);
4503 if (UTF8_IS_INVARIANT(*s)) {
4508 if (!utf8_to_uvchr(s, 0))
4512 down = (char*)(s - 1);
4513 /* reverse this character */
4517 *down-- = (char)tmp;
4523 down = SvPVX(TARG) + len - 1;
4527 *down-- = (char)tmp;
4529 (void)SvPOK_only_UTF8(TARG);
4541 register IV limit = POPi; /* note, negative is forever */
4542 SV * const sv = POPs;
4544 register const char *s = SvPV_const(sv, len);
4545 const bool do_utf8 = DO_UTF8(sv);
4546 const char *strend = s + len;
4548 register REGEXP *rx;
4550 register const char *m;
4552 const STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (STRLEN)(strend - s);
4553 I32 maxiters = slen + 10;
4555 const I32 origlimit = limit;
4558 const I32 gimme = GIMME_V;
4559 const I32 oldsave = PL_savestack_ix;
4560 I32 make_mortal = 1;
4565 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4570 DIE(aTHX_ "panic: pp_split");
4573 TAINT_IF((rx->extflags & RXf_PMf_LOCALE) &&
4574 (rx->extflags & (RXf_WHITE | RXf_SKIPWHITE)));
4576 RX_MATCH_UTF8_set(rx, do_utf8);
4579 if (pm->op_pmreplrootu.op_pmtargetoff) {
4580 ary = GvAVn((GV*)PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff));
4583 if (pm->op_pmreplrootu.op_pmtargetgv) {
4584 ary = GvAVn(pm->op_pmreplrootu.op_pmtargetgv);
4587 else if (gimme != G_ARRAY)
4588 ary = GvAVn(PL_defgv);
4591 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4597 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4599 XPUSHs(SvTIED_obj((SV*)ary, mg));
4606 for (i = AvFILLp(ary); i >= 0; i--)
4607 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
4609 /* temporarily switch stacks */
4610 SAVESWITCHSTACK(PL_curstack, ary);
4614 base = SP - PL_stack_base;
4616 if (rx->extflags & RXf_SKIPWHITE) {
4618 while (*s == ' ' || is_utf8_space((U8*)s))
4621 else if (rx->extflags & RXf_PMf_LOCALE) {
4622 while (isSPACE_LC(*s))
4630 if (rx->extflags & PMf_MULTILINE) {
4635 limit = maxiters + 2;
4636 if (rx->extflags & RXf_WHITE) {
4639 /* this one uses 'm' and is a negative test */
4641 while (m < strend && !( *m == ' ' || is_utf8_space((U8*)m) )) {
4642 const int t = UTF8SKIP(m);
4643 /* is_utf8_space returns FALSE for malform utf8 */
4649 } else if (rx->extflags & RXf_PMf_LOCALE) {
4650 while (m < strend && !isSPACE_LC(*m))
4653 while (m < strend && !isSPACE(*m))
4659 dstr = newSVpvn(s, m-s);
4663 (void)SvUTF8_on(dstr);
4666 /* skip the whitespace found last */
4668 s = m + UTF8SKIP(m);
4672 /* this one uses 's' and is a positive test */
4674 while (s < strend && ( *s == ' ' || is_utf8_space((U8*)s) ))
4676 } else if (rx->extflags & RXf_PMf_LOCALE) {
4677 while (s < strend && isSPACE_LC(*s))
4680 while (s < strend && isSPACE(*s))
4685 else if (rx->extflags & RXf_START_ONLY) {
4687 for (m = s; m < strend && *m != '\n'; m++)
4692 dstr = newSVpvn(s, m-s);
4696 (void)SvUTF8_on(dstr);
4701 else if (do_utf8 == ((rx->extflags & RXf_UTF8) != 0) &&
4702 (rx->extflags & RXf_USE_INTUIT) && !rx->nparens
4703 && (rx->extflags & RXf_CHECK_ALL)
4704 && !(rx->extflags & RXf_ANCH)) {
4705 const int tail = (rx->extflags & RXf_INTUIT_TAIL);
4706 SV * const csv = CALLREG_INTUIT_STRING(rx);
4708 len = rx->minlenret;
4709 if (len == 1 && !(rx->extflags & RXf_UTF8) && !tail) {
4710 const char c = *SvPV_nolen_const(csv);
4712 for (m = s; m < strend && *m != c; m++)
4716 dstr = newSVpvn(s, m-s);
4720 (void)SvUTF8_on(dstr);
4722 /* The rx->minlen is in characters but we want to step
4723 * s ahead by bytes. */
4725 s = (char*)utf8_hop((U8*)m, len);
4727 s = m + len; /* Fake \n at the end */
4731 while (s < strend && --limit &&
4732 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
4733 csv, multiline ? FBMrf_MULTILINE : 0)) )
4735 dstr = newSVpvn(s, m-s);
4739 (void)SvUTF8_on(dstr);
4741 /* The rx->minlen is in characters but we want to step
4742 * s ahead by bytes. */
4744 s = (char*)utf8_hop((U8*)m, len);
4746 s = m + len; /* Fake \n at the end */
4751 maxiters += slen * rx->nparens;
4752 while (s < strend && --limit)
4756 rex_return = CALLREGEXEC(rx, (char*)s, (char*)strend, (char*)orig, 1 ,
4759 if (rex_return == 0)
4761 TAINT_IF(RX_MATCH_TAINTED(rx));
4762 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
4767 strend = s + (strend - m);
4769 m = rx->offs[0].start + orig;
4770 dstr = newSVpvn(s, m-s);
4774 (void)SvUTF8_on(dstr);
4778 for (i = 1; i <= (I32)rx->nparens; i++) {
4779 s = rx->offs[i].start + orig;
4780 m = rx->offs[i].end + orig;
4782 /* japhy (07/27/01) -- the (m && s) test doesn't catch
4783 parens that didn't match -- they should be set to
4784 undef, not the empty string */
4785 if (m >= orig && s >= orig) {
4786 dstr = newSVpvn(s, m-s);
4789 dstr = &PL_sv_undef; /* undef, not "" */
4793 (void)SvUTF8_on(dstr);
4797 s = rx->offs[0].end + orig;
4801 iters = (SP - PL_stack_base) - base;
4802 if (iters > maxiters)
4803 DIE(aTHX_ "Split loop");
4805 /* keep field after final delim? */
4806 if (s < strend || (iters && origlimit)) {
4807 const STRLEN l = strend - s;
4808 dstr = newSVpvn(s, l);
4812 (void)SvUTF8_on(dstr);
4816 else if (!origlimit) {
4817 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
4818 if (TOPs && !make_mortal)
4821 *SP-- = &PL_sv_undef;
4826 LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */
4830 if (SvSMAGICAL(ary)) {
4835 if (gimme == G_ARRAY) {
4837 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4845 call_method("PUSH",G_SCALAR|G_DISCARD);
4848 if (gimme == G_ARRAY) {
4850 /* EXTEND should not be needed - we just popped them */
4852 for (i=0; i < iters; i++) {
4853 SV **svp = av_fetch(ary, i, FALSE);
4854 PUSHs((svp) ? *svp : &PL_sv_undef);
4861 if (gimme == G_ARRAY)
4877 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
4878 || SvTYPE(retsv) == SVt_PVCV) {
4879 retsv = refto(retsv);
4886 PP(unimplemented_op)
4889 DIE(aTHX_ "panic: unimplemented op %s (#%d) called", OP_NAME(PL_op),
4895 * c-indentation-style: bsd
4897 * indent-tabs-mode: t
4900 * ex: set ts=8 sts=4 sw=4 noet: