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 = (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);
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((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((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 = (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((GV*)sv)) && HvNAME_get(stash))
837 mro_isa_changed_in(stash);
838 /* undef *Pkg::meth_name ... */
839 else if(GvCVu((GV*)sv) && (stash = GvSTASH((GV*)sv)) && HvNAME_get(stash))
840 mro_method_changed_in(stash);
844 GvGP(sv) = gp_ref(gp);
846 GvLINE(sv) = CopLINE(PL_curcop);
853 if (SvTYPE(sv) >= SVt_PV && SvPVX_const(sv) && SvLEN(sv)) {
868 if (SvTYPE(TOPs) >= SVt_PVAV || isGV_with_GP(TOPs))
869 DIE(aTHX_ PL_no_modify);
870 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
871 && SvIVX(TOPs) != IV_MIN)
873 SvIV_set(TOPs, SvIVX(TOPs) - 1);
874 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
885 if (SvTYPE(TOPs) >= SVt_PVAV || isGV_with_GP(TOPs))
886 DIE(aTHX_ PL_no_modify);
887 sv_setsv(TARG, TOPs);
888 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
889 && SvIVX(TOPs) != IV_MAX)
891 SvIV_set(TOPs, SvIVX(TOPs) + 1);
892 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
897 /* special case for undef: see thread at 2003-03/msg00536.html in archive */
907 if (SvTYPE(TOPs) >= SVt_PVAV || isGV_with_GP(TOPs))
908 DIE(aTHX_ PL_no_modify);
909 sv_setsv(TARG, TOPs);
910 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
911 && SvIVX(TOPs) != IV_MIN)
913 SvIV_set(TOPs, SvIVX(TOPs) - 1);
914 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
923 /* Ordinary operators. */
927 dVAR; dSP; dATARGET; SV *svl, *svr;
928 #ifdef PERL_PRESERVE_IVUV
931 tryAMAGICbin(pow,opASSIGN);
932 svl = sv_2num(TOPm1s);
934 #ifdef PERL_PRESERVE_IVUV
935 /* For integer to integer power, we do the calculation by hand wherever
936 we're sure it is safe; otherwise we call pow() and try to convert to
937 integer afterwards. */
950 const IV iv = SvIVX(svr);
954 goto float_it; /* Can't do negative powers this way. */
958 baseuok = SvUOK(svl);
962 const IV iv = SvIVX(svl);
965 baseuok = TRUE; /* effectively it's a UV now */
967 baseuv = -iv; /* abs, baseuok == false records sign */
970 /* now we have integer ** positive integer. */
973 /* foo & (foo - 1) is zero only for a power of 2. */
974 if (!(baseuv & (baseuv - 1))) {
975 /* We are raising power-of-2 to a positive integer.
976 The logic here will work for any base (even non-integer
977 bases) but it can be less accurate than
978 pow (base,power) or exp (power * log (base)) when the
979 intermediate values start to spill out of the mantissa.
980 With powers of 2 we know this can't happen.
981 And powers of 2 are the favourite thing for perl
982 programmers to notice ** not doing what they mean. */
984 NV base = baseuok ? baseuv : -(NV)baseuv;
989 while (power >>= 1) {
1000 register unsigned int highbit = 8 * sizeof(UV);
1001 register unsigned int diff = 8 * sizeof(UV);
1002 while (diff >>= 1) {
1004 if (baseuv >> highbit) {
1008 /* we now have baseuv < 2 ** highbit */
1009 if (power * highbit <= 8 * sizeof(UV)) {
1010 /* result will definitely fit in UV, so use UV math
1011 on same algorithm as above */
1012 register UV result = 1;
1013 register UV base = baseuv;
1014 const bool odd_power = (bool)(power & 1);
1018 while (power >>= 1) {
1025 if (baseuok || !odd_power)
1026 /* answer is positive */
1028 else if (result <= (UV)IV_MAX)
1029 /* answer negative, fits in IV */
1030 SETi( -(IV)result );
1031 else if (result == (UV)IV_MIN)
1032 /* 2's complement assumption: special case IV_MIN */
1035 /* answer negative, doesn't fit */
1036 SETn( -(NV)result );
1046 NV right = SvNV(svr);
1047 NV left = SvNV(svl);
1050 #if defined(USE_LONG_DOUBLE) && defined(HAS_AIX_POWL_NEG_BASE_BUG)
1052 We are building perl with long double support and are on an AIX OS
1053 afflicted with a powl() function that wrongly returns NaNQ for any
1054 negative base. This was reported to IBM as PMR #23047-379 on
1055 03/06/2006. The problem exists in at least the following versions
1056 of AIX and the libm fileset, and no doubt others as well:
1058 AIX 4.3.3-ML10 bos.adt.libm 4.3.3.50
1059 AIX 5.1.0-ML04 bos.adt.libm 5.1.0.29
1060 AIX 5.2.0 bos.adt.libm 5.2.0.85
1062 So, until IBM fixes powl(), we provide the following workaround to
1063 handle the problem ourselves. Our logic is as follows: for
1064 negative bases (left), we use fmod(right, 2) to check if the
1065 exponent is an odd or even integer:
1067 - if odd, powl(left, right) == -powl(-left, right)
1068 - if even, powl(left, right) == powl(-left, right)
1070 If the exponent is not an integer, the result is rightly NaNQ, so
1071 we just return that (as NV_NAN).
1075 NV mod2 = Perl_fmod( right, 2.0 );
1076 if (mod2 == 1.0 || mod2 == -1.0) { /* odd integer */
1077 SETn( -Perl_pow( -left, right) );
1078 } else if (mod2 == 0.0) { /* even integer */
1079 SETn( Perl_pow( -left, right) );
1080 } else { /* fractional power */
1084 SETn( Perl_pow( left, right) );
1087 SETn( Perl_pow( left, right) );
1088 #endif /* HAS_AIX_POWL_NEG_BASE_BUG */
1090 #ifdef PERL_PRESERVE_IVUV
1100 dVAR; dSP; dATARGET; SV *svl, *svr;
1101 tryAMAGICbin(mult,opASSIGN);
1102 svl = sv_2num(TOPm1s);
1103 svr = sv_2num(TOPs);
1104 #ifdef PERL_PRESERVE_IVUV
1107 /* Unless the left argument is integer in range we are going to have to
1108 use NV maths. Hence only attempt to coerce the right argument if
1109 we know the left is integer. */
1110 /* Left operand is defined, so is it IV? */
1113 bool auvok = SvUOK(svl);
1114 bool buvok = SvUOK(svr);
1115 const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
1116 const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
1125 const IV aiv = SvIVX(svl);
1128 auvok = TRUE; /* effectively it's a UV now */
1130 alow = -aiv; /* abs, auvok == false records sign */
1136 const IV biv = SvIVX(svr);
1139 buvok = TRUE; /* effectively it's a UV now */
1141 blow = -biv; /* abs, buvok == false records sign */
1145 /* If this does sign extension on unsigned it's time for plan B */
1146 ahigh = alow >> (4 * sizeof (UV));
1148 bhigh = blow >> (4 * sizeof (UV));
1150 if (ahigh && bhigh) {
1152 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
1153 which is overflow. Drop to NVs below. */
1154 } else if (!ahigh && !bhigh) {
1155 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
1156 so the unsigned multiply cannot overflow. */
1157 const UV product = alow * blow;
1158 if (auvok == buvok) {
1159 /* -ve * -ve or +ve * +ve gives a +ve result. */
1163 } else if (product <= (UV)IV_MIN) {
1164 /* 2s complement assumption that (UV)-IV_MIN is correct. */
1165 /* -ve result, which could overflow an IV */
1167 SETi( -(IV)product );
1169 } /* else drop to NVs below. */
1171 /* One operand is large, 1 small */
1174 /* swap the operands */
1176 bhigh = blow; /* bhigh now the temp var for the swap */
1180 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1181 multiplies can't overflow. shift can, add can, -ve can. */
1182 product_middle = ahigh * blow;
1183 if (!(product_middle & topmask)) {
1184 /* OK, (ahigh * blow) won't lose bits when we shift it. */
1186 product_middle <<= (4 * sizeof (UV));
1187 product_low = alow * blow;
1189 /* as for pp_add, UV + something mustn't get smaller.
1190 IIRC ANSI mandates this wrapping *behaviour* for
1191 unsigned whatever the actual representation*/
1192 product_low += product_middle;
1193 if (product_low >= product_middle) {
1194 /* didn't overflow */
1195 if (auvok == buvok) {
1196 /* -ve * -ve or +ve * +ve gives a +ve result. */
1198 SETu( product_low );
1200 } else if (product_low <= (UV)IV_MIN) {
1201 /* 2s complement assumption again */
1202 /* -ve result, which could overflow an IV */
1204 SETi( -(IV)product_low );
1206 } /* else drop to NVs below. */
1208 } /* product_middle too large */
1209 } /* ahigh && bhigh */
1214 NV right = SvNV(svr);
1215 NV left = SvNV(svl);
1217 SETn( left * right );
1224 dVAR; dSP; dATARGET; SV *svl, *svr;
1225 tryAMAGICbin(div,opASSIGN);
1226 svl = sv_2num(TOPm1s);
1227 svr = sv_2num(TOPs);
1228 /* Only try to do UV divide first
1229 if ((SLOPPYDIVIDE is true) or
1230 (PERL_PRESERVE_IVUV is true and one or both SV is a UV too large
1232 The assumption is that it is better to use floating point divide
1233 whenever possible, only doing integer divide first if we can't be sure.
1234 If NV_PRESERVES_UV is true then we know at compile time that no UV
1235 can be too large to preserve, so don't need to compile the code to
1236 test the size of UVs. */
1239 # define PERL_TRY_UV_DIVIDE
1240 /* ensure that 20./5. == 4. */
1242 # ifdef PERL_PRESERVE_IVUV
1243 # ifndef NV_PRESERVES_UV
1244 # define PERL_TRY_UV_DIVIDE
1249 #ifdef PERL_TRY_UV_DIVIDE
1254 bool left_non_neg = SvUOK(svl);
1255 bool right_non_neg = SvUOK(svr);
1259 if (right_non_neg) {
1263 const IV biv = SvIVX(svr);
1266 right_non_neg = TRUE; /* effectively it's a UV now */
1272 /* historically undef()/0 gives a "Use of uninitialized value"
1273 warning before dieing, hence this test goes here.
1274 If it were immediately before the second SvIV_please, then
1275 DIE() would be invoked before left was even inspected, so
1276 no inpsection would give no warning. */
1278 DIE(aTHX_ "Illegal division by zero");
1284 const IV aiv = SvIVX(svl);
1287 left_non_neg = TRUE; /* effectively it's a UV now */
1296 /* For sloppy divide we always attempt integer division. */
1298 /* Otherwise we only attempt it if either or both operands
1299 would not be preserved by an NV. If both fit in NVs
1300 we fall through to the NV divide code below. However,
1301 as left >= right to ensure integer result here, we know that
1302 we can skip the test on the right operand - right big
1303 enough not to be preserved can't get here unless left is
1306 && (left > ((UV)1 << NV_PRESERVES_UV_BITS))
1309 /* Integer division can't overflow, but it can be imprecise. */
1310 const UV result = left / right;
1311 if (result * right == left) {
1312 SP--; /* result is valid */
1313 if (left_non_neg == right_non_neg) {
1314 /* signs identical, result is positive. */
1318 /* 2s complement assumption */
1319 if (result <= (UV)IV_MIN)
1320 SETi( -(IV)result );
1322 /* It's exact but too negative for IV. */
1323 SETn( -(NV)result );
1326 } /* tried integer divide but it was not an integer result */
1327 } /* else (PERL_ABS(result) < 1.0) or (both UVs in range for NV) */
1328 } /* left wasn't SvIOK */
1329 } /* right wasn't SvIOK */
1330 #endif /* PERL_TRY_UV_DIVIDE */
1332 NV right = SvNV(svr);
1333 NV left = SvNV(svl);
1334 (void)POPs;(void)POPs;
1335 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1336 if (! Perl_isnan(right) && right == 0.0)
1340 DIE(aTHX_ "Illegal division by zero");
1341 PUSHn( left / right );
1348 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1352 bool left_neg = FALSE;
1353 bool right_neg = FALSE;
1354 bool use_double = FALSE;
1355 bool dright_valid = FALSE;
1359 SV * const svr = sv_2num(TOPs);
1362 right_neg = !SvUOK(svr);
1366 const IV biv = SvIVX(svr);
1369 right_neg = FALSE; /* effectively it's a UV now */
1377 right_neg = dright < 0;
1380 if (dright < UV_MAX_P1) {
1381 right = U_V(dright);
1382 dright_valid = TRUE; /* In case we need to use double below. */
1389 /* At this point use_double is only true if right is out of range for
1390 a UV. In range NV has been rounded down to nearest UV and
1391 use_double false. */
1392 svl = sv_2num(TOPs);
1394 if (!use_double && SvIOK(svl)) {
1396 left_neg = !SvUOK(svl);
1400 const IV aiv = SvIVX(svl);
1403 left_neg = FALSE; /* effectively it's a UV now */
1412 left_neg = dleft < 0;
1416 /* This should be exactly the 5.6 behaviour - if left and right are
1417 both in range for UV then use U_V() rather than floor. */
1419 if (dleft < UV_MAX_P1) {
1420 /* right was in range, so is dleft, so use UVs not double.
1424 /* left is out of range for UV, right was in range, so promote
1425 right (back) to double. */
1427 /* The +0.5 is used in 5.6 even though it is not strictly
1428 consistent with the implicit +0 floor in the U_V()
1429 inside the #if 1. */
1430 dleft = Perl_floor(dleft + 0.5);
1433 dright = Perl_floor(dright + 0.5);
1444 DIE(aTHX_ "Illegal modulus zero");
1446 dans = Perl_fmod(dleft, dright);
1447 if ((left_neg != right_neg) && dans)
1448 dans = dright - dans;
1451 sv_setnv(TARG, dans);
1457 DIE(aTHX_ "Illegal modulus zero");
1460 if ((left_neg != right_neg) && ans)
1463 /* XXX may warn: unary minus operator applied to unsigned type */
1464 /* could change -foo to be (~foo)+1 instead */
1465 if (ans <= ~((UV)IV_MAX)+1)
1466 sv_setiv(TARG, ~ans+1);
1468 sv_setnv(TARG, -(NV)ans);
1471 sv_setuv(TARG, ans);
1480 dVAR; dSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
1487 const UV uv = SvUV(sv);
1489 count = IV_MAX; /* The best we can do? */
1493 const IV iv = SvIV(sv);
1500 else if (SvNOKp(sv)) {
1501 const NV nv = SvNV(sv);
1509 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1511 static const char oom_list_extend[] = "Out of memory during list extend";
1512 const I32 items = SP - MARK;
1513 const I32 max = items * count;
1515 MEM_WRAP_CHECK_1(max, SV*, oom_list_extend);
1516 /* Did the max computation overflow? */
1517 if (items > 0 && max > 0 && (max < items || max < count))
1518 Perl_croak(aTHX_ oom_list_extend);
1523 /* This code was intended to fix 20010809.028:
1526 for (($x =~ /./g) x 2) {
1527 print chop; # "abcdabcd" expected as output.
1530 * but that change (#11635) broke this code:
1532 $x = [("foo")x2]; # only one "foo" ended up in the anonlist.
1534 * I can't think of a better fix that doesn't introduce
1535 * an efficiency hit by copying the SVs. The stack isn't
1536 * refcounted, and mortalisation obviously doesn't
1537 * Do The Right Thing when the stack has more than
1538 * one pointer to the same mortal value.
1542 *SP = sv_2mortal(newSVsv(*SP));
1552 repeatcpy((char*)(MARK + items), (char*)MARK,
1553 items * sizeof(const SV *), count - 1);
1556 else if (count <= 0)
1559 else { /* Note: mark already snarfed by pp_list */
1560 SV * const tmpstr = POPs;
1563 static const char oom_string_extend[] =
1564 "Out of memory during string extend";
1566 SvSetSV(TARG, tmpstr);
1567 SvPV_force(TARG, len);
1568 isutf = DO_UTF8(TARG);
1573 const STRLEN max = (UV)count * len;
1574 if (len > MEM_SIZE_MAX / count)
1575 Perl_croak(aTHX_ oom_string_extend);
1576 MEM_WRAP_CHECK_1(max, char, oom_string_extend);
1577 SvGROW(TARG, max + 1);
1578 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1579 SvCUR_set(TARG, SvCUR(TARG) * count);
1581 *SvEND(TARG) = '\0';
1584 (void)SvPOK_only_UTF8(TARG);
1586 (void)SvPOK_only(TARG);
1588 if (PL_op->op_private & OPpREPEAT_DOLIST) {
1589 /* The parser saw this as a list repeat, and there
1590 are probably several items on the stack. But we're
1591 in scalar context, and there's no pp_list to save us
1592 now. So drop the rest of the items -- robin@kitsite.com
1605 dVAR; dSP; dATARGET; bool useleft; SV *svl, *svr;
1606 tryAMAGICbin(subtr,opASSIGN);
1607 svl = sv_2num(TOPm1s);
1608 svr = sv_2num(TOPs);
1609 useleft = USE_LEFT(svl);
1610 #ifdef PERL_PRESERVE_IVUV
1611 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1612 "bad things" happen if you rely on signed integers wrapping. */
1615 /* Unless the left argument is integer in range we are going to have to
1616 use NV maths. Hence only attempt to coerce the right argument if
1617 we know the left is integer. */
1618 register UV auv = 0;
1624 a_valid = auvok = 1;
1625 /* left operand is undef, treat as zero. */
1627 /* Left operand is defined, so is it IV? */
1630 if ((auvok = SvUOK(svl)))
1633 register const IV aiv = SvIVX(svl);
1636 auvok = 1; /* Now acting as a sign flag. */
1637 } else { /* 2s complement assumption for IV_MIN */
1645 bool result_good = 0;
1648 bool buvok = SvUOK(svr);
1653 register const IV biv = SvIVX(svr);
1660 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1661 else "IV" now, independent of how it came in.
1662 if a, b represents positive, A, B negative, a maps to -A etc
1667 all UV maths. negate result if A negative.
1668 subtract if signs same, add if signs differ. */
1670 if (auvok ^ buvok) {
1679 /* Must get smaller */
1684 if (result <= buv) {
1685 /* result really should be -(auv-buv). as its negation
1686 of true value, need to swap our result flag */
1698 if (result <= (UV)IV_MIN)
1699 SETi( -(IV)result );
1701 /* result valid, but out of range for IV. */
1702 SETn( -(NV)result );
1706 } /* Overflow, drop through to NVs. */
1711 NV value = SvNV(svr);
1715 /* left operand is undef, treat as zero - value */
1719 SETn( SvNV(svl) - value );
1726 dVAR; dSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1728 const IV shift = POPi;
1729 if (PL_op->op_private & HINT_INTEGER) {
1743 dVAR; dSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1745 const IV shift = POPi;
1746 if (PL_op->op_private & HINT_INTEGER) {
1760 dVAR; dSP; tryAMAGICbinSET(lt,0);
1761 #ifdef PERL_PRESERVE_IVUV
1764 SvIV_please(TOPm1s);
1765 if (SvIOK(TOPm1s)) {
1766 bool auvok = SvUOK(TOPm1s);
1767 bool buvok = SvUOK(TOPs);
1769 if (!auvok && !buvok) { /* ## IV < IV ## */
1770 const IV aiv = SvIVX(TOPm1s);
1771 const IV biv = SvIVX(TOPs);
1774 SETs(boolSV(aiv < biv));
1777 if (auvok && buvok) { /* ## UV < UV ## */
1778 const UV auv = SvUVX(TOPm1s);
1779 const UV buv = SvUVX(TOPs);
1782 SETs(boolSV(auv < buv));
1785 if (auvok) { /* ## UV < IV ## */
1787 const IV biv = SvIVX(TOPs);
1790 /* As (a) is a UV, it's >=0, so it cannot be < */
1795 SETs(boolSV(auv < (UV)biv));
1798 { /* ## IV < UV ## */
1799 const IV aiv = SvIVX(TOPm1s);
1803 /* As (b) is a UV, it's >=0, so it must be < */
1810 SETs(boolSV((UV)aiv < buv));
1816 #ifndef NV_PRESERVES_UV
1817 #ifdef PERL_PRESERVE_IVUV
1820 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1822 SETs(boolSV(SvRV(TOPs) < SvRV(TOPp1s)));
1827 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1829 if (Perl_isnan(left) || Perl_isnan(right))
1831 SETs(boolSV(left < right));
1834 SETs(boolSV(TOPn < value));
1842 dVAR; dSP; tryAMAGICbinSET(gt,0);
1843 #ifdef PERL_PRESERVE_IVUV
1846 SvIV_please(TOPm1s);
1847 if (SvIOK(TOPm1s)) {
1848 bool auvok = SvUOK(TOPm1s);
1849 bool buvok = SvUOK(TOPs);
1851 if (!auvok && !buvok) { /* ## IV > IV ## */
1852 const IV aiv = SvIVX(TOPm1s);
1853 const IV biv = SvIVX(TOPs);
1856 SETs(boolSV(aiv > biv));
1859 if (auvok && buvok) { /* ## UV > UV ## */
1860 const UV auv = SvUVX(TOPm1s);
1861 const UV buv = SvUVX(TOPs);
1864 SETs(boolSV(auv > buv));
1867 if (auvok) { /* ## UV > IV ## */
1869 const IV biv = SvIVX(TOPs);
1873 /* As (a) is a UV, it's >=0, so it must be > */
1878 SETs(boolSV(auv > (UV)biv));
1881 { /* ## IV > UV ## */
1882 const IV aiv = SvIVX(TOPm1s);
1886 /* As (b) is a UV, it's >=0, so it cannot be > */
1893 SETs(boolSV((UV)aiv > buv));
1899 #ifndef NV_PRESERVES_UV
1900 #ifdef PERL_PRESERVE_IVUV
1903 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1905 SETs(boolSV(SvRV(TOPs) > SvRV(TOPp1s)));
1910 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1912 if (Perl_isnan(left) || Perl_isnan(right))
1914 SETs(boolSV(left > right));
1917 SETs(boolSV(TOPn > value));
1925 dVAR; dSP; tryAMAGICbinSET(le,0);
1926 #ifdef PERL_PRESERVE_IVUV
1929 SvIV_please(TOPm1s);
1930 if (SvIOK(TOPm1s)) {
1931 bool auvok = SvUOK(TOPm1s);
1932 bool buvok = SvUOK(TOPs);
1934 if (!auvok && !buvok) { /* ## IV <= IV ## */
1935 const IV aiv = SvIVX(TOPm1s);
1936 const IV biv = SvIVX(TOPs);
1939 SETs(boolSV(aiv <= biv));
1942 if (auvok && buvok) { /* ## UV <= UV ## */
1943 UV auv = SvUVX(TOPm1s);
1944 UV buv = SvUVX(TOPs);
1947 SETs(boolSV(auv <= buv));
1950 if (auvok) { /* ## UV <= IV ## */
1952 const IV biv = SvIVX(TOPs);
1956 /* As (a) is a UV, it's >=0, so a cannot be <= */
1961 SETs(boolSV(auv <= (UV)biv));
1964 { /* ## IV <= UV ## */
1965 const IV aiv = SvIVX(TOPm1s);
1969 /* As (b) is a UV, it's >=0, so a must be <= */
1976 SETs(boolSV((UV)aiv <= buv));
1982 #ifndef NV_PRESERVES_UV
1983 #ifdef PERL_PRESERVE_IVUV
1986 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1988 SETs(boolSV(SvRV(TOPs) <= SvRV(TOPp1s)));
1993 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1995 if (Perl_isnan(left) || Perl_isnan(right))
1997 SETs(boolSV(left <= right));
2000 SETs(boolSV(TOPn <= value));
2008 dVAR; dSP; tryAMAGICbinSET(ge,0);
2009 #ifdef PERL_PRESERVE_IVUV
2012 SvIV_please(TOPm1s);
2013 if (SvIOK(TOPm1s)) {
2014 bool auvok = SvUOK(TOPm1s);
2015 bool buvok = SvUOK(TOPs);
2017 if (!auvok && !buvok) { /* ## IV >= IV ## */
2018 const IV aiv = SvIVX(TOPm1s);
2019 const IV biv = SvIVX(TOPs);
2022 SETs(boolSV(aiv >= biv));
2025 if (auvok && buvok) { /* ## UV >= UV ## */
2026 const UV auv = SvUVX(TOPm1s);
2027 const UV buv = SvUVX(TOPs);
2030 SETs(boolSV(auv >= buv));
2033 if (auvok) { /* ## UV >= IV ## */
2035 const IV biv = SvIVX(TOPs);
2039 /* As (a) is a UV, it's >=0, so it must be >= */
2044 SETs(boolSV(auv >= (UV)biv));
2047 { /* ## IV >= UV ## */
2048 const IV aiv = SvIVX(TOPm1s);
2052 /* As (b) is a UV, it's >=0, so a cannot be >= */
2059 SETs(boolSV((UV)aiv >= buv));
2065 #ifndef NV_PRESERVES_UV
2066 #ifdef PERL_PRESERVE_IVUV
2069 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2071 SETs(boolSV(SvRV(TOPs) >= SvRV(TOPp1s)));
2076 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2078 if (Perl_isnan(left) || Perl_isnan(right))
2080 SETs(boolSV(left >= right));
2083 SETs(boolSV(TOPn >= value));
2091 dVAR; dSP; tryAMAGICbinSET(ne,0);
2092 #ifndef NV_PRESERVES_UV
2093 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2095 SETs(boolSV(SvRV(TOPs) != SvRV(TOPp1s)));
2099 #ifdef PERL_PRESERVE_IVUV
2102 SvIV_please(TOPm1s);
2103 if (SvIOK(TOPm1s)) {
2104 const bool auvok = SvUOK(TOPm1s);
2105 const bool buvok = SvUOK(TOPs);
2107 if (auvok == buvok) { /* ## IV == IV or UV == UV ## */
2108 /* Casting IV to UV before comparison isn't going to matter
2109 on 2s complement. On 1s complement or sign&magnitude
2110 (if we have any of them) it could make negative zero
2111 differ from normal zero. As I understand it. (Need to
2112 check - is negative zero implementation defined behaviour
2114 const UV buv = SvUVX(POPs);
2115 const UV auv = SvUVX(TOPs);
2117 SETs(boolSV(auv != buv));
2120 { /* ## Mixed IV,UV ## */
2124 /* != is commutative so swap if needed (save code) */
2126 /* swap. top of stack (b) is the iv */
2130 /* As (a) is a UV, it's >0, so it cannot be == */
2139 /* As (b) is a UV, it's >0, so it cannot be == */
2143 uv = SvUVX(*(SP+1)); /* Do I want TOPp1s() ? */
2145 SETs(boolSV((UV)iv != uv));
2152 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2154 if (Perl_isnan(left) || Perl_isnan(right))
2156 SETs(boolSV(left != right));
2159 SETs(boolSV(TOPn != value));
2167 dVAR; dSP; dTARGET; tryAMAGICbin(ncmp,0);
2168 #ifndef NV_PRESERVES_UV
2169 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2170 const UV right = PTR2UV(SvRV(POPs));
2171 const UV left = PTR2UV(SvRV(TOPs));
2172 SETi((left > right) - (left < right));
2176 #ifdef PERL_PRESERVE_IVUV
2177 /* Fortunately it seems NaN isn't IOK */
2180 SvIV_please(TOPm1s);
2181 if (SvIOK(TOPm1s)) {
2182 const bool leftuvok = SvUOK(TOPm1s);
2183 const bool rightuvok = SvUOK(TOPs);
2185 if (!leftuvok && !rightuvok) { /* ## IV <=> IV ## */
2186 const IV leftiv = SvIVX(TOPm1s);
2187 const IV rightiv = SvIVX(TOPs);
2189 if (leftiv > rightiv)
2191 else if (leftiv < rightiv)
2195 } else if (leftuvok && rightuvok) { /* ## UV <=> UV ## */
2196 const UV leftuv = SvUVX(TOPm1s);
2197 const UV rightuv = SvUVX(TOPs);
2199 if (leftuv > rightuv)
2201 else if (leftuv < rightuv)
2205 } else if (leftuvok) { /* ## UV <=> IV ## */
2206 const IV rightiv = SvIVX(TOPs);
2208 /* As (a) is a UV, it's >=0, so it cannot be < */
2211 const UV leftuv = SvUVX(TOPm1s);
2212 if (leftuv > (UV)rightiv) {
2214 } else if (leftuv < (UV)rightiv) {
2220 } else { /* ## IV <=> UV ## */
2221 const IV leftiv = SvIVX(TOPm1s);
2223 /* As (b) is a UV, it's >=0, so it must be < */
2226 const UV rightuv = SvUVX(TOPs);
2227 if ((UV)leftiv > rightuv) {
2229 } else if ((UV)leftiv < rightuv) {
2247 if (Perl_isnan(left) || Perl_isnan(right)) {
2251 value = (left > right) - (left < right);
2255 else if (left < right)
2257 else if (left > right)
2273 int amg_type = sle_amg;
2277 switch (PL_op->op_type) {
2296 tryAMAGICbinSET_var(amg_type,0);
2299 const int cmp = (IN_LOCALE_RUNTIME
2300 ? sv_cmp_locale(left, right)
2301 : sv_cmp(left, right));
2302 SETs(boolSV(cmp * multiplier < rhs));
2309 dVAR; dSP; tryAMAGICbinSET(seq,0);
2312 SETs(boolSV(sv_eq(left, right)));
2319 dVAR; dSP; tryAMAGICbinSET(sne,0);
2322 SETs(boolSV(!sv_eq(left, right)));
2329 dVAR; dSP; dTARGET; tryAMAGICbin(scmp,0);
2332 const int cmp = (IN_LOCALE_RUNTIME
2333 ? sv_cmp_locale(left, right)
2334 : sv_cmp(left, right));
2342 dVAR; dSP; dATARGET; tryAMAGICbin(band,opASSIGN);
2347 if (SvNIOKp(left) || SvNIOKp(right)) {
2348 if (PL_op->op_private & HINT_INTEGER) {
2349 const IV i = SvIV_nomg(left) & SvIV_nomg(right);
2353 const UV u = SvUV_nomg(left) & SvUV_nomg(right);
2358 do_vop(PL_op->op_type, TARG, left, right);
2367 dVAR; dSP; dATARGET;
2368 const int op_type = PL_op->op_type;
2370 tryAMAGICbin_var((op_type == OP_BIT_OR ? bor_amg : bxor_amg), opASSIGN);
2375 if (SvNIOKp(left) || SvNIOKp(right)) {
2376 if (PL_op->op_private & HINT_INTEGER) {
2377 const IV l = (USE_LEFT(left) ? SvIV_nomg(left) : 0);
2378 const IV r = SvIV_nomg(right);
2379 const IV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2383 const UV l = (USE_LEFT(left) ? SvUV_nomg(left) : 0);
2384 const UV r = SvUV_nomg(right);
2385 const UV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2390 do_vop(op_type, TARG, left, right);
2399 dVAR; dSP; dTARGET; tryAMAGICun(neg);
2401 SV * const sv = sv_2num(TOPs);
2402 const int flags = SvFLAGS(sv);
2404 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
2405 /* It's publicly an integer, or privately an integer-not-float */
2408 if (SvIVX(sv) == IV_MIN) {
2409 /* 2s complement assumption. */
2410 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
2413 else if (SvUVX(sv) <= IV_MAX) {
2418 else if (SvIVX(sv) != IV_MIN) {
2422 #ifdef PERL_PRESERVE_IVUV
2431 else if (SvPOKp(sv)) {
2433 const char * const s = SvPV_const(sv, len);
2434 if (isIDFIRST(*s)) {
2435 sv_setpvs(TARG, "-");
2438 else if (*s == '+' || *s == '-') {
2440 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
2442 else if (DO_UTF8(sv)) {
2445 goto oops_its_an_int;
2447 sv_setnv(TARG, -SvNV(sv));
2449 sv_setpvs(TARG, "-");
2456 goto oops_its_an_int;
2457 sv_setnv(TARG, -SvNV(sv));
2469 dVAR; dSP; tryAMAGICunSET(not);
2470 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
2476 dVAR; dSP; dTARGET; tryAMAGICun(compl);
2481 if (PL_op->op_private & HINT_INTEGER) {
2482 const IV i = ~SvIV_nomg(sv);
2486 const UV u = ~SvUV_nomg(sv);
2495 (void)SvPV_nomg_const(sv,len); /* force check for uninit var */
2496 sv_setsv_nomg(TARG, sv);
2497 tmps = (U8*)SvPV_force(TARG, len);
2500 /* Calculate exact length, let's not estimate. */
2505 U8 * const send = tmps + len;
2506 U8 * const origtmps = tmps;
2507 const UV utf8flags = UTF8_ALLOW_ANYUV;
2509 while (tmps < send) {
2510 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2512 targlen += UNISKIP(~c);
2518 /* Now rewind strings and write them. */
2525 Newx(result, targlen + 1, U8);
2527 while (tmps < send) {
2528 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2530 p = uvchr_to_utf8_flags(p, ~c, UNICODE_ALLOW_ANY);
2533 sv_usepvn_flags(TARG, (char*)result, targlen,
2534 SV_HAS_TRAILING_NUL);
2541 Newx(result, nchar + 1, U8);
2543 while (tmps < send) {
2544 const U8 c = (U8)utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2549 sv_usepvn_flags(TARG, (char*)result, nchar, SV_HAS_TRAILING_NUL);
2557 register long *tmpl;
2558 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2561 for ( ; anum >= (I32)sizeof(long); anum -= (I32)sizeof(long), tmpl++)
2566 for ( ; anum > 0; anum--, tmps++)
2575 /* integer versions of some of the above */
2579 dVAR; dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
2582 SETi( left * right );
2590 dVAR; dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
2594 DIE(aTHX_ "Illegal division by zero");
2597 /* avoid FPE_INTOVF on some platforms when num is IV_MIN */
2601 value = num / value;
2607 #if defined(__GLIBC__) && IVSIZE == 8
2614 /* This is the vanilla old i_modulo. */
2615 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2619 DIE(aTHX_ "Illegal modulus zero");
2620 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2624 SETi( left % right );
2629 #if defined(__GLIBC__) && IVSIZE == 8
2634 /* This is the i_modulo with the workaround for the _moddi3 bug
2635 * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
2636 * See below for pp_i_modulo. */
2637 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2641 DIE(aTHX_ "Illegal modulus zero");
2642 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2646 SETi( left % PERL_ABS(right) );
2653 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2657 DIE(aTHX_ "Illegal modulus zero");
2658 /* The assumption is to use hereafter the old vanilla version... */
2660 PL_ppaddr[OP_I_MODULO] =
2662 /* .. but if we have glibc, we might have a buggy _moddi3
2663 * (at least glicb 2.2.5 is known to have this bug), in other
2664 * words our integer modulus with negative quad as the second
2665 * argument might be broken. Test for this and re-patch the
2666 * opcode dispatch table if that is the case, remembering to
2667 * also apply the workaround so that this first round works
2668 * right, too. See [perl #9402] for more information. */
2672 /* Cannot do this check with inlined IV constants since
2673 * that seems to work correctly even with the buggy glibc. */
2675 /* Yikes, we have the bug.
2676 * Patch in the workaround version. */
2678 PL_ppaddr[OP_I_MODULO] =
2679 &Perl_pp_i_modulo_1;
2680 /* Make certain we work right this time, too. */
2681 right = PERL_ABS(right);
2684 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2688 SETi( left % right );
2696 dVAR; dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
2699 SETi( left + right );
2706 dVAR; dSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
2709 SETi( left - right );
2716 dVAR; dSP; tryAMAGICbinSET(lt,0);
2719 SETs(boolSV(left < right));
2726 dVAR; dSP; tryAMAGICbinSET(gt,0);
2729 SETs(boolSV(left > right));
2736 dVAR; dSP; tryAMAGICbinSET(le,0);
2739 SETs(boolSV(left <= right));
2746 dVAR; dSP; tryAMAGICbinSET(ge,0);
2749 SETs(boolSV(left >= right));
2756 dVAR; dSP; tryAMAGICbinSET(eq,0);
2759 SETs(boolSV(left == right));
2766 dVAR; dSP; tryAMAGICbinSET(ne,0);
2769 SETs(boolSV(left != right));
2776 dVAR; dSP; dTARGET; tryAMAGICbin(ncmp,0);
2783 else if (left < right)
2794 dVAR; dSP; dTARGET; tryAMAGICun(neg);
2799 /* High falutin' math. */
2803 dVAR; dSP; dTARGET; tryAMAGICbin(atan2,0);
2806 SETn(Perl_atan2(left, right));
2814 int amg_type = sin_amg;
2815 const char *neg_report = NULL;
2816 NV (*func)(NV) = Perl_sin;
2817 const int op_type = PL_op->op_type;
2834 amg_type = sqrt_amg;
2836 neg_report = "sqrt";
2840 tryAMAGICun_var(amg_type);
2842 const NV value = POPn;
2844 if (op_type == OP_LOG ? (value <= 0.0) : (value < 0.0)) {
2845 SET_NUMERIC_STANDARD();
2846 DIE(aTHX_ "Can't take %s of %"NVgf, neg_report, value);
2849 XPUSHn(func(value));
2854 /* Support Configure command-line overrides for rand() functions.
2855 After 5.005, perhaps we should replace this by Configure support
2856 for drand48(), random(), or rand(). For 5.005, though, maintain
2857 compatibility by calling rand() but allow the user to override it.
2858 See INSTALL for details. --Andy Dougherty 15 July 1998
2860 /* Now it's after 5.005, and Configure supports drand48() and random(),
2861 in addition to rand(). So the overrides should not be needed any more.
2862 --Jarkko Hietaniemi 27 September 1998
2865 #ifndef HAS_DRAND48_PROTO
2866 extern double drand48 (void);
2879 if (!PL_srand_called) {
2880 (void)seedDrand01((Rand_seed_t)seed());
2881 PL_srand_called = TRUE;
2891 const UV anum = (MAXARG < 1) ? seed() : POPu;
2892 (void)seedDrand01((Rand_seed_t)anum);
2893 PL_srand_called = TRUE;
2900 dVAR; dSP; dTARGET; tryAMAGICun(int);
2902 SV * const sv = sv_2num(TOPs);
2903 const IV iv = SvIV(sv);
2904 /* XXX it's arguable that compiler casting to IV might be subtly
2905 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2906 else preferring IV has introduced a subtle behaviour change bug. OTOH
2907 relying on floating point to be accurate is a bug. */
2912 else if (SvIOK(sv)) {
2919 const NV value = SvNV(sv);
2921 if (value < (NV)UV_MAX + 0.5) {
2924 SETn(Perl_floor(value));
2928 if (value > (NV)IV_MIN - 0.5) {
2931 SETn(Perl_ceil(value));
2941 dVAR; dSP; dTARGET; tryAMAGICun(abs);
2943 SV * const sv = sv_2num(TOPs);
2944 /* This will cache the NV value if string isn't actually integer */
2945 const IV iv = SvIV(sv);
2950 else if (SvIOK(sv)) {
2951 /* IVX is precise */
2953 SETu(SvUV(sv)); /* force it to be numeric only */
2961 /* 2s complement assumption. Also, not really needed as
2962 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
2968 const NV value = SvNV(sv);
2982 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2986 SV* const sv = POPs;
2988 tmps = (SvPV_const(sv, len));
2990 /* If Unicode, try to downgrade
2991 * If not possible, croak. */
2992 SV* const tsv = sv_2mortal(newSVsv(sv));
2995 sv_utf8_downgrade(tsv, FALSE);
2996 tmps = SvPV_const(tsv, len);
2998 if (PL_op->op_type == OP_HEX)
3001 while (*tmps && len && isSPACE(*tmps))
3007 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
3009 else if (*tmps == 'b')
3010 result_uv = grok_bin (tmps, &len, &flags, &result_nv);
3012 result_uv = grok_oct (tmps, &len, &flags, &result_nv);
3014 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
3028 SV * const sv = TOPs;
3030 if (SvGAMAGIC(sv)) {
3031 /* For an overloaded or magic scalar, we can't know in advance if
3032 it's going to be UTF-8 or not. Also, we can't call sv_len_utf8 as
3033 it likes to cache the length. Maybe that should be a documented
3038 = sv_2pv_flags(sv, &len,
3039 SV_UNDEF_RETURNS_NULL|SV_CONST_RETURN|SV_GMAGIC);
3043 else if (DO_UTF8(sv)) {
3044 SETi(utf8_length((U8*)p, (U8*)p + len));
3048 } else if (SvOK(sv)) {
3049 /* Neither magic nor overloaded. */
3051 SETi(sv_len_utf8(sv));
3070 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3072 const I32 arybase = CopARYBASE_get(PL_curcop);
3074 const char *repl = NULL;
3076 const int num_args = PL_op->op_private & 7;
3077 bool repl_need_utf8_upgrade = FALSE;
3078 bool repl_is_utf8 = FALSE;
3080 SvTAINTED_off(TARG); /* decontaminate */
3081 SvUTF8_off(TARG); /* decontaminate */
3085 repl = SvPV_const(repl_sv, repl_len);
3086 repl_is_utf8 = DO_UTF8(repl_sv) && SvCUR(repl_sv);
3096 sv_utf8_upgrade(sv);
3098 else if (DO_UTF8(sv))
3099 repl_need_utf8_upgrade = TRUE;
3101 tmps = SvPV_const(sv, curlen);
3103 utf8_curlen = sv_len_utf8(sv);
3104 if (utf8_curlen == curlen)
3107 curlen = utf8_curlen;
3112 if (pos >= arybase) {
3130 else if (len >= 0) {
3132 if (rem > (I32)curlen)
3147 Perl_croak(aTHX_ "substr outside of string");
3148 if (ckWARN(WARN_SUBSTR))
3149 Perl_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3153 const I32 upos = pos;
3154 const I32 urem = rem;
3156 sv_pos_u2b(sv, &pos, &rem);
3158 /* we either return a PV or an LV. If the TARG hasn't been used
3159 * before, or is of that type, reuse it; otherwise use a mortal
3160 * instead. Note that LVs can have an extended lifetime, so also
3161 * dont reuse if refcount > 1 (bug #20933) */
3162 if (SvTYPE(TARG) > SVt_NULL) {
3163 if ( (SvTYPE(TARG) == SVt_PVLV)
3164 ? (!lvalue || SvREFCNT(TARG) > 1)
3167 TARG = sv_newmortal();
3171 sv_setpvn(TARG, tmps, rem);
3172 #ifdef USE_LOCALE_COLLATE
3173 sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3178 SV* repl_sv_copy = NULL;
3180 if (repl_need_utf8_upgrade) {
3181 repl_sv_copy = newSVsv(repl_sv);
3182 sv_utf8_upgrade(repl_sv_copy);
3183 repl = SvPV_const(repl_sv_copy, repl_len);
3184 repl_is_utf8 = DO_UTF8(repl_sv_copy) && SvCUR(sv);
3188 sv_insert_flags(sv, pos, rem, repl, repl_len, 0);
3192 SvREFCNT_dec(repl_sv_copy);
3194 else if (lvalue) { /* it's an lvalue! */
3195 if (!SvGMAGICAL(sv)) {
3197 SvPV_force_nolen(sv);
3198 if (ckWARN(WARN_SUBSTR))
3199 Perl_warner(aTHX_ packWARN(WARN_SUBSTR),
3200 "Attempt to use reference as lvalue in substr");
3202 if (isGV_with_GP(sv))
3203 SvPV_force_nolen(sv);
3204 else if (SvOK(sv)) /* is it defined ? */
3205 (void)SvPOK_only_UTF8(sv);
3207 sv_setpvs(sv, ""); /* avoid lexical reincarnation */
3210 if (SvTYPE(TARG) < SVt_PVLV) {
3211 sv_upgrade(TARG, SVt_PVLV);
3212 sv_magic(TARG, NULL, PERL_MAGIC_substr, NULL, 0);
3216 if (LvTARG(TARG) != sv) {
3218 SvREFCNT_dec(LvTARG(TARG));
3219 LvTARG(TARG) = SvREFCNT_inc_simple(sv);
3221 LvTARGOFF(TARG) = upos;
3222 LvTARGLEN(TARG) = urem;
3226 PUSHs(TARG); /* avoid SvSETMAGIC here */
3233 register const IV size = POPi;
3234 register const IV offset = POPi;
3235 register SV * const src = POPs;
3236 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3238 SvTAINTED_off(TARG); /* decontaminate */
3239 if (lvalue) { /* it's an lvalue! */
3240 if (SvREFCNT(TARG) > 1) /* don't share the TARG (#20933) */
3241 TARG = sv_newmortal();
3242 if (SvTYPE(TARG) < SVt_PVLV) {
3243 sv_upgrade(TARG, SVt_PVLV);
3244 sv_magic(TARG, NULL, PERL_MAGIC_vec, NULL, 0);
3247 if (LvTARG(TARG) != src) {
3249 SvREFCNT_dec(LvTARG(TARG));
3250 LvTARG(TARG) = SvREFCNT_inc_simple(src);
3252 LvTARGOFF(TARG) = offset;
3253 LvTARGLEN(TARG) = size;
3256 sv_setuv(TARG, do_vecget(src, offset, size));
3272 const char *little_p;
3273 const I32 arybase = CopARYBASE_get(PL_curcop);
3276 const bool is_index = PL_op->op_type == OP_INDEX;
3279 /* arybase is in characters, like offset, so combine prior to the
3280 UTF-8 to bytes calculation. */
3281 offset = POPi - arybase;
3285 big_p = SvPV_const(big, biglen);
3286 little_p = SvPV_const(little, llen);
3288 big_utf8 = DO_UTF8(big);
3289 little_utf8 = DO_UTF8(little);
3290 if (big_utf8 ^ little_utf8) {
3291 /* One needs to be upgraded. */
3292 if (little_utf8 && !PL_encoding) {
3293 /* Well, maybe instead we might be able to downgrade the small
3295 char * const pv = (char*)bytes_from_utf8((U8 *)little_p, &llen,
3298 /* If the large string is ISO-8859-1, and it's not possible to
3299 convert the small string to ISO-8859-1, then there is no
3300 way that it could be found anywhere by index. */
3305 /* At this point, pv is a malloc()ed string. So donate it to temp
3306 to ensure it will get free()d */
3307 little = temp = newSV(0);
3308 sv_usepvn(temp, pv, llen);
3309 little_p = SvPVX(little);
3312 ? newSVpvn(big_p, biglen) : newSVpvn(little_p, llen);
3315 sv_recode_to_utf8(temp, PL_encoding);
3317 sv_utf8_upgrade(temp);
3322 big_p = SvPV_const(big, biglen);
3325 little_p = SvPV_const(little, llen);
3329 if (SvGAMAGIC(big)) {
3330 /* Life just becomes a lot easier if I use a temporary here.
3331 Otherwise I need to avoid calls to sv_pos_u2b(), which (dangerously)
3332 will trigger magic and overloading again, as will fbm_instr()
3334 big = newSVpvn_flags(big_p, biglen,
3335 SVs_TEMP | (big_utf8 ? SVf_UTF8 : 0));
3338 if (SvGAMAGIC(little) || (is_index && !SvOK(little))) {
3339 /* index && SvOK() is a hack. fbm_instr() calls SvPV_const, which will
3340 warn on undef, and we've already triggered a warning with the
3341 SvPV_const some lines above. We can't remove that, as we need to
3342 call some SvPV to trigger overloading early and find out if the
3344 This is all getting to messy. The API isn't quite clean enough,
3345 because data access has side effects.
3347 little = newSVpvn_flags(little_p, llen,
3348 SVs_TEMP | (little_utf8 ? SVf_UTF8 : 0));
3349 little_p = SvPVX(little);
3353 offset = is_index ? 0 : biglen;
3355 if (big_utf8 && offset > 0)
3356 sv_pos_u2b(big, &offset, 0);
3362 else if (offset > (I32)biglen)
3364 if (!(little_p = is_index
3365 ? fbm_instr((unsigned char*)big_p + offset,
3366 (unsigned char*)big_p + biglen, little, 0)
3367 : rninstr(big_p, big_p + offset,
3368 little_p, little_p + llen)))
3371 retval = little_p - big_p;
3372 if (retval > 0 && big_utf8)
3373 sv_pos_b2u(big, &retval);
3378 PUSHi(retval + arybase);
3384 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
3385 if (SvTAINTED(MARK[1]))
3386 TAINT_PROPER("sprintf");
3387 do_sprintf(TARG, SP-MARK, MARK+1);
3388 TAINT_IF(SvTAINTED(TARG));
3400 const U8 *s = (U8*)SvPV_const(argsv, len);
3402 if (PL_encoding && SvPOK(argsv) && !DO_UTF8(argsv)) {
3403 SV * const tmpsv = sv_2mortal(newSVsv(argsv));
3404 s = (U8*)sv_recode_to_utf8(tmpsv, PL_encoding);
3408 XPUSHu(DO_UTF8(argsv) ?
3409 utf8n_to_uvchr(s, UTF8_MAXBYTES, 0, UTF8_ALLOW_ANYUV) :
3421 if (((SvIOK_notUV(TOPs) && SvIV(TOPs) < 0)
3423 (SvNOK(TOPs) && SvNV(TOPs) < 0.0))) {
3425 value = POPu; /* chr(-1) eq chr(0xff), etc. */
3427 (void) POPs; /* Ignore the argument value. */
3428 value = UNICODE_REPLACEMENT;
3434 SvUPGRADE(TARG,SVt_PV);
3436 if (value > 255 && !IN_BYTES) {
3437 SvGROW(TARG, (STRLEN)UNISKIP(value)+1);
3438 tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3439 SvCUR_set(TARG, tmps - SvPVX_const(TARG));
3441 (void)SvPOK_only(TARG);
3450 *tmps++ = (char)value;
3452 (void)SvPOK_only(TARG);
3454 if (PL_encoding && !IN_BYTES) {
3455 sv_recode_to_utf8(TARG, PL_encoding);
3457 if (SvCUR(TARG) == 0 || !is_utf8_string((U8*)tmps, SvCUR(TARG)) ||
3458 UNICODE_IS_REPLACEMENT(utf8_to_uvchr((U8*)tmps, NULL))) {
3462 *tmps++ = (char)value;
3478 const char *tmps = SvPV_const(left, len);
3480 if (DO_UTF8(left)) {
3481 /* If Unicode, try to downgrade.
3482 * If not possible, croak.
3483 * Yes, we made this up. */
3484 SV* const tsv = sv_2mortal(newSVsv(left));
3487 sv_utf8_downgrade(tsv, FALSE);
3488 tmps = SvPV_const(tsv, len);
3490 # ifdef USE_ITHREADS
3492 if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3493 /* This should be threadsafe because in ithreads there is only
3494 * one thread per interpreter. If this would not be true,
3495 * we would need a mutex to protect this malloc. */
3496 PL_reentrant_buffer->_crypt_struct_buffer =
3497 (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3498 #if defined(__GLIBC__) || defined(__EMX__)
3499 if (PL_reentrant_buffer->_crypt_struct_buffer) {
3500 PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3501 /* work around glibc-2.2.5 bug */
3502 PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3506 # endif /* HAS_CRYPT_R */
3507 # endif /* USE_ITHREADS */
3509 sv_setpv(TARG, fcrypt(tmps, SvPV_nolen_const(right)));
3511 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV_nolen_const(right)));
3517 "The crypt() function is unimplemented due to excessive paranoia.");
3529 bool inplace = TRUE;
3531 const int op_type = PL_op->op_type;
3534 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3540 s = (const U8*)SvPV_nomg_const(source, slen);
3542 if (ckWARN(WARN_UNINITIALIZED))
3543 report_uninit(source);
3548 if (slen && DO_UTF8(source) && UTF8_IS_START(*s)) {
3550 utf8_to_uvchr(s, &ulen);
3551 if (op_type == OP_UCFIRST) {
3552 toTITLE_utf8(s, tmpbuf, &tculen);
3554 toLOWER_utf8(s, tmpbuf, &tculen);
3556 /* If the two differ, we definately cannot do inplace. */
3557 inplace = (ulen == tculen);
3558 need = slen + 1 - ulen + tculen;
3564 if (SvPADTMP(source) && !SvREADONLY(source) && inplace && SvTEMP(source)) {
3565 /* We can convert in place. */
3568 s = d = (U8*)SvPV_force_nomg(source, slen);
3574 SvUPGRADE(dest, SVt_PV);
3575 d = (U8*)SvGROW(dest, need);
3576 (void)SvPOK_only(dest);
3585 /* slen is the byte length of the whole SV.
3586 * ulen is the byte length of the original Unicode character
3587 * stored as UTF-8 at s.
3588 * tculen is the byte length of the freshly titlecased (or
3589 * lowercased) Unicode character stored as UTF-8 at tmpbuf.
3590 * We first set the result to be the titlecased (/lowercased)
3591 * character, and then append the rest of the SV data. */
3592 sv_setpvn(dest, (char*)tmpbuf, tculen);
3594 sv_catpvn(dest, (char*)(s + ulen), slen - ulen);
3598 Copy(tmpbuf, d, tculen, U8);
3599 SvCUR_set(dest, need - 1);
3604 if (IN_LOCALE_RUNTIME) {
3607 *d = (op_type == OP_UCFIRST)
3608 ? toUPPER_LC(*s) : toLOWER_LC(*s);
3611 *d = (op_type == OP_UCFIRST) ? toUPPER(*s) : toLOWER(*s);
3613 /* See bug #39028 */
3621 /* This will copy the trailing NUL */
3622 Copy(s + 1, d + 1, slen, U8);
3623 SvCUR_set(dest, need - 1);
3630 /* There's so much setup/teardown code common between uc and lc, I wonder if
3631 it would be worth merging the two, and just having a switch outside each
3632 of the three tight loops. */
3646 if (SvPADTMP(source) && !SvREADONLY(source) && !SvAMAGIC(source)
3647 && SvTEMP(source) && !DO_UTF8(source)) {
3648 /* We can convert in place. */
3651 s = d = (U8*)SvPV_force_nomg(source, len);
3658 /* The old implementation would copy source into TARG at this point.
3659 This had the side effect that if source was undef, TARG was now
3660 an undefined SV with PADTMP set, and they don't warn inside
3661 sv_2pv_flags(). However, we're now getting the PV direct from
3662 source, which doesn't have PADTMP set, so it would warn. Hence the
3666 s = (const U8*)SvPV_nomg_const(source, len);
3668 if (ckWARN(WARN_UNINITIALIZED))
3669 report_uninit(source);
3675 SvUPGRADE(dest, SVt_PV);
3676 d = (U8*)SvGROW(dest, min);
3677 (void)SvPOK_only(dest);
3682 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
3683 to check DO_UTF8 again here. */
3685 if (DO_UTF8(source)) {
3686 const U8 *const send = s + len;
3687 U8 tmpbuf[UTF8_MAXBYTES+1];
3690 const STRLEN u = UTF8SKIP(s);
3693 toUPPER_utf8(s, tmpbuf, &ulen);
3694 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
3695 /* If the eventually required minimum size outgrows
3696 * the available space, we need to grow. */
3697 const UV o = d - (U8*)SvPVX_const(dest);
3699 /* If someone uppercases one million U+03B0s we SvGROW() one
3700 * million times. Or we could try guessing how much to
3701 allocate without allocating too much. Such is life. */
3703 d = (U8*)SvPVX(dest) + o;
3705 Copy(tmpbuf, d, ulen, U8);
3711 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3714 const U8 *const send = s + len;
3715 if (IN_LOCALE_RUNTIME) {
3718 for (; s < send; d++, s++)
3719 *d = toUPPER_LC(*s);
3722 for (; s < send; d++, s++)
3726 if (source != dest) {
3728 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3748 if (SvPADTMP(source) && !SvREADONLY(source) && !SvAMAGIC(source)
3749 && SvTEMP(source) && !DO_UTF8(source)) {
3750 /* We can convert in place. */
3753 s = d = (U8*)SvPV_force_nomg(source, len);
3760 /* The old implementation would copy source into TARG at this point.
3761 This had the side effect that if source was undef, TARG was now
3762 an undefined SV with PADTMP set, and they don't warn inside
3763 sv_2pv_flags(). However, we're now getting the PV direct from
3764 source, which doesn't have PADTMP set, so it would warn. Hence the
3768 s = (const U8*)SvPV_nomg_const(source, len);
3770 if (ckWARN(WARN_UNINITIALIZED))
3771 report_uninit(source);
3777 SvUPGRADE(dest, SVt_PV);
3778 d = (U8*)SvGROW(dest, min);
3779 (void)SvPOK_only(dest);
3784 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
3785 to check DO_UTF8 again here. */
3787 if (DO_UTF8(source)) {
3788 const U8 *const send = s + len;
3789 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3792 const STRLEN u = UTF8SKIP(s);
3794 const UV uv = toLOWER_utf8(s, tmpbuf, &ulen);
3796 #define GREEK_CAPITAL_LETTER_SIGMA 0x03A3 /* Unicode U+03A3 */
3797 if (uv == GREEK_CAPITAL_LETTER_SIGMA) {
3800 * Now if the sigma is NOT followed by
3801 * /$ignorable_sequence$cased_letter/;
3802 * and it IS preceded by /$cased_letter$ignorable_sequence/;
3803 * where $ignorable_sequence is [\x{2010}\x{AD}\p{Mn}]*
3804 * and $cased_letter is [\p{Ll}\p{Lo}\p{Lt}]
3805 * then it should be mapped to 0x03C2,
3806 * (GREEK SMALL LETTER FINAL SIGMA),
3807 * instead of staying 0x03A3.
3808 * "should be": in other words, this is not implemented yet.
3809 * See lib/unicore/SpecialCasing.txt.
3812 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
3813 /* If the eventually required minimum size outgrows
3814 * the available space, we need to grow. */
3815 const UV o = d - (U8*)SvPVX_const(dest);
3817 /* If someone lowercases one million U+0130s we SvGROW() one
3818 * million times. Or we could try guessing how much to
3819 allocate without allocating too much. Such is life. */
3821 d = (U8*)SvPVX(dest) + o;
3823 Copy(tmpbuf, d, ulen, U8);
3829 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3832 const U8 *const send = s + len;
3833 if (IN_LOCALE_RUNTIME) {
3836 for (; s < send; d++, s++)
3837 *d = toLOWER_LC(*s);
3840 for (; s < send; d++, s++)
3844 if (source != dest) {
3846 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3856 SV * const sv = TOPs;
3858 register const char *s = SvPV_const(sv,len);
3860 SvUTF8_off(TARG); /* decontaminate */
3863 SvUPGRADE(TARG, SVt_PV);
3864 SvGROW(TARG, (len * 2) + 1);
3868 if (UTF8_IS_CONTINUED(*s)) {
3869 STRLEN ulen = UTF8SKIP(s);
3893 SvCUR_set(TARG, d - SvPVX_const(TARG));
3894 (void)SvPOK_only_UTF8(TARG);
3897 sv_setpvn(TARG, s, len);
3899 if (SvSMAGICAL(TARG))
3908 dVAR; dSP; dMARK; dORIGMARK;
3909 register AV *const av = MUTABLE_AV(POPs);
3910 register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3912 if (SvTYPE(av) == SVt_PVAV) {
3913 const I32 arybase = CopARYBASE_get(PL_curcop);
3914 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
3917 for (svp = MARK + 1; svp <= SP; svp++) {
3918 const I32 elem = SvIV(*svp);
3922 if (max > AvMAX(av))
3925 while (++MARK <= SP) {
3927 I32 elem = SvIV(*MARK);
3931 svp = av_fetch(av, elem, lval);
3933 if (!svp || *svp == &PL_sv_undef)
3934 DIE(aTHX_ PL_no_aelem, elem);
3935 if (PL_op->op_private & OPpLVAL_INTRO)
3936 save_aelem(av, elem, svp);
3938 *MARK = svp ? *svp : &PL_sv_undef;
3941 if (GIMME != G_ARRAY) {
3943 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
3953 AV *array = MUTABLE_AV(POPs);
3954 const I32 gimme = GIMME_V;
3955 IV *iterp = Perl_av_iter_p(aTHX_ array);
3956 const IV current = (*iterp)++;
3958 if (current > av_len(array)) {
3960 if (gimme == G_SCALAR)
3967 mPUSHi(CopARYBASE_get(PL_curcop) + current);
3968 if (gimme == G_ARRAY) {
3969 SV **const element = av_fetch(array, current, 0);
3970 PUSHs(element ? *element : &PL_sv_undef);
3979 AV *array = MUTABLE_AV(POPs);
3980 const I32 gimme = GIMME_V;
3982 *Perl_av_iter_p(aTHX_ array) = 0;
3984 if (gimme == G_SCALAR) {
3986 PUSHi(av_len(array) + 1);
3988 else if (gimme == G_ARRAY) {
3989 IV n = Perl_av_len(aTHX_ array);
3990 IV i = CopARYBASE_get(PL_curcop);
3994 if (PL_op->op_type == OP_AKEYS) {
3996 for (; i <= n; i++) {
4001 for (i = 0; i <= n; i++) {
4002 SV *const *const elem = Perl_av_fetch(aTHX_ array, i, 0);
4003 PUSHs(elem ? *elem : &PL_sv_undef);
4010 /* Associative arrays. */
4016 HV * hash = MUTABLE_HV(POPs);
4018 const I32 gimme = GIMME_V;
4021 /* might clobber stack_sp */
4022 entry = hv_iternext(hash);
4027 SV* const sv = hv_iterkeysv(entry);
4028 PUSHs(sv); /* won't clobber stack_sp */
4029 if (gimme == G_ARRAY) {
4032 /* might clobber stack_sp */
4033 val = hv_iterval(hash, entry);
4038 else if (gimme == G_SCALAR)
4048 const I32 gimme = GIMME_V;
4049 const I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
4051 if (PL_op->op_private & OPpSLICE) {
4053 HV * const hv = MUTABLE_HV(POPs);
4054 const U32 hvtype = SvTYPE(hv);
4055 if (hvtype == SVt_PVHV) { /* hash element */
4056 while (++MARK <= SP) {
4057 SV * const sv = hv_delete_ent(hv, *MARK, discard, 0);
4058 *MARK = sv ? sv : &PL_sv_undef;
4061 else if (hvtype == SVt_PVAV) { /* array element */
4062 if (PL_op->op_flags & OPf_SPECIAL) {
4063 while (++MARK <= SP) {
4064 SV * const sv = av_delete(MUTABLE_AV(hv), SvIV(*MARK), discard);
4065 *MARK = sv ? sv : &PL_sv_undef;
4070 DIE(aTHX_ "Not a HASH reference");
4073 else if (gimme == G_SCALAR) {
4078 *++MARK = &PL_sv_undef;
4084 HV * const hv = MUTABLE_HV(POPs);
4086 if (SvTYPE(hv) == SVt_PVHV)
4087 sv = hv_delete_ent(hv, keysv, discard, 0);
4088 else if (SvTYPE(hv) == SVt_PVAV) {
4089 if (PL_op->op_flags & OPf_SPECIAL)
4090 sv = av_delete(MUTABLE_AV(hv), SvIV(keysv), discard);
4092 DIE(aTHX_ "panic: avhv_delete no longer supported");
4095 DIE(aTHX_ "Not a HASH reference");
4111 if (PL_op->op_private & OPpEXISTS_SUB) {
4113 SV * const sv = POPs;
4114 CV * const cv = sv_2cv(sv, &hv, &gv, 0);
4117 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
4122 hv = MUTABLE_HV(POPs);
4123 if (SvTYPE(hv) == SVt_PVHV) {
4124 if (hv_exists_ent(hv, tmpsv, 0))
4127 else if (SvTYPE(hv) == SVt_PVAV) {
4128 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
4129 if (av_exists(MUTABLE_AV(hv), SvIV(tmpsv)))
4134 DIE(aTHX_ "Not a HASH reference");
4141 dVAR; dSP; dMARK; dORIGMARK;
4142 register HV * const hv = MUTABLE_HV(POPs);
4143 register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
4144 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
4145 bool other_magic = FALSE;
4151 other_magic = mg_find((const SV *)hv, PERL_MAGIC_env) ||
4152 ((mg = mg_find((const SV *)hv, PERL_MAGIC_tied))
4153 /* Try to preserve the existenceness of a tied hash
4154 * element by using EXISTS and DELETE if possible.
4155 * Fallback to FETCH and STORE otherwise */
4156 && (stash = SvSTASH(SvRV(SvTIED_obj(MUTABLE_SV(hv), mg))))
4157 && gv_fetchmethod_autoload(stash, "EXISTS", TRUE)
4158 && gv_fetchmethod_autoload(stash, "DELETE", TRUE));
4161 while (++MARK <= SP) {
4162 SV * const keysv = *MARK;
4165 bool preeminent = FALSE;
4168 preeminent = SvRMAGICAL(hv) && !other_magic ? 1 :
4169 hv_exists_ent(hv, keysv, 0);
4172 he = hv_fetch_ent(hv, keysv, lval, 0);
4173 svp = he ? &HeVAL(he) : NULL;
4176 if (!svp || *svp == &PL_sv_undef) {
4177 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
4180 if (HvNAME_get(hv) && isGV(*svp))
4181 save_gp((GV*)*svp, !(PL_op->op_flags & OPf_SPECIAL));
4184 save_helem(hv, keysv, svp);
4187 const char * const key = SvPV_const(keysv, keylen);
4188 SAVEDELETE(hv, savepvn(key,keylen),
4189 SvUTF8(keysv) ? -(I32)keylen : (I32)keylen);
4194 *MARK = svp ? *svp : &PL_sv_undef;
4196 if (GIMME != G_ARRAY) {
4198 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
4204 /* List operators. */
4209 if (GIMME != G_ARRAY) {
4211 *MARK = *SP; /* unwanted list, return last item */
4213 *MARK = &PL_sv_undef;
4223 SV ** const lastrelem = PL_stack_sp;
4224 SV ** const lastlelem = PL_stack_base + POPMARK;
4225 SV ** const firstlelem = PL_stack_base + POPMARK + 1;
4226 register SV ** const firstrelem = lastlelem + 1;
4227 const I32 arybase = CopARYBASE_get(PL_curcop);
4228 I32 is_something_there = FALSE;
4230 register const I32 max = lastrelem - lastlelem;
4231 register SV **lelem;
4233 if (GIMME != G_ARRAY) {
4234 I32 ix = SvIV(*lastlelem);
4239 if (ix < 0 || ix >= max)
4240 *firstlelem = &PL_sv_undef;
4242 *firstlelem = firstrelem[ix];
4248 SP = firstlelem - 1;
4252 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
4253 I32 ix = SvIV(*lelem);
4258 if (ix < 0 || ix >= max)
4259 *lelem = &PL_sv_undef;
4261 is_something_there = TRUE;
4262 if (!(*lelem = firstrelem[ix]))
4263 *lelem = &PL_sv_undef;
4266 if (is_something_there)
4269 SP = firstlelem - 1;
4275 dVAR; dSP; dMARK; dORIGMARK;
4276 const I32 items = SP - MARK;
4277 SV * const av = MUTABLE_SV(av_make(items, MARK+1));
4278 SP = ORIGMARK; /* av_make() might realloc stack_sp */
4279 mXPUSHs((PL_op->op_flags & OPf_SPECIAL)
4280 ? newRV_noinc(av) : av);
4286 dVAR; dSP; dMARK; dORIGMARK;
4287 HV* const hv = newHV();
4290 SV * const key = *++MARK;
4291 SV * const val = newSV(0);
4293 sv_setsv(val, *++MARK);
4294 else if (ckWARN(WARN_MISC))
4295 Perl_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
4296 (void)hv_store_ent(hv,key,val,0);
4299 mXPUSHs((PL_op->op_flags & OPf_SPECIAL)
4300 ? newRV_noinc(MUTABLE_SV(hv)) : MUTABLE_SV(hv));
4306 dVAR; dSP; dMARK; dORIGMARK;
4307 register AV *ary = MUTABLE_AV(*++MARK);
4311 register I32 offset;
4312 register I32 length;
4316 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
4319 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
4323 call_method("SPLICE",GIMME_V);
4332 offset = i = SvIV(*MARK);
4334 offset += AvFILLp(ary) + 1;
4336 offset -= CopARYBASE_get(PL_curcop);
4338 DIE(aTHX_ PL_no_aelem, i);
4340 length = SvIVx(*MARK++);
4342 length += AvFILLp(ary) - offset + 1;
4348 length = AvMAX(ary) + 1; /* close enough to infinity */
4352 length = AvMAX(ary) + 1;
4354 if (offset > AvFILLp(ary) + 1) {
4355 if (ckWARN(WARN_MISC))
4356 Perl_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
4357 offset = AvFILLp(ary) + 1;
4359 after = AvFILLp(ary) + 1 - (offset + length);
4360 if (after < 0) { /* not that much array */
4361 length += after; /* offset+length now in array */
4367 /* At this point, MARK .. SP-1 is our new LIST */
4370 diff = newlen - length;
4371 if (newlen && !AvREAL(ary) && AvREIFY(ary))
4374 /* make new elements SVs now: avoid problems if they're from the array */
4375 for (dst = MARK, i = newlen; i; i--) {
4376 SV * const h = *dst;
4377 *dst++ = newSVsv(h);
4380 if (diff < 0) { /* shrinking the area */
4381 SV **tmparyval = NULL;
4383 Newx(tmparyval, newlen, SV*); /* so remember insertion */
4384 Copy(MARK, tmparyval, newlen, SV*);
4387 MARK = ORIGMARK + 1;
4388 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4389 MEXTEND(MARK, length);
4390 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
4392 EXTEND_MORTAL(length);
4393 for (i = length, dst = MARK; i; i--) {
4394 sv_2mortal(*dst); /* free them eventualy */
4401 *MARK = AvARRAY(ary)[offset+length-1];
4404 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
4405 SvREFCNT_dec(*dst++); /* free them now */
4408 AvFILLp(ary) += diff;
4410 /* pull up or down? */
4412 if (offset < after) { /* easier to pull up */
4413 if (offset) { /* esp. if nothing to pull */
4414 src = &AvARRAY(ary)[offset-1];
4415 dst = src - diff; /* diff is negative */
4416 for (i = offset; i > 0; i--) /* can't trust Copy */
4420 AvARRAY(ary) = AvARRAY(ary) - diff; /* diff is negative */
4424 if (after) { /* anything to pull down? */
4425 src = AvARRAY(ary) + offset + length;
4426 dst = src + diff; /* diff is negative */
4427 Move(src, dst, after, SV*);
4429 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
4430 /* avoid later double free */
4434 dst[--i] = &PL_sv_undef;
4437 Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
4438 Safefree(tmparyval);
4441 else { /* no, expanding (or same) */
4442 SV** tmparyval = NULL;
4444 Newx(tmparyval, length, SV*); /* so remember deletion */
4445 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
4448 if (diff > 0) { /* expanding */
4449 /* push up or down? */
4450 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
4454 Move(src, dst, offset, SV*);
4456 AvARRAY(ary) = AvARRAY(ary) - diff;/* diff is positive */
4458 AvFILLp(ary) += diff;
4461 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
4462 av_extend(ary, AvFILLp(ary) + diff);
4463 AvFILLp(ary) += diff;
4466 dst = AvARRAY(ary) + AvFILLp(ary);
4468 for (i = after; i; i--) {
4476 Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
4479 MARK = ORIGMARK + 1;
4480 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4482 Copy(tmparyval, MARK, length, SV*);
4484 EXTEND_MORTAL(length);
4485 for (i = length, dst = MARK; i; i--) {
4486 sv_2mortal(*dst); /* free them eventualy */
4493 else if (length--) {
4494 *MARK = tmparyval[length];
4497 while (length-- > 0)
4498 SvREFCNT_dec(tmparyval[length]);
4502 *MARK = &PL_sv_undef;
4503 Safefree(tmparyval);
4511 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4512 register AV * const ary = MUTABLE_AV(*++MARK);
4513 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
4516 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
4520 call_method("PUSH",G_SCALAR|G_DISCARD);
4524 PUSHi( AvFILL(ary) + 1 );
4527 PL_delaymagic = DM_DELAY;
4528 for (++MARK; MARK <= SP; MARK++) {
4529 SV * const sv = newSV(0);
4531 sv_setsv(sv, *MARK);
4532 av_store(ary, AvFILLp(ary)+1, sv);
4534 if (PL_delaymagic & DM_ARRAY)
4535 mg_set(MUTABLE_SV(ary));
4539 PUSHi( AvFILLp(ary) + 1 );
4548 AV * const av = MUTABLE_AV(POPs);
4549 SV * const sv = PL_op->op_type == OP_SHIFT ? av_shift(av) : av_pop(av);
4553 (void)sv_2mortal(sv);
4560 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4561 register AV *ary = MUTABLE_AV(*++MARK);
4562 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
4565 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
4569 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
4575 av_unshift(ary, SP - MARK);
4577 SV * const sv = newSVsv(*++MARK);
4578 (void)av_store(ary, i++, sv);
4582 PUSHi( AvFILL(ary) + 1 );
4589 SV ** const oldsp = SP;
4591 if (GIMME == G_ARRAY) {
4594 register SV * const tmp = *MARK;
4598 /* safe as long as stack cannot get extended in the above */
4603 register char *down;
4607 PADOFFSET padoff_du;
4609 SvUTF8_off(TARG); /* decontaminate */
4611 do_join(TARG, &PL_sv_no, MARK, SP);
4613 sv_setsv(TARG, (SP > MARK)
4615 : (padoff_du = find_rundefsvoffset(),
4616 (padoff_du == NOT_IN_PAD
4617 || PAD_COMPNAME_FLAGS_isOUR(padoff_du))
4618 ? DEFSV : PAD_SVl(padoff_du)));
4620 if (! SvOK(TARG) && ckWARN(WARN_UNINITIALIZED))
4621 report_uninit(TARG);
4624 up = SvPV_force(TARG, len);
4626 if (DO_UTF8(TARG)) { /* first reverse each character */
4627 U8* s = (U8*)SvPVX(TARG);
4628 const U8* send = (U8*)(s + len);
4630 if (UTF8_IS_INVARIANT(*s)) {
4635 if (!utf8_to_uvchr(s, 0))
4639 down = (char*)(s - 1);
4640 /* reverse this character */
4644 *down-- = (char)tmp;
4650 down = SvPVX(TARG) + len - 1;
4654 *down-- = (char)tmp;
4656 (void)SvPOK_only_UTF8(TARG);
4668 register IV limit = POPi; /* note, negative is forever */
4669 SV * const sv = POPs;
4671 register const char *s = SvPV_const(sv, len);
4672 const bool do_utf8 = DO_UTF8(sv);
4673 const char *strend = s + len;
4675 register REGEXP *rx;
4677 register const char *m;
4679 const STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (STRLEN)(strend - s);
4680 I32 maxiters = slen + 10;
4682 const I32 origlimit = limit;
4685 const I32 gimme = GIMME_V;
4686 const I32 oldsave = PL_savestack_ix;
4687 U32 make_mortal = SVs_TEMP;
4692 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4697 DIE(aTHX_ "panic: pp_split");
4700 TAINT_IF((RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) &&
4701 (RX_EXTFLAGS(rx) & (RXf_WHITE | RXf_SKIPWHITE)));
4703 RX_MATCH_UTF8_set(rx, do_utf8);
4706 if (pm->op_pmreplrootu.op_pmtargetoff) {
4707 ary = GvAVn((GV*)PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff));
4710 if (pm->op_pmreplrootu.op_pmtargetgv) {
4711 ary = GvAVn(pm->op_pmreplrootu.op_pmtargetgv);
4714 else if (gimme != G_ARRAY)
4715 ary = GvAVn(PL_defgv);
4718 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4724 if ((mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied))) {
4726 XPUSHs(SvTIED_obj(MUTABLE_SV(ary), mg));
4733 for (i = AvFILLp(ary); i >= 0; i--)
4734 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
4736 /* temporarily switch stacks */
4737 SAVESWITCHSTACK(PL_curstack, ary);
4741 base = SP - PL_stack_base;
4743 if (RX_EXTFLAGS(rx) & RXf_SKIPWHITE) {
4745 while (*s == ' ' || is_utf8_space((U8*)s))
4748 else if (RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) {
4749 while (isSPACE_LC(*s))
4757 if (RX_EXTFLAGS(rx) & PMf_MULTILINE) {
4762 limit = maxiters + 2;
4763 if (RX_EXTFLAGS(rx) & RXf_WHITE) {
4766 /* this one uses 'm' and is a negative test */
4768 while (m < strend && !( *m == ' ' || is_utf8_space((U8*)m) )) {
4769 const int t = UTF8SKIP(m);
4770 /* is_utf8_space returns FALSE for malform utf8 */
4776 } else if (RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) {
4777 while (m < strend && !isSPACE_LC(*m))
4780 while (m < strend && !isSPACE(*m))
4786 dstr = newSVpvn_flags(s, m-s,
4787 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
4790 /* skip the whitespace found last */
4792 s = m + UTF8SKIP(m);
4796 /* this one uses 's' and is a positive test */
4798 while (s < strend && ( *s == ' ' || is_utf8_space((U8*)s) ))
4800 } else if (RX_EXTFLAGS(rx) & RXf_PMf_LOCALE) {
4801 while (s < strend && isSPACE_LC(*s))
4804 while (s < strend && isSPACE(*s))
4809 else if (RX_EXTFLAGS(rx) & RXf_START_ONLY) {
4811 for (m = s; m < strend && *m != '\n'; m++)
4816 dstr = newSVpvn_flags(s, m-s,
4817 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
4822 else if (RX_EXTFLAGS(rx) & RXf_NULL && !(s >= strend)) {
4824 Pre-extend the stack, either the number of bytes or
4825 characters in the string or a limited amount, triggered by:
4827 my ($x, $y) = split //, $str;
4831 const U32 items = limit - 1;
4839 /* keep track of how many bytes we skip over */
4842 dstr = newSVpvn_flags(m, s-m, SVf_UTF8 | make_mortal);
4851 dstr = newSVpvn(s, 1);
4865 else if (do_utf8 == (RX_UTF8(rx) != 0) &&
4866 (RX_EXTFLAGS(rx) & RXf_USE_INTUIT) && !RX_NPARENS(rx)
4867 && (RX_EXTFLAGS(rx) & RXf_CHECK_ALL)
4868 && !(RX_EXTFLAGS(rx) & RXf_ANCH)) {
4869 const int tail = (RX_EXTFLAGS(rx) & RXf_INTUIT_TAIL);
4870 SV * const csv = CALLREG_INTUIT_STRING(rx);
4872 len = RX_MINLENRET(rx);
4873 if (len == 1 && !RX_UTF8(rx) && !tail) {
4874 const char c = *SvPV_nolen_const(csv);
4876 for (m = s; m < strend && *m != c; m++)
4880 dstr = newSVpvn_flags(s, m-s,
4881 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
4883 /* The rx->minlen is in characters but we want to step
4884 * s ahead by bytes. */
4886 s = (char*)utf8_hop((U8*)m, len);
4888 s = m + len; /* Fake \n at the end */
4892 while (s < strend && --limit &&
4893 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
4894 csv, multiline ? FBMrf_MULTILINE : 0)) )
4896 dstr = newSVpvn_flags(s, m-s,
4897 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
4899 /* The rx->minlen is in characters but we want to step
4900 * s ahead by bytes. */
4902 s = (char*)utf8_hop((U8*)m, len);
4904 s = m + len; /* Fake \n at the end */
4909 maxiters += slen * RX_NPARENS(rx);
4910 while (s < strend && --limit)
4914 rex_return = CALLREGEXEC(rx, (char*)s, (char*)strend, (char*)orig, 1 ,
4917 if (rex_return == 0)
4919 TAINT_IF(RX_MATCH_TAINTED(rx));
4920 if (RX_MATCH_COPIED(rx) && RX_SUBBEG(rx) != orig) {
4923 orig = RX_SUBBEG(rx);
4925 strend = s + (strend - m);
4927 m = RX_OFFS(rx)[0].start + orig;
4928 dstr = newSVpvn_flags(s, m-s,
4929 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
4931 if (RX_NPARENS(rx)) {
4933 for (i = 1; i <= (I32)RX_NPARENS(rx); i++) {
4934 s = RX_OFFS(rx)[i].start + orig;
4935 m = RX_OFFS(rx)[i].end + orig;
4937 /* japhy (07/27/01) -- the (m && s) test doesn't catch
4938 parens that didn't match -- they should be set to
4939 undef, not the empty string */
4940 if (m >= orig && s >= orig) {
4941 dstr = newSVpvn_flags(s, m-s,
4942 (do_utf8 ? SVf_UTF8 : 0)
4946 dstr = &PL_sv_undef; /* undef, not "" */
4950 s = RX_OFFS(rx)[0].end + orig;
4954 iters = (SP - PL_stack_base) - base;
4955 if (iters > maxiters)
4956 DIE(aTHX_ "Split loop");
4958 /* keep field after final delim? */
4959 if (s < strend || (iters && origlimit)) {
4960 const STRLEN l = strend - s;
4961 dstr = newSVpvn_flags(s, l, (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
4965 else if (!origlimit) {
4966 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
4967 if (TOPs && !make_mortal)
4970 *SP-- = &PL_sv_undef;
4975 LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */
4979 if (SvSMAGICAL(ary)) {
4981 mg_set(MUTABLE_SV(ary));
4984 if (gimme == G_ARRAY) {
4986 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4994 call_method("PUSH",G_SCALAR|G_DISCARD);
4997 if (gimme == G_ARRAY) {
4999 /* EXTEND should not be needed - we just popped them */
5001 for (i=0; i < iters; i++) {
5002 SV **svp = av_fetch(ary, i, FALSE);
5003 PUSHs((svp) ? *svp : &PL_sv_undef);
5010 if (gimme == G_ARRAY)
5022 SV *const sv = PAD_SVl(PL_op->op_targ);
5024 if (SvPADSTALE(sv)) {
5027 RETURNOP(cLOGOP->op_other);
5029 RETURNOP(cLOGOP->op_next);
5039 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
5040 || SvTYPE(retsv) == SVt_PVCV) {
5041 retsv = refto(retsv);
5048 PP(unimplemented_op)
5051 DIE(aTHX_ "panic: unimplemented op %s (#%d) called", OP_NAME(PL_op),
5057 * c-indentation-style: bsd
5059 * indent-tabs-mode: t
5062 * ex: set ts=8 sts=4 sw=4 noet: