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)
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);
834 if((stash = GvHV((GV*)sv)) && HvNAME_get(stash))
835 mro_isa_changed_in(stash);
836 /* undef *Pkg::meth_name ... */
837 else if(GvCVu((GV*)sv) && (stash = GvSTASH((GV*)sv)) && HvNAME_get(stash))
838 mro_method_changed_in(stash);
842 GvGP(sv) = gp_ref(gp);
844 GvLINE(sv) = CopLINE(PL_curcop);
850 if (SvTYPE(sv) >= SVt_PV && SvPVX_const(sv) && SvLEN(sv)) {
865 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
866 DIE(aTHX_ PL_no_modify);
867 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
868 && SvIVX(TOPs) != IV_MIN)
870 SvIV_set(TOPs, SvIVX(TOPs) - 1);
871 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
882 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
883 DIE(aTHX_ PL_no_modify);
884 sv_setsv(TARG, TOPs);
885 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
886 && SvIVX(TOPs) != IV_MAX)
888 SvIV_set(TOPs, SvIVX(TOPs) + 1);
889 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
894 /* special case for undef: see thread at 2003-03/msg00536.html in archive */
904 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
905 DIE(aTHX_ PL_no_modify);
906 sv_setsv(TARG, TOPs);
907 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
908 && SvIVX(TOPs) != IV_MIN)
910 SvIV_set(TOPs, SvIVX(TOPs) - 1);
911 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
920 /* Ordinary operators. */
924 dVAR; dSP; dATARGET; SV *svl, *svr;
925 #ifdef PERL_PRESERVE_IVUV
928 tryAMAGICbin(pow,opASSIGN);
929 svl = sv_2num(TOPm1s);
931 #ifdef PERL_PRESERVE_IVUV
932 /* For integer to integer power, we do the calculation by hand wherever
933 we're sure it is safe; otherwise we call pow() and try to convert to
934 integer afterwards. */
947 const IV iv = SvIVX(svr);
951 goto float_it; /* Can't do negative powers this way. */
955 baseuok = SvUOK(svl);
959 const IV iv = SvIVX(svl);
962 baseuok = TRUE; /* effectively it's a UV now */
964 baseuv = -iv; /* abs, baseuok == false records sign */
967 /* now we have integer ** positive integer. */
970 /* foo & (foo - 1) is zero only for a power of 2. */
971 if (!(baseuv & (baseuv - 1))) {
972 /* We are raising power-of-2 to a positive integer.
973 The logic here will work for any base (even non-integer
974 bases) but it can be less accurate than
975 pow (base,power) or exp (power * log (base)) when the
976 intermediate values start to spill out of the mantissa.
977 With powers of 2 we know this can't happen.
978 And powers of 2 are the favourite thing for perl
979 programmers to notice ** not doing what they mean. */
981 NV base = baseuok ? baseuv : -(NV)baseuv;
986 while (power >>= 1) {
997 register unsigned int highbit = 8 * sizeof(UV);
998 register unsigned int diff = 8 * sizeof(UV);
1001 if (baseuv >> highbit) {
1005 /* we now have baseuv < 2 ** highbit */
1006 if (power * highbit <= 8 * sizeof(UV)) {
1007 /* result will definitely fit in UV, so use UV math
1008 on same algorithm as above */
1009 register UV result = 1;
1010 register UV base = baseuv;
1011 const bool odd_power = (bool)(power & 1);
1015 while (power >>= 1) {
1022 if (baseuok || !odd_power)
1023 /* answer is positive */
1025 else if (result <= (UV)IV_MAX)
1026 /* answer negative, fits in IV */
1027 SETi( -(IV)result );
1028 else if (result == (UV)IV_MIN)
1029 /* 2's complement assumption: special case IV_MIN */
1032 /* answer negative, doesn't fit */
1033 SETn( -(NV)result );
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 */
1210 SETn( left * right );
1217 dVAR; dSP; dATARGET; SV *svl, *svr;
1218 tryAMAGICbin(div,opASSIGN);
1219 svl = sv_2num(TOPm1s);
1220 svr = sv_2num(TOPs);
1221 /* Only try to do UV divide first
1222 if ((SLOPPYDIVIDE is true) or
1223 (PERL_PRESERVE_IVUV is true and one or both SV is a UV too large
1225 The assumption is that it is better to use floating point divide
1226 whenever possible, only doing integer divide first if we can't be sure.
1227 If NV_PRESERVES_UV is true then we know at compile time that no UV
1228 can be too large to preserve, so don't need to compile the code to
1229 test the size of UVs. */
1232 # define PERL_TRY_UV_DIVIDE
1233 /* ensure that 20./5. == 4. */
1235 # ifdef PERL_PRESERVE_IVUV
1236 # ifndef NV_PRESERVES_UV
1237 # define PERL_TRY_UV_DIVIDE
1242 #ifdef PERL_TRY_UV_DIVIDE
1247 bool left_non_neg = SvUOK(svl);
1248 bool right_non_neg = SvUOK(svr);
1252 if (right_non_neg) {
1256 const IV biv = SvIVX(svr);
1259 right_non_neg = TRUE; /* effectively it's a UV now */
1265 /* historically undef()/0 gives a "Use of uninitialized value"
1266 warning before dieing, hence this test goes here.
1267 If it were immediately before the second SvIV_please, then
1268 DIE() would be invoked before left was even inspected, so
1269 no inpsection would give no warning. */
1271 DIE(aTHX_ "Illegal division by zero");
1277 const IV aiv = SvIVX(svl);
1280 left_non_neg = TRUE; /* effectively it's a UV now */
1289 /* For sloppy divide we always attempt integer division. */
1291 /* Otherwise we only attempt it if either or both operands
1292 would not be preserved by an NV. If both fit in NVs
1293 we fall through to the NV divide code below. However,
1294 as left >= right to ensure integer result here, we know that
1295 we can skip the test on the right operand - right big
1296 enough not to be preserved can't get here unless left is
1299 && (left > ((UV)1 << NV_PRESERVES_UV_BITS))
1302 /* Integer division can't overflow, but it can be imprecise. */
1303 const UV result = left / right;
1304 if (result * right == left) {
1305 SP--; /* result is valid */
1306 if (left_non_neg == right_non_neg) {
1307 /* signs identical, result is positive. */
1311 /* 2s complement assumption */
1312 if (result <= (UV)IV_MIN)
1313 SETi( -(IV)result );
1315 /* It's exact but too negative for IV. */
1316 SETn( -(NV)result );
1319 } /* tried integer divide but it was not an integer result */
1320 } /* else (PERL_ABS(result) < 1.0) or (both UVs in range for NV) */
1321 } /* left wasn't SvIOK */
1322 } /* right wasn't SvIOK */
1323 #endif /* PERL_TRY_UV_DIVIDE */
1326 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1327 if (! Perl_isnan(right) && right == 0.0)
1331 DIE(aTHX_ "Illegal division by zero");
1332 PUSHn( left / right );
1339 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1343 bool left_neg = FALSE;
1344 bool right_neg = FALSE;
1345 bool use_double = FALSE;
1346 bool dright_valid = FALSE;
1350 SV * const svr = sv_2num(TOPs);
1353 right_neg = !SvUOK(svr);
1357 const IV biv = SvIVX(svr);
1360 right_neg = FALSE; /* effectively it's a UV now */
1369 right_neg = dright < 0;
1372 if (dright < UV_MAX_P1) {
1373 right = U_V(dright);
1374 dright_valid = TRUE; /* In case we need to use double below. */
1380 /* At this point use_double is only true if right is out of range for
1381 a UV. In range NV has been rounded down to nearest UV and
1382 use_double false. */
1383 svl = sv_2num(TOPs);
1385 if (!use_double && SvIOK(svl)) {
1387 left_neg = !SvUOK(svl);
1391 const IV aiv = SvIVX(svl);
1394 left_neg = FALSE; /* effectively it's a UV now */
1404 left_neg = dleft < 0;
1408 /* This should be exactly the 5.6 behaviour - if left and right are
1409 both in range for UV then use U_V() rather than floor. */
1411 if (dleft < UV_MAX_P1) {
1412 /* right was in range, so is dleft, so use UVs not double.
1416 /* left is out of range for UV, right was in range, so promote
1417 right (back) to double. */
1419 /* The +0.5 is used in 5.6 even though it is not strictly
1420 consistent with the implicit +0 floor in the U_V()
1421 inside the #if 1. */
1422 dleft = Perl_floor(dleft + 0.5);
1425 dright = Perl_floor(dright + 0.5);
1435 DIE(aTHX_ "Illegal modulus zero");
1437 dans = Perl_fmod(dleft, dright);
1438 if ((left_neg != right_neg) && dans)
1439 dans = dright - dans;
1442 sv_setnv(TARG, dans);
1448 DIE(aTHX_ "Illegal modulus zero");
1451 if ((left_neg != right_neg) && ans)
1454 /* XXX may warn: unary minus operator applied to unsigned type */
1455 /* could change -foo to be (~foo)+1 instead */
1456 if (ans <= ~((UV)IV_MAX)+1)
1457 sv_setiv(TARG, ~ans+1);
1459 sv_setnv(TARG, -(NV)ans);
1462 sv_setuv(TARG, ans);
1471 dVAR; dSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
1478 const UV uv = SvUV(sv);
1480 count = IV_MAX; /* The best we can do? */
1484 const IV iv = SvIV(sv);
1491 else if (SvNOKp(sv)) {
1492 const NV nv = SvNV(sv);
1500 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1502 static const char oom_list_extend[] = "Out of memory during list extend";
1503 const I32 items = SP - MARK;
1504 const I32 max = items * count;
1506 MEM_WRAP_CHECK_1(max, SV*, oom_list_extend);
1507 /* Did the max computation overflow? */
1508 if (items > 0 && max > 0 && (max < items || max < count))
1509 Perl_croak(aTHX_ oom_list_extend);
1514 /* This code was intended to fix 20010809.028:
1517 for (($x =~ /./g) x 2) {
1518 print chop; # "abcdabcd" expected as output.
1521 * but that change (#11635) broke this code:
1523 $x = [("foo")x2]; # only one "foo" ended up in the anonlist.
1525 * I can't think of a better fix that doesn't introduce
1526 * an efficiency hit by copying the SVs. The stack isn't
1527 * refcounted, and mortalisation obviously doesn't
1528 * Do The Right Thing when the stack has more than
1529 * one pointer to the same mortal value.
1533 *SP = sv_2mortal(newSVsv(*SP));
1543 repeatcpy((char*)(MARK + items), (char*)MARK,
1544 items * sizeof(SV*), count - 1);
1547 else if (count <= 0)
1550 else { /* Note: mark already snarfed by pp_list */
1551 SV * const tmpstr = POPs;
1554 static const char oom_string_extend[] =
1555 "Out of memory during string extend";
1557 SvSetSV(TARG, tmpstr);
1558 SvPV_force(TARG, len);
1559 isutf = DO_UTF8(TARG);
1564 const STRLEN max = (UV)count * len;
1565 if (len > MEM_SIZE_MAX / count)
1566 Perl_croak(aTHX_ oom_string_extend);
1567 MEM_WRAP_CHECK_1(max, char, oom_string_extend);
1568 SvGROW(TARG, max + 1);
1569 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1570 SvCUR_set(TARG, SvCUR(TARG) * count);
1572 *SvEND(TARG) = '\0';
1575 (void)SvPOK_only_UTF8(TARG);
1577 (void)SvPOK_only(TARG);
1579 if (PL_op->op_private & OPpREPEAT_DOLIST) {
1580 /* The parser saw this as a list repeat, and there
1581 are probably several items on the stack. But we're
1582 in scalar context, and there's no pp_list to save us
1583 now. So drop the rest of the items -- robin@kitsite.com
1596 dVAR; dSP; dATARGET; bool useleft; SV *svl, *svr;
1597 tryAMAGICbin(subtr,opASSIGN);
1598 svl = sv_2num(TOPm1s);
1599 svr = sv_2num(TOPs);
1600 useleft = USE_LEFT(svl);
1601 #ifdef PERL_PRESERVE_IVUV
1602 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1603 "bad things" happen if you rely on signed integers wrapping. */
1606 /* Unless the left argument is integer in range we are going to have to
1607 use NV maths. Hence only attempt to coerce the right argument if
1608 we know the left is integer. */
1609 register UV auv = 0;
1615 a_valid = auvok = 1;
1616 /* left operand is undef, treat as zero. */
1618 /* Left operand is defined, so is it IV? */
1621 if ((auvok = SvUOK(svl)))
1624 register const IV aiv = SvIVX(svl);
1627 auvok = 1; /* Now acting as a sign flag. */
1628 } else { /* 2s complement assumption for IV_MIN */
1636 bool result_good = 0;
1639 bool buvok = SvUOK(svr);
1644 register const IV biv = SvIVX(svr);
1651 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1652 else "IV" now, independent of how it came in.
1653 if a, b represents positive, A, B negative, a maps to -A etc
1658 all UV maths. negate result if A negative.
1659 subtract if signs same, add if signs differ. */
1661 if (auvok ^ buvok) {
1670 /* Must get smaller */
1675 if (result <= buv) {
1676 /* result really should be -(auv-buv). as its negation
1677 of true value, need to swap our result flag */
1689 if (result <= (UV)IV_MIN)
1690 SETi( -(IV)result );
1692 /* result valid, but out of range for IV. */
1693 SETn( -(NV)result );
1697 } /* Overflow, drop through to NVs. */
1704 /* left operand is undef, treat as zero - value */
1708 SETn( TOPn - value );
1715 dVAR; dSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1717 const IV shift = POPi;
1718 if (PL_op->op_private & HINT_INTEGER) {
1732 dVAR; dSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1734 const IV shift = POPi;
1735 if (PL_op->op_private & HINT_INTEGER) {
1749 dVAR; dSP; tryAMAGICbinSET(lt,0);
1750 #ifdef PERL_PRESERVE_IVUV
1753 SvIV_please(TOPm1s);
1754 if (SvIOK(TOPm1s)) {
1755 bool auvok = SvUOK(TOPm1s);
1756 bool buvok = SvUOK(TOPs);
1758 if (!auvok && !buvok) { /* ## IV < IV ## */
1759 const IV aiv = SvIVX(TOPm1s);
1760 const IV biv = SvIVX(TOPs);
1763 SETs(boolSV(aiv < biv));
1766 if (auvok && buvok) { /* ## UV < UV ## */
1767 const UV auv = SvUVX(TOPm1s);
1768 const UV buv = SvUVX(TOPs);
1771 SETs(boolSV(auv < buv));
1774 if (auvok) { /* ## UV < IV ## */
1776 const IV biv = SvIVX(TOPs);
1779 /* As (a) is a UV, it's >=0, so it cannot be < */
1784 SETs(boolSV(auv < (UV)biv));
1787 { /* ## IV < UV ## */
1788 const IV aiv = SvIVX(TOPm1s);
1792 /* As (b) is a UV, it's >=0, so it must be < */
1799 SETs(boolSV((UV)aiv < buv));
1805 #ifndef NV_PRESERVES_UV
1806 #ifdef PERL_PRESERVE_IVUV
1809 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1811 SETs(boolSV(SvRV(TOPs) < SvRV(TOPp1s)));
1816 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1818 if (Perl_isnan(left) || Perl_isnan(right))
1820 SETs(boolSV(left < right));
1823 SETs(boolSV(TOPn < value));
1831 dVAR; dSP; tryAMAGICbinSET(gt,0);
1832 #ifdef PERL_PRESERVE_IVUV
1835 SvIV_please(TOPm1s);
1836 if (SvIOK(TOPm1s)) {
1837 bool auvok = SvUOK(TOPm1s);
1838 bool buvok = SvUOK(TOPs);
1840 if (!auvok && !buvok) { /* ## IV > IV ## */
1841 const IV aiv = SvIVX(TOPm1s);
1842 const IV biv = SvIVX(TOPs);
1845 SETs(boolSV(aiv > biv));
1848 if (auvok && buvok) { /* ## UV > UV ## */
1849 const UV auv = SvUVX(TOPm1s);
1850 const UV buv = SvUVX(TOPs);
1853 SETs(boolSV(auv > buv));
1856 if (auvok) { /* ## UV > IV ## */
1858 const IV biv = SvIVX(TOPs);
1862 /* As (a) is a UV, it's >=0, so it must be > */
1867 SETs(boolSV(auv > (UV)biv));
1870 { /* ## IV > UV ## */
1871 const IV aiv = SvIVX(TOPm1s);
1875 /* As (b) is a UV, it's >=0, so it cannot be > */
1882 SETs(boolSV((UV)aiv > buv));
1888 #ifndef NV_PRESERVES_UV
1889 #ifdef PERL_PRESERVE_IVUV
1892 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1894 SETs(boolSV(SvRV(TOPs) > SvRV(TOPp1s)));
1899 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1901 if (Perl_isnan(left) || Perl_isnan(right))
1903 SETs(boolSV(left > right));
1906 SETs(boolSV(TOPn > value));
1914 dVAR; dSP; tryAMAGICbinSET(le,0);
1915 #ifdef PERL_PRESERVE_IVUV
1918 SvIV_please(TOPm1s);
1919 if (SvIOK(TOPm1s)) {
1920 bool auvok = SvUOK(TOPm1s);
1921 bool buvok = SvUOK(TOPs);
1923 if (!auvok && !buvok) { /* ## IV <= IV ## */
1924 const IV aiv = SvIVX(TOPm1s);
1925 const IV biv = SvIVX(TOPs);
1928 SETs(boolSV(aiv <= biv));
1931 if (auvok && buvok) { /* ## UV <= UV ## */
1932 UV auv = SvUVX(TOPm1s);
1933 UV buv = SvUVX(TOPs);
1936 SETs(boolSV(auv <= buv));
1939 if (auvok) { /* ## UV <= IV ## */
1941 const IV biv = SvIVX(TOPs);
1945 /* As (a) is a UV, it's >=0, so a cannot be <= */
1950 SETs(boolSV(auv <= (UV)biv));
1953 { /* ## IV <= UV ## */
1954 const IV aiv = SvIVX(TOPm1s);
1958 /* As (b) is a UV, it's >=0, so a must be <= */
1965 SETs(boolSV((UV)aiv <= buv));
1971 #ifndef NV_PRESERVES_UV
1972 #ifdef PERL_PRESERVE_IVUV
1975 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1977 SETs(boolSV(SvRV(TOPs) <= SvRV(TOPp1s)));
1982 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1984 if (Perl_isnan(left) || Perl_isnan(right))
1986 SETs(boolSV(left <= right));
1989 SETs(boolSV(TOPn <= value));
1997 dVAR; dSP; tryAMAGICbinSET(ge,0);
1998 #ifdef PERL_PRESERVE_IVUV
2001 SvIV_please(TOPm1s);
2002 if (SvIOK(TOPm1s)) {
2003 bool auvok = SvUOK(TOPm1s);
2004 bool buvok = SvUOK(TOPs);
2006 if (!auvok && !buvok) { /* ## IV >= IV ## */
2007 const IV aiv = SvIVX(TOPm1s);
2008 const IV biv = SvIVX(TOPs);
2011 SETs(boolSV(aiv >= biv));
2014 if (auvok && buvok) { /* ## UV >= UV ## */
2015 const UV auv = SvUVX(TOPm1s);
2016 const UV buv = SvUVX(TOPs);
2019 SETs(boolSV(auv >= buv));
2022 if (auvok) { /* ## UV >= IV ## */
2024 const IV biv = SvIVX(TOPs);
2028 /* As (a) is a UV, it's >=0, so it must be >= */
2033 SETs(boolSV(auv >= (UV)biv));
2036 { /* ## IV >= UV ## */
2037 const IV aiv = SvIVX(TOPm1s);
2041 /* As (b) is a UV, it's >=0, so a cannot be >= */
2048 SETs(boolSV((UV)aiv >= buv));
2054 #ifndef NV_PRESERVES_UV
2055 #ifdef PERL_PRESERVE_IVUV
2058 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2060 SETs(boolSV(SvRV(TOPs) >= SvRV(TOPp1s)));
2065 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2067 if (Perl_isnan(left) || Perl_isnan(right))
2069 SETs(boolSV(left >= right));
2072 SETs(boolSV(TOPn >= value));
2080 dVAR; dSP; tryAMAGICbinSET(ne,0);
2081 #ifndef NV_PRESERVES_UV
2082 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2084 SETs(boolSV(SvRV(TOPs) != SvRV(TOPp1s)));
2088 #ifdef PERL_PRESERVE_IVUV
2091 SvIV_please(TOPm1s);
2092 if (SvIOK(TOPm1s)) {
2093 const bool auvok = SvUOK(TOPm1s);
2094 const bool buvok = SvUOK(TOPs);
2096 if (auvok == buvok) { /* ## IV == IV or UV == UV ## */
2097 /* Casting IV to UV before comparison isn't going to matter
2098 on 2s complement. On 1s complement or sign&magnitude
2099 (if we have any of them) it could make negative zero
2100 differ from normal zero. As I understand it. (Need to
2101 check - is negative zero implementation defined behaviour
2103 const UV buv = SvUVX(POPs);
2104 const UV auv = SvUVX(TOPs);
2106 SETs(boolSV(auv != buv));
2109 { /* ## Mixed IV,UV ## */
2113 /* != is commutative so swap if needed (save code) */
2115 /* swap. top of stack (b) is the iv */
2119 /* As (a) is a UV, it's >0, so it cannot be == */
2128 /* As (b) is a UV, it's >0, so it cannot be == */
2132 uv = SvUVX(*(SP+1)); /* Do I want TOPp1s() ? */
2134 SETs(boolSV((UV)iv != uv));
2141 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2143 if (Perl_isnan(left) || Perl_isnan(right))
2145 SETs(boolSV(left != right));
2148 SETs(boolSV(TOPn != value));
2156 dVAR; dSP; dTARGET; tryAMAGICbin(ncmp,0);
2157 #ifndef NV_PRESERVES_UV
2158 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2159 const UV right = PTR2UV(SvRV(POPs));
2160 const UV left = PTR2UV(SvRV(TOPs));
2161 SETi((left > right) - (left < right));
2165 #ifdef PERL_PRESERVE_IVUV
2166 /* Fortunately it seems NaN isn't IOK */
2169 SvIV_please(TOPm1s);
2170 if (SvIOK(TOPm1s)) {
2171 const bool leftuvok = SvUOK(TOPm1s);
2172 const bool rightuvok = SvUOK(TOPs);
2174 if (!leftuvok && !rightuvok) { /* ## IV <=> IV ## */
2175 const IV leftiv = SvIVX(TOPm1s);
2176 const IV rightiv = SvIVX(TOPs);
2178 if (leftiv > rightiv)
2180 else if (leftiv < rightiv)
2184 } else if (leftuvok && rightuvok) { /* ## UV <=> UV ## */
2185 const UV leftuv = SvUVX(TOPm1s);
2186 const UV rightuv = SvUVX(TOPs);
2188 if (leftuv > rightuv)
2190 else if (leftuv < rightuv)
2194 } else if (leftuvok) { /* ## UV <=> IV ## */
2195 const IV rightiv = SvIVX(TOPs);
2197 /* As (a) is a UV, it's >=0, so it cannot be < */
2200 const UV leftuv = SvUVX(TOPm1s);
2201 if (leftuv > (UV)rightiv) {
2203 } else if (leftuv < (UV)rightiv) {
2209 } else { /* ## IV <=> UV ## */
2210 const IV leftiv = SvIVX(TOPm1s);
2212 /* As (b) is a UV, it's >=0, so it must be < */
2215 const UV rightuv = SvUVX(TOPs);
2216 if ((UV)leftiv > rightuv) {
2218 } else if ((UV)leftiv < rightuv) {
2236 if (Perl_isnan(left) || Perl_isnan(right)) {
2240 value = (left > right) - (left < right);
2244 else if (left < right)
2246 else if (left > right)
2262 int amg_type = sle_amg;
2266 switch (PL_op->op_type) {
2285 tryAMAGICbinSET_var(amg_type,0);
2288 const int cmp = (IN_LOCALE_RUNTIME
2289 ? sv_cmp_locale(left, right)
2290 : sv_cmp(left, right));
2291 SETs(boolSV(cmp * multiplier < rhs));
2298 dVAR; dSP; tryAMAGICbinSET(seq,0);
2301 SETs(boolSV(sv_eq(left, right)));
2308 dVAR; dSP; tryAMAGICbinSET(sne,0);
2311 SETs(boolSV(!sv_eq(left, right)));
2318 dVAR; dSP; dTARGET; tryAMAGICbin(scmp,0);
2321 const int cmp = (IN_LOCALE_RUNTIME
2322 ? sv_cmp_locale(left, right)
2323 : sv_cmp(left, right));
2331 dVAR; dSP; dATARGET; tryAMAGICbin(band,opASSIGN);
2336 if (SvNIOKp(left) || SvNIOKp(right)) {
2337 if (PL_op->op_private & HINT_INTEGER) {
2338 const IV i = SvIV_nomg(left) & SvIV_nomg(right);
2342 const UV u = SvUV_nomg(left) & SvUV_nomg(right);
2347 do_vop(PL_op->op_type, TARG, left, right);
2356 dVAR; dSP; dATARGET;
2357 const int op_type = PL_op->op_type;
2359 tryAMAGICbin_var((op_type == OP_BIT_OR ? bor_amg : bxor_amg), opASSIGN);
2364 if (SvNIOKp(left) || SvNIOKp(right)) {
2365 if (PL_op->op_private & HINT_INTEGER) {
2366 const IV l = (USE_LEFT(left) ? SvIV_nomg(left) : 0);
2367 const IV r = SvIV_nomg(right);
2368 const IV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2372 const UV l = (USE_LEFT(left) ? SvUV_nomg(left) : 0);
2373 const UV r = SvUV_nomg(right);
2374 const UV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2379 do_vop(op_type, TARG, left, right);
2388 dVAR; dSP; dTARGET; tryAMAGICun(neg);
2390 SV * const sv = sv_2num(TOPs);
2391 const int flags = SvFLAGS(sv);
2393 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
2394 /* It's publicly an integer, or privately an integer-not-float */
2397 if (SvIVX(sv) == IV_MIN) {
2398 /* 2s complement assumption. */
2399 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
2402 else if (SvUVX(sv) <= IV_MAX) {
2407 else if (SvIVX(sv) != IV_MIN) {
2411 #ifdef PERL_PRESERVE_IVUV
2420 else if (SvPOKp(sv)) {
2422 const char * const s = SvPV_const(sv, len);
2423 if (isIDFIRST(*s)) {
2424 sv_setpvn(TARG, "-", 1);
2427 else if (*s == '+' || *s == '-') {
2429 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
2431 else if (DO_UTF8(sv)) {
2434 goto oops_its_an_int;
2436 sv_setnv(TARG, -SvNV(sv));
2438 sv_setpvn(TARG, "-", 1);
2445 goto oops_its_an_int;
2446 sv_setnv(TARG, -SvNV(sv));
2458 dVAR; dSP; tryAMAGICunSET(not);
2459 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
2465 dVAR; dSP; dTARGET; tryAMAGICun(compl);
2470 if (PL_op->op_private & HINT_INTEGER) {
2471 const IV i = ~SvIV_nomg(sv);
2475 const UV u = ~SvUV_nomg(sv);
2484 (void)SvPV_nomg_const(sv,len); /* force check for uninit var */
2485 sv_setsv_nomg(TARG, sv);
2486 tmps = (U8*)SvPV_force(TARG, len);
2489 /* Calculate exact length, let's not estimate. */
2494 U8 * const send = tmps + len;
2495 U8 * const origtmps = tmps;
2496 const UV utf8flags = UTF8_ALLOW_ANYUV;
2498 while (tmps < send) {
2499 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2501 targlen += UNISKIP(~c);
2507 /* Now rewind strings and write them. */
2514 Newx(result, targlen + 1, U8);
2516 while (tmps < send) {
2517 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2519 p = uvchr_to_utf8_flags(p, ~c, UNICODE_ALLOW_ANY);
2522 sv_usepvn_flags(TARG, (char*)result, targlen,
2523 SV_HAS_TRAILING_NUL);
2530 Newx(result, nchar + 1, U8);
2532 while (tmps < send) {
2533 const U8 c = (U8)utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2538 sv_usepvn_flags(TARG, (char*)result, nchar, SV_HAS_TRAILING_NUL);
2546 register long *tmpl;
2547 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2550 for ( ; anum >= (I32)sizeof(long); anum -= (I32)sizeof(long), tmpl++)
2555 for ( ; anum > 0; anum--, tmps++)
2564 /* integer versions of some of the above */
2568 dVAR; dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
2571 SETi( left * right );
2579 dVAR; dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
2583 DIE(aTHX_ "Illegal division by zero");
2586 /* avoid FPE_INTOVF on some platforms when num is IV_MIN */
2590 value = num / value;
2596 #if defined(__GLIBC__) && IVSIZE == 8
2603 /* This is the vanilla old i_modulo. */
2604 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2608 DIE(aTHX_ "Illegal modulus zero");
2609 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2613 SETi( left % right );
2618 #if defined(__GLIBC__) && IVSIZE == 8
2623 /* This is the i_modulo with the workaround for the _moddi3 bug
2624 * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
2625 * See below for pp_i_modulo. */
2626 dVAR; dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2630 DIE(aTHX_ "Illegal modulus zero");
2631 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2635 SETi( left % PERL_ABS(right) );
2642 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2646 DIE(aTHX_ "Illegal modulus zero");
2647 /* The assumption is to use hereafter the old vanilla version... */
2649 PL_ppaddr[OP_I_MODULO] =
2651 /* .. but if we have glibc, we might have a buggy _moddi3
2652 * (at least glicb 2.2.5 is known to have this bug), in other
2653 * words our integer modulus with negative quad as the second
2654 * argument might be broken. Test for this and re-patch the
2655 * opcode dispatch table if that is the case, remembering to
2656 * also apply the workaround so that this first round works
2657 * right, too. See [perl #9402] for more information. */
2661 /* Cannot do this check with inlined IV constants since
2662 * that seems to work correctly even with the buggy glibc. */
2664 /* Yikes, we have the bug.
2665 * Patch in the workaround version. */
2667 PL_ppaddr[OP_I_MODULO] =
2668 &Perl_pp_i_modulo_1;
2669 /* Make certain we work right this time, too. */
2670 right = PERL_ABS(right);
2673 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2677 SETi( left % right );
2685 dVAR; dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
2688 SETi( left + right );
2695 dVAR; dSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
2698 SETi( left - right );
2705 dVAR; dSP; tryAMAGICbinSET(lt,0);
2708 SETs(boolSV(left < right));
2715 dVAR; dSP; tryAMAGICbinSET(gt,0);
2718 SETs(boolSV(left > right));
2725 dVAR; dSP; tryAMAGICbinSET(le,0);
2728 SETs(boolSV(left <= right));
2735 dVAR; dSP; tryAMAGICbinSET(ge,0);
2738 SETs(boolSV(left >= right));
2745 dVAR; dSP; tryAMAGICbinSET(eq,0);
2748 SETs(boolSV(left == right));
2755 dVAR; dSP; tryAMAGICbinSET(ne,0);
2758 SETs(boolSV(left != right));
2765 dVAR; dSP; dTARGET; tryAMAGICbin(ncmp,0);
2772 else if (left < right)
2783 dVAR; dSP; dTARGET; tryAMAGICun(neg);
2788 /* High falutin' math. */
2792 dVAR; dSP; dTARGET; tryAMAGICbin(atan2,0);
2795 SETn(Perl_atan2(left, right));
2803 int amg_type = sin_amg;
2804 const char *neg_report = NULL;
2805 NV (*func)(NV) = Perl_sin;
2806 const int op_type = PL_op->op_type;
2823 amg_type = sqrt_amg;
2825 neg_report = "sqrt";
2829 tryAMAGICun_var(amg_type);
2831 const NV value = POPn;
2833 if (op_type == OP_LOG ? (value <= 0.0) : (value < 0.0)) {
2834 SET_NUMERIC_STANDARD();
2835 DIE(aTHX_ "Can't take %s of %"NVgf, neg_report, value);
2838 XPUSHn(func(value));
2843 /* Support Configure command-line overrides for rand() functions.
2844 After 5.005, perhaps we should replace this by Configure support
2845 for drand48(), random(), or rand(). For 5.005, though, maintain
2846 compatibility by calling rand() but allow the user to override it.
2847 See INSTALL for details. --Andy Dougherty 15 July 1998
2849 /* Now it's after 5.005, and Configure supports drand48() and random(),
2850 in addition to rand(). So the overrides should not be needed any more.
2851 --Jarkko Hietaniemi 27 September 1998
2854 #ifndef HAS_DRAND48_PROTO
2855 extern double drand48 (void);
2868 if (!PL_srand_called) {
2869 (void)seedDrand01((Rand_seed_t)seed());
2870 PL_srand_called = TRUE;
2880 const UV anum = (MAXARG < 1) ? seed() : POPu;
2881 (void)seedDrand01((Rand_seed_t)anum);
2882 PL_srand_called = TRUE;
2889 dVAR; dSP; dTARGET; tryAMAGICun(int);
2891 SV * const sv = sv_2num(TOPs);
2892 const IV iv = SvIV(sv);
2893 /* XXX it's arguable that compiler casting to IV might be subtly
2894 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2895 else preferring IV has introduced a subtle behaviour change bug. OTOH
2896 relying on floating point to be accurate is a bug. */
2901 else if (SvIOK(sv)) {
2908 const NV value = SvNV(sv);
2910 if (value < (NV)UV_MAX + 0.5) {
2913 SETn(Perl_floor(value));
2917 if (value > (NV)IV_MIN - 0.5) {
2920 SETn(Perl_ceil(value));
2930 dVAR; dSP; dTARGET; tryAMAGICun(abs);
2932 SV * const sv = sv_2num(TOPs);
2933 /* This will cache the NV value if string isn't actually integer */
2934 const IV iv = SvIV(sv);
2939 else if (SvIOK(sv)) {
2940 /* IVX is precise */
2942 SETu(SvUV(sv)); /* force it to be numeric only */
2950 /* 2s complement assumption. Also, not really needed as
2951 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
2957 const NV value = SvNV(sv);
2971 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2975 SV* const sv = POPs;
2977 tmps = (SvPV_const(sv, len));
2979 /* If Unicode, try to downgrade
2980 * If not possible, croak. */
2981 SV* const tsv = sv_2mortal(newSVsv(sv));
2984 sv_utf8_downgrade(tsv, FALSE);
2985 tmps = SvPV_const(tsv, len);
2987 if (PL_op->op_type == OP_HEX)
2990 while (*tmps && len && isSPACE(*tmps))
2996 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2998 else if (*tmps == 'b')
2999 result_uv = grok_bin (tmps, &len, &flags, &result_nv);
3001 result_uv = grok_oct (tmps, &len, &flags, &result_nv);
3003 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
3017 SV * const sv = TOPs;
3020 /* For an overloaded scalar, we can't know in advance if it's going to
3021 be UTF-8 or not. Also, we can't call sv_len_utf8 as it likes to
3022 cache the length. Maybe that should be a documented feature of it.
3025 const char *const p = SvPV_const(sv, len);
3028 SETi(utf8_length((U8*)p, (U8*)p + len));
3034 else if (DO_UTF8(sv))
3035 SETi(sv_len_utf8(sv));
3051 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3053 const I32 arybase = CopARYBASE_get(PL_curcop);
3055 const char *repl = NULL;
3057 const int num_args = PL_op->op_private & 7;
3058 bool repl_need_utf8_upgrade = FALSE;
3059 bool repl_is_utf8 = FALSE;
3061 SvTAINTED_off(TARG); /* decontaminate */
3062 SvUTF8_off(TARG); /* decontaminate */
3066 repl = SvPV_const(repl_sv, repl_len);
3067 repl_is_utf8 = DO_UTF8(repl_sv) && SvCUR(repl_sv);
3077 sv_utf8_upgrade(sv);
3079 else if (DO_UTF8(sv))
3080 repl_need_utf8_upgrade = TRUE;
3082 tmps = SvPV_const(sv, curlen);
3084 utf8_curlen = sv_len_utf8(sv);
3085 if (utf8_curlen == curlen)
3088 curlen = utf8_curlen;
3093 if (pos >= arybase) {
3111 else if (len >= 0) {
3113 if (rem > (I32)curlen)
3128 Perl_croak(aTHX_ "substr outside of string");
3129 if (ckWARN(WARN_SUBSTR))
3130 Perl_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3134 const I32 upos = pos;
3135 const I32 urem = rem;
3137 sv_pos_u2b(sv, &pos, &rem);
3139 /* we either return a PV or an LV. If the TARG hasn't been used
3140 * before, or is of that type, reuse it; otherwise use a mortal
3141 * instead. Note that LVs can have an extended lifetime, so also
3142 * dont reuse if refcount > 1 (bug #20933) */
3143 if (SvTYPE(TARG) > SVt_NULL) {
3144 if ( (SvTYPE(TARG) == SVt_PVLV)
3145 ? (!lvalue || SvREFCNT(TARG) > 1)
3148 TARG = sv_newmortal();
3152 sv_setpvn(TARG, tmps, rem);
3153 #ifdef USE_LOCALE_COLLATE
3154 sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3159 SV* repl_sv_copy = NULL;
3161 if (repl_need_utf8_upgrade) {
3162 repl_sv_copy = newSVsv(repl_sv);
3163 sv_utf8_upgrade(repl_sv_copy);
3164 repl = SvPV_const(repl_sv_copy, repl_len);
3165 repl_is_utf8 = DO_UTF8(repl_sv_copy) && SvCUR(sv);
3167 sv_insert(sv, pos, rem, repl, repl_len);
3171 SvREFCNT_dec(repl_sv_copy);
3173 else if (lvalue) { /* it's an lvalue! */
3174 if (!SvGMAGICAL(sv)) {
3176 SvPV_force_nolen(sv);
3177 if (ckWARN(WARN_SUBSTR))
3178 Perl_warner(aTHX_ packWARN(WARN_SUBSTR),
3179 "Attempt to use reference as lvalue in substr");
3181 if (isGV_with_GP(sv))
3182 SvPV_force_nolen(sv);
3183 else if (SvOK(sv)) /* is it defined ? */
3184 (void)SvPOK_only_UTF8(sv);
3186 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
3189 if (SvTYPE(TARG) < SVt_PVLV) {
3190 sv_upgrade(TARG, SVt_PVLV);
3191 sv_magic(TARG, NULL, PERL_MAGIC_substr, NULL, 0);
3195 if (LvTARG(TARG) != sv) {
3197 SvREFCNT_dec(LvTARG(TARG));
3198 LvTARG(TARG) = SvREFCNT_inc_simple(sv);
3200 LvTARGOFF(TARG) = upos;
3201 LvTARGLEN(TARG) = urem;
3205 PUSHs(TARG); /* avoid SvSETMAGIC here */
3212 register const IV size = POPi;
3213 register const IV offset = POPi;
3214 register SV * const src = POPs;
3215 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3217 SvTAINTED_off(TARG); /* decontaminate */
3218 if (lvalue) { /* it's an lvalue! */
3219 if (SvREFCNT(TARG) > 1) /* don't share the TARG (#20933) */
3220 TARG = sv_newmortal();
3221 if (SvTYPE(TARG) < SVt_PVLV) {
3222 sv_upgrade(TARG, SVt_PVLV);
3223 sv_magic(TARG, NULL, PERL_MAGIC_vec, NULL, 0);
3226 if (LvTARG(TARG) != src) {
3228 SvREFCNT_dec(LvTARG(TARG));
3229 LvTARG(TARG) = SvREFCNT_inc_simple(src);
3231 LvTARGOFF(TARG) = offset;
3232 LvTARGLEN(TARG) = size;
3235 sv_setuv(TARG, do_vecget(src, offset, size));
3251 const char *little_p;
3252 const I32 arybase = CopARYBASE_get(PL_curcop);
3255 const bool is_index = PL_op->op_type == OP_INDEX;
3258 /* arybase is in characters, like offset, so combine prior to the
3259 UTF-8 to bytes calculation. */
3260 offset = POPi - arybase;
3264 big_p = SvPV_const(big, biglen);
3265 little_p = SvPV_const(little, llen);
3267 big_utf8 = DO_UTF8(big);
3268 little_utf8 = DO_UTF8(little);
3269 if (big_utf8 ^ little_utf8) {
3270 /* One needs to be upgraded. */
3271 if (little_utf8 && !PL_encoding) {
3272 /* Well, maybe instead we might be able to downgrade the small
3274 char * const pv = (char*)bytes_from_utf8((U8 *)little_p, &llen,
3277 /* If the large string is ISO-8859-1, and it's not possible to
3278 convert the small string to ISO-8859-1, then there is no
3279 way that it could be found anywhere by index. */
3284 /* At this point, pv is a malloc()ed string. So donate it to temp
3285 to ensure it will get free()d */
3286 little = temp = newSV(0);
3287 sv_usepvn(temp, pv, llen);
3288 little_p = SvPVX(little);
3291 ? newSVpvn(big_p, biglen) : newSVpvn(little_p, llen);
3294 sv_recode_to_utf8(temp, PL_encoding);
3296 sv_utf8_upgrade(temp);
3301 big_p = SvPV_const(big, biglen);
3304 little_p = SvPV_const(little, llen);
3308 if (SvGAMAGIC(big)) {
3309 /* Life just becomes a lot easier if I use a temporary here.
3310 Otherwise I need to avoid calls to sv_pos_u2b(), which (dangerously)
3311 will trigger magic and overloading again, as will fbm_instr()
3313 big = sv_2mortal(newSVpvn(big_p, biglen));
3318 if (SvGAMAGIC(little) || (is_index && !SvOK(little))) {
3319 /* index && SvOK() is a hack. fbm_instr() calls SvPV_const, which will
3320 warn on undef, and we've already triggered a warning with the
3321 SvPV_const some lines above. We can't remove that, as we need to
3322 call some SvPV to trigger overloading early and find out if the
3324 This is all getting to messy. The API isn't quite clean enough,
3325 because data access has side effects.
3327 little = sv_2mortal(newSVpvn(little_p, llen));
3330 little_p = SvPVX(little);
3334 offset = is_index ? 0 : biglen;
3336 if (big_utf8 && offset > 0)
3337 sv_pos_u2b(big, &offset, 0);
3343 else if (offset > (I32)biglen)
3345 if (!(little_p = is_index
3346 ? fbm_instr((unsigned char*)big_p + offset,
3347 (unsigned char*)big_p + biglen, little, 0)
3348 : rninstr(big_p, big_p + offset,
3349 little_p, little_p + llen)))
3352 retval = little_p - big_p;
3353 if (retval > 0 && big_utf8)
3354 sv_pos_b2u(big, &retval);
3359 PUSHi(retval + arybase);
3365 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
3366 if (SvTAINTED(MARK[1]))
3367 TAINT_PROPER("sprintf");
3368 do_sprintf(TARG, SP-MARK, MARK+1);
3369 TAINT_IF(SvTAINTED(TARG));
3381 const U8 *s = (U8*)SvPV_const(argsv, len);
3383 if (PL_encoding && SvPOK(argsv) && !DO_UTF8(argsv)) {
3384 SV * const tmpsv = sv_2mortal(newSVsv(argsv));
3385 s = (U8*)sv_recode_to_utf8(tmpsv, PL_encoding);
3389 XPUSHu(DO_UTF8(argsv) ?
3390 utf8n_to_uvchr(s, UTF8_MAXBYTES, 0, UTF8_ALLOW_ANYUV) :
3402 if (((SvIOK_notUV(TOPs) && SvIV(TOPs) < 0)
3404 (SvNOK(TOPs) && SvNV(TOPs) < 0.0))) {
3406 value = POPu; /* chr(-1) eq chr(0xff), etc. */
3408 (void) POPs; /* Ignore the argument value. */
3409 value = UNICODE_REPLACEMENT;
3415 SvUPGRADE(TARG,SVt_PV);
3417 if (value > 255 && !IN_BYTES) {
3418 SvGROW(TARG, (STRLEN)UNISKIP(value)+1);
3419 tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3420 SvCUR_set(TARG, tmps - SvPVX_const(TARG));
3422 (void)SvPOK_only(TARG);
3431 *tmps++ = (char)value;
3433 (void)SvPOK_only(TARG);
3435 if (PL_encoding && !IN_BYTES) {
3436 sv_recode_to_utf8(TARG, PL_encoding);
3438 if (SvCUR(TARG) == 0 || !is_utf8_string((U8*)tmps, SvCUR(TARG)) ||
3439 UNICODE_IS_REPLACEMENT(utf8_to_uvchr((U8*)tmps, NULL))) {
3443 *tmps++ = (char)value;
3459 const char *tmps = SvPV_const(left, len);
3461 if (DO_UTF8(left)) {
3462 /* If Unicode, try to downgrade.
3463 * If not possible, croak.
3464 * Yes, we made this up. */
3465 SV* const tsv = sv_2mortal(newSVsv(left));
3468 sv_utf8_downgrade(tsv, FALSE);
3469 tmps = SvPV_const(tsv, len);
3471 # ifdef USE_ITHREADS
3473 if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3474 /* This should be threadsafe because in ithreads there is only
3475 * one thread per interpreter. If this would not be true,
3476 * we would need a mutex to protect this malloc. */
3477 PL_reentrant_buffer->_crypt_struct_buffer =
3478 (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3479 #if defined(__GLIBC__) || defined(__EMX__)
3480 if (PL_reentrant_buffer->_crypt_struct_buffer) {
3481 PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3482 /* work around glibc-2.2.5 bug */
3483 PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3487 # endif /* HAS_CRYPT_R */
3488 # endif /* USE_ITHREADS */
3490 sv_setpv(TARG, fcrypt(tmps, SvPV_nolen_const(right)));
3492 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV_nolen_const(right)));
3498 "The crypt() function is unimplemented due to excessive paranoia.");
3510 bool inplace = TRUE;
3512 const int op_type = PL_op->op_type;
3515 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3521 s = (const U8*)SvPV_nomg_const(source, slen);
3527 if (slen && DO_UTF8(source) && UTF8_IS_START(*s)) {
3529 utf8_to_uvchr(s, &ulen);
3530 if (op_type == OP_UCFIRST) {
3531 toTITLE_utf8(s, tmpbuf, &tculen);
3533 toLOWER_utf8(s, tmpbuf, &tculen);
3535 /* If the two differ, we definately cannot do inplace. */
3536 inplace = (ulen == tculen);
3537 need = slen + 1 - ulen + tculen;
3543 if (SvPADTMP(source) && !SvREADONLY(source) && inplace && SvTEMP(source)) {
3544 /* We can convert in place. */
3547 s = d = (U8*)SvPV_force_nomg(source, slen);
3553 SvUPGRADE(dest, SVt_PV);
3554 d = (U8*)SvGROW(dest, need);
3555 (void)SvPOK_only(dest);
3564 /* slen is the byte length of the whole SV.
3565 * ulen is the byte length of the original Unicode character
3566 * stored as UTF-8 at s.
3567 * tculen is the byte length of the freshly titlecased (or
3568 * lowercased) Unicode character stored as UTF-8 at tmpbuf.
3569 * We first set the result to be the titlecased (/lowercased)
3570 * character, and then append the rest of the SV data. */
3571 sv_setpvn(dest, (char*)tmpbuf, tculen);
3573 sv_catpvn(dest, (char*)(s + ulen), slen - ulen);
3577 Copy(tmpbuf, d, tculen, U8);
3578 SvCUR_set(dest, need - 1);
3583 if (IN_LOCALE_RUNTIME) {
3586 *d = (op_type == OP_UCFIRST)
3587 ? toUPPER_LC(*s) : toLOWER_LC(*s);
3590 *d = (op_type == OP_UCFIRST) ? toUPPER(*s) : toLOWER(*s);
3592 /* See bug #39028 */
3600 /* This will copy the trailing NUL */
3601 Copy(s + 1, d + 1, slen, U8);
3602 SvCUR_set(dest, need - 1);
3609 /* There's so much setup/teardown code common between uc and lc, I wonder if
3610 it would be worth merging the two, and just having a switch outside each
3611 of the three tight loops. */
3625 if (SvPADTMP(source) && !SvREADONLY(source) && !SvAMAGIC(source)
3626 && SvTEMP(source) && !DO_UTF8(source)) {
3627 /* We can convert in place. */
3630 s = d = (U8*)SvPV_force_nomg(source, len);
3637 /* The old implementation would copy source into TARG at this point.
3638 This had the side effect that if source was undef, TARG was now
3639 an undefined SV with PADTMP set, and they don't warn inside
3640 sv_2pv_flags(). However, we're now getting the PV direct from
3641 source, which doesn't have PADTMP set, so it would warn. Hence the
3645 s = (const U8*)SvPV_nomg_const(source, len);
3652 SvUPGRADE(dest, SVt_PV);
3653 d = (U8*)SvGROW(dest, min);
3654 (void)SvPOK_only(dest);
3659 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
3660 to check DO_UTF8 again here. */
3662 if (DO_UTF8(source)) {
3663 const U8 *const send = s + len;
3664 U8 tmpbuf[UTF8_MAXBYTES+1];
3667 const STRLEN u = UTF8SKIP(s);
3670 toUPPER_utf8(s, tmpbuf, &ulen);
3671 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
3672 /* If the eventually required minimum size outgrows
3673 * the available space, we need to grow. */
3674 const UV o = d - (U8*)SvPVX_const(dest);
3676 /* If someone uppercases one million U+03B0s we SvGROW() one
3677 * million times. Or we could try guessing how much to
3678 allocate without allocating too much. Such is life. */
3680 d = (U8*)SvPVX(dest) + o;
3682 Copy(tmpbuf, d, ulen, U8);
3688 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3691 const U8 *const send = s + len;
3692 if (IN_LOCALE_RUNTIME) {
3695 for (; s < send; d++, s++)
3696 *d = toUPPER_LC(*s);
3699 for (; s < send; d++, s++)
3703 if (source != dest) {
3705 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3725 if (SvPADTMP(source) && !SvREADONLY(source) && !SvAMAGIC(source)
3726 && SvTEMP(source) && !DO_UTF8(source)) {
3727 /* We can convert in place. */
3730 s = d = (U8*)SvPV_force_nomg(source, len);
3737 /* The old implementation would copy source into TARG at this point.
3738 This had the side effect that if source was undef, TARG was now
3739 an undefined SV with PADTMP set, and they don't warn inside
3740 sv_2pv_flags(). However, we're now getting the PV direct from
3741 source, which doesn't have PADTMP set, so it would warn. Hence the
3745 s = (const U8*)SvPV_nomg_const(source, len);
3752 SvUPGRADE(dest, SVt_PV);
3753 d = (U8*)SvGROW(dest, min);
3754 (void)SvPOK_only(dest);
3759 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
3760 to check DO_UTF8 again here. */
3762 if (DO_UTF8(source)) {
3763 const U8 *const send = s + len;
3764 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3767 const STRLEN u = UTF8SKIP(s);
3769 const UV uv = toLOWER_utf8(s, tmpbuf, &ulen);
3771 #define GREEK_CAPITAL_LETTER_SIGMA 0x03A3 /* Unicode U+03A3 */
3772 if (uv == GREEK_CAPITAL_LETTER_SIGMA) {
3775 * Now if the sigma is NOT followed by
3776 * /$ignorable_sequence$cased_letter/;
3777 * and it IS preceded by /$cased_letter$ignorable_sequence/;
3778 * where $ignorable_sequence is [\x{2010}\x{AD}\p{Mn}]*
3779 * and $cased_letter is [\p{Ll}\p{Lo}\p{Lt}]
3780 * then it should be mapped to 0x03C2,
3781 * (GREEK SMALL LETTER FINAL SIGMA),
3782 * instead of staying 0x03A3.
3783 * "should be": in other words, this is not implemented yet.
3784 * See lib/unicore/SpecialCasing.txt.
3787 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
3788 /* If the eventually required minimum size outgrows
3789 * the available space, we need to grow. */
3790 const UV o = d - (U8*)SvPVX_const(dest);
3792 /* If someone lowercases one million U+0130s we SvGROW() one
3793 * million times. Or we could try guessing how much to
3794 allocate without allocating too much. Such is life. */
3796 d = (U8*)SvPVX(dest) + o;
3798 Copy(tmpbuf, d, ulen, U8);
3804 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3807 const U8 *const send = s + len;
3808 if (IN_LOCALE_RUNTIME) {
3811 for (; s < send; d++, s++)
3812 *d = toLOWER_LC(*s);
3815 for (; s < send; d++, s++)
3819 if (source != dest) {
3821 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3831 SV * const sv = TOPs;
3833 register const char *s = SvPV_const(sv,len);
3835 SvUTF8_off(TARG); /* decontaminate */
3838 SvUPGRADE(TARG, SVt_PV);
3839 SvGROW(TARG, (len * 2) + 1);
3843 if (UTF8_IS_CONTINUED(*s)) {
3844 STRLEN ulen = UTF8SKIP(s);
3868 SvCUR_set(TARG, d - SvPVX_const(TARG));
3869 (void)SvPOK_only_UTF8(TARG);
3872 sv_setpvn(TARG, s, len);
3874 if (SvSMAGICAL(TARG))
3883 dVAR; dSP; dMARK; dORIGMARK;
3884 register AV* const av = (AV*)POPs;
3885 register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3887 if (SvTYPE(av) == SVt_PVAV) {
3888 const I32 arybase = CopARYBASE_get(PL_curcop);
3889 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
3892 for (svp = MARK + 1; svp <= SP; svp++) {
3893 const I32 elem = SvIV(*svp);
3897 if (max > AvMAX(av))
3900 while (++MARK <= SP) {
3902 I32 elem = SvIV(*MARK);
3906 svp = av_fetch(av, elem, lval);
3908 if (!svp || *svp == &PL_sv_undef)
3909 DIE(aTHX_ PL_no_aelem, elem);
3910 if (PL_op->op_private & OPpLVAL_INTRO)
3911 save_aelem(av, elem, svp);
3913 *MARK = svp ? *svp : &PL_sv_undef;
3916 if (GIMME != G_ARRAY) {
3918 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
3924 /* Associative arrays. */
3930 HV * hash = (HV*)POPs;
3932 const I32 gimme = GIMME_V;
3935 /* might clobber stack_sp */
3936 entry = hv_iternext(hash);
3941 SV* const sv = hv_iterkeysv(entry);
3942 PUSHs(sv); /* won't clobber stack_sp */
3943 if (gimme == G_ARRAY) {
3946 /* might clobber stack_sp */
3947 val = hv_iterval(hash, entry);
3952 else if (gimme == G_SCALAR)
3962 const I32 gimme = GIMME_V;
3963 const I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
3965 if (PL_op->op_private & OPpSLICE) {
3967 HV * const hv = (HV*)POPs;
3968 const U32 hvtype = SvTYPE(hv);
3969 if (hvtype == SVt_PVHV) { /* hash element */
3970 while (++MARK <= SP) {
3971 SV * const sv = hv_delete_ent(hv, *MARK, discard, 0);
3972 *MARK = sv ? sv : &PL_sv_undef;
3975 else if (hvtype == SVt_PVAV) { /* array element */
3976 if (PL_op->op_flags & OPf_SPECIAL) {
3977 while (++MARK <= SP) {
3978 SV * const sv = av_delete((AV*)hv, SvIV(*MARK), discard);
3979 *MARK = sv ? sv : &PL_sv_undef;
3984 DIE(aTHX_ "Not a HASH reference");
3987 else if (gimme == G_SCALAR) {
3992 *++MARK = &PL_sv_undef;
3998 HV * const hv = (HV*)POPs;
4000 if (SvTYPE(hv) == SVt_PVHV)
4001 sv = hv_delete_ent(hv, keysv, discard, 0);
4002 else if (SvTYPE(hv) == SVt_PVAV) {
4003 if (PL_op->op_flags & OPf_SPECIAL)
4004 sv = av_delete((AV*)hv, SvIV(keysv), discard);
4006 DIE(aTHX_ "panic: avhv_delete no longer supported");
4009 DIE(aTHX_ "Not a HASH reference");
4025 if (PL_op->op_private & OPpEXISTS_SUB) {
4027 SV * const sv = POPs;
4028 CV * const cv = sv_2cv(sv, &hv, &gv, 0);
4031 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
4037 if (SvTYPE(hv) == SVt_PVHV) {
4038 if (hv_exists_ent(hv, tmpsv, 0))
4041 else if (SvTYPE(hv) == SVt_PVAV) {
4042 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
4043 if (av_exists((AV*)hv, SvIV(tmpsv)))
4048 DIE(aTHX_ "Not a HASH reference");
4055 dVAR; dSP; dMARK; dORIGMARK;
4056 register HV * const hv = (HV*)POPs;
4057 register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
4058 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
4059 bool other_magic = FALSE;
4065 other_magic = mg_find((SV*)hv, PERL_MAGIC_env) ||
4066 ((mg = mg_find((SV*)hv, PERL_MAGIC_tied))
4067 /* Try to preserve the existenceness of a tied hash
4068 * element by using EXISTS and DELETE if possible.
4069 * Fallback to FETCH and STORE otherwise */
4070 && (stash = SvSTASH(SvRV(SvTIED_obj((SV*)hv, mg))))
4071 && gv_fetchmethod_autoload(stash, "EXISTS", TRUE)
4072 && gv_fetchmethod_autoload(stash, "DELETE", TRUE));
4075 while (++MARK <= SP) {
4076 SV * const keysv = *MARK;
4079 bool preeminent = FALSE;
4082 preeminent = SvRMAGICAL(hv) && !other_magic ? 1 :
4083 hv_exists_ent(hv, keysv, 0);
4086 he = hv_fetch_ent(hv, keysv, lval, 0);
4087 svp = he ? &HeVAL(he) : NULL;
4090 if (!svp || *svp == &PL_sv_undef) {
4091 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
4094 if (HvNAME_get(hv) && isGV(*svp))
4095 save_gp((GV*)*svp, !(PL_op->op_flags & OPf_SPECIAL));
4098 save_helem(hv, keysv, svp);
4101 const char * const key = SvPV_const(keysv, keylen);
4102 SAVEDELETE(hv, savepvn(key,keylen),
4103 SvUTF8(keysv) ? -(I32)keylen : (I32)keylen);
4108 *MARK = svp ? *svp : &PL_sv_undef;
4110 if (GIMME != G_ARRAY) {
4112 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
4118 /* List operators. */
4123 if (GIMME != G_ARRAY) {
4125 *MARK = *SP; /* unwanted list, return last item */
4127 *MARK = &PL_sv_undef;
4137 SV ** const lastrelem = PL_stack_sp;
4138 SV ** const lastlelem = PL_stack_base + POPMARK;
4139 SV ** const firstlelem = PL_stack_base + POPMARK + 1;
4140 register SV ** const firstrelem = lastlelem + 1;
4141 const I32 arybase = CopARYBASE_get(PL_curcop);
4142 I32 is_something_there = FALSE;
4144 register const I32 max = lastrelem - lastlelem;
4145 register SV **lelem;
4147 if (GIMME != G_ARRAY) {
4148 I32 ix = SvIV(*lastlelem);
4153 if (ix < 0 || ix >= max)
4154 *firstlelem = &PL_sv_undef;
4156 *firstlelem = firstrelem[ix];
4162 SP = firstlelem - 1;
4166 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
4167 I32 ix = SvIV(*lelem);
4172 if (ix < 0 || ix >= max)
4173 *lelem = &PL_sv_undef;
4175 is_something_there = TRUE;
4176 if (!(*lelem = firstrelem[ix]))
4177 *lelem = &PL_sv_undef;
4180 if (is_something_there)
4183 SP = firstlelem - 1;
4189 dVAR; dSP; dMARK; dORIGMARK;
4190 const I32 items = SP - MARK;
4191 SV * const av = (SV *) av_make(items, MARK+1);
4192 SP = ORIGMARK; /* av_make() might realloc stack_sp */
4193 XPUSHs(sv_2mortal((PL_op->op_flags & OPf_SPECIAL)
4194 ? newRV_noinc(av) : av));
4200 dVAR; dSP; dMARK; dORIGMARK;
4201 HV* const hv = newHV();
4204 SV * const key = *++MARK;
4205 SV * const val = newSV(0);
4207 sv_setsv(val, *++MARK);
4208 else if (ckWARN(WARN_MISC))
4209 Perl_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
4210 (void)hv_store_ent(hv,key,val,0);
4213 XPUSHs(sv_2mortal((PL_op->op_flags & OPf_SPECIAL)
4214 ? newRV_noinc((SV*) hv) : (SV*)hv));
4220 dVAR; dSP; dMARK; dORIGMARK;
4221 register AV *ary = (AV*)*++MARK;
4225 register I32 offset;
4226 register I32 length;
4230 const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4233 *MARK-- = SvTIED_obj((SV*)ary, mg);
4237 call_method("SPLICE",GIMME_V);
4246 offset = i = SvIV(*MARK);
4248 offset += AvFILLp(ary) + 1;
4250 offset -= CopARYBASE_get(PL_curcop);
4252 DIE(aTHX_ PL_no_aelem, i);
4254 length = SvIVx(*MARK++);
4256 length += AvFILLp(ary) - offset + 1;
4262 length = AvMAX(ary) + 1; /* close enough to infinity */
4266 length = AvMAX(ary) + 1;
4268 if (offset > AvFILLp(ary) + 1) {
4269 if (ckWARN(WARN_MISC))
4270 Perl_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
4271 offset = AvFILLp(ary) + 1;
4273 after = AvFILLp(ary) + 1 - (offset + length);
4274 if (after < 0) { /* not that much array */
4275 length += after; /* offset+length now in array */
4281 /* At this point, MARK .. SP-1 is our new LIST */
4284 diff = newlen - length;
4285 if (newlen && !AvREAL(ary) && AvREIFY(ary))
4288 /* make new elements SVs now: avoid problems if they're from the array */
4289 for (dst = MARK, i = newlen; i; i--) {
4290 SV * const h = *dst;
4291 *dst++ = newSVsv(h);
4294 if (diff < 0) { /* shrinking the area */
4295 SV **tmparyval = NULL;
4297 Newx(tmparyval, newlen, SV*); /* so remember insertion */
4298 Copy(MARK, tmparyval, newlen, SV*);
4301 MARK = ORIGMARK + 1;
4302 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4303 MEXTEND(MARK, length);
4304 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
4306 EXTEND_MORTAL(length);
4307 for (i = length, dst = MARK; i; i--) {
4308 sv_2mortal(*dst); /* free them eventualy */
4315 *MARK = AvARRAY(ary)[offset+length-1];
4318 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
4319 SvREFCNT_dec(*dst++); /* free them now */
4322 AvFILLp(ary) += diff;
4324 /* pull up or down? */
4326 if (offset < after) { /* easier to pull up */
4327 if (offset) { /* esp. if nothing to pull */
4328 src = &AvARRAY(ary)[offset-1];
4329 dst = src - diff; /* diff is negative */
4330 for (i = offset; i > 0; i--) /* can't trust Copy */
4334 AvARRAY(ary) = AvARRAY(ary) - diff; /* diff is negative */
4338 if (after) { /* anything to pull down? */
4339 src = AvARRAY(ary) + offset + length;
4340 dst = src + diff; /* diff is negative */
4341 Move(src, dst, after, SV*);
4343 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
4344 /* avoid later double free */
4348 dst[--i] = &PL_sv_undef;
4351 Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
4352 Safefree(tmparyval);
4355 else { /* no, expanding (or same) */
4356 SV** tmparyval = NULL;
4358 Newx(tmparyval, length, SV*); /* so remember deletion */
4359 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
4362 if (diff > 0) { /* expanding */
4363 /* push up or down? */
4364 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
4368 Move(src, dst, offset, SV*);
4370 AvARRAY(ary) = AvARRAY(ary) - diff;/* diff is positive */
4372 AvFILLp(ary) += diff;
4375 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
4376 av_extend(ary, AvFILLp(ary) + diff);
4377 AvFILLp(ary) += diff;
4380 dst = AvARRAY(ary) + AvFILLp(ary);
4382 for (i = after; i; i--) {
4390 Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
4393 MARK = ORIGMARK + 1;
4394 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4396 Copy(tmparyval, MARK, length, SV*);
4398 EXTEND_MORTAL(length);
4399 for (i = length, dst = MARK; i; i--) {
4400 sv_2mortal(*dst); /* free them eventualy */
4407 else if (length--) {
4408 *MARK = tmparyval[length];
4411 while (length-- > 0)
4412 SvREFCNT_dec(tmparyval[length]);
4416 *MARK = &PL_sv_undef;
4417 Safefree(tmparyval);
4425 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4426 register AV * const ary = (AV*)*++MARK;
4427 const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4430 *MARK-- = SvTIED_obj((SV*)ary, mg);
4434 call_method("PUSH",G_SCALAR|G_DISCARD);
4438 PUSHi( AvFILL(ary) + 1 );
4441 PL_delaymagic = DM_DELAY;
4442 for (++MARK; MARK <= SP; MARK++) {
4443 SV * const sv = newSV(0);
4445 sv_setsv(sv, *MARK);
4446 av_store(ary, AvFILLp(ary)+1, sv);
4448 if (PL_delaymagic & DM_ARRAY)
4453 PUSHi( AvFILLp(ary) + 1 );
4462 AV * const av = (AV*)POPs;
4463 SV * const sv = PL_op->op_type == OP_SHIFT ? av_shift(av) : av_pop(av);
4467 (void)sv_2mortal(sv);
4474 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4475 register AV *ary = (AV*)*++MARK;
4476 const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4479 *MARK-- = SvTIED_obj((SV*)ary, mg);
4483 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
4489 av_unshift(ary, SP - MARK);
4491 SV * const sv = newSVsv(*++MARK);
4492 (void)av_store(ary, i++, sv);
4496 PUSHi( AvFILL(ary) + 1 );
4503 SV ** const oldsp = SP;
4505 if (GIMME == G_ARRAY) {
4508 register SV * const tmp = *MARK;
4512 /* safe as long as stack cannot get extended in the above */
4517 register char *down;
4521 PADOFFSET padoff_du;
4523 SvUTF8_off(TARG); /* decontaminate */
4525 do_join(TARG, &PL_sv_no, MARK, SP);
4527 sv_setsv(TARG, (SP > MARK)
4529 : (padoff_du = find_rundefsvoffset(),
4530 (padoff_du == NOT_IN_PAD
4531 || PAD_COMPNAME_FLAGS_isOUR(padoff_du))
4532 ? DEFSV : PAD_SVl(padoff_du)));
4533 up = SvPV_force(TARG, len);
4535 if (DO_UTF8(TARG)) { /* first reverse each character */
4536 U8* s = (U8*)SvPVX(TARG);
4537 const U8* send = (U8*)(s + len);
4539 if (UTF8_IS_INVARIANT(*s)) {
4544 if (!utf8_to_uvchr(s, 0))
4548 down = (char*)(s - 1);
4549 /* reverse this character */
4553 *down-- = (char)tmp;
4559 down = SvPVX(TARG) + len - 1;
4563 *down-- = (char)tmp;
4565 (void)SvPOK_only_UTF8(TARG);
4577 register IV limit = POPi; /* note, negative is forever */
4578 SV * const sv = POPs;
4580 register const char *s = SvPV_const(sv, len);
4581 const bool do_utf8 = DO_UTF8(sv);
4582 const char *strend = s + len;
4584 register REGEXP *rx;
4586 register const char *m;
4588 const STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (STRLEN)(strend - s);
4589 I32 maxiters = slen + 10;
4591 const I32 origlimit = limit;
4594 const I32 gimme = GIMME_V;
4595 const I32 oldsave = PL_savestack_ix;
4596 I32 make_mortal = 1;
4601 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4606 DIE(aTHX_ "panic: pp_split");
4609 TAINT_IF((rx->extflags & RXf_PMf_LOCALE) &&
4610 (rx->extflags & (RXf_WHITE | RXf_SKIPWHITE)));
4612 RX_MATCH_UTF8_set(rx, do_utf8);
4615 if (pm->op_pmreplrootu.op_pmtargetoff) {
4616 ary = GvAVn((GV*)PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff));
4619 if (pm->op_pmreplrootu.op_pmtargetgv) {
4620 ary = GvAVn(pm->op_pmreplrootu.op_pmtargetgv);
4623 else if (gimme != G_ARRAY)
4624 ary = GvAVn(PL_defgv);
4627 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4633 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4635 XPUSHs(SvTIED_obj((SV*)ary, mg));
4642 for (i = AvFILLp(ary); i >= 0; i--)
4643 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
4645 /* temporarily switch stacks */
4646 SAVESWITCHSTACK(PL_curstack, ary);
4650 base = SP - PL_stack_base;
4652 if (rx->extflags & RXf_SKIPWHITE) {
4654 while (*s == ' ' || is_utf8_space((U8*)s))
4657 else if (rx->extflags & RXf_PMf_LOCALE) {
4658 while (isSPACE_LC(*s))
4666 if (rx->extflags & PMf_MULTILINE) {
4671 limit = maxiters + 2;
4672 if (rx->extflags & RXf_WHITE) {
4675 /* this one uses 'm' and is a negative test */
4677 while (m < strend && !( *m == ' ' || is_utf8_space((U8*)m) )) {
4678 const int t = UTF8SKIP(m);
4679 /* is_utf8_space returns FALSE for malform utf8 */
4685 } else if (rx->extflags & RXf_PMf_LOCALE) {
4686 while (m < strend && !isSPACE_LC(*m))
4689 while (m < strend && !isSPACE(*m))
4695 dstr = newSVpvn(s, m-s);
4699 (void)SvUTF8_on(dstr);
4702 /* skip the whitespace found last */
4704 s = m + UTF8SKIP(m);
4708 /* this one uses 's' and is a positive test */
4710 while (s < strend && ( *s == ' ' || is_utf8_space((U8*)s) ))
4712 } else if (rx->extflags & RXf_PMf_LOCALE) {
4713 while (s < strend && isSPACE_LC(*s))
4716 while (s < strend && isSPACE(*s))
4721 else if (rx->extflags & RXf_START_ONLY) {
4723 for (m = s; m < strend && *m != '\n'; m++)
4728 dstr = newSVpvn(s, m-s);
4732 (void)SvUTF8_on(dstr);
4737 else if (rx->extflags & RXf_NULL && !(s >= strend)) {
4739 Pre-extend the stack, either the number of bytes or
4740 characters in the string or a limited amount, triggered by:
4742 my ($x, $y) = split //, $str;
4746 const U32 items = limit - 1;
4754 /* keep track of how many bytes we skip over */
4757 dstr = newSVpvn(m, s-m);
4762 (void)SvUTF8_on(dstr);
4770 dstr = newSVpvn(s, 1);
4784 else if (do_utf8 == ((rx->extflags & RXf_UTF8) != 0) &&
4785 (rx->extflags & RXf_USE_INTUIT) && !rx->nparens
4786 && (rx->extflags & RXf_CHECK_ALL)
4787 && !(rx->extflags & RXf_ANCH)) {
4788 const int tail = (rx->extflags & RXf_INTUIT_TAIL);
4789 SV * const csv = CALLREG_INTUIT_STRING(rx);
4791 len = rx->minlenret;
4792 if (len == 1 && !(rx->extflags & RXf_UTF8) && !tail) {
4793 const char c = *SvPV_nolen_const(csv);
4795 for (m = s; m < strend && *m != c; m++)
4799 dstr = newSVpvn(s, m-s);
4803 (void)SvUTF8_on(dstr);
4805 /* The rx->minlen is in characters but we want to step
4806 * s ahead by bytes. */
4808 s = (char*)utf8_hop((U8*)m, len);
4810 s = m + len; /* Fake \n at the end */
4814 while (s < strend && --limit &&
4815 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
4816 csv, multiline ? FBMrf_MULTILINE : 0)) )
4818 dstr = newSVpvn(s, m-s);
4822 (void)SvUTF8_on(dstr);
4824 /* The rx->minlen is in characters but we want to step
4825 * s ahead by bytes. */
4827 s = (char*)utf8_hop((U8*)m, len);
4829 s = m + len; /* Fake \n at the end */
4834 maxiters += slen * rx->nparens;
4835 while (s < strend && --limit)
4839 rex_return = CALLREGEXEC(rx, (char*)s, (char*)strend, (char*)orig, 1 ,
4842 if (rex_return == 0)
4844 TAINT_IF(RX_MATCH_TAINTED(rx));
4845 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
4850 strend = s + (strend - m);
4852 m = rx->offs[0].start + orig;
4853 dstr = newSVpvn(s, m-s);
4857 (void)SvUTF8_on(dstr);
4861 for (i = 1; i <= (I32)rx->nparens; i++) {
4862 s = rx->offs[i].start + orig;
4863 m = rx->offs[i].end + orig;
4865 /* japhy (07/27/01) -- the (m && s) test doesn't catch
4866 parens that didn't match -- they should be set to
4867 undef, not the empty string */
4868 if (m >= orig && s >= orig) {
4869 dstr = newSVpvn(s, m-s);
4872 dstr = &PL_sv_undef; /* undef, not "" */
4876 (void)SvUTF8_on(dstr);
4880 s = rx->offs[0].end + orig;
4884 iters = (SP - PL_stack_base) - base;
4885 if (iters > maxiters)
4886 DIE(aTHX_ "Split loop");
4888 /* keep field after final delim? */
4889 if (s < strend || (iters && origlimit)) {
4890 const STRLEN l = strend - s;
4891 dstr = newSVpvn(s, l);
4895 (void)SvUTF8_on(dstr);
4899 else if (!origlimit) {
4900 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
4901 if (TOPs && !make_mortal)
4904 *SP-- = &PL_sv_undef;
4909 LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */
4913 if (SvSMAGICAL(ary)) {
4918 if (gimme == G_ARRAY) {
4920 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4928 call_method("PUSH",G_SCALAR|G_DISCARD);
4931 if (gimme == G_ARRAY) {
4933 /* EXTEND should not be needed - we just popped them */
4935 for (i=0; i < iters; i++) {
4936 SV **svp = av_fetch(ary, i, FALSE);
4937 PUSHs((svp) ? *svp : &PL_sv_undef);
4944 if (gimme == G_ARRAY)
4956 SV *const sv = PAD_SVl(PL_op->op_targ);
4958 if (SvPADSTALE(sv)) {
4961 RETURNOP(cLOGOP->op_other);
4963 RETURNOP(cLOGOP->op_next);
4973 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
4974 || SvTYPE(retsv) == SVt_PVCV) {
4975 retsv = refto(retsv);
4982 PP(unimplemented_op)
4985 DIE(aTHX_ "panic: unimplemented op %s (#%d) called", OP_NAME(PL_op),
4991 * c-indentation-style: bsd
4993 * indent-tabs-mode: t
4996 * ex: set ts=8 sts=4 sw=4 noet: