3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 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(MUTABLE_AV(TARG)) + 1;
80 if (SvMAGICAL(TARG)) {
82 for (i=0; i < (U32)maxarg; i++) {
83 SV * const * const svp = av_fetch(MUTABLE_AV(TARG), i, FALSE);
84 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
88 Copy(AvARRAY((const AV *)TARG), SP+1, maxarg, SV*);
92 else if (gimme == G_SCALAR) {
93 SV* const sv = sv_newmortal();
94 const I32 maxarg = AvFILL(MUTABLE_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_ MUTABLE_HV(TARG));
136 tryAMAGICunDEREF(to_gv);
139 if (SvTYPE(sv) == SVt_PVIO) {
140 GV * const gv = MUTABLE_GV(sv_newmortal());
141 gv_init(gv, 0, "", 0, 0);
142 GvIOp(gv) = MUTABLE_IO(sv);
143 SvREFCNT_inc_void_NN(sv);
146 else if (!isGV_with_GP(sv))
147 DIE(aTHX_ "Not a GLOB reference");
150 if (!isGV_with_GP(sv)) {
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);
168 gv = MUTABLE_GV(newSV(0));
169 gv_init(gv, CopSTASH(PL_curcop), name, len, 0);
172 const char * const name = CopSTASHPV(PL_curcop);
175 prepare_SV_for_RV(sv);
176 SvRV_set(sv, MUTABLE_SV(gv));
181 if (PL_op->op_flags & OPf_REF ||
182 PL_op->op_private & HINT_STRICT_REFS)
183 DIE(aTHX_ PL_no_usym, "a symbol");
184 if (ckWARN(WARN_UNINITIALIZED))
188 if ((PL_op->op_flags & OPf_SPECIAL) &&
189 !(PL_op->op_flags & OPf_MOD))
191 SV * const temp = MUTABLE_SV(gv_fetchsv(sv, 0, SVt_PVGV));
193 && (!is_gv_magical_sv(sv,0)
194 || !(sv = MUTABLE_SV(gv_fetchsv(sv, GV_ADD,
201 if (PL_op->op_private & HINT_STRICT_REFS)
202 DIE(aTHX_ PL_no_symref_sv, sv, "a symbol");
203 if ((PL_op->op_private & (OPpLVAL_INTRO|OPpDONT_INIT_GV))
204 == OPpDONT_INIT_GV) {
205 /* We are the target of a coderef assignment. Return
206 the scalar unchanged, and let pp_sasssign deal with
210 sv = MUTABLE_SV(gv_fetchsv(sv, GV_ADD, SVt_PVGV));
214 if (PL_op->op_private & OPpLVAL_INTRO)
215 save_gp(MUTABLE_GV(sv), !(PL_op->op_flags & OPf_SPECIAL));
220 /* Helper function for pp_rv2sv and pp_rv2av */
222 Perl_softref2xv(pTHX_ SV *const sv, const char *const what,
223 const svtype type, SV ***spp)
228 PERL_ARGS_ASSERT_SOFTREF2XV;
230 if (PL_op->op_private & HINT_STRICT_REFS) {
232 Perl_die(aTHX_ PL_no_symref_sv, sv, what);
234 Perl_die(aTHX_ PL_no_usym, what);
237 if (PL_op->op_flags & OPf_REF)
238 Perl_die(aTHX_ PL_no_usym, what);
239 if (ckWARN(WARN_UNINITIALIZED))
241 if (type != SVt_PV && GIMME_V == G_ARRAY) {
245 **spp = &PL_sv_undef;
248 if ((PL_op->op_flags & OPf_SPECIAL) &&
249 !(PL_op->op_flags & OPf_MOD))
251 gv = gv_fetchsv(sv, 0, type);
253 && (!is_gv_magical_sv(sv,0)
254 || !(gv = gv_fetchsv(sv, GV_ADD, type))))
256 **spp = &PL_sv_undef;
261 gv = gv_fetchsv(sv, GV_ADD, type);
273 tryAMAGICunDEREF(to_sv);
276 switch (SvTYPE(sv)) {
282 DIE(aTHX_ "Not a SCALAR reference");
289 if (!isGV_with_GP(gv)) {
290 if (SvGMAGICAL(sv)) {
295 gv = Perl_softref2xv(aTHX_ sv, "a SCALAR", SVt_PV, &sp);
301 if (PL_op->op_flags & OPf_MOD) {
302 if (PL_op->op_private & OPpLVAL_INTRO) {
303 if (cUNOP->op_first->op_type == OP_NULL)
304 sv = save_scalar(MUTABLE_GV(TOPs));
306 sv = save_scalar(gv);
308 Perl_croak(aTHX_ PL_no_localize_ref);
310 else if (PL_op->op_private & OPpDEREF)
311 vivify_ref(sv, PL_op->op_private & OPpDEREF);
320 AV * const av = MUTABLE_AV(TOPs);
321 SV ** const sv = Perl_av_arylen_p(aTHX_ MUTABLE_AV(av));
323 *sv = newSV_type(SVt_PVMG);
324 sv_magic(*sv, MUTABLE_SV(av), PERL_MAGIC_arylen, NULL, 0);
332 dVAR; dSP; dTARGET; dPOPss;
334 if (PL_op->op_flags & OPf_MOD || LVRET) {
335 if (SvTYPE(TARG) < SVt_PVLV) {
336 sv_upgrade(TARG, SVt_PVLV);
337 sv_magic(TARG, NULL, PERL_MAGIC_pos, NULL, 0);
341 if (LvTARG(TARG) != sv) {
343 SvREFCNT_dec(LvTARG(TARG));
344 LvTARG(TARG) = SvREFCNT_inc_simple(sv);
346 PUSHs(TARG); /* no SvSETMAGIC */
350 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
351 const MAGIC * const mg = mg_find(sv, PERL_MAGIC_regex_global);
352 if (mg && mg->mg_len >= 0) {
356 PUSHi(i + CopARYBASE_get(PL_curcop));
369 const I32 flags = (PL_op->op_flags & OPf_SPECIAL)
371 : ((PL_op->op_private & (OPpLVAL_INTRO|OPpMAY_RETURN_CONSTANT)) == OPpMAY_RETURN_CONSTANT)
374 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
375 /* (But not in defined().) */
377 CV *cv = sv_2cv(TOPs, &stash_unused, &gv, flags);
380 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
381 if ((PL_op->op_private & OPpLVAL_INTRO)) {
382 if (gv && GvCV(gv) == cv && (gv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv), FALSE)))
385 DIE(aTHX_ "Can't modify non-lvalue subroutine call");
388 else if ((flags == (GV_ADD|GV_NOEXPAND)) && gv && SvROK(gv)) {
392 cv = MUTABLE_CV(&PL_sv_undef);
393 SETs(MUTABLE_SV(cv));
403 SV *ret = &PL_sv_undef;
405 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
406 const char * s = SvPVX_const(TOPs);
407 if (strnEQ(s, "CORE::", 6)) {
408 const int code = keyword(s + 6, SvCUR(TOPs) - 6, 1);
409 if (code < 0) { /* Overridable. */
410 #define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
411 int i = 0, n = 0, seen_question = 0, defgv = 0;
413 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
415 if (code == -KEY_chop || code == -KEY_chomp
416 || code == -KEY_exec || code == -KEY_system)
418 if (code == -KEY_mkdir) {
419 ret = newSVpvs_flags("_;$", SVs_TEMP);
422 if (code == -KEY_readpipe) {
423 s = "CORE::backtick";
425 while (i < MAXO) { /* The slow way. */
426 if (strEQ(s + 6, PL_op_name[i])
427 || strEQ(s + 6, PL_op_desc[i]))
433 goto nonesuch; /* Should not happen... */
435 defgv = PL_opargs[i] & OA_DEFGV;
436 oa = PL_opargs[i] >> OASHIFT;
438 if (oa & OA_OPTIONAL && !seen_question && !defgv) {
442 if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
443 && (oa & (OA_OPTIONAL - 1)) <= OA_SCALARREF
444 /* But globs are already references (kinda) */
445 && (oa & (OA_OPTIONAL - 1)) != OA_FILEREF
449 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
452 if (defgv && str[n - 1] == '$')
455 ret = newSVpvn_flags(str, n - 1, SVs_TEMP);
457 else if (code) /* Non-Overridable */
459 else { /* None such */
461 DIE(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
465 cv = sv_2cv(TOPs, &stash, &gv, 0);
467 ret = newSVpvn_flags(SvPVX_const(cv), SvCUR(cv), SVs_TEMP);
476 CV *cv = MUTABLE_CV(PAD_SV(PL_op->op_targ));
478 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
480 PUSHs(MUTABLE_SV(cv));
494 if (GIMME != G_ARRAY) {
498 *MARK = &PL_sv_undef;
499 *MARK = refto(*MARK);
503 EXTEND_MORTAL(SP - MARK);
505 *MARK = refto(*MARK);
510 S_refto(pTHX_ SV *sv)
515 PERL_ARGS_ASSERT_REFTO;
517 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
520 if (!(sv = LvTARG(sv)))
523 SvREFCNT_inc_void_NN(sv);
525 else if (SvTYPE(sv) == SVt_PVAV) {
526 if (!AvREAL((const AV *)sv) && AvREIFY((const AV *)sv))
527 av_reify(MUTABLE_AV(sv));
529 SvREFCNT_inc_void_NN(sv);
531 else if (SvPADTMP(sv) && !IS_PADGV(sv))
535 SvREFCNT_inc_void_NN(sv);
538 sv_upgrade(rv, SVt_IV);
548 SV * const sv = POPs;
553 if (!sv || !SvROK(sv))
556 pv = sv_reftype(SvRV(sv),TRUE);
557 PUSHp(pv, strlen(pv));
567 stash = CopSTASH(PL_curcop);
569 SV * const ssv = POPs;
573 if (ssv && !SvGMAGICAL(ssv) && !SvAMAGIC(ssv) && SvROK(ssv))
574 Perl_croak(aTHX_ "Attempt to bless into a reference");
575 ptr = SvPV_const(ssv,len);
576 if (len == 0 && ckWARN(WARN_MISC))
577 Perl_warner(aTHX_ packWARN(WARN_MISC),
578 "Explicit blessing to '' (assuming package main)");
579 stash = gv_stashpvn(ptr, len, GV_ADD);
582 (void)sv_bless(TOPs, stash);
591 const char * const elem = SvPV_nolen_const(sv);
592 GV * const gv = MUTABLE_GV(POPs);
597 /* elem will always be NUL terminated. */
598 const char * const second_letter = elem + 1;
601 if (strEQ(second_letter, "RRAY"))
602 tmpRef = MUTABLE_SV(GvAV(gv));
605 if (strEQ(second_letter, "ODE"))
606 tmpRef = MUTABLE_SV(GvCVu(gv));
609 if (strEQ(second_letter, "ILEHANDLE")) {
610 /* finally deprecated in 5.8.0 */
611 deprecate("*glob{FILEHANDLE}");
612 tmpRef = MUTABLE_SV(GvIOp(gv));
615 if (strEQ(second_letter, "ORMAT"))
616 tmpRef = MUTABLE_SV(GvFORM(gv));
619 if (strEQ(second_letter, "LOB"))
620 tmpRef = MUTABLE_SV(gv);
623 if (strEQ(second_letter, "ASH"))
624 tmpRef = MUTABLE_SV(GvHV(gv));
627 if (*second_letter == 'O' && !elem[2])
628 tmpRef = MUTABLE_SV(GvIOp(gv));
631 if (strEQ(second_letter, "AME"))
632 sv = newSVhek(GvNAME_HEK(gv));
635 if (strEQ(second_letter, "ACKAGE")) {
636 const HV * const stash = GvSTASH(gv);
637 const HEK * const hek = stash ? HvNAME_HEK(stash) : NULL;
638 sv = hek ? newSVhek(hek) : newSVpvs("__ANON__");
642 if (strEQ(second_letter, "CALAR"))
657 /* Pattern matching */
662 register unsigned char *s;
665 register I32 *sfirst;
669 if (sv == PL_lastscream) {
673 s = (unsigned char*)(SvPV(sv, len));
675 if (pos <= 0 || !SvPOK(sv) || SvUTF8(sv)) {
676 /* No point in studying a zero length string, and not safe to study
677 anything that doesn't appear to be a simple scalar (and hence might
678 change between now and when the regexp engine runs without our set
679 magic ever running) such as a reference to an object with overloaded
685 SvSCREAM_off(PL_lastscream);
686 SvREFCNT_dec(PL_lastscream);
688 PL_lastscream = SvREFCNT_inc_simple(sv);
690 s = (unsigned char*)(SvPV(sv, len));
694 if (pos > PL_maxscream) {
695 if (PL_maxscream < 0) {
696 PL_maxscream = pos + 80;
697 Newx(PL_screamfirst, 256, I32);
698 Newx(PL_screamnext, PL_maxscream, I32);
701 PL_maxscream = pos + pos / 4;
702 Renew(PL_screamnext, PL_maxscream, I32);
706 sfirst = PL_screamfirst;
707 snext = PL_screamnext;
709 if (!sfirst || !snext)
710 DIE(aTHX_ "do_study: out of memory");
712 for (ch = 256; ch; --ch)
717 register const I32 ch = s[pos];
719 snext[pos] = sfirst[ch] - pos;
726 /* piggyback on m//g magic */
727 sv_magic(sv, NULL, PERL_MAGIC_regex_global, NULL, 0);
736 if (PL_op->op_flags & OPf_STACKED)
738 else if (PL_op->op_private & OPpTARGET_MY)
744 TARG = sv_newmortal();
749 /* Lvalue operators. */
761 dVAR; dSP; dMARK; dTARGET; dORIGMARK;
763 do_chop(TARG, *++MARK);
772 SETi(do_chomp(TOPs));
778 dVAR; dSP; dMARK; dTARGET;
779 register I32 count = 0;
782 count += do_chomp(POPs);
792 if (!PL_op->op_private) {
801 SV_CHECK_THINKFIRST_COW_DROP(sv);
803 switch (SvTYPE(sv)) {
807 av_undef(MUTABLE_AV(sv));
810 hv_undef(MUTABLE_HV(sv));
813 if (cv_const_sv((const CV *)sv) && ckWARN(WARN_MISC))
814 Perl_warner(aTHX_ packWARN(WARN_MISC), "Constant subroutine %s undefined",
815 CvANON((const CV *)sv) ? "(anonymous)"
816 : GvENAME(CvGV((const CV *)sv)));
820 /* let user-undef'd sub keep its identity */
821 GV* const gv = CvGV((const CV *)sv);
822 cv_undef(MUTABLE_CV(sv));
823 CvGV((const CV *)sv) = gv;
828 SvSetMagicSV(sv, &PL_sv_undef);
831 else if (isGV_with_GP(sv)) {
836 if((stash = GvHV((const GV *)sv)) && HvNAME_get(stash))
837 mro_isa_changed_in(stash);
838 /* undef *Pkg::meth_name ... */
839 else if(GvCVu((const GV *)sv) && (stash = GvSTASH((const GV *)sv))
840 && HvNAME_get(stash))
841 mro_method_changed_in(stash);
843 gp_free(MUTABLE_GV(sv));
845 GvGP(sv) = gp_ref(gp);
847 GvLINE(sv) = CopLINE(PL_curcop);
848 GvEGV(sv) = MUTABLE_GV(sv);
854 if (SvTYPE(sv) >= SVt_PV && SvPVX_const(sv) && SvLEN(sv)) {
869 if (SvTYPE(TOPs) >= SVt_PVAV || isGV_with_GP(TOPs))
870 DIE(aTHX_ PL_no_modify);
871 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
872 && SvIVX(TOPs) != IV_MIN)
874 SvIV_set(TOPs, SvIVX(TOPs) - 1);
875 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
886 if (SvTYPE(TOPs) >= SVt_PVAV || isGV_with_GP(TOPs))
887 DIE(aTHX_ PL_no_modify);
888 sv_setsv(TARG, TOPs);
889 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
890 && SvIVX(TOPs) != IV_MAX)
892 SvIV_set(TOPs, SvIVX(TOPs) + 1);
893 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
898 /* special case for undef: see thread at 2003-03/msg00536.html in archive */
908 if (SvTYPE(TOPs) >= SVt_PVAV || isGV_with_GP(TOPs))
909 DIE(aTHX_ PL_no_modify);
910 sv_setsv(TARG, TOPs);
911 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
912 && SvIVX(TOPs) != IV_MIN)
914 SvIV_set(TOPs, SvIVX(TOPs) - 1);
915 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
924 /* Ordinary operators. */
928 dVAR; dSP; dATARGET; SV *svl, *svr;
929 #ifdef PERL_PRESERVE_IVUV
932 tryAMAGICbin(pow,opASSIGN);
933 svl = sv_2num(TOPm1s);
935 #ifdef PERL_PRESERVE_IVUV
936 /* For integer to integer power, we do the calculation by hand wherever
937 we're sure it is safe; otherwise we call pow() and try to convert to
938 integer afterwards. */
951 const IV iv = SvIVX(svr);
955 goto float_it; /* Can't do negative powers this way. */
959 baseuok = SvUOK(svl);
963 const IV iv = SvIVX(svl);
966 baseuok = TRUE; /* effectively it's a UV now */
968 baseuv = -iv; /* abs, baseuok == false records sign */
971 /* now we have integer ** positive integer. */
974 /* foo & (foo - 1) is zero only for a power of 2. */
975 if (!(baseuv & (baseuv - 1))) {
976 /* We are raising power-of-2 to a positive integer.
977 The logic here will work for any base (even non-integer
978 bases) but it can be less accurate than
979 pow (base,power) or exp (power * log (base)) when the
980 intermediate values start to spill out of the mantissa.
981 With powers of 2 we know this can't happen.
982 And powers of 2 are the favourite thing for perl
983 programmers to notice ** not doing what they mean. */
985 NV base = baseuok ? baseuv : -(NV)baseuv;
990 while (power >>= 1) {
1001 register unsigned int highbit = 8 * sizeof(UV);
1002 register unsigned int diff = 8 * sizeof(UV);
1003 while (diff >>= 1) {
1005 if (baseuv >> highbit) {
1009 /* we now have baseuv < 2 ** highbit */
1010 if (power * highbit <= 8 * sizeof(UV)) {
1011 /* result will definitely fit in UV, so use UV math
1012 on same algorithm as above */
1013 register UV result = 1;
1014 register UV base = baseuv;
1015 const bool odd_power = (bool)(power & 1);
1019 while (power >>= 1) {
1026 if (baseuok || !odd_power)
1027 /* answer is positive */
1029 else if (result <= (UV)IV_MAX)
1030 /* answer negative, fits in IV */
1031 SETi( -(IV)result );
1032 else if (result == (UV)IV_MIN)
1033 /* 2's complement assumption: special case IV_MIN */
1036 /* answer negative, doesn't fit */
1037 SETn( -(NV)result );
1047 NV right = SvNV(svr);
1048 NV left = SvNV(svl);
1051 #if defined(USE_LONG_DOUBLE) && defined(HAS_AIX_POWL_NEG_BASE_BUG)
1053 We are building perl with long double support and are on an AIX OS
1054 afflicted with a powl() function that wrongly returns NaNQ for any
1055 negative base. This was reported to IBM as PMR #23047-379 on
1056 03/06/2006. The problem exists in at least the following versions
1057 of AIX and the libm fileset, and no doubt others as well:
1059 AIX 4.3.3-ML10 bos.adt.libm 4.3.3.50
1060 AIX 5.1.0-ML04 bos.adt.libm 5.1.0.29
1061 AIX 5.2.0 bos.adt.libm 5.2.0.85
1063 So, until IBM fixes powl(), we provide the following workaround to
1064 handle the problem ourselves. Our logic is as follows: for
1065 negative bases (left), we use fmod(right, 2) to check if the
1066 exponent is an odd or even integer:
1068 - if odd, powl(left, right) == -powl(-left, right)
1069 - if even, powl(left, right) == powl(-left, right)
1071 If the exponent is not an integer, the result is rightly NaNQ, so
1072 we just return that (as NV_NAN).
1076 NV mod2 = Perl_fmod( right, 2.0 );
1077 if (mod2 == 1.0 || mod2 == -1.0) { /* odd integer */
1078 SETn( -Perl_pow( -left, right) );
1079 } else if (mod2 == 0.0) { /* even integer */
1080 SETn( Perl_pow( -left, right) );
1081 } else { /* fractional power */
1085 SETn( Perl_pow( left, right) );
1088 SETn( Perl_pow( left, right) );
1089 #endif /* HAS_AIX_POWL_NEG_BASE_BUG */
1091 #ifdef PERL_PRESERVE_IVUV
1101 dVAR; dSP; dATARGET; SV *svl, *svr;
1102 tryAMAGICbin(mult,opASSIGN);
1103 svl = sv_2num(TOPm1s);
1104 svr = sv_2num(TOPs);
1105 #ifdef PERL_PRESERVE_IVUV
1108 /* Unless the left argument is integer in range we are going to have to
1109 use NV maths. Hence only attempt to coerce the right argument if
1110 we know the left is integer. */
1111 /* Left operand is defined, so is it IV? */
1114 bool auvok = SvUOK(svl);
1115 bool buvok = SvUOK(svr);
1116 const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
1117 const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
1126 const IV aiv = SvIVX(svl);
1129 auvok = TRUE; /* effectively it's a UV now */
1131 alow = -aiv; /* abs, auvok == false records sign */
1137 const IV biv = SvIVX(svr);
1140 buvok = TRUE; /* effectively it's a UV now */
1142 blow = -biv; /* abs, buvok == false records sign */
1146 /* If this does sign extension on unsigned it's time for plan B */
1147 ahigh = alow >> (4 * sizeof (UV));
1149 bhigh = blow >> (4 * sizeof (UV));
1151 if (ahigh && bhigh) {
1153 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
1154 which is overflow. Drop to NVs below. */
1155 } else if (!ahigh && !bhigh) {
1156 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
1157 so the unsigned multiply cannot overflow. */
1158 const UV product = alow * blow;
1159 if (auvok == buvok) {
1160 /* -ve * -ve or +ve * +ve gives a +ve result. */
1164 } else if (product <= (UV)IV_MIN) {
1165 /* 2s complement assumption that (UV)-IV_MIN is correct. */
1166 /* -ve result, which could overflow an IV */
1168 SETi( -(IV)product );
1170 } /* else drop to NVs below. */
1172 /* One operand is large, 1 small */
1175 /* swap the operands */
1177 bhigh = blow; /* bhigh now the temp var for the swap */
1181 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1182 multiplies can't overflow. shift can, add can, -ve can. */
1183 product_middle = ahigh * blow;
1184 if (!(product_middle & topmask)) {
1185 /* OK, (ahigh * blow) won't lose bits when we shift it. */
1187 product_middle <<= (4 * sizeof (UV));
1188 product_low = alow * blow;
1190 /* as for pp_add, UV + something mustn't get smaller.
1191 IIRC ANSI mandates this wrapping *behaviour* for
1192 unsigned whatever the actual representation*/
1193 product_low += product_middle;
1194 if (product_low >= product_middle) {
1195 /* didn't overflow */
1196 if (auvok == buvok) {
1197 /* -ve * -ve or +ve * +ve gives a +ve result. */
1199 SETu( product_low );
1201 } else if (product_low <= (UV)IV_MIN) {
1202 /* 2s complement assumption again */
1203 /* -ve result, which could overflow an IV */
1205 SETi( -(IV)product_low );
1207 } /* else drop to NVs below. */
1209 } /* product_middle too large */
1210 } /* ahigh && bhigh */
1215 NV right = SvNV(svr);
1216 NV left = SvNV(svl);
1218 SETn( left * right );
1225 dVAR; dSP; dATARGET; SV *svl, *svr;
1226 tryAMAGICbin(div,opASSIGN);
1227 svl = sv_2num(TOPm1s);
1228 svr = sv_2num(TOPs);
1229 /* Only try to do UV divide first
1230 if ((SLOPPYDIVIDE is true) or
1231 (PERL_PRESERVE_IVUV is true and one or both SV is a UV too large
1233 The assumption is that it is better to use floating point divide
1234 whenever possible, only doing integer divide first if we can't be sure.
1235 If NV_PRESERVES_UV is true then we know at compile time that no UV
1236 can be too large to preserve, so don't need to compile the code to
1237 test the size of UVs. */
1240 # define PERL_TRY_UV_DIVIDE
1241 /* ensure that 20./5. == 4. */
1243 # ifdef PERL_PRESERVE_IVUV
1244 # ifndef NV_PRESERVES_UV
1245 # define PERL_TRY_UV_DIVIDE
1250 #ifdef PERL_TRY_UV_DIVIDE
1255 bool left_non_neg = SvUOK(svl);
1256 bool right_non_neg = SvUOK(svr);
1260 if (right_non_neg) {
1264 const IV biv = SvIVX(svr);
1267 right_non_neg = TRUE; /* effectively it's a UV now */
1273 /* historically undef()/0 gives a "Use of uninitialized value"
1274 warning before dieing, hence this test goes here.
1275 If it were immediately before the second SvIV_please, then
1276 DIE() would be invoked before left was even inspected, so
1277 no inpsection would give no warning. */
1279 DIE(aTHX_ "Illegal division by zero");
1285 const IV aiv = SvIVX(svl);
1288 left_non_neg = TRUE; /* effectively it's a UV now */
1297 /* For sloppy divide we always attempt integer division. */
1299 /* Otherwise we only attempt it if either or both operands
1300 would not be preserved by an NV. If both fit in NVs
1301 we fall through to the NV divide code below. However,
1302 as left >= right to ensure integer result here, we know that
1303 we can skip the test on the right operand - right big
1304 enough not to be preserved can't get here unless left is
1307 && (left > ((UV)1 << NV_PRESERVES_UV_BITS))
1310 /* Integer division can't overflow, but it can be imprecise. */
1311 const UV result = left / right;
1312 if (result * right == left) {
1313 SP--; /* result is valid */
1314 if (left_non_neg == right_non_neg) {
1315 /* signs identical, result is positive. */
1319 /* 2s complement assumption */
1320 if (result <= (UV)IV_MIN)
1321 SETi( -(IV)result );
1323 /* It's exact but too negative for IV. */
1324 SETn( -(NV)result );
1327 } /* tried integer divide but it was not an integer result */
1328 } /* else (PERL_ABS(result) < 1.0) or (both UVs in range for NV) */
1329 } /* left wasn't SvIOK */
1330 } /* right wasn't SvIOK */
1331 #endif /* PERL_TRY_UV_DIVIDE */
1333 NV right = SvNV(svr);
1334 NV left = SvNV(svl);
1335 (void)POPs;(void)POPs;
1336 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1337 if (! Perl_isnan(right) && right == 0.0)
1341 DIE(aTHX_ "Illegal division by zero");
1342 PUSHn( left / right );
1349 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1353 bool left_neg = FALSE;
1354 bool right_neg = FALSE;
1355 bool use_double = FALSE;
1356 bool dright_valid = FALSE;
1360 SV * const svr = sv_2num(TOPs);
1363 right_neg = !SvUOK(svr);
1367 const IV biv = SvIVX(svr);
1370 right_neg = FALSE; /* effectively it's a UV now */
1378 right_neg = dright < 0;
1381 if (dright < UV_MAX_P1) {
1382 right = U_V(dright);
1383 dright_valid = TRUE; /* In case we need to use double below. */
1390 /* At this point use_double is only true if right is out of range for
1391 a UV. In range NV has been rounded down to nearest UV and
1392 use_double false. */
1393 svl = sv_2num(TOPs);
1395 if (!use_double && SvIOK(svl)) {
1397 left_neg = !SvUOK(svl);
1401 const IV aiv = SvIVX(svl);
1404 left_neg = FALSE; /* effectively it's a UV now */
1413 left_neg = dleft < 0;
1417 /* This should be exactly the 5.6 behaviour - if left and right are
1418 both in range for UV then use U_V() rather than floor. */
1420 if (dleft < UV_MAX_P1) {
1421 /* right was in range, so is dleft, so use UVs not double.
1425 /* left is out of range for UV, right was in range, so promote
1426 right (back) to double. */
1428 /* The +0.5 is used in 5.6 even though it is not strictly
1429 consistent with the implicit +0 floor in the U_V()
1430 inside the #if 1. */
1431 dleft = Perl_floor(dleft + 0.5);
1434 dright = Perl_floor(dright + 0.5);
1445 DIE(aTHX_ "Illegal modulus zero");
1447 dans = Perl_fmod(dleft, dright);
1448 if ((left_neg != right_neg) && dans)
1449 dans = dright - dans;
1452 sv_setnv(TARG, dans);
1458 DIE(aTHX_ "Illegal modulus zero");
1461 if ((left_neg != right_neg) && ans)
1464 /* XXX may warn: unary minus operator applied to unsigned type */
1465 /* could change -foo to be (~foo)+1 instead */
1466 if (ans <= ~((UV)IV_MAX)+1)
1467 sv_setiv(TARG, ~ans+1);
1469 sv_setnv(TARG, -(NV)ans);
1472 sv_setuv(TARG, ans);
1481 dVAR; dSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
1488 const UV uv = SvUV(sv);
1490 count = IV_MAX; /* The best we can do? */
1494 const IV iv = SvIV(sv);
1501 else if (SvNOKp(sv)) {
1502 const NV nv = SvNV(sv);
1510 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1512 static const char oom_list_extend[] = "Out of memory during list extend";
1513 const I32 items = SP - MARK;
1514 const I32 max = items * count;
1516 MEM_WRAP_CHECK_1(max, SV*, oom_list_extend);
1517 /* Did the max computation overflow? */
1518 if (items > 0 && max > 0 && (max < items || max < count))
1519 Perl_croak(aTHX_ oom_list_extend);
1524 /* This code was intended to fix 20010809.028:
1527 for (($x =~ /./g) x 2) {
1528 print chop; # "abcdabcd" expected as output.
1531 * but that change (#11635) broke this code:
1533 $x = [("foo")x2]; # only one "foo" ended up in the anonlist.
1535 * I can't think of a better fix that doesn't introduce
1536 * an efficiency hit by copying the SVs. The stack isn't
1537 * refcounted, and mortalisation obviously doesn't
1538 * Do The Right Thing when the stack has more than
1539 * one pointer to the same mortal value.
1543 *SP = sv_2mortal(newSVsv(*SP));
1553 repeatcpy((char*)(MARK + items), (char*)MARK,
1554 items * sizeof(const SV *), count - 1);
1557 else if (count <= 0)
1560 else { /* Note: mark already snarfed by pp_list */
1561 SV * const tmpstr = POPs;
1564 static const char oom_string_extend[] =
1565 "Out of memory during string extend";
1567 SvSetSV(TARG, tmpstr);
1568 SvPV_force(TARG, len);
1569 isutf = DO_UTF8(TARG);
1574 const STRLEN max = (UV)count * len;
1575 if (len > MEM_SIZE_MAX / count)
1576 Perl_croak(aTHX_ oom_string_extend);
1577 MEM_WRAP_CHECK_1(max, char, oom_string_extend);
1578 SvGROW(TARG, max + 1);
1579 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1580 SvCUR_set(TARG, SvCUR(TARG) * count);
1582 *SvEND(TARG) = '\0';
1585 (void)SvPOK_only_UTF8(TARG);
1587 (void)SvPOK_only(TARG);
1589 if (PL_op->op_private & OPpREPEAT_DOLIST) {
1590 /* The parser saw this as a list repeat, and there
1591 are probably several items on the stack. But we're
1592 in scalar context, and there's no pp_list to save us
1593 now. So drop the rest of the items -- robin@kitsite.com
1606 dVAR; dSP; dATARGET; bool useleft; SV *svl, *svr;
1607 tryAMAGICbin(subtr,opASSIGN);
1608 svl = sv_2num(TOPm1s);
1609 svr = sv_2num(TOPs);
1610 useleft = USE_LEFT(svl);
1611 #ifdef PERL_PRESERVE_IVUV
1612 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1613 "bad things" happen if you rely on signed integers wrapping. */
1616 /* Unless the left argument is integer in range we are going to have to
1617 use NV maths. Hence only attempt to coerce the right argument if
1618 we know the left is integer. */
1619 register UV auv = 0;
1625 a_valid = auvok = 1;
1626 /* left operand is undef, treat as zero. */
1628 /* Left operand is defined, so is it IV? */
1631 if ((auvok = SvUOK(svl)))
1634 register const IV aiv = SvIVX(svl);
1637 auvok = 1; /* Now acting as a sign flag. */
1638 } else { /* 2s complement assumption for IV_MIN */
1646 bool result_good = 0;
1649 bool buvok = SvUOK(svr);
1654 register const IV biv = SvIVX(svr);
1661 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1662 else "IV" now, independent of how it came in.
1663 if a, b represents positive, A, B negative, a maps to -A etc
1668 all UV maths. negate result if A negative.
1669 subtract if signs same, add if signs differ. */
1671 if (auvok ^ buvok) {
1680 /* Must get smaller */
1685 if (result <= buv) {
1686 /* result really should be -(auv-buv). as its negation
1687 of true value, need to swap our result flag */
1699 if (result <= (UV)IV_MIN)
1700 SETi( -(IV)result );
1702 /* result valid, but out of range for IV. */
1703 SETn( -(NV)result );
1707 } /* Overflow, drop through to NVs. */
1712 NV value = SvNV(svr);
1716 /* left operand is undef, treat as zero - value */
1720 SETn( SvNV(svl) - value );
1727 dVAR; dSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1729 const IV shift = POPi;
1730 if (PL_op->op_private & HINT_INTEGER) {
1744 dVAR; dSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1746 const IV shift = POPi;
1747 if (PL_op->op_private & HINT_INTEGER) {
1761 dVAR; dSP; tryAMAGICbinSET(lt,0);
1762 #ifdef PERL_PRESERVE_IVUV
1765 SvIV_please(TOPm1s);
1766 if (SvIOK(TOPm1s)) {
1767 bool auvok = SvUOK(TOPm1s);
1768 bool buvok = SvUOK(TOPs);
1770 if (!auvok && !buvok) { /* ## IV < IV ## */
1771 const IV aiv = SvIVX(TOPm1s);
1772 const IV biv = SvIVX(TOPs);
1775 SETs(boolSV(aiv < biv));
1778 if (auvok && buvok) { /* ## UV < UV ## */
1779 const UV auv = SvUVX(TOPm1s);
1780 const UV buv = SvUVX(TOPs);
1783 SETs(boolSV(auv < buv));
1786 if (auvok) { /* ## UV < IV ## */
1788 const IV biv = SvIVX(TOPs);
1791 /* As (a) is a UV, it's >=0, so it cannot be < */
1796 SETs(boolSV(auv < (UV)biv));
1799 { /* ## IV < UV ## */
1800 const IV aiv = SvIVX(TOPm1s);
1804 /* As (b) is a UV, it's >=0, so it must be < */
1811 SETs(boolSV((UV)aiv < buv));
1817 #ifndef NV_PRESERVES_UV
1818 #ifdef PERL_PRESERVE_IVUV
1821 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1823 SETs(boolSV(SvRV(TOPs) < SvRV(TOPp1s)));
1828 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1830 if (Perl_isnan(left) || Perl_isnan(right))
1832 SETs(boolSV(left < right));
1835 SETs(boolSV(TOPn < value));
1843 dVAR; dSP; tryAMAGICbinSET(gt,0);
1844 #ifdef PERL_PRESERVE_IVUV
1847 SvIV_please(TOPm1s);
1848 if (SvIOK(TOPm1s)) {
1849 bool auvok = SvUOK(TOPm1s);
1850 bool buvok = SvUOK(TOPs);
1852 if (!auvok && !buvok) { /* ## IV > IV ## */
1853 const IV aiv = SvIVX(TOPm1s);
1854 const IV biv = SvIVX(TOPs);
1857 SETs(boolSV(aiv > biv));
1860 if (auvok && buvok) { /* ## UV > UV ## */
1861 const UV auv = SvUVX(TOPm1s);
1862 const UV buv = SvUVX(TOPs);
1865 SETs(boolSV(auv > buv));
1868 if (auvok) { /* ## UV > IV ## */
1870 const IV biv = SvIVX(TOPs);
1874 /* As (a) is a UV, it's >=0, so it must be > */
1879 SETs(boolSV(auv > (UV)biv));
1882 { /* ## IV > UV ## */
1883 const IV aiv = SvIVX(TOPm1s);
1887 /* As (b) is a UV, it's >=0, so it cannot be > */
1894 SETs(boolSV((UV)aiv > buv));
1900 #ifndef NV_PRESERVES_UV
1901 #ifdef PERL_PRESERVE_IVUV
1904 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1906 SETs(boolSV(SvRV(TOPs) > SvRV(TOPp1s)));
1911 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1913 if (Perl_isnan(left) || Perl_isnan(right))
1915 SETs(boolSV(left > right));
1918 SETs(boolSV(TOPn > value));
1926 dVAR; dSP; tryAMAGICbinSET(le,0);
1927 #ifdef PERL_PRESERVE_IVUV
1930 SvIV_please(TOPm1s);
1931 if (SvIOK(TOPm1s)) {
1932 bool auvok = SvUOK(TOPm1s);
1933 bool buvok = SvUOK(TOPs);
1935 if (!auvok && !buvok) { /* ## IV <= IV ## */
1936 const IV aiv = SvIVX(TOPm1s);
1937 const IV biv = SvIVX(TOPs);
1940 SETs(boolSV(aiv <= biv));
1943 if (auvok && buvok) { /* ## UV <= UV ## */
1944 UV auv = SvUVX(TOPm1s);
1945 UV buv = SvUVX(TOPs);
1948 SETs(boolSV(auv <= buv));
1951 if (auvok) { /* ## UV <= IV ## */
1953 const IV biv = SvIVX(TOPs);
1957 /* As (a) is a UV, it's >=0, so a cannot be <= */
1962 SETs(boolSV(auv <= (UV)biv));
1965 { /* ## IV <= UV ## */
1966 const IV aiv = SvIVX(TOPm1s);
1970 /* As (b) is a UV, it's >=0, so a must be <= */
1977 SETs(boolSV((UV)aiv <= buv));
1983 #ifndef NV_PRESERVES_UV
1984 #ifdef PERL_PRESERVE_IVUV
1987 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1989 SETs(boolSV(SvRV(TOPs) <= SvRV(TOPp1s)));
1994 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1996 if (Perl_isnan(left) || Perl_isnan(right))
1998 SETs(boolSV(left <= right));
2001 SETs(boolSV(TOPn <= value));
2009 dVAR; dSP; tryAMAGICbinSET(ge,0);
2010 #ifdef PERL_PRESERVE_IVUV
2013 SvIV_please(TOPm1s);
2014 if (SvIOK(TOPm1s)) {
2015 bool auvok = SvUOK(TOPm1s);
2016 bool buvok = SvUOK(TOPs);
2018 if (!auvok && !buvok) { /* ## IV >= IV ## */
2019 const IV aiv = SvIVX(TOPm1s);
2020 const IV biv = SvIVX(TOPs);
2023 SETs(boolSV(aiv >= biv));
2026 if (auvok && buvok) { /* ## UV >= UV ## */
2027 const UV auv = SvUVX(TOPm1s);
2028 const UV buv = SvUVX(TOPs);
2031 SETs(boolSV(auv >= buv));
2034 if (auvok) { /* ## UV >= IV ## */
2036 const IV biv = SvIVX(TOPs);
2040 /* As (a) is a UV, it's >=0, so it must be >= */
2045 SETs(boolSV(auv >= (UV)biv));
2048 { /* ## IV >= UV ## */
2049 const IV aiv = SvIVX(TOPm1s);
2053 /* As (b) is a UV, it's >=0, so a cannot be >= */
2060 SETs(boolSV((UV)aiv >= buv));
2066 #ifndef NV_PRESERVES_UV
2067 #ifdef PERL_PRESERVE_IVUV
2070 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2072 SETs(boolSV(SvRV(TOPs) >= SvRV(TOPp1s)));
2077 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2079 if (Perl_isnan(left) || Perl_isnan(right))
2081 SETs(boolSV(left >= right));
2084 SETs(boolSV(TOPn >= value));
2092 dVAR; dSP; tryAMAGICbinSET(ne,0);
2093 #ifndef NV_PRESERVES_UV
2094 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2096 SETs(boolSV(SvRV(TOPs) != SvRV(TOPp1s)));
2100 #ifdef PERL_PRESERVE_IVUV
2103 SvIV_please(TOPm1s);
2104 if (SvIOK(TOPm1s)) {
2105 const bool auvok = SvUOK(TOPm1s);
2106 const bool buvok = SvUOK(TOPs);
2108 if (auvok == buvok) { /* ## IV == IV or UV == UV ## */
2109 /* Casting IV to UV before comparison isn't going to matter
2110 on 2s complement. On 1s complement or sign&magnitude
2111 (if we have any of them) it could make negative zero
2112 differ from normal zero. As I understand it. (Need to
2113 check - is negative zero implementation defined behaviour
2115 const UV buv = SvUVX(POPs);
2116 const UV auv = SvUVX(TOPs);
2118 SETs(boolSV(auv != buv));
2121 { /* ## Mixed IV,UV ## */
2125 /* != is commutative so swap if needed (save code) */
2127 /* swap. top of stack (b) is the iv */
2131 /* As (a) is a UV, it's >0, so it cannot be == */
2140 /* As (b) is a UV, it's >0, so it cannot be == */
2144 uv = SvUVX(*(SP+1)); /* Do I want TOPp1s() ? */
2146 SETs(boolSV((UV)iv != uv));
2153 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2155 if (Perl_isnan(left) || Perl_isnan(right))
2157 SETs(boolSV(left != right));
2160 SETs(boolSV(TOPn != value));
2168 dVAR; dSP; dTARGET; tryAMAGICbin(ncmp,0);
2169 #ifndef NV_PRESERVES_UV
2170 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2171 const UV right = PTR2UV(SvRV(POPs));
2172 const UV left = PTR2UV(SvRV(TOPs));
2173 SETi((left > right) - (left < right));
2177 #ifdef PERL_PRESERVE_IVUV
2178 /* Fortunately it seems NaN isn't IOK */
2181 SvIV_please(TOPm1s);
2182 if (SvIOK(TOPm1s)) {
2183 const bool leftuvok = SvUOK(TOPm1s);
2184 const bool rightuvok = SvUOK(TOPs);
2186 if (!leftuvok && !rightuvok) { /* ## IV <=> IV ## */
2187 const IV leftiv = SvIVX(TOPm1s);
2188 const IV rightiv = SvIVX(TOPs);
2190 if (leftiv > rightiv)
2192 else if (leftiv < rightiv)
2196 } else if (leftuvok && rightuvok) { /* ## UV <=> UV ## */
2197 const UV leftuv = SvUVX(TOPm1s);
2198 const UV rightuv = SvUVX(TOPs);
2200 if (leftuv > rightuv)
2202 else if (leftuv < rightuv)
2206 } else if (leftuvok) { /* ## UV <=> IV ## */
2207 const IV rightiv = SvIVX(TOPs);
2209 /* As (a) is a UV, it's >=0, so it cannot be < */
2212 const UV leftuv = SvUVX(TOPm1s);
2213 if (leftuv > (UV)rightiv) {
2215 } else if (leftuv < (UV)rightiv) {
2221 } else { /* ## IV <=> UV ## */
2222 const IV leftiv = SvIVX(TOPm1s);
2224 /* As (b) is a UV, it's >=0, so it must be < */
2227 const UV rightuv = SvUVX(TOPs);
2228 if ((UV)leftiv > rightuv) {
2230 } else if ((UV)leftiv < rightuv) {
2248 if (Perl_isnan(left) || Perl_isnan(right)) {
2252 value = (left > right) - (left < right);
2256 else if (left < right)
2258 else if (left > right)
2274 int amg_type = sle_amg;
2278 switch (PL_op->op_type) {
2297 tryAMAGICbinSET_var(amg_type,0);
2300 const int cmp = (IN_LOCALE_RUNTIME
2301 ? sv_cmp_locale(left, right)
2302 : sv_cmp(left, right));
2303 SETs(boolSV(cmp * multiplier < rhs));
2310 dVAR; dSP; tryAMAGICbinSET(seq,0);
2313 SETs(boolSV(sv_eq(left, right)));
2320 dVAR; dSP; tryAMAGICbinSET(sne,0);
2323 SETs(boolSV(!sv_eq(left, right)));
2330 dVAR; dSP; dTARGET; tryAMAGICbin(scmp,0);
2333 const int cmp = (IN_LOCALE_RUNTIME
2334 ? sv_cmp_locale(left, right)
2335 : sv_cmp(left, right));
2343 dVAR; dSP; dATARGET; tryAMAGICbin(band,opASSIGN);
2348 if (SvNIOKp(left) || SvNIOKp(right)) {
2349 if (PL_op->op_private & HINT_INTEGER) {
2350 const IV i = SvIV_nomg(left) & SvIV_nomg(right);
2354 const UV u = SvUV_nomg(left) & SvUV_nomg(right);
2359 do_vop(PL_op->op_type, TARG, left, right);
2368 dVAR; dSP; dATARGET;
2369 const int op_type = PL_op->op_type;
2371 tryAMAGICbin_var((op_type == OP_BIT_OR ? bor_amg : bxor_amg), opASSIGN);
2376 if (SvNIOKp(left) || SvNIOKp(right)) {
2377 if (PL_op->op_private & HINT_INTEGER) {
2378 const IV l = (USE_LEFT(left) ? SvIV_nomg(left) : 0);
2379 const IV r = SvIV_nomg(right);
2380 const IV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2384 const UV l = (USE_LEFT(left) ? SvUV_nomg(left) : 0);
2385 const UV r = SvUV_nomg(right);
2386 const UV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2391 do_vop(op_type, TARG, left, right);
2400 dVAR; dSP; dTARGET; tryAMAGICun(neg);
2402 SV * const sv = sv_2num(TOPs);
2403 const int flags = SvFLAGS(sv);
2405 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
2406 /* It's publicly an integer, or privately an integer-not-float */
2409 if (SvIVX(sv) == IV_MIN) {
2410 /* 2s complement assumption. */
2411 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
2414 else if (SvUVX(sv) <= IV_MAX) {
2419 else if (SvIVX(sv) != IV_MIN) {
2423 #ifdef PERL_PRESERVE_IVUV
2432 else if (SvPOKp(sv)) {
2434 const char * const s = SvPV_const(sv, len);
2435 if (isIDFIRST(*s)) {
2436 sv_setpvs(TARG, "-");
2439 else if (*s == '+' || *s == '-') {
2441 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
2443 else if (DO_UTF8(sv)) {
2446 goto oops_its_an_int;
2448 sv_setnv(TARG, -SvNV(sv));
2450 sv_setpvs(TARG, "-");
2457 goto oops_its_an_int;
2458 sv_setnv(TARG, -SvNV(sv));
2470 dVAR; dSP; tryAMAGICunSET(not);
2471 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
2477 dVAR; dSP; dTARGET; tryAMAGICun(compl);
2482 if (PL_op->op_private & HINT_INTEGER) {
2483 const IV i = ~SvIV_nomg(sv);
2487 const UV u = ~SvUV_nomg(sv);
2496 (void)SvPV_nomg_const(sv,len); /* force check for uninit var */
2497 sv_setsv_nomg(TARG, sv);
2498 tmps = (U8*)SvPV_force(TARG, len);
2501 /* Calculate exact length, let's not estimate. */
2506 U8 * const send = tmps + len;
2507 U8 * const origtmps = tmps;
2508 const UV utf8flags = UTF8_ALLOW_ANYUV;
2510 while (tmps < send) {
2511 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2513 targlen += UNISKIP(~c);
2519 /* Now rewind strings and write them. */
2526 Newx(result, targlen + 1, U8);
2528 while (tmps < send) {
2529 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2531 p = uvchr_to_utf8_flags(p, ~c, UNICODE_ALLOW_ANY);
2534 sv_usepvn_flags(TARG, (char*)result, targlen,
2535 SV_HAS_TRAILING_NUL);
2542 Newx(result, nchar + 1, U8);
2544 while (tmps < send) {
2545 const U8 c = (U8)utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2550 sv_usepvn_flags(TARG, (char*)result, nchar, SV_HAS_TRAILING_NUL);
2558 register long *tmpl;
2559 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2562 for ( ; anum >= (I32)sizeof(long); anum -= (I32)sizeof(long), tmpl++)
2567 for ( ; anum > 0; anum--, tmps++)
2576 /* integer versions of some of the above */
2580 dVAR; dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
2583 SETi( left * right );
2591 dVAR; dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
2595 DIE(aTHX_ "Illegal division by zero");
2598 /* avoid FPE_INTOVF on some platforms when num is IV_MIN */
2602 value = num / value;
2608 #if defined(__GLIBC__) && IVSIZE == 8
2615 /* This is the vanilla old i_modulo. */
2616 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2620 DIE(aTHX_ "Illegal modulus zero");
2621 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2625 SETi( left % right );
2630 #if defined(__GLIBC__) && IVSIZE == 8
2635 /* This is the i_modulo with the workaround for the _moddi3 bug
2636 * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
2637 * See below for pp_i_modulo. */
2638 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2642 DIE(aTHX_ "Illegal modulus zero");
2643 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2647 SETi( left % PERL_ABS(right) );
2654 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2658 DIE(aTHX_ "Illegal modulus zero");
2659 /* The assumption is to use hereafter the old vanilla version... */
2661 PL_ppaddr[OP_I_MODULO] =
2663 /* .. but if we have glibc, we might have a buggy _moddi3
2664 * (at least glicb 2.2.5 is known to have this bug), in other
2665 * words our integer modulus with negative quad as the second
2666 * argument might be broken. Test for this and re-patch the
2667 * opcode dispatch table if that is the case, remembering to
2668 * also apply the workaround so that this first round works
2669 * right, too. See [perl #9402] for more information. */
2673 /* Cannot do this check with inlined IV constants since
2674 * that seems to work correctly even with the buggy glibc. */
2676 /* Yikes, we have the bug.
2677 * Patch in the workaround version. */
2679 PL_ppaddr[OP_I_MODULO] =
2680 &Perl_pp_i_modulo_1;
2681 /* Make certain we work right this time, too. */
2682 right = PERL_ABS(right);
2685 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2689 SETi( left % right );
2697 dVAR; dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
2700 SETi( left + right );
2707 dVAR; dSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
2710 SETi( left - right );
2717 dVAR; dSP; tryAMAGICbinSET(lt,0);
2720 SETs(boolSV(left < right));
2727 dVAR; dSP; tryAMAGICbinSET(gt,0);
2730 SETs(boolSV(left > right));
2737 dVAR; dSP; tryAMAGICbinSET(le,0);
2740 SETs(boolSV(left <= right));
2747 dVAR; dSP; tryAMAGICbinSET(ge,0);
2750 SETs(boolSV(left >= right));
2757 dVAR; dSP; tryAMAGICbinSET(eq,0);
2760 SETs(boolSV(left == right));
2767 dVAR; dSP; tryAMAGICbinSET(ne,0);
2770 SETs(boolSV(left != right));
2777 dVAR; dSP; dTARGET; tryAMAGICbin(ncmp,0);
2784 else if (left < right)
2795 dVAR; dSP; dTARGET; tryAMAGICun(neg);
2800 /* High falutin' math. */
2804 dVAR; dSP; dTARGET; tryAMAGICbin(atan2,0);
2807 SETn(Perl_atan2(left, right));
2815 int amg_type = sin_amg;
2816 const char *neg_report = NULL;
2817 NV (*func)(NV) = Perl_sin;
2818 const int op_type = PL_op->op_type;
2835 amg_type = sqrt_amg;
2837 neg_report = "sqrt";
2841 tryAMAGICun_var(amg_type);
2843 const NV value = POPn;
2845 if (op_type == OP_LOG ? (value <= 0.0) : (value < 0.0)) {
2846 SET_NUMERIC_STANDARD();
2847 DIE(aTHX_ "Can't take %s of %"NVgf, neg_report, value);
2850 XPUSHn(func(value));
2855 /* Support Configure command-line overrides for rand() functions.
2856 After 5.005, perhaps we should replace this by Configure support
2857 for drand48(), random(), or rand(). For 5.005, though, maintain
2858 compatibility by calling rand() but allow the user to override it.
2859 See INSTALL for details. --Andy Dougherty 15 July 1998
2861 /* Now it's after 5.005, and Configure supports drand48() and random(),
2862 in addition to rand(). So the overrides should not be needed any more.
2863 --Jarkko Hietaniemi 27 September 1998
2866 #ifndef HAS_DRAND48_PROTO
2867 extern double drand48 (void);
2880 if (!PL_srand_called) {
2881 (void)seedDrand01((Rand_seed_t)seed());
2882 PL_srand_called = TRUE;
2892 const UV anum = (MAXARG < 1) ? seed() : POPu;
2893 (void)seedDrand01((Rand_seed_t)anum);
2894 PL_srand_called = TRUE;
2901 dVAR; dSP; dTARGET; tryAMAGICun(int);
2903 SV * const sv = sv_2num(TOPs);
2904 const IV iv = SvIV(sv);
2905 /* XXX it's arguable that compiler casting to IV might be subtly
2906 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2907 else preferring IV has introduced a subtle behaviour change bug. OTOH
2908 relying on floating point to be accurate is a bug. */
2913 else if (SvIOK(sv)) {
2920 const NV value = SvNV(sv);
2922 if (value < (NV)UV_MAX + 0.5) {
2925 SETn(Perl_floor(value));
2929 if (value > (NV)IV_MIN - 0.5) {
2932 SETn(Perl_ceil(value));
2942 dVAR; dSP; dTARGET; tryAMAGICun(abs);
2944 SV * const sv = sv_2num(TOPs);
2945 /* This will cache the NV value if string isn't actually integer */
2946 const IV iv = SvIV(sv);
2951 else if (SvIOK(sv)) {
2952 /* IVX is precise */
2954 SETu(SvUV(sv)); /* force it to be numeric only */
2962 /* 2s complement assumption. Also, not really needed as
2963 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
2969 const NV value = SvNV(sv);
2983 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2987 SV* const sv = POPs;
2989 tmps = (SvPV_const(sv, len));
2991 /* If Unicode, try to downgrade
2992 * If not possible, croak. */
2993 SV* const tsv = sv_2mortal(newSVsv(sv));
2996 sv_utf8_downgrade(tsv, FALSE);
2997 tmps = SvPV_const(tsv, len);
2999 if (PL_op->op_type == OP_HEX)
3002 while (*tmps && len && isSPACE(*tmps))
3008 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
3010 else if (*tmps == 'b')
3011 result_uv = grok_bin (tmps, &len, &flags, &result_nv);
3013 result_uv = grok_oct (tmps, &len, &flags, &result_nv);
3015 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
3029 SV * const sv = TOPs;
3031 if (SvGAMAGIC(sv)) {
3032 /* For an overloaded or magic scalar, we can't know in advance if
3033 it's going to be UTF-8 or not. Also, we can't call sv_len_utf8 as
3034 it likes to cache the length. Maybe that should be a documented
3039 = sv_2pv_flags(sv, &len,
3040 SV_UNDEF_RETURNS_NULL|SV_CONST_RETURN|SV_GMAGIC);
3044 else if (DO_UTF8(sv)) {
3045 SETi(utf8_length((U8*)p, (U8*)p + len));
3049 } else if (SvOK(sv)) {
3050 /* Neither magic nor overloaded. */
3052 SETi(sv_len_utf8(sv));
3071 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3073 const I32 arybase = CopARYBASE_get(PL_curcop);
3075 const char *repl = NULL;
3077 const int num_args = PL_op->op_private & 7;
3078 bool repl_need_utf8_upgrade = FALSE;
3079 bool repl_is_utf8 = FALSE;
3081 SvTAINTED_off(TARG); /* decontaminate */
3082 SvUTF8_off(TARG); /* decontaminate */
3086 repl = SvPV_const(repl_sv, repl_len);
3087 repl_is_utf8 = DO_UTF8(repl_sv) && SvCUR(repl_sv);
3097 sv_utf8_upgrade(sv);
3099 else if (DO_UTF8(sv))
3100 repl_need_utf8_upgrade = TRUE;
3102 tmps = SvPV_const(sv, curlen);
3104 utf8_curlen = sv_len_utf8(sv);
3105 if (utf8_curlen == curlen)
3108 curlen = utf8_curlen;
3113 if (pos >= arybase) {
3131 else if (len >= 0) {
3133 if (rem > (I32)curlen)
3148 Perl_croak(aTHX_ "substr outside of string");
3149 if (ckWARN(WARN_SUBSTR))
3150 Perl_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3154 const I32 upos = pos;
3155 const I32 urem = rem;
3157 sv_pos_u2b(sv, &pos, &rem);
3159 /* we either return a PV or an LV. If the TARG hasn't been used
3160 * before, or is of that type, reuse it; otherwise use a mortal
3161 * instead. Note that LVs can have an extended lifetime, so also
3162 * dont reuse if refcount > 1 (bug #20933) */
3163 if (SvTYPE(TARG) > SVt_NULL) {
3164 if ( (SvTYPE(TARG) == SVt_PVLV)
3165 ? (!lvalue || SvREFCNT(TARG) > 1)
3168 TARG = sv_newmortal();
3172 sv_setpvn(TARG, tmps, rem);
3173 #ifdef USE_LOCALE_COLLATE
3174 sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3179 SV* repl_sv_copy = NULL;
3181 if (repl_need_utf8_upgrade) {
3182 repl_sv_copy = newSVsv(repl_sv);
3183 sv_utf8_upgrade(repl_sv_copy);
3184 repl = SvPV_const(repl_sv_copy, repl_len);
3185 repl_is_utf8 = DO_UTF8(repl_sv_copy) && SvCUR(sv);
3189 sv_insert_flags(sv, pos, rem, repl, repl_len, 0);
3193 SvREFCNT_dec(repl_sv_copy);
3195 else if (lvalue) { /* it's an lvalue! */
3196 if (!SvGMAGICAL(sv)) {
3198 SvPV_force_nolen(sv);
3199 if (ckWARN(WARN_SUBSTR))
3200 Perl_warner(aTHX_ packWARN(WARN_SUBSTR),
3201 "Attempt to use reference as lvalue in substr");
3203 if (isGV_with_GP(sv))
3204 SvPV_force_nolen(sv);
3205 else if (SvOK(sv)) /* is it defined ? */
3206 (void)SvPOK_only_UTF8(sv);
3208 sv_setpvs(sv, ""); /* avoid lexical reincarnation */
3211 if (SvTYPE(TARG) < SVt_PVLV) {
3212 sv_upgrade(TARG, SVt_PVLV);
3213 sv_magic(TARG, NULL, PERL_MAGIC_substr, NULL, 0);
3217 if (LvTARG(TARG) != sv) {
3219 SvREFCNT_dec(LvTARG(TARG));
3220 LvTARG(TARG) = SvREFCNT_inc_simple(sv);
3222 LvTARGOFF(TARG) = upos;
3223 LvTARGLEN(TARG) = urem;
3227 PUSHs(TARG); /* avoid SvSETMAGIC here */
3234 register const IV size = POPi;
3235 register const IV offset = POPi;
3236 register SV * const src = POPs;
3237 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3239 SvTAINTED_off(TARG); /* decontaminate */
3240 if (lvalue) { /* it's an lvalue! */
3241 if (SvREFCNT(TARG) > 1) /* don't share the TARG (#20933) */
3242 TARG = sv_newmortal();
3243 if (SvTYPE(TARG) < SVt_PVLV) {
3244 sv_upgrade(TARG, SVt_PVLV);
3245 sv_magic(TARG, NULL, PERL_MAGIC_vec, NULL, 0);
3248 if (LvTARG(TARG) != src) {
3250 SvREFCNT_dec(LvTARG(TARG));
3251 LvTARG(TARG) = SvREFCNT_inc_simple(src);
3253 LvTARGOFF(TARG) = offset;
3254 LvTARGLEN(TARG) = size;
3257 sv_setuv(TARG, do_vecget(src, offset, size));
3273 const char *little_p;
3274 const I32 arybase = CopARYBASE_get(PL_curcop);
3277 const bool is_index = PL_op->op_type == OP_INDEX;
3280 /* arybase is in characters, like offset, so combine prior to the
3281 UTF-8 to bytes calculation. */
3282 offset = POPi - arybase;
3286 big_p = SvPV_const(big, biglen);
3287 little_p = SvPV_const(little, llen);
3289 big_utf8 = DO_UTF8(big);
3290 little_utf8 = DO_UTF8(little);
3291 if (big_utf8 ^ little_utf8) {
3292 /* One needs to be upgraded. */
3293 if (little_utf8 && !PL_encoding) {
3294 /* Well, maybe instead we might be able to downgrade the small
3296 char * const pv = (char*)bytes_from_utf8((U8 *)little_p, &llen,
3299 /* If the large string is ISO-8859-1, and it's not possible to
3300 convert the small string to ISO-8859-1, then there is no
3301 way that it could be found anywhere by index. */
3306 /* At this point, pv is a malloc()ed string. So donate it to temp
3307 to ensure it will get free()d */
3308 little = temp = newSV(0);
3309 sv_usepvn(temp, pv, llen);
3310 little_p = SvPVX(little);
3313 ? newSVpvn(big_p, biglen) : newSVpvn(little_p, llen);
3316 sv_recode_to_utf8(temp, PL_encoding);
3318 sv_utf8_upgrade(temp);
3323 big_p = SvPV_const(big, biglen);
3326 little_p = SvPV_const(little, llen);
3330 if (SvGAMAGIC(big)) {
3331 /* Life just becomes a lot easier if I use a temporary here.
3332 Otherwise I need to avoid calls to sv_pos_u2b(), which (dangerously)
3333 will trigger magic and overloading again, as will fbm_instr()
3335 big = newSVpvn_flags(big_p, biglen,
3336 SVs_TEMP | (big_utf8 ? SVf_UTF8 : 0));
3339 if (SvGAMAGIC(little) || (is_index && !SvOK(little))) {
3340 /* index && SvOK() is a hack. fbm_instr() calls SvPV_const, which will
3341 warn on undef, and we've already triggered a warning with the
3342 SvPV_const some lines above. We can't remove that, as we need to
3343 call some SvPV to trigger overloading early and find out if the
3345 This is all getting to messy. The API isn't quite clean enough,
3346 because data access has side effects.
3348 little = newSVpvn_flags(little_p, llen,
3349 SVs_TEMP | (little_utf8 ? SVf_UTF8 : 0));
3350 little_p = SvPVX(little);
3354 offset = is_index ? 0 : biglen;
3356 if (big_utf8 && offset > 0)
3357 sv_pos_u2b(big, &offset, 0);
3363 else if (offset > (I32)biglen)
3365 if (!(little_p = is_index
3366 ? fbm_instr((unsigned char*)big_p + offset,
3367 (unsigned char*)big_p + biglen, little, 0)
3368 : rninstr(big_p, big_p + offset,
3369 little_p, little_p + llen)))
3372 retval = little_p - big_p;
3373 if (retval > 0 && big_utf8)
3374 sv_pos_b2u(big, &retval);
3379 PUSHi(retval + arybase);
3385 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
3386 if (SvTAINTED(MARK[1]))
3387 TAINT_PROPER("sprintf");
3388 do_sprintf(TARG, SP-MARK, MARK+1);
3389 TAINT_IF(SvTAINTED(TARG));
3401 const U8 *s = (U8*)SvPV_const(argsv, len);
3403 if (PL_encoding && SvPOK(argsv) && !DO_UTF8(argsv)) {
3404 SV * const tmpsv = sv_2mortal(newSVsv(argsv));
3405 s = (U8*)sv_recode_to_utf8(tmpsv, PL_encoding);
3409 XPUSHu(DO_UTF8(argsv) ?
3410 utf8n_to_uvchr(s, UTF8_MAXBYTES, 0, UTF8_ALLOW_ANYUV) :
3422 if (((SvIOK_notUV(TOPs) && SvIV(TOPs) < 0)
3424 (SvNOK(TOPs) && SvNV(TOPs) < 0.0))) {
3426 value = POPu; /* chr(-1) eq chr(0xff), etc. */
3428 (void) POPs; /* Ignore the argument value. */
3429 value = UNICODE_REPLACEMENT;
3435 SvUPGRADE(TARG,SVt_PV);
3437 if (value > 255 && !IN_BYTES) {
3438 SvGROW(TARG, (STRLEN)UNISKIP(value)+1);
3439 tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3440 SvCUR_set(TARG, tmps - SvPVX_const(TARG));
3442 (void)SvPOK_only(TARG);
3451 *tmps++ = (char)value;
3453 (void)SvPOK_only(TARG);
3455 if (PL_encoding && !IN_BYTES) {
3456 sv_recode_to_utf8(TARG, PL_encoding);
3458 if (SvCUR(TARG) == 0 || !is_utf8_string((U8*)tmps, SvCUR(TARG)) ||
3459 UNICODE_IS_REPLACEMENT(utf8_to_uvchr((U8*)tmps, NULL))) {
3463 *tmps++ = (char)value;
3479 const char *tmps = SvPV_const(left, len);
3481 if (DO_UTF8(left)) {
3482 /* If Unicode, try to downgrade.
3483 * If not possible, croak.
3484 * Yes, we made this up. */
3485 SV* const tsv = sv_2mortal(newSVsv(left));
3488 sv_utf8_downgrade(tsv, FALSE);
3489 tmps = SvPV_const(tsv, len);
3491 # ifdef USE_ITHREADS
3493 if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3494 /* This should be threadsafe because in ithreads there is only
3495 * one thread per interpreter. If this would not be true,
3496 * we would need a mutex to protect this malloc. */
3497 PL_reentrant_buffer->_crypt_struct_buffer =
3498 (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3499 #if defined(__GLIBC__) || defined(__EMX__)
3500 if (PL_reentrant_buffer->_crypt_struct_buffer) {
3501 PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3502 /* work around glibc-2.2.5 bug */
3503 PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3507 # endif /* HAS_CRYPT_R */
3508 # endif /* USE_ITHREADS */
3510 sv_setpv(TARG, fcrypt(tmps, SvPV_nolen_const(right)));
3512 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV_nolen_const(right)));
3518 "The crypt() function is unimplemented due to excessive paranoia.");
3530 bool inplace = TRUE;
3532 const int op_type = PL_op->op_type;
3535 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3541 s = (const U8*)SvPV_nomg_const(source, slen);
3543 if (ckWARN(WARN_UNINITIALIZED))
3544 report_uninit(source);
3549 if (slen && DO_UTF8(source) && UTF8_IS_START(*s)) {
3551 utf8_to_uvchr(s, &ulen);
3552 if (op_type == OP_UCFIRST) {
3553 toTITLE_utf8(s, tmpbuf, &tculen);
3555 toLOWER_utf8(s, tmpbuf, &tculen);
3557 /* If the two differ, we definately cannot do inplace. */
3558 inplace = (ulen == tculen);
3559 need = slen + 1 - ulen + tculen;
3565 if (SvPADTMP(source) && !SvREADONLY(source) && inplace && SvTEMP(source)) {
3566 /* We can convert in place. */
3569 s = d = (U8*)SvPV_force_nomg(source, slen);
3575 SvUPGRADE(dest, SVt_PV);
3576 d = (U8*)SvGROW(dest, need);
3577 (void)SvPOK_only(dest);
3586 /* slen is the byte length of the whole SV.
3587 * ulen is the byte length of the original Unicode character
3588 * stored as UTF-8 at s.
3589 * tculen is the byte length of the freshly titlecased (or
3590 * lowercased) Unicode character stored as UTF-8 at tmpbuf.
3591 * We first set the result to be the titlecased (/lowercased)
3592 * character, and then append the rest of the SV data. */
3593 sv_setpvn(dest, (char*)tmpbuf, tculen);
3595 sv_catpvn(dest, (char*)(s + ulen), slen - ulen);
3599 Copy(tmpbuf, d, tculen, U8);
3600 SvCUR_set(dest, need - 1);
3605 if (IN_LOCALE_RUNTIME) {
3608 *d = (op_type == OP_UCFIRST)
3609 ? toUPPER_LC(*s) : toLOWER_LC(*s);
3612 *d = (op_type == OP_UCFIRST) ? toUPPER(*s) : toLOWER(*s);
3614 /* See bug #39028 */
3622 /* This will copy the trailing NUL */
3623 Copy(s + 1, d + 1, slen, U8);
3624 SvCUR_set(dest, need - 1);
3631 /* There's so much setup/teardown code common between uc and lc, I wonder if
3632 it would be worth merging the two, and just having a switch outside each
3633 of the three tight loops. */
3647 if (SvPADTMP(source) && !SvREADONLY(source) && !SvAMAGIC(source)
3648 && SvTEMP(source) && !DO_UTF8(source)) {
3649 /* We can convert in place. */
3652 s = d = (U8*)SvPV_force_nomg(source, len);
3659 /* The old implementation would copy source into TARG at this point.
3660 This had the side effect that if source was undef, TARG was now
3661 an undefined SV with PADTMP set, and they don't warn inside
3662 sv_2pv_flags(). However, we're now getting the PV direct from
3663 source, which doesn't have PADTMP set, so it would warn. Hence the
3667 s = (const U8*)SvPV_nomg_const(source, len);
3669 if (ckWARN(WARN_UNINITIALIZED))
3670 report_uninit(source);
3676 SvUPGRADE(dest, SVt_PV);
3677 d = (U8*)SvGROW(dest, min);
3678 (void)SvPOK_only(dest);
3683 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
3684 to check DO_UTF8 again here. */
3686 if (DO_UTF8(source)) {
3687 const U8 *const send = s + len;
3688 U8 tmpbuf[UTF8_MAXBYTES+1];
3691 const STRLEN u = UTF8SKIP(s);
3694 toUPPER_utf8(s, tmpbuf, &ulen);
3695 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
3696 /* If the eventually required minimum size outgrows
3697 * the available space, we need to grow. */
3698 const UV o = d - (U8*)SvPVX_const(dest);
3700 /* If someone uppercases one million U+03B0s we SvGROW() one
3701 * million times. Or we could try guessing how much to
3702 allocate without allocating too much. Such is life. */
3704 d = (U8*)SvPVX(dest) + o;
3706 Copy(tmpbuf, d, ulen, U8);
3712 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3715 const U8 *const send = s + len;
3716 if (IN_LOCALE_RUNTIME) {
3719 for (; s < send; d++, s++)
3720 *d = toUPPER_LC(*s);
3723 for (; s < send; d++, s++)
3727 if (source != dest) {
3729 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3749 if (SvPADTMP(source) && !SvREADONLY(source) && !SvAMAGIC(source)
3750 && SvTEMP(source) && !DO_UTF8(source)) {
3751 /* We can convert in place. */
3754 s = d = (U8*)SvPV_force_nomg(source, len);
3761 /* The old implementation would copy source into TARG at this point.
3762 This had the side effect that if source was undef, TARG was now
3763 an undefined SV with PADTMP set, and they don't warn inside
3764 sv_2pv_flags(). However, we're now getting the PV direct from
3765 source, which doesn't have PADTMP set, so it would warn. Hence the
3769 s = (const U8*)SvPV_nomg_const(source, len);
3771 if (ckWARN(WARN_UNINITIALIZED))
3772 report_uninit(source);
3778 SvUPGRADE(dest, SVt_PV);
3779 d = (U8*)SvGROW(dest, min);
3780 (void)SvPOK_only(dest);
3785 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
3786 to check DO_UTF8 again here. */
3788 if (DO_UTF8(source)) {
3789 const U8 *const send = s + len;
3790 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3793 const STRLEN u = UTF8SKIP(s);
3795 const UV uv = toLOWER_utf8(s, tmpbuf, &ulen);
3797 #define GREEK_CAPITAL_LETTER_SIGMA 0x03A3 /* Unicode U+03A3 */
3798 if (uv == GREEK_CAPITAL_LETTER_SIGMA) {
3801 * Now if the sigma is NOT followed by
3802 * /$ignorable_sequence$cased_letter/;
3803 * and it IS preceded by /$cased_letter$ignorable_sequence/;
3804 * where $ignorable_sequence is [\x{2010}\x{AD}\p{Mn}]*
3805 * and $cased_letter is [\p{Ll}\p{Lo}\p{Lt}]
3806 * then it should be mapped to 0x03C2,
3807 * (GREEK SMALL LETTER FINAL SIGMA),
3808 * instead of staying 0x03A3.
3809 * "should be": in other words, this is not implemented yet.
3810 * See lib/unicore/SpecialCasing.txt.
3813 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
3814 /* If the eventually required minimum size outgrows
3815 * the available space, we need to grow. */
3816 const UV o = d - (U8*)SvPVX_const(dest);
3818 /* If someone lowercases one million U+0130s we SvGROW() one
3819 * million times. Or we could try guessing how much to
3820 allocate without allocating too much. Such is life. */
3822 d = (U8*)SvPVX(dest) + o;
3824 Copy(tmpbuf, d, ulen, U8);
3830 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3833 const U8 *const send = s + len;
3834 if (IN_LOCALE_RUNTIME) {
3837 for (; s < send; d++, s++)
3838 *d = toLOWER_LC(*s);
3841 for (; s < send; d++, s++)
3845 if (source != dest) {
3847 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3857 SV * const sv = TOPs;
3859 register const char *s = SvPV_const(sv,len);
3861 SvUTF8_off(TARG); /* decontaminate */
3864 SvUPGRADE(TARG, SVt_PV);
3865 SvGROW(TARG, (len * 2) + 1);
3869 if (UTF8_IS_CONTINUED(*s)) {
3870 STRLEN ulen = UTF8SKIP(s);
3894 SvCUR_set(TARG, d - SvPVX_const(TARG));
3895 (void)SvPOK_only_UTF8(TARG);
3898 sv_setpvn(TARG, s, len);
3900 if (SvSMAGICAL(TARG))
3909 dVAR; dSP; dMARK; dORIGMARK;
3910 register AV *const av = MUTABLE_AV(POPs);
3911 register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3913 if (SvTYPE(av) == SVt_PVAV) {
3914 const I32 arybase = CopARYBASE_get(PL_curcop);
3915 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
3918 for (svp = MARK + 1; svp <= SP; svp++) {
3919 const I32 elem = SvIV(*svp);
3923 if (max > AvMAX(av))
3926 while (++MARK <= SP) {
3928 I32 elem = SvIV(*MARK);
3932 svp = av_fetch(av, elem, lval);
3934 if (!svp || *svp == &PL_sv_undef)
3935 DIE(aTHX_ PL_no_aelem, elem);
3936 if (PL_op->op_private & OPpLVAL_INTRO)
3937 save_aelem(av, elem, svp);
3939 *MARK = svp ? *svp : &PL_sv_undef;
3942 if (GIMME != G_ARRAY) {
3944 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
3954 AV *array = MUTABLE_AV(POPs);
3955 const I32 gimme = GIMME_V;
3956 IV *iterp = Perl_av_iter_p(aTHX_ array);
3957 const IV current = (*iterp)++;
3959 if (current > av_len(array)) {
3961 if (gimme == G_SCALAR)
3968 mPUSHi(CopARYBASE_get(PL_curcop) + current);
3969 if (gimme == G_ARRAY) {
3970 SV **const element = av_fetch(array, current, 0);
3971 PUSHs(element ? *element : &PL_sv_undef);
3980 AV *array = MUTABLE_AV(POPs);
3981 const I32 gimme = GIMME_V;
3983 *Perl_av_iter_p(aTHX_ array) = 0;
3985 if (gimme == G_SCALAR) {
3987 PUSHi(av_len(array) + 1);
3989 else if (gimme == G_ARRAY) {
3990 IV n = Perl_av_len(aTHX_ array);
3991 IV i = CopARYBASE_get(PL_curcop);
3995 if (PL_op->op_type == OP_AKEYS) {
3997 for (; i <= n; i++) {
4002 for (i = 0; i <= n; i++) {
4003 SV *const *const elem = Perl_av_fetch(aTHX_ array, i, 0);
4004 PUSHs(elem ? *elem : &PL_sv_undef);
4011 /* Associative arrays. */
4017 HV * hash = MUTABLE_HV(POPs);
4019 const I32 gimme = GIMME_V;
4022 /* might clobber stack_sp */
4023 entry = hv_iternext(hash);
4028 SV* const sv = hv_iterkeysv(entry);
4029 PUSHs(sv); /* won't clobber stack_sp */
4030 if (gimme == G_ARRAY) {
4033 /* might clobber stack_sp */
4034 val = hv_iterval(hash, entry);
4039 else if (gimme == G_SCALAR)
4049 const I32 gimme = GIMME_V;
4050 const I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
4052 if (PL_op->op_private & OPpSLICE) {
4054 HV * const hv = MUTABLE_HV(POPs);
4055 const U32 hvtype = SvTYPE(hv);
4056 if (hvtype == SVt_PVHV) { /* hash element */
4057 while (++MARK <= SP) {
4058 SV * const sv = hv_delete_ent(hv, *MARK, discard, 0);
4059 *MARK = sv ? sv : &PL_sv_undef;
4062 else if (hvtype == SVt_PVAV) { /* array element */
4063 if (PL_op->op_flags & OPf_SPECIAL) {
4064 while (++MARK <= SP) {
4065 SV * const sv = av_delete(MUTABLE_AV(hv), SvIV(*MARK), discard);
4066 *MARK = sv ? sv : &PL_sv_undef;
4071 DIE(aTHX_ "Not a HASH reference");
4074 else if (gimme == G_SCALAR) {
4079 *++MARK = &PL_sv_undef;
4085 HV * const hv = MUTABLE_HV(POPs);
4087 if (SvTYPE(hv) == SVt_PVHV)
4088 sv = hv_delete_ent(hv, keysv, discard, 0);
4089 else if (SvTYPE(hv) == SVt_PVAV) {
4090 if (PL_op->op_flags & OPf_SPECIAL)
4091 sv = av_delete(MUTABLE_AV(hv), SvIV(keysv), discard);
4093 DIE(aTHX_ "panic: avhv_delete no longer supported");
4096 DIE(aTHX_ "Not a HASH reference");
4112 if (PL_op->op_private & OPpEXISTS_SUB) {
4114 SV * const sv = POPs;
4115 CV * const cv = sv_2cv(sv, &hv, &gv, 0);
4118 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
4123 hv = MUTABLE_HV(POPs);
4124 if (SvTYPE(hv) == SVt_PVHV) {
4125 if (hv_exists_ent(hv, tmpsv, 0))
4128 else if (SvTYPE(hv) == SVt_PVAV) {
4129 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
4130 if (av_exists(MUTABLE_AV(hv), SvIV(tmpsv)))
4135 DIE(aTHX_ "Not a HASH reference");
4142 dVAR; dSP; dMARK; dORIGMARK;
4143 register HV * const hv = MUTABLE_HV(POPs);
4144 register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
4145 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
4146 bool other_magic = FALSE;
4152 other_magic = mg_find((const SV *)hv, PERL_MAGIC_env) ||
4153 ((mg = mg_find((const SV *)hv, PERL_MAGIC_tied))
4154 /* Try to preserve the existenceness of a tied hash
4155 * element by using EXISTS and DELETE if possible.
4156 * Fallback to FETCH and STORE otherwise */
4157 && (stash = SvSTASH(SvRV(SvTIED_obj(MUTABLE_SV(hv), mg))))
4158 && gv_fetchmethod_autoload(stash, "EXISTS", TRUE)
4159 && gv_fetchmethod_autoload(stash, "DELETE", TRUE));
4162 while (++MARK <= SP) {
4163 SV * const keysv = *MARK;
4166 bool preeminent = FALSE;
4169 preeminent = SvRMAGICAL(hv) && !other_magic ? 1 :
4170 hv_exists_ent(hv, keysv, 0);
4173 he = hv_fetch_ent(hv, keysv, lval, 0);
4174 svp = he ? &HeVAL(he) : NULL;
4177 if (!svp || *svp == &PL_sv_undef) {
4178 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
4181 if (HvNAME_get(hv) && isGV(*svp))
4182 save_gp(MUTABLE_GV(*svp), !(PL_op->op_flags & OPf_SPECIAL));
4185 save_helem(hv, keysv, svp);
4188 const char * const key = SvPV_const(keysv, keylen);
4189 SAVEDELETE(hv, savepvn(key,keylen),
4190 SvUTF8(keysv) ? -(I32)keylen : (I32)keylen);
4195 *MARK = svp ? *svp : &PL_sv_undef;
4197 if (GIMME != G_ARRAY) {
4199 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
4205 /* List operators. */
4210 if (GIMME != G_ARRAY) {
4212 *MARK = *SP; /* unwanted list, return last item */
4214 *MARK = &PL_sv_undef;
4224 SV ** const lastrelem = PL_stack_sp;
4225 SV ** const lastlelem = PL_stack_base + POPMARK;
4226 SV ** const firstlelem = PL_stack_base + POPMARK + 1;
4227 register SV ** const firstrelem = lastlelem + 1;
4228 const I32 arybase = CopARYBASE_get(PL_curcop);
4229 I32 is_something_there = FALSE;
4231 register const I32 max = lastrelem - lastlelem;
4232 register SV **lelem;
4234 if (GIMME != G_ARRAY) {
4235 I32 ix = SvIV(*lastlelem);
4240 if (ix < 0 || ix >= max)
4241 *firstlelem = &PL_sv_undef;
4243 *firstlelem = firstrelem[ix];
4249 SP = firstlelem - 1;
4253 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
4254 I32 ix = SvIV(*lelem);
4259 if (ix < 0 || ix >= max)
4260 *lelem = &PL_sv_undef;
4262 is_something_there = TRUE;
4263 if (!(*lelem = firstrelem[ix]))
4264 *lelem = &PL_sv_undef;
4267 if (is_something_there)
4270 SP = firstlelem - 1;
4276 dVAR; dSP; dMARK; dORIGMARK;
4277 const I32 items = SP - MARK;
4278 SV * const av = MUTABLE_SV(av_make(items, MARK+1));
4279 SP = ORIGMARK; /* av_make() might realloc stack_sp */
4280 mXPUSHs((PL_op->op_flags & OPf_SPECIAL)
4281 ? newRV_noinc(av) : av);
4287 dVAR; dSP; dMARK; dORIGMARK;
4288 HV* const hv = newHV();
4291 SV * const key = *++MARK;
4292 SV * const val = newSV(0);
4294 sv_setsv(val, *++MARK);
4295 else if (ckWARN(WARN_MISC))
4296 Perl_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
4297 (void)hv_store_ent(hv,key,val,0);
4300 mXPUSHs((PL_op->op_flags & OPf_SPECIAL)
4301 ? newRV_noinc(MUTABLE_SV(hv)) : MUTABLE_SV(hv));
4307 dVAR; dSP; dMARK; dORIGMARK;
4308 register AV *ary = MUTABLE_AV(*++MARK);
4312 register I32 offset;
4313 register I32 length;
4317 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
4320 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
4324 call_method("SPLICE",GIMME_V);
4333 offset = i = SvIV(*MARK);
4335 offset += AvFILLp(ary) + 1;
4337 offset -= CopARYBASE_get(PL_curcop);
4339 DIE(aTHX_ PL_no_aelem, i);
4341 length = SvIVx(*MARK++);
4343 length += AvFILLp(ary) - offset + 1;
4349 length = AvMAX(ary) + 1; /* close enough to infinity */
4353 length = AvMAX(ary) + 1;
4355 if (offset > AvFILLp(ary) + 1) {
4356 if (ckWARN(WARN_MISC))
4357 Perl_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
4358 offset = AvFILLp(ary) + 1;
4360 after = AvFILLp(ary) + 1 - (offset + length);
4361 if (after < 0) { /* not that much array */
4362 length += after; /* offset+length now in array */
4368 /* At this point, MARK .. SP-1 is our new LIST */
4371 diff = newlen - length;
4372 if (newlen && !AvREAL(ary) && AvREIFY(ary))
4375 /* make new elements SVs now: avoid problems if they're from the array */
4376 for (dst = MARK, i = newlen; i; i--) {
4377 SV * const h = *dst;
4378 *dst++ = newSVsv(h);
4381 if (diff < 0) { /* shrinking the area */
4382 SV **tmparyval = NULL;
4384 Newx(tmparyval, newlen, SV*); /* so remember insertion */
4385 Copy(MARK, tmparyval, newlen, SV*);
4388 MARK = ORIGMARK + 1;
4389 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4390 MEXTEND(MARK, length);
4391 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
4393 EXTEND_MORTAL(length);
4394 for (i = length, dst = MARK; i; i--) {
4395 sv_2mortal(*dst); /* free them eventualy */
4402 *MARK = AvARRAY(ary)[offset+length-1];
4405 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
4406 SvREFCNT_dec(*dst++); /* free them now */
4409 AvFILLp(ary) += diff;
4411 /* pull up or down? */
4413 if (offset < after) { /* easier to pull up */
4414 if (offset) { /* esp. if nothing to pull */
4415 src = &AvARRAY(ary)[offset-1];
4416 dst = src - diff; /* diff is negative */
4417 for (i = offset; i > 0; i--) /* can't trust Copy */
4421 AvARRAY(ary) = AvARRAY(ary) - diff; /* diff is negative */
4425 if (after) { /* anything to pull down? */
4426 src = AvARRAY(ary) + offset + length;
4427 dst = src + diff; /* diff is negative */
4428 Move(src, dst, after, SV*);
4430 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
4431 /* avoid later double free */
4435 dst[--i] = &PL_sv_undef;
4438 Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
4439 Safefree(tmparyval);
4442 else { /* no, expanding (or same) */
4443 SV** tmparyval = NULL;
4445 Newx(tmparyval, length, SV*); /* so remember deletion */
4446 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
4449 if (diff > 0) { /* expanding */
4450 /* push up or down? */
4451 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
4455 Move(src, dst, offset, SV*);
4457 AvARRAY(ary) = AvARRAY(ary) - diff;/* diff is positive */
4459 AvFILLp(ary) += diff;
4462 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
4463 av_extend(ary, AvFILLp(ary) + diff);
4464 AvFILLp(ary) += diff;
4467 dst = AvARRAY(ary) + AvFILLp(ary);
4469 for (i = after; i; i--) {
4477 Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
4480 MARK = ORIGMARK + 1;
4481 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4483 Copy(tmparyval, MARK, length, SV*);
4485 EXTEND_MORTAL(length);
4486 for (i = length, dst = MARK; i; i--) {
4487 sv_2mortal(*dst); /* free them eventualy */
4494 else if (length--) {
4495 *MARK = tmparyval[length];
4498 while (length-- > 0)
4499 SvREFCNT_dec(tmparyval[length]);
4503 *MARK = &PL_sv_undef;
4504 Safefree(tmparyval);
4512 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4513 register AV * const ary = MUTABLE_AV(*++MARK);
4514 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
4517 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
4521 call_method("PUSH",G_SCALAR|G_DISCARD);
4525 PUSHi( AvFILL(ary) + 1 );
4528 PL_delaymagic = DM_DELAY;
4529 for (++MARK; MARK <= SP; MARK++) {
4530 SV * const sv = newSV(0);
4532 sv_setsv(sv, *MARK);
4533 av_store(ary, AvFILLp(ary)+1, sv);
4535 if (PL_delaymagic & DM_ARRAY)
4536 mg_set(MUTABLE_SV(ary));
4540 PUSHi( AvFILLp(ary) + 1 );
4549 AV * const av = MUTABLE_AV(POPs);
4550 SV * const sv = PL_op->op_type == OP_SHIFT ? av_shift(av) : av_pop(av);
4554 (void)sv_2mortal(sv);
4561 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4562 register AV *ary = MUTABLE_AV(*++MARK);
4563 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
4566 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
4570 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
4576 av_unshift(ary, SP - MARK);
4578 SV * const sv = newSVsv(*++MARK);
4579 (void)av_store(ary, i++, sv);
4583 PUSHi( AvFILL(ary) + 1 );
4590 SV ** const oldsp = SP;
4592 if (GIMME == G_ARRAY) {
4595 register SV * const tmp = *MARK;
4599 /* safe as long as stack cannot get extended in the above */
4604 register char *down;
4608 PADOFFSET padoff_du;
4610 SvUTF8_off(TARG); /* decontaminate */
4612 do_join(TARG, &PL_sv_no, MARK, SP);
4614 sv_setsv(TARG, (SP > MARK)
4616 : (padoff_du = find_rundefsvoffset(),
4617 (padoff_du == NOT_IN_PAD
4618 || PAD_COMPNAME_FLAGS_isOUR(padoff_du))
4619 ? DEFSV : PAD_SVl(padoff_du)));
4621 if (! SvOK(TARG) && ckWARN(WARN_UNINITIALIZED))
4622 report_uninit(TARG);
4625 up = SvPV_force(TARG, len);
4627 if (DO_UTF8(TARG)) { /* first reverse each character */
4628 U8* s = (U8*)SvPVX(TARG);
4629 const U8* send = (U8*)(s + len);
4631 if (UTF8_IS_INVARIANT(*s)) {
4636 if (!utf8_to_uvchr(s, 0))
4640 down = (char*)(s - 1);
4641 /* reverse this character */
4645 *down-- = (char)tmp;
4651 down = SvPVX(TARG) + len - 1;
4655 *down-- = (char)tmp;
4657 (void)SvPOK_only_UTF8(TARG);
4669 register IV limit = POPi; /* note, negative is forever */
4670 SV * const sv = POPs;
4672 register const char *s = SvPV_const(sv, len);
4673 const bool do_utf8 = DO_UTF8(sv);
4674 const char *strend = s + len;
4676 register REGEXP *rx;
4678 register const char *m;
4680 const STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (STRLEN)(strend - s);
4681 I32 maxiters = slen + 10;
4683 const I32 origlimit = limit;
4686 const I32 gimme = GIMME_V;
4687 const I32 oldsave = PL_savestack_ix;
4688 U32 make_mortal = SVs_TEMP;
4693 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4698 DIE(aTHX_ "panic: pp_split");
4701 TAINT_IF((RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) &&
4702 (RX_EXTFLAGS(rx) & (RXf_WHITE | RXf_SKIPWHITE)));
4704 RX_MATCH_UTF8_set(rx, do_utf8);
4707 if (pm->op_pmreplrootu.op_pmtargetoff) {
4708 ary = GvAVn(MUTABLE_GV(PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff)));
4711 if (pm->op_pmreplrootu.op_pmtargetgv) {
4712 ary = GvAVn(pm->op_pmreplrootu.op_pmtargetgv);
4715 else if (gimme != G_ARRAY)
4716 ary = GvAVn(PL_defgv);
4719 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4725 if ((mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied))) {
4727 XPUSHs(SvTIED_obj(MUTABLE_SV(ary), mg));
4734 for (i = AvFILLp(ary); i >= 0; i--)
4735 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
4737 /* temporarily switch stacks */
4738 SAVESWITCHSTACK(PL_curstack, ary);
4742 base = SP - PL_stack_base;
4744 if (RX_EXTFLAGS(rx) & RXf_SKIPWHITE) {
4746 while (*s == ' ' || is_utf8_space((U8*)s))
4749 else if (RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) {
4750 while (isSPACE_LC(*s))
4758 if (RX_EXTFLAGS(rx) & PMf_MULTILINE) {
4763 limit = maxiters + 2;
4764 if (RX_EXTFLAGS(rx) & RXf_WHITE) {
4767 /* this one uses 'm' and is a negative test */
4769 while (m < strend && !( *m == ' ' || is_utf8_space((U8*)m) )) {
4770 const int t = UTF8SKIP(m);
4771 /* is_utf8_space returns FALSE for malform utf8 */
4777 } else if (RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) {
4778 while (m < strend && !isSPACE_LC(*m))
4781 while (m < strend && !isSPACE(*m))
4787 dstr = newSVpvn_flags(s, m-s,
4788 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
4791 /* skip the whitespace found last */
4793 s = m + UTF8SKIP(m);
4797 /* this one uses 's' and is a positive test */
4799 while (s < strend && ( *s == ' ' || is_utf8_space((U8*)s) ))
4801 } else if (RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) {
4802 while (s < strend && isSPACE_LC(*s))
4805 while (s < strend && isSPACE(*s))
4810 else if (RX_EXTFLAGS(rx) & RXf_START_ONLY) {
4812 for (m = s; m < strend && *m != '\n'; m++)
4817 dstr = newSVpvn_flags(s, m-s,
4818 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
4823 else if (RX_EXTFLAGS(rx) & RXf_NULL && !(s >= strend)) {
4825 Pre-extend the stack, either the number of bytes or
4826 characters in the string or a limited amount, triggered by:
4828 my ($x, $y) = split //, $str;
4832 const U32 items = limit - 1;
4840 /* keep track of how many bytes we skip over */
4843 dstr = newSVpvn_flags(m, s-m, SVf_UTF8 | make_mortal);
4852 dstr = newSVpvn(s, 1);
4866 else if (do_utf8 == (RX_UTF8(rx) != 0) &&
4867 (RX_EXTFLAGS(rx) & RXf_USE_INTUIT) && !RX_NPARENS(rx)
4868 && (RX_EXTFLAGS(rx) & RXf_CHECK_ALL)
4869 && !(RX_EXTFLAGS(rx) & RXf_ANCH)) {
4870 const int tail = (RX_EXTFLAGS(rx) & RXf_INTUIT_TAIL);
4871 SV * const csv = CALLREG_INTUIT_STRING(rx);
4873 len = RX_MINLENRET(rx);
4874 if (len == 1 && !RX_UTF8(rx) && !tail) {
4875 const char c = *SvPV_nolen_const(csv);
4877 for (m = s; m < strend && *m != c; m++)
4881 dstr = newSVpvn_flags(s, m-s,
4882 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
4884 /* The rx->minlen is in characters but we want to step
4885 * s ahead by bytes. */
4887 s = (char*)utf8_hop((U8*)m, len);
4889 s = m + len; /* Fake \n at the end */
4893 while (s < strend && --limit &&
4894 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
4895 csv, multiline ? FBMrf_MULTILINE : 0)) )
4897 dstr = newSVpvn_flags(s, m-s,
4898 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
4900 /* The rx->minlen is in characters but we want to step
4901 * s ahead by bytes. */
4903 s = (char*)utf8_hop((U8*)m, len);
4905 s = m + len; /* Fake \n at the end */
4910 maxiters += slen * RX_NPARENS(rx);
4911 while (s < strend && --limit)
4915 rex_return = CALLREGEXEC(rx, (char*)s, (char*)strend, (char*)orig, 1 ,
4918 if (rex_return == 0)
4920 TAINT_IF(RX_MATCH_TAINTED(rx));
4921 if (RX_MATCH_COPIED(rx) && RX_SUBBEG(rx) != orig) {
4924 orig = RX_SUBBEG(rx);
4926 strend = s + (strend - m);
4928 m = RX_OFFS(rx)[0].start + orig;
4929 dstr = newSVpvn_flags(s, m-s,
4930 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
4932 if (RX_NPARENS(rx)) {
4934 for (i = 1; i <= (I32)RX_NPARENS(rx); i++) {
4935 s = RX_OFFS(rx)[i].start + orig;
4936 m = RX_OFFS(rx)[i].end + orig;
4938 /* japhy (07/27/01) -- the (m && s) test doesn't catch
4939 parens that didn't match -- they should be set to
4940 undef, not the empty string */
4941 if (m >= orig && s >= orig) {
4942 dstr = newSVpvn_flags(s, m-s,
4943 (do_utf8 ? SVf_UTF8 : 0)
4947 dstr = &PL_sv_undef; /* undef, not "" */
4951 s = RX_OFFS(rx)[0].end + orig;
4955 iters = (SP - PL_stack_base) - base;
4956 if (iters > maxiters)
4957 DIE(aTHX_ "Split loop");
4959 /* keep field after final delim? */
4960 if (s < strend || (iters && origlimit)) {
4961 const STRLEN l = strend - s;
4962 dstr = newSVpvn_flags(s, l, (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
4966 else if (!origlimit) {
4967 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
4968 if (TOPs && !make_mortal)
4971 *SP-- = &PL_sv_undef;
4976 LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */
4980 if (SvSMAGICAL(ary)) {
4982 mg_set(MUTABLE_SV(ary));
4985 if (gimme == G_ARRAY) {
4987 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4995 call_method("PUSH",G_SCALAR|G_DISCARD);
4998 if (gimme == G_ARRAY) {
5000 /* EXTEND should not be needed - we just popped them */
5002 for (i=0; i < iters; i++) {
5003 SV **svp = av_fetch(ary, i, FALSE);
5004 PUSHs((svp) ? *svp : &PL_sv_undef);
5011 if (gimme == G_ARRAY)
5023 SV *const sv = PAD_SVl(PL_op->op_targ);
5025 if (SvPADSTALE(sv)) {
5028 RETURNOP(cLOGOP->op_other);
5030 RETURNOP(cLOGOP->op_next);
5040 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
5041 || SvTYPE(retsv) == SVt_PVCV) {
5042 retsv = refto(retsv);
5049 PP(unimplemented_op)
5052 DIE(aTHX_ "panic: unimplemented op %s (#%d) called", OP_NAME(PL_op),
5058 * c-indentation-style: bsd
5060 * indent-tabs-mode: t
5063 * ex: set ts=8 sts=4 sw=4 noet: