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
13 * to discover, and no knowing what you'll find round a corner.
14 * And Elves, sir!' --Samwise Gamgee
16 * [p.225 of _The Lord of the Rings_, II/i: "Many Meetings"]
19 /* This file contains general pp ("push/pop") functions that execute the
20 * opcodes that make up a perl program. A typical pp function expects to
21 * find its arguments on the stack, and usually pushes its results onto
22 * the stack, hence the 'pp' terminology. Each OP structure contains
23 * a pointer to the relevant pp_foo() function.
33 /* XXX I can't imagine anyone who doesn't have this actually _needs_
34 it, since pid_t is an integral type.
37 #ifdef NEED_GETPID_PROTO
38 extern Pid_t getpid (void);
42 * Some BSDs and Cygwin default to POSIX math instead of IEEE.
43 * This switches them over to IEEE.
45 #if defined(LIBM_LIB_VERSION)
46 _LIB_VERSION_TYPE _LIB_VERSION = _IEEE_;
49 /* variations on pp_null */
55 if (GIMME_V == G_SCALAR)
66 assert(SvTYPE(TARG) == SVt_PVAV);
67 if (PL_op->op_private & OPpLVAL_INTRO)
68 if (!(PL_op->op_private & OPpPAD_STATE))
69 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
71 if (PL_op->op_flags & OPf_REF) {
74 } else if (PL_op->op_private & OPpMAYBE_LVSUB) {
75 const I32 flags = is_lvalue_sub();
76 if (flags && !(flags & OPpENTERSUB_INARGS)) {
77 if (GIMME == G_SCALAR)
78 /* diag_listed_as: Can't return %s to lvalue scalar context */
79 Perl_croak(aTHX_ "Can't return array to lvalue scalar context");
85 if (gimme == G_ARRAY) {
86 const I32 maxarg = AvFILL(MUTABLE_AV(TARG)) + 1;
88 if (SvMAGICAL(TARG)) {
90 for (i=0; i < (U32)maxarg; i++) {
91 SV * const * const svp = av_fetch(MUTABLE_AV(TARG), i, FALSE);
92 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
96 Copy(AvARRAY((const AV *)TARG), SP+1, maxarg, SV*);
100 else if (gimme == G_SCALAR) {
101 SV* const sv = sv_newmortal();
102 const I32 maxarg = AvFILL(MUTABLE_AV(TARG)) + 1;
103 sv_setiv(sv, maxarg);
114 assert(SvTYPE(TARG) == SVt_PVHV);
116 if (PL_op->op_private & OPpLVAL_INTRO)
117 if (!(PL_op->op_private & OPpPAD_STATE))
118 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
119 if (PL_op->op_flags & OPf_REF)
121 else if (PL_op->op_private & OPpMAYBE_LVSUB) {
122 const I32 flags = is_lvalue_sub();
123 if (flags && !(flags & OPpENTERSUB_INARGS)) {
124 if (GIMME == G_SCALAR)
125 /* diag_listed_as: Can't return %s to lvalue scalar context */
126 Perl_croak(aTHX_ "Can't return hash to lvalue scalar context");
131 if (gimme == G_ARRAY) {
132 RETURNOP(Perl_do_kv(aTHX));
134 else if (gimme == G_SCALAR) {
135 SV* const sv = Perl_hv_scalar(aTHX_ MUTABLE_HV(TARG));
143 static const char S_no_symref_sv[] =
144 "Can't use string (\"%" SVf32 "\"%s) as %s ref while \"strict refs\" in use";
146 /* In some cases this function inspects PL_op. If this function is called
147 for new op types, more bool parameters may need to be added in place of
150 When noinit is true, the absence of a gv will cause a retval of undef.
151 This is unrelated to the cv-to-gv assignment case.
155 S_rv2gv(pTHX_ SV *sv, const bool vivify_sv, const bool strict,
159 if (!isGV(sv) || SvFAKE(sv)) SvGETMAGIC(sv);
162 sv = amagic_deref_call(sv, to_gv_amg);
166 if (SvTYPE(sv) == SVt_PVIO) {
167 GV * const gv = MUTABLE_GV(sv_newmortal());
168 gv_init(gv, 0, "__ANONIO__", 10, 0);
169 GvIOp(gv) = MUTABLE_IO(sv);
170 SvREFCNT_inc_void_NN(sv);
173 else if (!isGV_with_GP(sv))
174 return (SV *)Perl_die(aTHX_ "Not a GLOB reference");
177 if (!isGV_with_GP(sv)) {
179 /* If this is a 'my' scalar and flag is set then vivify
182 if (vivify_sv && sv != &PL_sv_undef) {
185 Perl_croak_no_modify(aTHX);
186 if (cUNOP->op_targ) {
187 SV * const namesv = PAD_SV(cUNOP->op_targ);
188 gv = MUTABLE_GV(newSV(0));
189 gv_init_sv(gv, CopSTASH(PL_curcop), namesv, 0);
192 const char * const name = CopSTASHPV(PL_curcop);
193 gv = newGVgen_flags(name,
194 HvNAMEUTF8(CopSTASH(PL_curcop)) ? SVf_UTF8 : 0 );
196 prepare_SV_for_RV(sv);
197 SvRV_set(sv, MUTABLE_SV(gv));
202 if (PL_op->op_flags & OPf_REF || strict)
203 return (SV *)Perl_die(aTHX_ PL_no_usym, "a symbol");
204 if (ckWARN(WARN_UNINITIALIZED))
210 if (!(sv = MUTABLE_SV(gv_fetchsv_nomg(
211 sv, GV_ADDMG, SVt_PVGV
221 (SvPOKp(sv) && SvCUR(sv)>32 ? "..." : ""),
224 if ((PL_op->op_private & (OPpLVAL_INTRO|OPpDONT_INIT_GV))
225 == OPpDONT_INIT_GV) {
226 /* We are the target of a coderef assignment. Return
227 the scalar unchanged, and let pp_sasssign deal with
231 sv = MUTABLE_SV(gv_fetchsv_nomg(sv, GV_ADD, SVt_PVGV));
233 /* FAKE globs in the symbol table cause weird bugs (#77810) */
237 if (SvFAKE(sv) && !(PL_op->op_private & OPpALLOW_FAKE)) {
238 SV *newsv = sv_newmortal();
239 sv_setsv_flags(newsv, sv, 0);
251 sv, PL_op->op_private & OPpDEREF,
252 PL_op->op_private & HINT_STRICT_REFS,
253 ((PL_op->op_flags & OPf_SPECIAL) && !(PL_op->op_flags & OPf_MOD))
254 || PL_op->op_type == OP_READLINE
256 if (PL_op->op_private & OPpLVAL_INTRO)
257 save_gp(MUTABLE_GV(sv), !(PL_op->op_flags & OPf_SPECIAL));
262 /* Helper function for pp_rv2sv and pp_rv2av */
264 Perl_softref2xv(pTHX_ SV *const sv, const char *const what,
265 const svtype type, SV ***spp)
270 PERL_ARGS_ASSERT_SOFTREF2XV;
272 if (PL_op->op_private & HINT_STRICT_REFS) {
274 Perl_die(aTHX_ S_no_symref_sv, sv,
275 (SvPOKp(sv) && SvCUR(sv)>32 ? "..." : ""), what);
277 Perl_die(aTHX_ PL_no_usym, what);
281 PL_op->op_flags & OPf_REF &&
282 PL_op->op_next->op_type != OP_BOOLKEYS
284 Perl_die(aTHX_ PL_no_usym, what);
285 if (ckWARN(WARN_UNINITIALIZED))
287 if (type != SVt_PV && GIMME_V == G_ARRAY) {
291 **spp = &PL_sv_undef;
294 if ((PL_op->op_flags & OPf_SPECIAL) &&
295 !(PL_op->op_flags & OPf_MOD))
297 if (!(gv = gv_fetchsv_nomg(sv, GV_ADDMG, type)))
299 **spp = &PL_sv_undef;
304 gv = gv_fetchsv_nomg(sv, GV_ADD, type);
317 sv = amagic_deref_call(sv, to_sv_amg);
321 switch (SvTYPE(sv)) {
327 DIE(aTHX_ "Not a SCALAR reference");
334 if (!isGV_with_GP(gv)) {
335 gv = Perl_softref2xv(aTHX_ sv, "a SCALAR", SVt_PV, &sp);
341 if (PL_op->op_flags & OPf_MOD) {
342 if (PL_op->op_private & OPpLVAL_INTRO) {
343 if (cUNOP->op_first->op_type == OP_NULL)
344 sv = save_scalar(MUTABLE_GV(TOPs));
346 sv = save_scalar(gv);
348 Perl_croak(aTHX_ "%s", PL_no_localize_ref);
350 else if (PL_op->op_private & OPpDEREF)
351 sv = vivify_ref(sv, PL_op->op_private & OPpDEREF);
360 AV * const av = MUTABLE_AV(TOPs);
361 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
363 SV ** const sv = Perl_av_arylen_p(aTHX_ MUTABLE_AV(av));
365 *sv = newSV_type(SVt_PVMG);
366 sv_magic(*sv, MUTABLE_SV(av), PERL_MAGIC_arylen, NULL, 0);
370 SETs(sv_2mortal(newSViv(AvFILL(MUTABLE_AV(av)))));
379 if (PL_op->op_flags & OPf_MOD || LVRET) {
380 SV * const ret = sv_2mortal(newSV_type(SVt_PVLV)); /* Not TARG RT#67838 */
381 sv_magic(ret, NULL, PERL_MAGIC_pos, NULL, 0);
383 LvTARG(ret) = SvREFCNT_inc_simple(sv);
384 PUSHs(ret); /* no SvSETMAGIC */
388 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
389 const MAGIC * const mg = mg_find(sv, PERL_MAGIC_regex_global);
390 if (mg && mg->mg_len >= 0) {
408 const I32 flags = (PL_op->op_flags & OPf_SPECIAL)
410 : ((PL_op->op_private & (OPpLVAL_INTRO|OPpMAY_RETURN_CONSTANT)) == OPpMAY_RETURN_CONSTANT)
413 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
414 /* (But not in defined().) */
416 CV *cv = sv_2cv(TOPs, &stash_unused, &gv, flags);
418 else if ((flags == (GV_ADD|GV_NOEXPAND)) && gv && SvROK(gv)) {
422 cv = MUTABLE_CV(&PL_sv_undef);
423 SETs(MUTABLE_SV(cv));
433 SV *ret = &PL_sv_undef;
435 if (SvGMAGICAL(TOPs)) SETs(sv_mortalcopy(TOPs));
436 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
437 const char * s = SvPVX_const(TOPs);
438 if (strnEQ(s, "CORE::", 6)) {
439 const int code = keyword(s + 6, SvCUR(TOPs) - 6, 1);
440 if (!code || code == -KEY_CORE)
441 DIE(aTHX_ "Can't find an opnumber for \"%"SVf"\"",
442 SVfARG(newSVpvn_flags(
443 s+6, SvCUR(TOPs)-6, SvFLAGS(TOPs) & SVf_UTF8
446 SV * const sv = core_prototype(NULL, s + 6, code, NULL);
452 cv = sv_2cv(TOPs, &stash, &gv, 0);
454 ret = newSVpvn_flags(
455 CvPROTO(cv), CvPROTOLEN(cv), SVs_TEMP | SvUTF8(cv)
465 CV *cv = MUTABLE_CV(PAD_SV(PL_op->op_targ));
467 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
469 PUSHs(MUTABLE_SV(cv));
483 if (GIMME != G_ARRAY) {
487 *MARK = &PL_sv_undef;
488 *MARK = refto(*MARK);
492 EXTEND_MORTAL(SP - MARK);
494 *MARK = refto(*MARK);
499 S_refto(pTHX_ SV *sv)
504 PERL_ARGS_ASSERT_REFTO;
506 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
509 if (!(sv = LvTARG(sv)))
512 SvREFCNT_inc_void_NN(sv);
514 else if (SvTYPE(sv) == SVt_PVAV) {
515 if (!AvREAL((const AV *)sv) && AvREIFY((const AV *)sv))
516 av_reify(MUTABLE_AV(sv));
518 SvREFCNT_inc_void_NN(sv);
520 else if (SvPADTMP(sv) && !IS_PADGV(sv))
524 SvREFCNT_inc_void_NN(sv);
527 sv_upgrade(rv, SVt_IV);
536 SV * const sv = POPs;
541 if (!sv || !SvROK(sv))
544 (void)sv_ref(TARG,SvRV(sv),TRUE);
556 stash = CopSTASH(PL_curcop);
558 SV * const ssv = POPs;
562 if (!ssv) goto curstash;
563 if (!SvGMAGICAL(ssv) && !SvAMAGIC(ssv) && SvROK(ssv))
564 Perl_croak(aTHX_ "Attempt to bless into a reference");
565 ptr = SvPV_const(ssv,len);
567 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
568 "Explicit blessing to '' (assuming package main)");
569 stash = gv_stashpvn(ptr, len, GV_ADD|SvUTF8(ssv));
572 (void)sv_bless(TOPs, stash);
582 const char * const elem = SvPV_const(sv, len);
583 GV * const gv = MUTABLE_GV(POPs);
588 /* elem will always be NUL terminated. */
589 const char * const second_letter = elem + 1;
592 if (len == 5 && strEQ(second_letter, "RRAY"))
593 tmpRef = MUTABLE_SV(GvAV(gv));
596 if (len == 4 && strEQ(second_letter, "ODE"))
597 tmpRef = MUTABLE_SV(GvCVu(gv));
600 if (len == 10 && strEQ(second_letter, "ILEHANDLE")) {
601 /* finally deprecated in 5.8.0 */
602 deprecate("*glob{FILEHANDLE}");
603 tmpRef = MUTABLE_SV(GvIOp(gv));
606 if (len == 6 && strEQ(second_letter, "ORMAT"))
607 tmpRef = MUTABLE_SV(GvFORM(gv));
610 if (len == 4 && strEQ(second_letter, "LOB"))
611 tmpRef = MUTABLE_SV(gv);
614 if (len == 4 && strEQ(second_letter, "ASH"))
615 tmpRef = MUTABLE_SV(GvHV(gv));
618 if (*second_letter == 'O' && !elem[2] && len == 2)
619 tmpRef = MUTABLE_SV(GvIOp(gv));
622 if (len == 4 && strEQ(second_letter, "AME"))
623 sv = newSVhek(GvNAME_HEK(gv));
626 if (len == 7 && strEQ(second_letter, "ACKAGE")) {
627 const HV * const stash = GvSTASH(gv);
628 const HEK * const hek = stash ? HvNAME_HEK(stash) : NULL;
629 sv = hek ? newSVhek(hek) : newSVpvs("__ANON__");
633 if (len == 6 && strEQ(second_letter, "CALAR"))
648 /* Pattern matching */
656 if (len == 0 || len > I32_MAX || !SvPOK(sv) || SvUTF8(sv) || SvVALID(sv)) {
657 /* Historically, study was skipped in these cases. */
661 /* Make study a no-op. It's no longer useful and its existence
662 complicates matters elsewhere. */
671 if (PL_op->op_flags & OPf_STACKED)
673 else if (PL_op->op_private & OPpTARGET_MY)
679 TARG = sv_newmortal();
680 if(PL_op->op_type == OP_TRANSR) {
682 const char * const pv = SvPV(sv,len);
683 SV * const newsv = newSVpvn_flags(pv, len, SVs_TEMP|SvUTF8(sv));
687 else PUSHi(do_trans(sv));
691 /* Lvalue operators. */
694 S_do_chomp(pTHX_ SV *retval, SV *sv, bool chomping)
700 PERL_ARGS_ASSERT_DO_CHOMP;
702 if (chomping && (RsSNARF(PL_rs) || RsRECORD(PL_rs)))
704 if (SvTYPE(sv) == SVt_PVAV) {
706 AV *const av = MUTABLE_AV(sv);
707 const I32 max = AvFILL(av);
709 for (i = 0; i <= max; i++) {
710 sv = MUTABLE_SV(av_fetch(av, i, FALSE));
711 if (sv && ((sv = *(SV**)sv), sv != &PL_sv_undef))
712 do_chomp(retval, sv, chomping);
716 else if (SvTYPE(sv) == SVt_PVHV) {
717 HV* const hv = MUTABLE_HV(sv);
719 (void)hv_iterinit(hv);
720 while ((entry = hv_iternext(hv)))
721 do_chomp(retval, hv_iterval(hv,entry), chomping);
724 else if (SvREADONLY(sv)) {
726 /* SV is copy-on-write */
727 sv_force_normal_flags(sv, 0);
730 Perl_croak_no_modify(aTHX);
735 /* XXX, here sv is utf8-ized as a side-effect!
736 If encoding.pm is used properly, almost string-generating
737 operations, including literal strings, chr(), input data, etc.
738 should have been utf8-ized already, right?
740 sv_recode_to_utf8(sv, PL_encoding);
746 char *temp_buffer = NULL;
755 while (len && s[-1] == '\n') {
762 STRLEN rslen, rs_charlen;
763 const char *rsptr = SvPV_const(PL_rs, rslen);
765 rs_charlen = SvUTF8(PL_rs)
769 if (SvUTF8(PL_rs) != SvUTF8(sv)) {
770 /* Assumption is that rs is shorter than the scalar. */
772 /* RS is utf8, scalar is 8 bit. */
774 temp_buffer = (char*)bytes_from_utf8((U8*)rsptr,
777 /* Cannot downgrade, therefore cannot possibly match
779 assert (temp_buffer == rsptr);
785 else if (PL_encoding) {
786 /* RS is 8 bit, encoding.pm is used.
787 * Do not recode PL_rs as a side-effect. */
788 svrecode = newSVpvn(rsptr, rslen);
789 sv_recode_to_utf8(svrecode, PL_encoding);
790 rsptr = SvPV_const(svrecode, rslen);
791 rs_charlen = sv_len_utf8(svrecode);
794 /* RS is 8 bit, scalar is utf8. */
795 temp_buffer = (char*)bytes_to_utf8((U8*)rsptr, &rslen);
809 if (memNE(s, rsptr, rslen))
811 SvIVX(retval) += rs_charlen;
814 s = SvPV_force_nomg_nolen(sv);
822 SvREFCNT_dec(svrecode);
824 Safefree(temp_buffer);
826 if (len && !SvPOK(sv))
827 s = SvPV_force_nomg(sv, len);
830 char * const send = s + len;
831 char * const start = s;
833 while (s > start && UTF8_IS_CONTINUATION(*s))
835 if (is_utf8_string((U8*)s, send - s)) {
836 sv_setpvn(retval, s, send - s);
838 SvCUR_set(sv, s - start);
844 sv_setpvs(retval, "");
848 sv_setpvn(retval, s, 1);
855 sv_setpvs(retval, "");
863 const bool chomping = PL_op->op_type == OP_SCHOMP;
867 do_chomp(TARG, TOPs, chomping);
874 dVAR; dSP; dMARK; dTARGET; dORIGMARK;
875 const bool chomping = PL_op->op_type == OP_CHOMP;
880 do_chomp(TARG, *++MARK, chomping);
891 if (!PL_op->op_private) {
900 SV_CHECK_THINKFIRST_COW_DROP(sv);
902 switch (SvTYPE(sv)) {
906 av_undef(MUTABLE_AV(sv));
909 hv_undef(MUTABLE_HV(sv));
912 if (cv_const_sv((const CV *)sv))
913 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
914 "Constant subroutine %"SVf" undefined",
915 SVfARG(CvANON((const CV *)sv)
916 ? newSVpvs_flags("(anonymous)", SVs_TEMP)
917 : sv_2mortal(newSVhek(GvENAME_HEK(CvGV((const CV *)sv))))));
921 /* let user-undef'd sub keep its identity */
922 GV* const gv = CvGV((const CV *)sv);
923 cv_undef(MUTABLE_CV(sv));
924 CvGV_set(MUTABLE_CV(sv), gv);
929 SvSetMagicSV(sv, &PL_sv_undef);
932 else if (isGV_with_GP(sv)) {
936 /* undef *Pkg::meth_name ... */
938 = GvCVu((const GV *)sv) && (stash = GvSTASH((const GV *)sv))
939 && HvENAME_get(stash);
941 if((stash = GvHV((const GV *)sv))) {
942 if(HvENAME_get(stash))
943 SvREFCNT_inc_simple_void_NN(sv_2mortal((SV *)stash));
947 gp_free(MUTABLE_GV(sv));
949 GvGP_set(sv, gp_ref(gp));
951 GvLINE(sv) = CopLINE(PL_curcop);
952 GvEGV(sv) = MUTABLE_GV(sv);
956 mro_package_moved(NULL, stash, (const GV *)sv, 0);
958 /* undef *Foo::ISA */
959 if( strEQ(GvNAME((const GV *)sv), "ISA")
960 && (stash = GvSTASH((const GV *)sv))
961 && (method_changed || HvENAME(stash)) )
962 mro_isa_changed_in(stash);
963 else if(method_changed)
964 mro_method_changed_in(
965 GvSTASH((const GV *)sv)
972 if (SvTYPE(sv) >= SVt_PV && SvPVX_const(sv) && SvLEN(sv)) {
988 PL_op->op_type == OP_POSTINC || PL_op->op_type == OP_I_POSTINC;
989 if (SvTYPE(TOPs) >= SVt_PVAV || (isGV_with_GP(TOPs) && !SvFAKE(TOPs)))
990 Perl_croak_no_modify(aTHX);
992 TARG = sv_newmortal();
993 sv_setsv(TARG, TOPs);
994 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
995 && SvIVX(TOPs) != (inc ? IV_MAX : IV_MIN))
997 SvIV_set(TOPs, SvIVX(TOPs) + (inc ? 1 : -1));
998 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
1002 else sv_dec_nomg(TOPs);
1004 /* special case for undef: see thread at 2003-03/msg00536.html in archive */
1005 if (inc && !SvOK(TARG))
1011 /* Ordinary operators. */
1015 dVAR; dSP; dATARGET; SV *svl, *svr;
1016 #ifdef PERL_PRESERVE_IVUV
1019 tryAMAGICbin_MG(pow_amg, AMGf_assign|AMGf_numeric);
1022 #ifdef PERL_PRESERVE_IVUV
1023 /* For integer to integer power, we do the calculation by hand wherever
1024 we're sure it is safe; otherwise we call pow() and try to convert to
1025 integer afterwards. */
1026 if (SvIV_please_nomg(svr) && SvIV_please_nomg(svl)) {
1034 const IV iv = SvIVX(svr);
1038 goto float_it; /* Can't do negative powers this way. */
1042 baseuok = SvUOK(svl);
1044 baseuv = SvUVX(svl);
1046 const IV iv = SvIVX(svl);
1049 baseuok = TRUE; /* effectively it's a UV now */
1051 baseuv = -iv; /* abs, baseuok == false records sign */
1054 /* now we have integer ** positive integer. */
1057 /* foo & (foo - 1) is zero only for a power of 2. */
1058 if (!(baseuv & (baseuv - 1))) {
1059 /* We are raising power-of-2 to a positive integer.
1060 The logic here will work for any base (even non-integer
1061 bases) but it can be less accurate than
1062 pow (base,power) or exp (power * log (base)) when the
1063 intermediate values start to spill out of the mantissa.
1064 With powers of 2 we know this can't happen.
1065 And powers of 2 are the favourite thing for perl
1066 programmers to notice ** not doing what they mean. */
1068 NV base = baseuok ? baseuv : -(NV)baseuv;
1073 while (power >>= 1) {
1081 SvIV_please_nomg(svr);
1084 register unsigned int highbit = 8 * sizeof(UV);
1085 register unsigned int diff = 8 * sizeof(UV);
1086 while (diff >>= 1) {
1088 if (baseuv >> highbit) {
1092 /* we now have baseuv < 2 ** highbit */
1093 if (power * highbit <= 8 * sizeof(UV)) {
1094 /* result will definitely fit in UV, so use UV math
1095 on same algorithm as above */
1096 register UV result = 1;
1097 register UV base = baseuv;
1098 const bool odd_power = cBOOL(power & 1);
1102 while (power >>= 1) {
1109 if (baseuok || !odd_power)
1110 /* answer is positive */
1112 else if (result <= (UV)IV_MAX)
1113 /* answer negative, fits in IV */
1114 SETi( -(IV)result );
1115 else if (result == (UV)IV_MIN)
1116 /* 2's complement assumption: special case IV_MIN */
1119 /* answer negative, doesn't fit */
1120 SETn( -(NV)result );
1128 NV right = SvNV_nomg(svr);
1129 NV left = SvNV_nomg(svl);
1132 #if defined(USE_LONG_DOUBLE) && defined(HAS_AIX_POWL_NEG_BASE_BUG)
1134 We are building perl with long double support and are on an AIX OS
1135 afflicted with a powl() function that wrongly returns NaNQ for any
1136 negative base. This was reported to IBM as PMR #23047-379 on
1137 03/06/2006. The problem exists in at least the following versions
1138 of AIX and the libm fileset, and no doubt others as well:
1140 AIX 4.3.3-ML10 bos.adt.libm 4.3.3.50
1141 AIX 5.1.0-ML04 bos.adt.libm 5.1.0.29
1142 AIX 5.2.0 bos.adt.libm 5.2.0.85
1144 So, until IBM fixes powl(), we provide the following workaround to
1145 handle the problem ourselves. Our logic is as follows: for
1146 negative bases (left), we use fmod(right, 2) to check if the
1147 exponent is an odd or even integer:
1149 - if odd, powl(left, right) == -powl(-left, right)
1150 - if even, powl(left, right) == powl(-left, right)
1152 If the exponent is not an integer, the result is rightly NaNQ, so
1153 we just return that (as NV_NAN).
1157 NV mod2 = Perl_fmod( right, 2.0 );
1158 if (mod2 == 1.0 || mod2 == -1.0) { /* odd integer */
1159 SETn( -Perl_pow( -left, right) );
1160 } else if (mod2 == 0.0) { /* even integer */
1161 SETn( Perl_pow( -left, right) );
1162 } else { /* fractional power */
1166 SETn( Perl_pow( left, right) );
1169 SETn( Perl_pow( left, right) );
1170 #endif /* HAS_AIX_POWL_NEG_BASE_BUG */
1172 #ifdef PERL_PRESERVE_IVUV
1174 SvIV_please_nomg(svr);
1182 dVAR; dSP; dATARGET; SV *svl, *svr;
1183 tryAMAGICbin_MG(mult_amg, AMGf_assign|AMGf_numeric);
1186 #ifdef PERL_PRESERVE_IVUV
1187 if (SvIV_please_nomg(svr)) {
1188 /* Unless the left argument is integer in range we are going to have to
1189 use NV maths. Hence only attempt to coerce the right argument if
1190 we know the left is integer. */
1191 /* Left operand is defined, so is it IV? */
1192 if (SvIV_please_nomg(svl)) {
1193 bool auvok = SvUOK(svl);
1194 bool buvok = SvUOK(svr);
1195 const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
1196 const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
1205 const IV aiv = SvIVX(svl);
1208 auvok = TRUE; /* effectively it's a UV now */
1210 alow = -aiv; /* abs, auvok == false records sign */
1216 const IV biv = SvIVX(svr);
1219 buvok = TRUE; /* effectively it's a UV now */
1221 blow = -biv; /* abs, buvok == false records sign */
1225 /* If this does sign extension on unsigned it's time for plan B */
1226 ahigh = alow >> (4 * sizeof (UV));
1228 bhigh = blow >> (4 * sizeof (UV));
1230 if (ahigh && bhigh) {
1232 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
1233 which is overflow. Drop to NVs below. */
1234 } else if (!ahigh && !bhigh) {
1235 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
1236 so the unsigned multiply cannot overflow. */
1237 const UV product = alow * blow;
1238 if (auvok == buvok) {
1239 /* -ve * -ve or +ve * +ve gives a +ve result. */
1243 } else if (product <= (UV)IV_MIN) {
1244 /* 2s complement assumption that (UV)-IV_MIN is correct. */
1245 /* -ve result, which could overflow an IV */
1247 SETi( -(IV)product );
1249 } /* else drop to NVs below. */
1251 /* One operand is large, 1 small */
1254 /* swap the operands */
1256 bhigh = blow; /* bhigh now the temp var for the swap */
1260 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1261 multiplies can't overflow. shift can, add can, -ve can. */
1262 product_middle = ahigh * blow;
1263 if (!(product_middle & topmask)) {
1264 /* OK, (ahigh * blow) won't lose bits when we shift it. */
1266 product_middle <<= (4 * sizeof (UV));
1267 product_low = alow * blow;
1269 /* as for pp_add, UV + something mustn't get smaller.
1270 IIRC ANSI mandates this wrapping *behaviour* for
1271 unsigned whatever the actual representation*/
1272 product_low += product_middle;
1273 if (product_low >= product_middle) {
1274 /* didn't overflow */
1275 if (auvok == buvok) {
1276 /* -ve * -ve or +ve * +ve gives a +ve result. */
1278 SETu( product_low );
1280 } else if (product_low <= (UV)IV_MIN) {
1281 /* 2s complement assumption again */
1282 /* -ve result, which could overflow an IV */
1284 SETi( -(IV)product_low );
1286 } /* else drop to NVs below. */
1288 } /* product_middle too large */
1289 } /* ahigh && bhigh */
1294 NV right = SvNV_nomg(svr);
1295 NV left = SvNV_nomg(svl);
1297 SETn( left * right );
1304 dVAR; dSP; dATARGET; SV *svl, *svr;
1305 tryAMAGICbin_MG(div_amg, AMGf_assign|AMGf_numeric);
1308 /* Only try to do UV divide first
1309 if ((SLOPPYDIVIDE is true) or
1310 (PERL_PRESERVE_IVUV is true and one or both SV is a UV too large
1312 The assumption is that it is better to use floating point divide
1313 whenever possible, only doing integer divide first if we can't be sure.
1314 If NV_PRESERVES_UV is true then we know at compile time that no UV
1315 can be too large to preserve, so don't need to compile the code to
1316 test the size of UVs. */
1319 # define PERL_TRY_UV_DIVIDE
1320 /* ensure that 20./5. == 4. */
1322 # ifdef PERL_PRESERVE_IVUV
1323 # ifndef NV_PRESERVES_UV
1324 # define PERL_TRY_UV_DIVIDE
1329 #ifdef PERL_TRY_UV_DIVIDE
1330 if (SvIV_please_nomg(svr) && SvIV_please_nomg(svl)) {
1331 bool left_non_neg = SvUOK(svl);
1332 bool right_non_neg = SvUOK(svr);
1336 if (right_non_neg) {
1340 const IV biv = SvIVX(svr);
1343 right_non_neg = TRUE; /* effectively it's a UV now */
1349 /* historically undef()/0 gives a "Use of uninitialized value"
1350 warning before dieing, hence this test goes here.
1351 If it were immediately before the second SvIV_please, then
1352 DIE() would be invoked before left was even inspected, so
1353 no inspection would give no warning. */
1355 DIE(aTHX_ "Illegal division by zero");
1361 const IV aiv = SvIVX(svl);
1364 left_non_neg = TRUE; /* effectively it's a UV now */
1373 /* For sloppy divide we always attempt integer division. */
1375 /* Otherwise we only attempt it if either or both operands
1376 would not be preserved by an NV. If both fit in NVs
1377 we fall through to the NV divide code below. However,
1378 as left >= right to ensure integer result here, we know that
1379 we can skip the test on the right operand - right big
1380 enough not to be preserved can't get here unless left is
1383 && (left > ((UV)1 << NV_PRESERVES_UV_BITS))
1386 /* Integer division can't overflow, but it can be imprecise. */
1387 const UV result = left / right;
1388 if (result * right == left) {
1389 SP--; /* result is valid */
1390 if (left_non_neg == right_non_neg) {
1391 /* signs identical, result is positive. */
1395 /* 2s complement assumption */
1396 if (result <= (UV)IV_MIN)
1397 SETi( -(IV)result );
1399 /* It's exact but too negative for IV. */
1400 SETn( -(NV)result );
1403 } /* tried integer divide but it was not an integer result */
1404 } /* else (PERL_ABS(result) < 1.0) or (both UVs in range for NV) */
1405 } /* one operand wasn't SvIOK */
1406 #endif /* PERL_TRY_UV_DIVIDE */
1408 NV right = SvNV_nomg(svr);
1409 NV left = SvNV_nomg(svl);
1410 (void)POPs;(void)POPs;
1411 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1412 if (! Perl_isnan(right) && right == 0.0)
1416 DIE(aTHX_ "Illegal division by zero");
1417 PUSHn( left / right );
1424 dVAR; dSP; dATARGET;
1425 tryAMAGICbin_MG(modulo_amg, AMGf_assign|AMGf_numeric);
1429 bool left_neg = FALSE;
1430 bool right_neg = FALSE;
1431 bool use_double = FALSE;
1432 bool dright_valid = FALSE;
1435 SV * const svr = TOPs;
1436 SV * const svl = TOPm1s;
1437 if (SvIV_please_nomg(svr)) {
1438 right_neg = !SvUOK(svr);
1442 const IV biv = SvIVX(svr);
1445 right_neg = FALSE; /* effectively it's a UV now */
1452 dright = SvNV_nomg(svr);
1453 right_neg = dright < 0;
1456 if (dright < UV_MAX_P1) {
1457 right = U_V(dright);
1458 dright_valid = TRUE; /* In case we need to use double below. */
1464 /* At this point use_double is only true if right is out of range for
1465 a UV. In range NV has been rounded down to nearest UV and
1466 use_double false. */
1467 if (!use_double && SvIV_please_nomg(svl)) {
1468 left_neg = !SvUOK(svl);
1472 const IV aiv = SvIVX(svl);
1475 left_neg = FALSE; /* effectively it's a UV now */
1482 dleft = SvNV_nomg(svl);
1483 left_neg = dleft < 0;
1487 /* This should be exactly the 5.6 behaviour - if left and right are
1488 both in range for UV then use U_V() rather than floor. */
1490 if (dleft < UV_MAX_P1) {
1491 /* right was in range, so is dleft, so use UVs not double.
1495 /* left is out of range for UV, right was in range, so promote
1496 right (back) to double. */
1498 /* The +0.5 is used in 5.6 even though it is not strictly
1499 consistent with the implicit +0 floor in the U_V()
1500 inside the #if 1. */
1501 dleft = Perl_floor(dleft + 0.5);
1504 dright = Perl_floor(dright + 0.5);
1515 DIE(aTHX_ "Illegal modulus zero");
1517 dans = Perl_fmod(dleft, dright);
1518 if ((left_neg != right_neg) && dans)
1519 dans = dright - dans;
1522 sv_setnv(TARG, dans);
1528 DIE(aTHX_ "Illegal modulus zero");
1531 if ((left_neg != right_neg) && ans)
1534 /* XXX may warn: unary minus operator applied to unsigned type */
1535 /* could change -foo to be (~foo)+1 instead */
1536 if (ans <= ~((UV)IV_MAX)+1)
1537 sv_setiv(TARG, ~ans+1);
1539 sv_setnv(TARG, -(NV)ans);
1542 sv_setuv(TARG, ans);
1551 dVAR; dSP; dATARGET;
1555 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1556 /* TODO: think of some way of doing list-repeat overloading ??? */
1561 tryAMAGICbin_MG(repeat_amg, AMGf_assign);
1567 const UV uv = SvUV_nomg(sv);
1569 count = IV_MAX; /* The best we can do? */
1573 const IV iv = SvIV_nomg(sv);
1580 else if (SvNOKp(sv)) {
1581 const NV nv = SvNV_nomg(sv);
1588 count = SvIV_nomg(sv);
1590 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1592 static const char oom_list_extend[] = "Out of memory during list extend";
1593 const I32 items = SP - MARK;
1594 const I32 max = items * count;
1596 MEM_WRAP_CHECK_1(max, SV*, oom_list_extend);
1597 /* Did the max computation overflow? */
1598 if (items > 0 && max > 0 && (max < items || max < count))
1599 Perl_croak(aTHX_ oom_list_extend);
1604 /* This code was intended to fix 20010809.028:
1607 for (($x =~ /./g) x 2) {
1608 print chop; # "abcdabcd" expected as output.
1611 * but that change (#11635) broke this code:
1613 $x = [("foo")x2]; # only one "foo" ended up in the anonlist.
1615 * I can't think of a better fix that doesn't introduce
1616 * an efficiency hit by copying the SVs. The stack isn't
1617 * refcounted, and mortalisation obviously doesn't
1618 * Do The Right Thing when the stack has more than
1619 * one pointer to the same mortal value.
1623 *SP = sv_2mortal(newSVsv(*SP));
1633 repeatcpy((char*)(MARK + items), (char*)MARK,
1634 items * sizeof(const SV *), count - 1);
1637 else if (count <= 0)
1640 else { /* Note: mark already snarfed by pp_list */
1641 SV * const tmpstr = POPs;
1644 static const char oom_string_extend[] =
1645 "Out of memory during string extend";
1648 sv_setsv_nomg(TARG, tmpstr);
1649 SvPV_force_nomg(TARG, len);
1650 isutf = DO_UTF8(TARG);
1655 const STRLEN max = (UV)count * len;
1656 if (len > MEM_SIZE_MAX / count)
1657 Perl_croak(aTHX_ oom_string_extend);
1658 MEM_WRAP_CHECK_1(max, char, oom_string_extend);
1659 SvGROW(TARG, max + 1);
1660 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1661 SvCUR_set(TARG, SvCUR(TARG) * count);
1663 *SvEND(TARG) = '\0';
1666 (void)SvPOK_only_UTF8(TARG);
1668 (void)SvPOK_only(TARG);
1670 if (PL_op->op_private & OPpREPEAT_DOLIST) {
1671 /* The parser saw this as a list repeat, and there
1672 are probably several items on the stack. But we're
1673 in scalar context, and there's no pp_list to save us
1674 now. So drop the rest of the items -- robin@kitsite.com
1686 dVAR; dSP; dATARGET; bool useleft; SV *svl, *svr;
1687 tryAMAGICbin_MG(subtr_amg, AMGf_assign|AMGf_numeric);
1690 useleft = USE_LEFT(svl);
1691 #ifdef PERL_PRESERVE_IVUV
1692 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1693 "bad things" happen if you rely on signed integers wrapping. */
1694 if (SvIV_please_nomg(svr)) {
1695 /* Unless the left argument is integer in range we are going to have to
1696 use NV maths. Hence only attempt to coerce the right argument if
1697 we know the left is integer. */
1698 register UV auv = 0;
1704 a_valid = auvok = 1;
1705 /* left operand is undef, treat as zero. */
1707 /* Left operand is defined, so is it IV? */
1708 if (SvIV_please_nomg(svl)) {
1709 if ((auvok = SvUOK(svl)))
1712 register const IV aiv = SvIVX(svl);
1715 auvok = 1; /* Now acting as a sign flag. */
1716 } else { /* 2s complement assumption for IV_MIN */
1724 bool result_good = 0;
1727 bool buvok = SvUOK(svr);
1732 register const IV biv = SvIVX(svr);
1739 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1740 else "IV" now, independent of how it came in.
1741 if a, b represents positive, A, B negative, a maps to -A etc
1746 all UV maths. negate result if A negative.
1747 subtract if signs same, add if signs differ. */
1749 if (auvok ^ buvok) {
1758 /* Must get smaller */
1763 if (result <= buv) {
1764 /* result really should be -(auv-buv). as its negation
1765 of true value, need to swap our result flag */
1777 if (result <= (UV)IV_MIN)
1778 SETi( -(IV)result );
1780 /* result valid, but out of range for IV. */
1781 SETn( -(NV)result );
1785 } /* Overflow, drop through to NVs. */
1790 NV value = SvNV_nomg(svr);
1794 /* left operand is undef, treat as zero - value */
1798 SETn( SvNV_nomg(svl) - value );
1805 dVAR; dSP; dATARGET; SV *svl, *svr;
1806 tryAMAGICbin_MG(lshift_amg, AMGf_assign|AMGf_numeric);
1810 const IV shift = SvIV_nomg(svr);
1811 if (PL_op->op_private & HINT_INTEGER) {
1812 const IV i = SvIV_nomg(svl);
1816 const UV u = SvUV_nomg(svl);
1825 dVAR; dSP; dATARGET; SV *svl, *svr;
1826 tryAMAGICbin_MG(rshift_amg, AMGf_assign|AMGf_numeric);
1830 const IV shift = SvIV_nomg(svr);
1831 if (PL_op->op_private & HINT_INTEGER) {
1832 const IV i = SvIV_nomg(svl);
1836 const UV u = SvUV_nomg(svl);
1848 tryAMAGICbin_MG(lt_amg, AMGf_set|AMGf_numeric);
1852 (SvIOK_notUV(left) && SvIOK_notUV(right))
1853 ? (SvIVX(left) < SvIVX(right))
1854 : (do_ncmp(left, right) == -1)
1864 tryAMAGICbin_MG(gt_amg, AMGf_set|AMGf_numeric);
1868 (SvIOK_notUV(left) && SvIOK_notUV(right))
1869 ? (SvIVX(left) > SvIVX(right))
1870 : (do_ncmp(left, right) == 1)
1880 tryAMAGICbin_MG(le_amg, AMGf_set|AMGf_numeric);
1884 (SvIOK_notUV(left) && SvIOK_notUV(right))
1885 ? (SvIVX(left) <= SvIVX(right))
1886 : (do_ncmp(left, right) <= 0)
1896 tryAMAGICbin_MG(ge_amg, AMGf_set|AMGf_numeric);
1900 (SvIOK_notUV(left) && SvIOK_notUV(right))
1901 ? (SvIVX(left) >= SvIVX(right))
1902 : ( (do_ncmp(left, right) & 2) == 0)
1912 tryAMAGICbin_MG(ne_amg, AMGf_set|AMGf_numeric);
1916 (SvIOK_notUV(left) && SvIOK_notUV(right))
1917 ? (SvIVX(left) != SvIVX(right))
1918 : (do_ncmp(left, right) != 0)
1923 /* compare left and right SVs. Returns:
1927 * 2: left or right was a NaN
1930 Perl_do_ncmp(pTHX_ SV* const left, SV * const right)
1934 PERL_ARGS_ASSERT_DO_NCMP;
1935 #ifdef PERL_PRESERVE_IVUV
1936 /* Fortunately it seems NaN isn't IOK */
1937 if (SvIV_please_nomg(right) && SvIV_please_nomg(left)) {
1939 const IV leftiv = SvIVX(left);
1940 if (!SvUOK(right)) {
1941 /* ## IV <=> IV ## */
1942 const IV rightiv = SvIVX(right);
1943 return (leftiv > rightiv) - (leftiv < rightiv);
1945 /* ## IV <=> UV ## */
1947 /* As (b) is a UV, it's >=0, so it must be < */
1950 const UV rightuv = SvUVX(right);
1951 return ((UV)leftiv > rightuv) - ((UV)leftiv < rightuv);
1956 /* ## UV <=> UV ## */
1957 const UV leftuv = SvUVX(left);
1958 const UV rightuv = SvUVX(right);
1959 return (leftuv > rightuv) - (leftuv < rightuv);
1961 /* ## UV <=> IV ## */
1963 const IV rightiv = SvIVX(right);
1965 /* As (a) is a UV, it's >=0, so it cannot be < */
1968 const UV leftuv = SvUVX(left);
1969 return (leftuv > (UV)rightiv) - (leftuv < (UV)rightiv);
1972 assert(0); /* NOTREACHED */
1976 NV const rnv = SvNV_nomg(right);
1977 NV const lnv = SvNV_nomg(left);
1979 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1980 if (Perl_isnan(lnv) || Perl_isnan(rnv)) {
1983 return (lnv > rnv) - (lnv < rnv);
2002 tryAMAGICbin_MG(ncmp_amg, AMGf_numeric);
2005 value = do_ncmp(left, right);
2020 int amg_type = sle_amg;
2024 switch (PL_op->op_type) {
2043 tryAMAGICbin_MG(amg_type, AMGf_set);
2046 const int cmp = (IN_LOCALE_RUNTIME
2047 ? sv_cmp_locale_flags(left, right, 0)
2048 : sv_cmp_flags(left, right, 0));
2049 SETs(boolSV(cmp * multiplier < rhs));
2057 tryAMAGICbin_MG(seq_amg, AMGf_set);
2060 SETs(boolSV(sv_eq_flags(left, right, 0)));
2068 tryAMAGICbin_MG(sne_amg, AMGf_set);
2071 SETs(boolSV(!sv_eq_flags(left, right, 0)));
2079 tryAMAGICbin_MG(scmp_amg, 0);
2082 const int cmp = (IN_LOCALE_RUNTIME
2083 ? sv_cmp_locale_flags(left, right, 0)
2084 : sv_cmp_flags(left, right, 0));
2092 dVAR; dSP; dATARGET;
2093 tryAMAGICbin_MG(band_amg, AMGf_assign);
2096 if (SvNIOKp(left) || SvNIOKp(right)) {
2097 const bool left_ro_nonnum = !SvNIOKp(left) && SvREADONLY(left);
2098 const bool right_ro_nonnum = !SvNIOKp(right) && SvREADONLY(right);
2099 if (PL_op->op_private & HINT_INTEGER) {
2100 const IV i = SvIV_nomg(left) & SvIV_nomg(right);
2104 const UV u = SvUV_nomg(left) & SvUV_nomg(right);
2107 if (left_ro_nonnum && left != TARG) SvNIOK_off(left);
2108 if (right_ro_nonnum) SvNIOK_off(right);
2111 do_vop(PL_op->op_type, TARG, left, right);
2120 dVAR; dSP; dATARGET;
2121 const int op_type = PL_op->op_type;
2123 tryAMAGICbin_MG((op_type == OP_BIT_OR ? bor_amg : bxor_amg), AMGf_assign);
2126 if (SvNIOKp(left) || SvNIOKp(right)) {
2127 const bool left_ro_nonnum = !SvNIOKp(left) && SvREADONLY(left);
2128 const bool right_ro_nonnum = !SvNIOKp(right) && SvREADONLY(right);
2129 if (PL_op->op_private & HINT_INTEGER) {
2130 const IV l = (USE_LEFT(left) ? SvIV_nomg(left) : 0);
2131 const IV r = SvIV_nomg(right);
2132 const IV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2136 const UV l = (USE_LEFT(left) ? SvUV_nomg(left) : 0);
2137 const UV r = SvUV_nomg(right);
2138 const UV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2141 if (left_ro_nonnum && left != TARG) SvNIOK_off(left);
2142 if (right_ro_nonnum) SvNIOK_off(right);
2145 do_vop(op_type, TARG, left, right);
2155 tryAMAGICun_MG(neg_amg, AMGf_numeric);
2157 SV * const sv = TOPs;
2159 if (SvIOK(sv) || (SvGMAGICAL(sv) && SvIOKp(sv))) {
2160 /* It's publicly an integer */
2163 if (SvIVX(sv) == IV_MIN) {
2164 /* 2s complement assumption. */
2165 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
2168 else if (SvUVX(sv) <= IV_MAX) {
2173 else if (SvIVX(sv) != IV_MIN) {
2177 #ifdef PERL_PRESERVE_IVUV
2184 if (SvNIOKp(sv) && (SvNIOK(sv) || !SvPOK(sv)))
2185 SETn(-SvNV_nomg(sv));
2186 else if (SvPOKp(sv)) {
2188 const char * const s = SvPV_nomg_const(sv, len);
2189 if (isIDFIRST(*s)) {
2190 sv_setpvs(TARG, "-");
2193 else if (*s == '+' || (*s == '-' && !looks_like_number(sv))) {
2194 sv_setsv_nomg(TARG, sv);
2195 *SvPV_force_nomg(TARG, len) = *s == '-' ? '+' : '-';
2197 else if (SvIV_please_nomg(sv))
2198 goto oops_its_an_int;
2200 sv_setnv(TARG, -SvNV_nomg(sv));
2204 SETn(-SvNV_nomg(sv));
2212 tryAMAGICun_MG(not_amg, AMGf_set);
2213 *PL_stack_sp = boolSV(!SvTRUE_nomg(*PL_stack_sp));
2220 tryAMAGICun_MG(compl_amg, AMGf_numeric);
2224 if (PL_op->op_private & HINT_INTEGER) {
2225 const IV i = ~SvIV_nomg(sv);
2229 const UV u = ~SvUV_nomg(sv);
2238 (void)SvPV_nomg_const(sv,len); /* force check for uninit var */
2239 sv_setsv_nomg(TARG, sv);
2240 tmps = (U8*)SvPV_force_nomg(TARG, len);
2243 /* Calculate exact length, let's not estimate. */
2248 U8 * const send = tmps + len;
2249 U8 * const origtmps = tmps;
2250 const UV utf8flags = UTF8_ALLOW_ANYUV;
2252 while (tmps < send) {
2253 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2255 targlen += UNISKIP(~c);
2261 /* Now rewind strings and write them. */
2268 Newx(result, targlen + 1, U8);
2270 while (tmps < send) {
2271 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2273 p = uvchr_to_utf8_flags(p, ~c, UNICODE_ALLOW_ANY);
2276 sv_usepvn_flags(TARG, (char*)result, targlen,
2277 SV_HAS_TRAILING_NUL);
2284 Newx(result, nchar + 1, U8);
2286 while (tmps < send) {
2287 const U8 c = (U8)utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2292 sv_usepvn_flags(TARG, (char*)result, nchar, SV_HAS_TRAILING_NUL);
2300 register long *tmpl;
2301 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2304 for ( ; anum >= (I32)sizeof(long); anum -= (I32)sizeof(long), tmpl++)
2309 for ( ; anum > 0; anum--, tmps++)
2317 /* integer versions of some of the above */
2321 dVAR; dSP; dATARGET;
2322 tryAMAGICbin_MG(mult_amg, AMGf_assign);
2325 SETi( left * right );
2333 dVAR; dSP; dATARGET;
2334 tryAMAGICbin_MG(div_amg, AMGf_assign);
2337 IV value = SvIV_nomg(right);
2339 DIE(aTHX_ "Illegal division by zero");
2340 num = SvIV_nomg(left);
2342 /* avoid FPE_INTOVF on some platforms when num is IV_MIN */
2346 value = num / value;
2352 #if defined(__GLIBC__) && IVSIZE == 8
2359 /* This is the vanilla old i_modulo. */
2360 dVAR; dSP; dATARGET;
2361 tryAMAGICbin_MG(modulo_amg, AMGf_assign);
2365 DIE(aTHX_ "Illegal modulus zero");
2366 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2370 SETi( left % right );
2375 #if defined(__GLIBC__) && IVSIZE == 8
2380 /* This is the i_modulo with the workaround for the _moddi3 bug
2381 * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
2382 * See below for pp_i_modulo. */
2383 dVAR; dSP; dATARGET;
2384 tryAMAGICbin_MG(modulo_amg, AMGf_assign);
2388 DIE(aTHX_ "Illegal modulus zero");
2389 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2393 SETi( left % PERL_ABS(right) );
2400 dVAR; dSP; dATARGET;
2401 tryAMAGICbin_MG(modulo_amg, AMGf_assign);
2405 DIE(aTHX_ "Illegal modulus zero");
2406 /* The assumption is to use hereafter the old vanilla version... */
2408 PL_ppaddr[OP_I_MODULO] =
2410 /* .. but if we have glibc, we might have a buggy _moddi3
2411 * (at least glicb 2.2.5 is known to have this bug), in other
2412 * words our integer modulus with negative quad as the second
2413 * argument might be broken. Test for this and re-patch the
2414 * opcode dispatch table if that is the case, remembering to
2415 * also apply the workaround so that this first round works
2416 * right, too. See [perl #9402] for more information. */
2420 /* Cannot do this check with inlined IV constants since
2421 * that seems to work correctly even with the buggy glibc. */
2423 /* Yikes, we have the bug.
2424 * Patch in the workaround version. */
2426 PL_ppaddr[OP_I_MODULO] =
2427 &Perl_pp_i_modulo_1;
2428 /* Make certain we work right this time, too. */
2429 right = PERL_ABS(right);
2432 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2436 SETi( left % right );
2444 dVAR; dSP; dATARGET;
2445 tryAMAGICbin_MG(add_amg, AMGf_assign);
2447 dPOPTOPiirl_ul_nomg;
2448 SETi( left + right );
2455 dVAR; dSP; dATARGET;
2456 tryAMAGICbin_MG(subtr_amg, AMGf_assign);
2458 dPOPTOPiirl_ul_nomg;
2459 SETi( left - right );
2467 tryAMAGICbin_MG(lt_amg, AMGf_set);
2470 SETs(boolSV(left < right));
2478 tryAMAGICbin_MG(gt_amg, AMGf_set);
2481 SETs(boolSV(left > right));
2489 tryAMAGICbin_MG(le_amg, AMGf_set);
2492 SETs(boolSV(left <= right));
2500 tryAMAGICbin_MG(ge_amg, AMGf_set);
2503 SETs(boolSV(left >= right));
2511 tryAMAGICbin_MG(eq_amg, AMGf_set);
2514 SETs(boolSV(left == right));
2522 tryAMAGICbin_MG(ne_amg, AMGf_set);
2525 SETs(boolSV(left != right));
2533 tryAMAGICbin_MG(ncmp_amg, 0);
2540 else if (left < right)
2552 tryAMAGICun_MG(neg_amg, 0);
2554 SV * const sv = TOPs;
2555 IV const i = SvIV_nomg(sv);
2561 /* High falutin' math. */
2566 tryAMAGICbin_MG(atan2_amg, 0);
2569 SETn(Perl_atan2(left, right));
2577 int amg_type = sin_amg;
2578 const char *neg_report = NULL;
2579 NV (*func)(NV) = Perl_sin;
2580 const int op_type = PL_op->op_type;
2597 amg_type = sqrt_amg;
2599 neg_report = "sqrt";
2604 tryAMAGICun_MG(amg_type, 0);
2606 SV * const arg = POPs;
2607 const NV value = SvNV_nomg(arg);
2609 if (op_type == OP_LOG ? (value <= 0.0) : (value < 0.0)) {
2610 SET_NUMERIC_STANDARD();
2611 /* diag_listed_as: Can't take log of %g */
2612 DIE(aTHX_ "Can't take %s of %"NVgf, neg_report, value);
2615 XPUSHn(func(value));
2620 /* Support Configure command-line overrides for rand() functions.
2621 After 5.005, perhaps we should replace this by Configure support
2622 for drand48(), random(), or rand(). For 5.005, though, maintain
2623 compatibility by calling rand() but allow the user to override it.
2624 See INSTALL for details. --Andy Dougherty 15 July 1998
2626 /* Now it's after 5.005, and Configure supports drand48() and random(),
2627 in addition to rand(). So the overrides should not be needed any more.
2628 --Jarkko Hietaniemi 27 September 1998
2631 #ifndef HAS_DRAND48_PROTO
2632 extern double drand48 (void);
2642 value = 1.0; (void)POPs;
2648 if (!PL_srand_called) {
2649 (void)seedDrand01((Rand_seed_t)seed());
2650 PL_srand_called = TRUE;
2662 if (MAXARG >= 1 && (TOPs || POPs)) {
2669 pv = SvPV(top, len);
2670 flags = grok_number(pv, len, &anum);
2672 if (!(flags & IS_NUMBER_IN_UV)) {
2673 Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
2674 "Integer overflow in srand");
2682 (void)seedDrand01((Rand_seed_t)anum);
2683 PL_srand_called = TRUE;
2687 /* Historically srand always returned true. We can avoid breaking
2689 sv_setpvs(TARG, "0 but true");
2698 tryAMAGICun_MG(int_amg, AMGf_numeric);
2700 SV * const sv = TOPs;
2701 const IV iv = SvIV_nomg(sv);
2702 /* XXX it's arguable that compiler casting to IV might be subtly
2703 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2704 else preferring IV has introduced a subtle behaviour change bug. OTOH
2705 relying on floating point to be accurate is a bug. */
2710 else if (SvIOK(sv)) {
2712 SETu(SvUV_nomg(sv));
2717 const NV value = SvNV_nomg(sv);
2719 if (value < (NV)UV_MAX + 0.5) {
2722 SETn(Perl_floor(value));
2726 if (value > (NV)IV_MIN - 0.5) {
2729 SETn(Perl_ceil(value));
2740 tryAMAGICun_MG(abs_amg, AMGf_numeric);
2742 SV * const sv = TOPs;
2743 /* This will cache the NV value if string isn't actually integer */
2744 const IV iv = SvIV_nomg(sv);
2749 else if (SvIOK(sv)) {
2750 /* IVX is precise */
2752 SETu(SvUV_nomg(sv)); /* force it to be numeric only */
2760 /* 2s complement assumption. Also, not really needed as
2761 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
2767 const NV value = SvNV_nomg(sv);
2781 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2785 SV* const sv = POPs;
2787 tmps = (SvPV_const(sv, len));
2789 /* If Unicode, try to downgrade
2790 * If not possible, croak. */
2791 SV* const tsv = sv_2mortal(newSVsv(sv));
2794 sv_utf8_downgrade(tsv, FALSE);
2795 tmps = SvPV_const(tsv, len);
2797 if (PL_op->op_type == OP_HEX)
2800 while (*tmps && len && isSPACE(*tmps))
2804 if (*tmps == 'x' || *tmps == 'X') {
2806 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2808 else if (*tmps == 'b' || *tmps == 'B')
2809 result_uv = grok_bin (tmps, &len, &flags, &result_nv);
2811 result_uv = grok_oct (tmps, &len, &flags, &result_nv);
2813 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
2827 SV * const sv = TOPs;
2829 if (SvGAMAGIC(sv)) {
2830 /* For an overloaded or magic scalar, we can't know in advance if
2831 it's going to be UTF-8 or not. Also, we can't call sv_len_utf8 as
2832 it likes to cache the length. Maybe that should be a documented
2837 = sv_2pv_flags(sv, &len,
2838 SV_UNDEF_RETURNS_NULL|SV_CONST_RETURN|SV_GMAGIC);
2841 if (!SvPADTMP(TARG)) {
2842 sv_setsv(TARG, &PL_sv_undef);
2847 else if (DO_UTF8(sv)) {
2848 SETi(utf8_length((U8*)p, (U8*)p + len));
2852 } else if (SvOK(sv)) {
2853 /* Neither magic nor overloaded. */
2855 SETi(sv_len_utf8(sv));
2859 if (!SvPADTMP(TARG)) {
2860 sv_setsv_nomg(TARG, &PL_sv_undef);
2868 /* Returns false if substring is completely outside original string.
2869 No length is indicated by len_iv = 0 and len_is_uv = 0. len_is_uv must
2870 always be true for an explicit 0.
2873 Perl_translate_substr_offsets(pTHX_ STRLEN curlen, IV pos1_iv,
2874 bool pos1_is_uv, IV len_iv,
2875 bool len_is_uv, STRLEN *posp,
2881 PERL_ARGS_ASSERT_TRANSLATE_SUBSTR_OFFSETS;
2883 if (!pos1_is_uv && pos1_iv < 0 && curlen) {
2884 pos1_is_uv = curlen-1 > ~(UV)pos1_iv;
2887 if ((pos1_is_uv || pos1_iv > 0) && (UV)pos1_iv > curlen)
2890 if (len_iv || len_is_uv) {
2891 if (!len_is_uv && len_iv < 0) {
2892 pos2_iv = curlen + len_iv;
2894 pos2_is_uv = curlen-1 > ~(UV)len_iv;
2897 } else { /* len_iv >= 0 */
2898 if (!pos1_is_uv && pos1_iv < 0) {
2899 pos2_iv = pos1_iv + len_iv;
2900 pos2_is_uv = (UV)len_iv > (UV)IV_MAX;
2902 if ((UV)len_iv > curlen-(UV)pos1_iv)
2905 pos2_iv = pos1_iv+len_iv;
2915 if (!pos2_is_uv && pos2_iv < 0) {
2916 if (!pos1_is_uv && pos1_iv < 0)
2920 else if (!pos1_is_uv && pos1_iv < 0)
2923 if ((UV)pos2_iv < (UV)pos1_iv)
2925 if ((UV)pos2_iv > curlen)
2928 /* pos1_iv and pos2_iv both in 0..curlen, so the cast is safe */
2929 *posp = (STRLEN)( (UV)pos1_iv );
2930 *lenp = (STRLEN)( (UV)pos2_iv - (UV)pos1_iv );
2947 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
2948 const bool rvalue = (GIMME_V != G_VOID);
2951 const char *repl = NULL;
2953 int num_args = PL_op->op_private & 7;
2954 bool repl_need_utf8_upgrade = FALSE;
2955 bool repl_is_utf8 = FALSE;
2959 if(!(repl_sv = POPs)) num_args--;
2961 if ((len_sv = POPs)) {
2962 len_iv = SvIV(len_sv);
2963 len_is_uv = len_iv ? SvIOK_UV(len_sv) : 1;
2968 pos1_iv = SvIV(pos_sv);
2969 pos1_is_uv = SvIOK_UV(pos_sv);
2971 if (PL_op->op_private & OPpSUBSTR_REPL_FIRST) {
2977 repl = SvPV_const(repl_sv, repl_len);
2978 repl_is_utf8 = DO_UTF8(repl_sv) && repl_len;
2981 sv_utf8_upgrade(sv);
2983 else if (DO_UTF8(sv))
2984 repl_need_utf8_upgrade = TRUE;
2988 ret = sv_2mortal(newSV_type(SVt_PVLV)); /* Not TARG RT#67838 */
2989 sv_magic(ret, NULL, PERL_MAGIC_substr, NULL, 0);
2991 LvTARG(ret) = SvREFCNT_inc_simple(sv);
2993 pos1_is_uv || pos1_iv >= 0
2994 ? (STRLEN)(UV)pos1_iv
2995 : (LvFLAGS(ret) |= 1, (STRLEN)(UV)-pos1_iv);
2997 len_is_uv || len_iv > 0
2998 ? (STRLEN)(UV)len_iv
2999 : (LvFLAGS(ret) |= 2, (STRLEN)(UV)-len_iv);
3002 PUSHs(ret); /* avoid SvSETMAGIC here */
3005 tmps = SvPV_const(sv, curlen);
3007 utf8_curlen = sv_len_utf8(sv);
3008 if (utf8_curlen == curlen)
3011 curlen = utf8_curlen;
3017 STRLEN pos, len, byte_len, byte_pos;
3019 if (!translate_substr_offsets(
3020 curlen, pos1_iv, pos1_is_uv, len_iv, len_is_uv, &pos, &len
3024 byte_pos = utf8_curlen
3025 ? sv_pos_u2b_flags(sv, pos, &byte_len, SV_CONST_RETURN) : pos;
3030 SvTAINTED_off(TARG); /* decontaminate */
3031 SvUTF8_off(TARG); /* decontaminate */
3032 sv_setpvn(TARG, tmps, byte_len);
3033 #ifdef USE_LOCALE_COLLATE
3034 sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3041 SV* repl_sv_copy = NULL;
3043 if (repl_need_utf8_upgrade) {
3044 repl_sv_copy = newSVsv(repl_sv);
3045 sv_utf8_upgrade(repl_sv_copy);
3046 repl = SvPV_const(repl_sv_copy, repl_len);
3047 repl_is_utf8 = DO_UTF8(repl_sv_copy) && repl_len;
3050 Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR),
3051 "Attempt to use reference as lvalue in substr"
3055 sv_insert_flags(sv, byte_pos, byte_len, repl, repl_len, 0);
3058 SvREFCNT_dec(repl_sv_copy);
3070 Perl_croak(aTHX_ "substr outside of string");
3071 Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3078 register const IV size = POPi;
3079 register const IV offset = POPi;
3080 register SV * const src = POPs;
3081 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3084 if (lvalue) { /* it's an lvalue! */
3085 ret = sv_2mortal(newSV_type(SVt_PVLV)); /* Not TARG RT#67838 */
3086 sv_magic(ret, NULL, PERL_MAGIC_vec, NULL, 0);
3088 LvTARG(ret) = SvREFCNT_inc_simple(src);
3089 LvTARGOFF(ret) = offset;
3090 LvTARGLEN(ret) = size;
3094 SvTAINTED_off(TARG); /* decontaminate */
3098 sv_setuv(ret, do_vecget(src, offset, size));
3114 const char *little_p;
3117 const bool is_index = PL_op->op_type == OP_INDEX;
3118 const bool threeargs = MAXARG >= 3 && (TOPs || ((void)POPs,0));
3124 big_p = SvPV_const(big, biglen);
3125 little_p = SvPV_const(little, llen);
3127 big_utf8 = DO_UTF8(big);
3128 little_utf8 = DO_UTF8(little);
3129 if (big_utf8 ^ little_utf8) {
3130 /* One needs to be upgraded. */
3131 if (little_utf8 && !PL_encoding) {
3132 /* Well, maybe instead we might be able to downgrade the small
3134 char * const pv = (char*)bytes_from_utf8((U8 *)little_p, &llen,
3137 /* If the large string is ISO-8859-1, and it's not possible to
3138 convert the small string to ISO-8859-1, then there is no
3139 way that it could be found anywhere by index. */
3144 /* At this point, pv is a malloc()ed string. So donate it to temp
3145 to ensure it will get free()d */
3146 little = temp = newSV(0);
3147 sv_usepvn(temp, pv, llen);
3148 little_p = SvPVX(little);
3151 ? newSVpvn(big_p, biglen) : newSVpvn(little_p, llen);
3154 sv_recode_to_utf8(temp, PL_encoding);
3156 sv_utf8_upgrade(temp);
3161 big_p = SvPV_const(big, biglen);
3164 little_p = SvPV_const(little, llen);
3168 if (SvGAMAGIC(big)) {
3169 /* Life just becomes a lot easier if I use a temporary here.
3170 Otherwise I need to avoid calls to sv_pos_u2b(), which (dangerously)
3171 will trigger magic and overloading again, as will fbm_instr()
3173 big = newSVpvn_flags(big_p, biglen,
3174 SVs_TEMP | (big_utf8 ? SVf_UTF8 : 0));
3177 if (SvGAMAGIC(little) || (is_index && !SvOK(little))) {
3178 /* index && SvOK() is a hack. fbm_instr() calls SvPV_const, which will
3179 warn on undef, and we've already triggered a warning with the
3180 SvPV_const some lines above. We can't remove that, as we need to
3181 call some SvPV to trigger overloading early and find out if the
3183 This is all getting to messy. The API isn't quite clean enough,
3184 because data access has side effects.
3186 little = newSVpvn_flags(little_p, llen,
3187 SVs_TEMP | (little_utf8 ? SVf_UTF8 : 0));
3188 little_p = SvPVX(little);
3192 offset = is_index ? 0 : biglen;
3194 if (big_utf8 && offset > 0)
3195 sv_pos_u2b(big, &offset, 0);
3201 else if (offset > (I32)biglen)
3203 if (!(little_p = is_index
3204 ? fbm_instr((unsigned char*)big_p + offset,
3205 (unsigned char*)big_p + biglen, little, 0)
3206 : rninstr(big_p, big_p + offset,
3207 little_p, little_p + llen)))
3210 retval = little_p - big_p;
3211 if (retval > 0 && big_utf8)
3212 sv_pos_b2u(big, &retval);
3222 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
3223 SvTAINTED_off(TARG);
3224 do_sprintf(TARG, SP-MARK, MARK+1);
3225 TAINT_IF(SvTAINTED(TARG));
3237 const U8 *s = (U8*)SvPV_const(argsv, len);
3239 if (PL_encoding && SvPOK(argsv) && !DO_UTF8(argsv)) {
3240 SV * const tmpsv = sv_2mortal(newSVsv(argsv));
3241 s = (U8*)sv_recode_to_utf8(tmpsv, PL_encoding);
3245 XPUSHu(DO_UTF8(argsv) ?
3246 utf8n_to_uvchr(s, UTF8_MAXBYTES, 0, UTF8_ALLOW_ANYUV) :
3260 if (!IN_BYTES /* under bytes, chr(-1) eq chr(0xff), etc. */
3261 && ((SvIOKp(top) && !SvIsUV(top) && SvIV_nomg(top) < 0)
3263 ((SvNOKp(top) || (SvOK(top) && !SvIsUV(top)))
3264 && SvNV_nomg(top) < 0.0))) {
3265 if (ckWARN(WARN_UTF8)) {
3266 if (SvGMAGICAL(top)) {
3267 SV *top2 = sv_newmortal();
3268 sv_setsv_nomg(top2, top);
3271 Perl_warner(aTHX_ packWARN(WARN_UTF8),
3272 "Invalid negative number (%"SVf") in chr", top);
3274 value = UNICODE_REPLACEMENT;
3276 value = SvUV_nomg(top);
3279 SvUPGRADE(TARG,SVt_PV);
3281 if (value > 255 && !IN_BYTES) {
3282 SvGROW(TARG, (STRLEN)UNISKIP(value)+1);
3283 tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3284 SvCUR_set(TARG, tmps - SvPVX_const(TARG));
3286 (void)SvPOK_only(TARG);
3295 *tmps++ = (char)value;
3297 (void)SvPOK_only(TARG);
3299 if (PL_encoding && !IN_BYTES) {
3300 sv_recode_to_utf8(TARG, PL_encoding);
3302 if (SvCUR(TARG) == 0
3303 || ! is_utf8_string((U8*)tmps, SvCUR(TARG))
3304 || UTF8_IS_REPLACEMENT((U8*) tmps, (U8*) tmps + SvCUR(TARG)))
3309 *tmps++ = (char)value;
3325 const char *tmps = SvPV_const(left, len);
3327 if (DO_UTF8(left)) {
3328 /* If Unicode, try to downgrade.
3329 * If not possible, croak.
3330 * Yes, we made this up. */
3331 SV* const tsv = sv_2mortal(newSVsv(left));
3334 sv_utf8_downgrade(tsv, FALSE);
3335 tmps = SvPV_const(tsv, len);
3337 # ifdef USE_ITHREADS
3339 if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3340 /* This should be threadsafe because in ithreads there is only
3341 * one thread per interpreter. If this would not be true,
3342 * we would need a mutex to protect this malloc. */
3343 PL_reentrant_buffer->_crypt_struct_buffer =
3344 (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3345 #if defined(__GLIBC__) || defined(__EMX__)
3346 if (PL_reentrant_buffer->_crypt_struct_buffer) {
3347 PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3348 /* work around glibc-2.2.5 bug */
3349 PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3353 # endif /* HAS_CRYPT_R */
3354 # endif /* USE_ITHREADS */
3356 sv_setpv(TARG, fcrypt(tmps, SvPV_nolen_const(right)));
3358 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV_nolen_const(right)));
3364 "The crypt() function is unimplemented due to excessive paranoia.");
3368 /* Generally UTF-8 and UTF-EBCDIC are indistinguishable at this level. So
3369 * most comments below say UTF-8, when in fact they mean UTF-EBCDIC as well */
3371 /* Generates code to store a unicode codepoint c that is known to occupy
3372 * exactly two UTF-8 and UTF-EBCDIC bytes; it is stored into p and p+1,
3373 * and p is advanced to point to the next available byte after the two bytes */
3374 #define CAT_UNI_TO_UTF8_TWO_BYTE(p, c) \
3376 *(p)++ = UTF8_TWO_BYTE_HI(c); \
3377 *((p)++) = UTF8_TWO_BYTE_LO(c); \
3382 /* Actually is both lcfirst() and ucfirst(). Only the first character
3383 * changes. This means that possibly we can change in-place, ie., just
3384 * take the source and change that one character and store it back, but not
3385 * if read-only etc, or if the length changes */
3390 STRLEN slen; /* slen is the byte length of the whole SV. */
3393 bool inplace; /* ? Convert first char only, in-place */
3394 bool doing_utf8 = FALSE; /* ? using utf8 */
3395 bool convert_source_to_utf8 = FALSE; /* ? need to convert */
3396 const int op_type = PL_op->op_type;
3399 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3400 STRLEN ulen; /* ulen is the byte length of the original Unicode character
3401 * stored as UTF-8 at s. */
3402 STRLEN tculen; /* tculen is the byte length of the freshly titlecased (or
3403 * lowercased) character stored in tmpbuf. May be either
3404 * UTF-8 or not, but in either case is the number of bytes */
3405 bool tainted = FALSE;
3409 s = (const U8*)SvPV_nomg_const(source, slen);
3411 if (ckWARN(WARN_UNINITIALIZED))
3412 report_uninit(source);
3417 /* We may be able to get away with changing only the first character, in
3418 * place, but not if read-only, etc. Later we may discover more reasons to
3419 * not convert in-place. */
3420 inplace = SvPADTMP(source) && !SvREADONLY(source) && SvTEMP(source);
3422 /* First calculate what the changed first character should be. This affects
3423 * whether we can just swap it out, leaving the rest of the string unchanged,
3424 * or even if have to convert the dest to UTF-8 when the source isn't */
3426 if (! slen) { /* If empty */
3427 need = 1; /* still need a trailing NUL */
3430 else if (DO_UTF8(source)) { /* Is the source utf8? */
3433 if (op_type == OP_UCFIRST) {
3434 _to_utf8_title_flags(s, tmpbuf, &tculen,
3435 cBOOL(IN_LOCALE_RUNTIME), &tainted);
3438 _to_utf8_lower_flags(s, tmpbuf, &tculen,
3439 cBOOL(IN_LOCALE_RUNTIME), &tainted);
3442 /* we can't do in-place if the length changes. */
3443 if (ulen != tculen) inplace = FALSE;
3444 need = slen + 1 - ulen + tculen;
3446 else { /* Non-zero length, non-UTF-8, Need to consider locale and if
3447 * latin1 is treated as caseless. Note that a locale takes
3449 ulen = 1; /* Original character is 1 byte */
3450 tculen = 1; /* Most characters will require one byte, but this will
3451 * need to be overridden for the tricky ones */
3454 if (op_type == OP_LCFIRST) {
3456 /* lower case the first letter: no trickiness for any character */
3457 *tmpbuf = (IN_LOCALE_RUNTIME) ? toLOWER_LC(*s) :
3458 ((IN_UNI_8_BIT) ? toLOWER_LATIN1(*s) : toLOWER(*s));
3461 else if (IN_LOCALE_RUNTIME) {
3462 *tmpbuf = toUPPER_LC(*s); /* This would be a bug if any locales
3463 * have upper and title case different
3466 else if (! IN_UNI_8_BIT) {
3467 *tmpbuf = toUPPER(*s); /* Returns caseless for non-ascii, or
3468 * on EBCDIC machines whatever the
3469 * native function does */
3471 else { /* is ucfirst non-UTF-8, not in locale, and cased latin1 */
3472 UV title_ord = _to_upper_title_latin1(*s, tmpbuf, &tculen, 's');
3474 assert(tculen == 2);
3476 /* If the result is an upper Latin1-range character, it can
3477 * still be represented in one byte, which is its ordinal */
3478 if (UTF8_IS_DOWNGRADEABLE_START(*tmpbuf)) {
3479 *tmpbuf = (U8) title_ord;
3483 /* Otherwise it became more than one ASCII character (in
3484 * the case of LATIN_SMALL_LETTER_SHARP_S) or changed to
3485 * beyond Latin1, so the number of bytes changed, so can't
3486 * replace just the first character in place. */
3489 /* If the result won't fit in a byte, the entire result will
3490 * have to be in UTF-8. Assume worst case sizing in
3491 * conversion. (all latin1 characters occupy at most two bytes
3493 if (title_ord > 255) {
3495 convert_source_to_utf8 = TRUE;
3496 need = slen * 2 + 1;
3498 /* The (converted) UTF-8 and UTF-EBCDIC lengths of all
3499 * (both) characters whose title case is above 255 is
3503 else { /* LATIN_SMALL_LETTER_SHARP_S expands by 1 byte */
3504 need = slen + 1 + 1;
3508 } /* End of use Unicode (Latin1) semantics */
3509 } /* End of changing the case of the first character */
3511 /* Here, have the first character's changed case stored in tmpbuf. Ready to
3512 * generate the result */
3515 /* We can convert in place. This means we change just the first
3516 * character without disturbing the rest; no need to grow */
3518 s = d = (U8*)SvPV_force_nomg(source, slen);
3524 /* Here, we can't convert in place; we earlier calculated how much
3525 * space we will need, so grow to accommodate that */
3526 SvUPGRADE(dest, SVt_PV);
3527 d = (U8*)SvGROW(dest, need);
3528 (void)SvPOK_only(dest);
3535 if (! convert_source_to_utf8) {
3537 /* Here both source and dest are in UTF-8, but have to create
3538 * the entire output. We initialize the result to be the
3539 * title/lower cased first character, and then append the rest
3541 sv_setpvn(dest, (char*)tmpbuf, tculen);
3543 sv_catpvn(dest, (char*)(s + ulen), slen - ulen);
3547 const U8 *const send = s + slen;
3549 /* Here the dest needs to be in UTF-8, but the source isn't,
3550 * except we earlier UTF-8'd the first character of the source
3551 * into tmpbuf. First put that into dest, and then append the
3552 * rest of the source, converting it to UTF-8 as we go. */
3554 /* Assert tculen is 2 here because the only two characters that
3555 * get to this part of the code have 2-byte UTF-8 equivalents */
3557 *d++ = *(tmpbuf + 1);
3558 s++; /* We have just processed the 1st char */
3560 for (; s < send; s++) {
3561 d = uvchr_to_utf8(d, *s);
3564 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3568 else { /* in-place UTF-8. Just overwrite the first character */
3569 Copy(tmpbuf, d, tculen, U8);
3570 SvCUR_set(dest, need - 1);
3578 else { /* Neither source nor dest are in or need to be UTF-8 */
3580 if (IN_LOCALE_RUNTIME) {
3584 if (inplace) { /* in-place, only need to change the 1st char */
3587 else { /* Not in-place */
3589 /* Copy the case-changed character(s) from tmpbuf */
3590 Copy(tmpbuf, d, tculen, U8);
3591 d += tculen - 1; /* Code below expects d to point to final
3592 * character stored */
3595 else { /* empty source */
3596 /* See bug #39028: Don't taint if empty */
3600 /* In a "use bytes" we don't treat the source as UTF-8, but, still want
3601 * the destination to retain that flag */
3605 if (!inplace) { /* Finish the rest of the string, unchanged */
3606 /* This will copy the trailing NUL */
3607 Copy(s + 1, d + 1, slen, U8);
3608 SvCUR_set(dest, need - 1);
3611 if (dest != source && SvTAINTED(source))
3617 /* There's so much setup/teardown code common between uc and lc, I wonder if
3618 it would be worth merging the two, and just having a switch outside each
3619 of the three tight loops. There is less and less commonality though */
3633 if (SvPADTMP(source) && !SvREADONLY(source) && !SvAMAGIC(source)
3634 && SvTEMP(source) && !DO_UTF8(source)
3635 && (IN_LOCALE_RUNTIME || ! IN_UNI_8_BIT)) {
3637 /* We can convert in place. The reason we can't if in UNI_8_BIT is to
3638 * make the loop tight, so we overwrite the source with the dest before
3639 * looking at it, and we need to look at the original source
3640 * afterwards. There would also need to be code added to handle
3641 * switching to not in-place in midstream if we run into characters
3642 * that change the length.
3645 s = d = (U8*)SvPV_force_nomg(source, len);
3652 /* The old implementation would copy source into TARG at this point.
3653 This had the side effect that if source was undef, TARG was now
3654 an undefined SV with PADTMP set, and they don't warn inside
3655 sv_2pv_flags(). However, we're now getting the PV direct from
3656 source, which doesn't have PADTMP set, so it would warn. Hence the
3660 s = (const U8*)SvPV_nomg_const(source, len);
3662 if (ckWARN(WARN_UNINITIALIZED))
3663 report_uninit(source);
3669 SvUPGRADE(dest, SVt_PV);
3670 d = (U8*)SvGROW(dest, min);
3671 (void)SvPOK_only(dest);
3676 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
3677 to check DO_UTF8 again here. */
3679 if (DO_UTF8(source)) {
3680 const U8 *const send = s + len;
3681 U8 tmpbuf[UTF8_MAXBYTES+1];
3682 bool tainted = FALSE;
3684 /* All occurrences of these are to be moved to follow any other marks.
3685 * This is context-dependent. We may not be passed enough context to
3686 * move the iota subscript beyond all of them, but we do the best we can
3687 * with what we're given. The result is always better than if we
3688 * hadn't done this. And, the problem would only arise if we are
3689 * passed a character without all its combining marks, which would be
3690 * the caller's mistake. The information this is based on comes from a
3691 * comment in Unicode SpecialCasing.txt, (and the Standard's text
3692 * itself) and so can't be checked properly to see if it ever gets
3693 * revised. But the likelihood of it changing is remote */
3694 bool in_iota_subscript = FALSE;
3700 if (in_iota_subscript && ! is_utf8_mark(s)) {
3702 /* A non-mark. Time to output the iota subscript */
3703 #define GREEK_CAPITAL_LETTER_IOTA 0x0399
3704 #define COMBINING_GREEK_YPOGEGRAMMENI 0x0345
3706 CAT_UNI_TO_UTF8_TWO_BYTE(d, GREEK_CAPITAL_LETTER_IOTA);
3707 in_iota_subscript = FALSE;
3710 /* Then handle the current character. Get the changed case value
3711 * and copy it to the output buffer */
3714 uv = _to_utf8_upper_flags(s, tmpbuf, &ulen,
3715 cBOOL(IN_LOCALE_RUNTIME), &tainted);
3716 if (uv == GREEK_CAPITAL_LETTER_IOTA
3717 && utf8_to_uvchr_buf(s, send, 0) == COMBINING_GREEK_YPOGEGRAMMENI)
3719 in_iota_subscript = TRUE;
3722 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
3723 /* If the eventually required minimum size outgrows the
3724 * available space, we need to grow. */
3725 const UV o = d - (U8*)SvPVX_const(dest);
3727 /* If someone uppercases one million U+03B0s we SvGROW()
3728 * one million times. Or we could try guessing how much to
3729 * allocate without allocating too much. Such is life.
3730 * See corresponding comment in lc code for another option
3733 d = (U8*)SvPVX(dest) + o;
3735 Copy(tmpbuf, d, ulen, U8);
3740 if (in_iota_subscript) {
3741 CAT_UNI_TO_UTF8_TWO_BYTE(d, GREEK_CAPITAL_LETTER_IOTA);
3746 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3752 else { /* Not UTF-8 */
3754 const U8 *const send = s + len;
3756 /* Use locale casing if in locale; regular style if not treating
3757 * latin1 as having case; otherwise the latin1 casing. Do the
3758 * whole thing in a tight loop, for speed, */
3759 if (IN_LOCALE_RUNTIME) {
3762 for (; s < send; d++, s++)
3763 *d = toUPPER_LC(*s);
3765 else if (! IN_UNI_8_BIT) {
3766 for (; s < send; d++, s++) {
3771 for (; s < send; d++, s++) {
3772 *d = toUPPER_LATIN1_MOD(*s);
3773 if (LIKELY(*d != LATIN_SMALL_LETTER_Y_WITH_DIAERESIS)) continue;
3775 /* The mainstream case is the tight loop above. To avoid
3776 * extra tests in that, all three characters that require
3777 * special handling are mapped by the MOD to the one tested
3779 * Use the source to distinguish between the three cases */
3781 if (*s == LATIN_SMALL_LETTER_SHARP_S) {
3783 /* uc() of this requires 2 characters, but they are
3784 * ASCII. If not enough room, grow the string */
3785 if (SvLEN(dest) < ++min) {
3786 const UV o = d - (U8*)SvPVX_const(dest);
3788 d = (U8*)SvPVX(dest) + o;
3790 *d++ = 'S'; *d = 'S'; /* upper case is 'SS' */
3791 continue; /* Back to the tight loop; still in ASCII */
3794 /* The other two special handling characters have their
3795 * upper cases outside the latin1 range, hence need to be
3796 * in UTF-8, so the whole result needs to be in UTF-8. So,
3797 * here we are somewhere in the middle of processing a
3798 * non-UTF-8 string, and realize that we will have to convert
3799 * the whole thing to UTF-8. What to do? There are
3800 * several possibilities. The simplest to code is to
3801 * convert what we have so far, set a flag, and continue on
3802 * in the loop. The flag would be tested each time through
3803 * the loop, and if set, the next character would be
3804 * converted to UTF-8 and stored. But, I (khw) didn't want
3805 * to slow down the mainstream case at all for this fairly
3806 * rare case, so I didn't want to add a test that didn't
3807 * absolutely have to be there in the loop, besides the
3808 * possibility that it would get too complicated for
3809 * optimizers to deal with. Another possibility is to just
3810 * give up, convert the source to UTF-8, and restart the
3811 * function that way. Another possibility is to convert
3812 * both what has already been processed and what is yet to
3813 * come separately to UTF-8, then jump into the loop that
3814 * handles UTF-8. But the most efficient time-wise of the
3815 * ones I could think of is what follows, and turned out to
3816 * not require much extra code. */
3818 /* Convert what we have so far into UTF-8, telling the
3819 * function that we know it should be converted, and to
3820 * allow extra space for what we haven't processed yet.
3821 * Assume the worst case space requirements for converting
3822 * what we haven't processed so far: that it will require
3823 * two bytes for each remaining source character, plus the
3824 * NUL at the end. This may cause the string pointer to
3825 * move, so re-find it. */
3827 len = d - (U8*)SvPVX_const(dest);
3828 SvCUR_set(dest, len);
3829 len = sv_utf8_upgrade_flags_grow(dest,
3830 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
3832 d = (U8*)SvPVX(dest) + len;
3834 /* Now process the remainder of the source, converting to
3835 * upper and UTF-8. If a resulting byte is invariant in
3836 * UTF-8, output it as-is, otherwise convert to UTF-8 and
3837 * append it to the output. */
3838 for (; s < send; s++) {
3839 (void) _to_upper_title_latin1(*s, d, &len, 'S');
3843 /* Here have processed the whole source; no need to continue
3844 * with the outer loop. Each character has been converted
3845 * to upper case and converted to UTF-8 */
3848 } /* End of processing all latin1-style chars */
3849 } /* End of processing all chars */
3850 } /* End of source is not empty */
3852 if (source != dest) {
3853 *d = '\0'; /* Here d points to 1 after last char, add NUL */
3854 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3856 } /* End of isn't utf8 */
3857 if (dest != source && SvTAINTED(source))
3876 if (SvPADTMP(source) && !SvREADONLY(source) && !SvAMAGIC(source)
3877 && SvTEMP(source) && !DO_UTF8(source)) {
3879 /* We can convert in place, as lowercasing anything in the latin1 range
3880 * (or else DO_UTF8 would have been on) doesn't lengthen it */
3882 s = d = (U8*)SvPV_force_nomg(source, len);
3889 /* The old implementation would copy source into TARG at this point.
3890 This had the side effect that if source was undef, TARG was now
3891 an undefined SV with PADTMP set, and they don't warn inside
3892 sv_2pv_flags(). However, we're now getting the PV direct from
3893 source, which doesn't have PADTMP set, so it would warn. Hence the
3897 s = (const U8*)SvPV_nomg_const(source, len);
3899 if (ckWARN(WARN_UNINITIALIZED))
3900 report_uninit(source);
3906 SvUPGRADE(dest, SVt_PV);
3907 d = (U8*)SvGROW(dest, min);
3908 (void)SvPOK_only(dest);
3913 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
3914 to check DO_UTF8 again here. */
3916 if (DO_UTF8(source)) {
3917 const U8 *const send = s + len;
3918 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3919 bool tainted = FALSE;
3922 const STRLEN u = UTF8SKIP(s);
3925 _to_utf8_lower_flags(s, tmpbuf, &ulen,
3926 cBOOL(IN_LOCALE_RUNTIME), &tainted);
3928 /* Here is where we would do context-sensitive actions. See the
3929 * commit message for this comment for why there isn't any */
3931 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
3933 /* If the eventually required minimum size outgrows the
3934 * available space, we need to grow. */
3935 const UV o = d - (U8*)SvPVX_const(dest);
3937 /* If someone lowercases one million U+0130s we SvGROW() one
3938 * million times. Or we could try guessing how much to
3939 * allocate without allocating too much. Such is life.
3940 * Another option would be to grow an extra byte or two more
3941 * each time we need to grow, which would cut down the million
3942 * to 500K, with little waste */
3944 d = (U8*)SvPVX(dest) + o;
3947 /* Copy the newly lowercased letter to the output buffer we're
3949 Copy(tmpbuf, d, ulen, U8);
3952 } /* End of looping through the source string */
3955 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3960 } else { /* Not utf8 */
3962 const U8 *const send = s + len;
3964 /* Use locale casing if in locale; regular style if not treating
3965 * latin1 as having case; otherwise the latin1 casing. Do the
3966 * whole thing in a tight loop, for speed, */
3967 if (IN_LOCALE_RUNTIME) {
3970 for (; s < send; d++, s++)
3971 *d = toLOWER_LC(*s);
3973 else if (! IN_UNI_8_BIT) {
3974 for (; s < send; d++, s++) {
3979 for (; s < send; d++, s++) {
3980 *d = toLOWER_LATIN1(*s);
3984 if (source != dest) {
3986 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3989 if (dest != source && SvTAINTED(source))
3998 SV * const sv = TOPs;
4000 register const char *s = SvPV_const(sv,len);
4002 SvUTF8_off(TARG); /* decontaminate */
4005 SvUPGRADE(TARG, SVt_PV);
4006 SvGROW(TARG, (len * 2) + 1);
4010 STRLEN ulen = UTF8SKIP(s);
4011 bool to_quote = FALSE;
4013 if (UTF8_IS_INVARIANT(*s)) {
4014 if (_isQUOTEMETA(*s)) {
4018 else if (UTF8_IS_DOWNGRADEABLE_START(*s)) {
4020 /* In locale, we quote all non-ASCII Latin1 chars.
4021 * Otherwise use the quoting rules */
4022 if (IN_LOCALE_RUNTIME
4023 || _isQUOTEMETA(TWO_BYTE_UTF8_TO_UNI(*s, *(s + 1))))
4028 else if (_is_utf8_quotemeta((U8 *) s)) {
4043 else if (IN_UNI_8_BIT) {
4045 if (_isQUOTEMETA(*s))
4051 /* For non UNI_8_BIT (and hence in locale) just quote all \W
4052 * including everything above ASCII */
4054 if (!isWORDCHAR_A(*s))
4060 SvCUR_set(TARG, d - SvPVX_const(TARG));
4061 (void)SvPOK_only_UTF8(TARG);
4064 sv_setpvn(TARG, s, len);
4081 U8 tmpbuf[UTF8_MAXBYTES * UTF8_MAX_FOLD_CHAR_EXPAND + 1];
4082 const bool full_folding = TRUE;
4083 const U8 flags = ( full_folding ? FOLD_FLAGS_FULL : 0 )
4084 | ( IN_LOCALE_RUNTIME ? FOLD_FLAGS_LOCALE : 0 );
4086 /* This is a facsimile of pp_lc, but with a thousand bugs thanks to me.
4087 * You are welcome(?) -Hugmeir
4095 s = (const U8*)SvPV_nomg_const(source, len);
4097 if (ckWARN(WARN_UNINITIALIZED))
4098 report_uninit(source);
4105 SvUPGRADE(dest, SVt_PV);
4106 d = (U8*)SvGROW(dest, min);
4107 (void)SvPOK_only(dest);
4112 if (DO_UTF8(source)) { /* UTF-8 flagged string. */
4113 bool tainted = FALSE;
4115 const STRLEN u = UTF8SKIP(s);
4118 _to_utf8_fold_flags(s, tmpbuf, &ulen, flags, &tainted);
4120 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4121 const UV o = d - (U8*)SvPVX_const(dest);
4123 d = (U8*)SvPVX(dest) + o;
4126 Copy(tmpbuf, d, ulen, U8);
4135 } /* Unflagged string */
4137 /* For locale, bytes, and nothing, the behavior is supposed to be the
4140 if ( IN_LOCALE_RUNTIME ) { /* Under locale */
4143 for (; s < send; d++, s++)
4144 *d = toLOWER_LC(*s);
4146 else if ( !IN_UNI_8_BIT ) { /* Under nothing, or bytes */
4147 for (; s < send; d++, s++)
4151 /* For ASCII and the Latin-1 range, there's only two troublesome folds,
4152 * \x{DF} (\N{LATIN SMALL LETTER SHARP S}), which under full casefolding
4153 * becomes 'ss', and \x{B5} (\N{MICRO SIGN}), which under any fold becomes
4154 * \x{3BC} (\N{GREEK SMALL LETTER MU}) -- For the rest, the casefold is
4157 for (; s < send; d++, s++) {
4158 if (*s == MICRO_SIGN) {
4159 /* \N{MICRO SIGN}'s casefold is \N{GREEK SMALL LETTER MU}, which
4160 * is outside of the latin-1 range. There's a couple of ways to
4161 * deal with this -- khw discusses them in pp_lc/uc, so go there :)
4162 * What we do here is upgrade what we had already casefolded,
4163 * then enter an inner loop that appends the rest of the characters
4166 len = d - (U8*)SvPVX_const(dest);
4167 SvCUR_set(dest, len);
4168 len = sv_utf8_upgrade_flags_grow(dest,
4169 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
4170 /* The max expansion for latin1
4171 * chars is 1 byte becomes 2 */
4173 d = (U8*)SvPVX(dest) + len;
4175 CAT_UNI_TO_UTF8_TWO_BYTE(d, GREEK_SMALL_LETTER_MU);
4177 for (; s < send; s++) {
4179 UV fc = _to_uni_fold_flags(*s, tmpbuf, &ulen, flags);
4180 if UNI_IS_INVARIANT(fc) {
4181 if ( full_folding && *s == LATIN_SMALL_LETTER_SHARP_S) {
4189 Copy(tmpbuf, d, ulen, U8);
4195 else if (full_folding && *s == LATIN_SMALL_LETTER_SHARP_S) {
4196 /* Under full casefolding, LATIN SMALL LETTER SHARP S becomes "ss",
4197 * which may require growing the SV.
4199 if (SvLEN(dest) < ++min) {
4200 const UV o = d - (U8*)SvPVX_const(dest);
4202 d = (U8*)SvPVX(dest) + o;
4207 else { /* If it's not one of those two, the fold is their lower case */
4208 *d = toLOWER_LATIN1(*s);
4214 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4216 if (SvTAINTED(source))
4226 dVAR; dSP; dMARK; dORIGMARK;
4227 register AV *const av = MUTABLE_AV(POPs);
4228 register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
4230 if (SvTYPE(av) == SVt_PVAV) {
4231 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
4232 bool can_preserve = FALSE;
4238 can_preserve = SvCANEXISTDELETE(av);
4241 if (lval && localizing) {
4244 for (svp = MARK + 1; svp <= SP; svp++) {
4245 const I32 elem = SvIV(*svp);
4249 if (max > AvMAX(av))
4253 while (++MARK <= SP) {
4255 I32 elem = SvIV(*MARK);
4256 bool preeminent = TRUE;
4258 if (localizing && can_preserve) {
4259 /* If we can determine whether the element exist,
4260 * Try to preserve the existenceness of a tied array
4261 * element by using EXISTS and DELETE if possible.
4262 * Fallback to FETCH and STORE otherwise. */
4263 preeminent = av_exists(av, elem);
4266 svp = av_fetch(av, elem, lval);
4268 if (!svp || *svp == &PL_sv_undef)
4269 DIE(aTHX_ PL_no_aelem, elem);
4272 save_aelem(av, elem, svp);
4274 SAVEADELETE(av, elem);
4277 *MARK = svp ? *svp : &PL_sv_undef;
4280 if (GIMME != G_ARRAY) {
4282 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
4288 /* Smart dereferencing for keys, values and each */
4300 (SvTYPE(sv) != SVt_PVHV && SvTYPE(sv) != SVt_PVAV)
4305 "Type of argument to %s must be unblessed hashref or arrayref",
4306 PL_op_desc[PL_op->op_type] );
4309 if (PL_op->op_flags & OPf_SPECIAL && SvTYPE(sv) == SVt_PVAV)
4311 "Can't modify %s in %s",
4312 PL_op_desc[PL_op->op_type], PL_op_desc[PL_op->op_next->op_type]
4315 /* Delegate to correct function for op type */
4317 if (PL_op->op_type == OP_RKEYS || PL_op->op_type == OP_RVALUES) {
4318 return (SvTYPE(sv) == SVt_PVHV) ? Perl_do_kv(aTHX) : Perl_pp_akeys(aTHX);
4321 return (SvTYPE(sv) == SVt_PVHV) ? Perl_pp_each(aTHX) : Perl_pp_aeach(aTHX);
4329 AV *array = MUTABLE_AV(POPs);
4330 const I32 gimme = GIMME_V;
4331 IV *iterp = Perl_av_iter_p(aTHX_ array);
4332 const IV current = (*iterp)++;
4334 if (current > av_len(array)) {
4336 if (gimme == G_SCALAR)
4344 if (gimme == G_ARRAY) {
4345 SV **const element = av_fetch(array, current, 0);
4346 PUSHs(element ? *element : &PL_sv_undef);
4355 AV *array = MUTABLE_AV(POPs);
4356 const I32 gimme = GIMME_V;
4358 *Perl_av_iter_p(aTHX_ array) = 0;
4360 if (gimme == G_SCALAR) {
4362 PUSHi(av_len(array) + 1);
4364 else if (gimme == G_ARRAY) {
4365 IV n = Perl_av_len(aTHX_ array);
4370 if (PL_op->op_type == OP_AKEYS || PL_op->op_type == OP_RKEYS) {
4371 for (i = 0; i <= n; i++) {
4376 for (i = 0; i <= n; i++) {
4377 SV *const *const elem = Perl_av_fetch(aTHX_ array, i, 0);
4378 PUSHs(elem ? *elem : &PL_sv_undef);
4385 /* Associative arrays. */
4391 HV * hash = MUTABLE_HV(POPs);
4393 const I32 gimme = GIMME_V;
4396 /* might clobber stack_sp */
4397 entry = hv_iternext(hash);
4402 SV* const sv = hv_iterkeysv(entry);
4403 PUSHs(sv); /* won't clobber stack_sp */
4404 if (gimme == G_ARRAY) {
4407 /* might clobber stack_sp */
4408 val = hv_iterval(hash, entry);
4413 else if (gimme == G_SCALAR)
4420 S_do_delete_local(pTHX)
4424 const I32 gimme = GIMME_V;
4427 const bool sliced = !!(PL_op->op_private & OPpSLICE);
4428 SV *unsliced_keysv = sliced ? NULL : POPs;
4429 SV * const osv = POPs;
4430 register SV **mark =
4431 sliced ? PL_stack_base + POPMARK : &unsliced_keysv-1;
4433 const bool tied = SvRMAGICAL(osv)
4434 && mg_find((const SV *)osv, PERL_MAGIC_tied);
4435 const bool can_preserve = SvCANEXISTDELETE(osv);
4436 const U32 type = SvTYPE(osv);
4437 SV ** const end = sliced ? SP : &unsliced_keysv;
4439 if (type == SVt_PVHV) { /* hash element */
4440 HV * const hv = MUTABLE_HV(osv);
4441 while (++MARK <= end) {
4442 SV * const keysv = *MARK;
4444 bool preeminent = TRUE;
4446 preeminent = hv_exists_ent(hv, keysv, 0);
4448 HE *he = hv_fetch_ent(hv, keysv, 1, 0);
4455 sv = hv_delete_ent(hv, keysv, 0, 0);
4456 SvREFCNT_inc_simple_void(sv); /* De-mortalize */
4459 if (!sv) DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
4460 save_helem_flags(hv, keysv, &sv, SAVEf_KEEPOLDELEM);
4462 *MARK = sv_mortalcopy(sv);
4468 SAVEHDELETE(hv, keysv);
4469 *MARK = &PL_sv_undef;
4473 else if (type == SVt_PVAV) { /* array element */
4474 if (PL_op->op_flags & OPf_SPECIAL) {
4475 AV * const av = MUTABLE_AV(osv);
4476 while (++MARK <= end) {
4477 I32 idx = SvIV(*MARK);
4479 bool preeminent = TRUE;
4481 preeminent = av_exists(av, idx);
4483 SV **svp = av_fetch(av, idx, 1);
4490 sv = av_delete(av, idx, 0);
4491 SvREFCNT_inc_simple_void(sv); /* De-mortalize */
4494 save_aelem_flags(av, idx, &sv, SAVEf_KEEPOLDELEM);
4496 *MARK = sv_mortalcopy(sv);
4502 SAVEADELETE(av, idx);
4503 *MARK = &PL_sv_undef;
4508 DIE(aTHX_ "panic: avhv_delete no longer supported");
4511 DIE(aTHX_ "Not a HASH reference");
4513 if (gimme == G_VOID)
4515 else if (gimme == G_SCALAR) {
4520 *++MARK = &PL_sv_undef;
4524 else if (gimme != G_VOID)
4525 PUSHs(unsliced_keysv);
4537 if (PL_op->op_private & OPpLVAL_INTRO)
4538 return do_delete_local();
4541 discard = (gimme == G_VOID) ? G_DISCARD : 0;
4543 if (PL_op->op_private & OPpSLICE) {
4545 HV * const hv = MUTABLE_HV(POPs);
4546 const U32 hvtype = SvTYPE(hv);
4547 if (hvtype == SVt_PVHV) { /* hash element */
4548 while (++MARK <= SP) {
4549 SV * const sv = hv_delete_ent(hv, *MARK, discard, 0);
4550 *MARK = sv ? sv : &PL_sv_undef;
4553 else if (hvtype == SVt_PVAV) { /* array element */
4554 if (PL_op->op_flags & OPf_SPECIAL) {
4555 while (++MARK <= SP) {
4556 SV * const sv = av_delete(MUTABLE_AV(hv), SvIV(*MARK), discard);
4557 *MARK = sv ? sv : &PL_sv_undef;
4562 DIE(aTHX_ "Not a HASH reference");
4565 else if (gimme == G_SCALAR) {
4570 *++MARK = &PL_sv_undef;
4576 HV * const hv = MUTABLE_HV(POPs);
4578 if (SvTYPE(hv) == SVt_PVHV)
4579 sv = hv_delete_ent(hv, keysv, discard, 0);
4580 else if (SvTYPE(hv) == SVt_PVAV) {
4581 if (PL_op->op_flags & OPf_SPECIAL)
4582 sv = av_delete(MUTABLE_AV(hv), SvIV(keysv), discard);
4584 DIE(aTHX_ "panic: avhv_delete no longer supported");
4587 DIE(aTHX_ "Not a HASH reference");
4603 if (PL_op->op_private & OPpEXISTS_SUB) {
4605 SV * const sv = POPs;
4606 CV * const cv = sv_2cv(sv, &hv, &gv, 0);
4609 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))