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.
32 #include "regcharclass.h"
34 /* XXX I can't imagine anyone who doesn't have this actually _needs_
35 it, since pid_t is an integral type.
38 #ifdef NEED_GETPID_PROTO
39 extern Pid_t getpid (void);
43 * Some BSDs and Cygwin default to POSIX math instead of IEEE.
44 * This switches them over to IEEE.
46 #if defined(LIBM_LIB_VERSION)
47 _LIB_VERSION_TYPE _LIB_VERSION = _IEEE_;
50 static const STRLEN small_mu_len = sizeof(GREEK_SMALL_LETTER_MU_UTF8) - 1;
51 static const STRLEN capital_iota_len = sizeof(GREEK_CAPITAL_LETTER_IOTA_UTF8) - 1;
53 /* variations on pp_null */
58 if (GIMME_V == G_SCALAR)
65 /* This is also called directly by pp_lvavref. */
70 assert(SvTYPE(TARG) == SVt_PVAV);
71 if (UNLIKELY( PL_op->op_private & OPpLVAL_INTRO ))
72 if (LIKELY( !(PL_op->op_private & OPpPAD_STATE) ))
73 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
75 if (PL_op->op_flags & OPf_REF) {
78 } else if (PL_op->op_private & OPpMAYBE_LVSUB) {
79 const I32 flags = is_lvalue_sub();
80 if (flags && !(flags & OPpENTERSUB_INARGS)) {
81 if (GIMME == G_SCALAR)
82 /* diag_listed_as: Can't return %s to lvalue scalar context */
83 Perl_croak(aTHX_ "Can't return array to lvalue scalar context");
89 if (gimme == G_ARRAY) {
90 /* XXX see also S_pushav in pp_hot.c */
91 const Size_t maxarg = AvFILL(MUTABLE_AV(TARG)) + 1;
93 if (SvMAGICAL(TARG)) {
95 for (i=0; i < maxarg; i++) {
96 SV * const * const svp = av_fetch(MUTABLE_AV(TARG), i, FALSE);
97 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
102 for (i=0; i < (PADOFFSET)maxarg; i++) {
103 SV * const sv = AvARRAY((const AV *)TARG)[i];
104 SP[i+1] = sv ? sv : &PL_sv_undef;
109 else if (gimme == G_SCALAR) {
110 SV* const sv = sv_newmortal();
111 const SSize_t maxarg = AvFILL(MUTABLE_AV(TARG)) + 1;
112 sv_setiv(sv, maxarg);
123 assert(SvTYPE(TARG) == SVt_PVHV);
125 if (UNLIKELY( PL_op->op_private & OPpLVAL_INTRO ))
126 if (LIKELY( !(PL_op->op_private & OPpPAD_STATE) ))
127 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
128 if (PL_op->op_flags & OPf_REF)
130 else if (PL_op->op_private & OPpMAYBE_LVSUB) {
131 const I32 flags = is_lvalue_sub();
132 if (flags && !(flags & OPpENTERSUB_INARGS)) {
133 if (GIMME == G_SCALAR)
134 /* diag_listed_as: Can't return %s to lvalue scalar context */
135 Perl_croak(aTHX_ "Can't return hash to lvalue scalar context");
140 if (gimme == G_ARRAY) {
141 RETURNOP(Perl_do_kv(aTHX));
143 else if ((PL_op->op_private & OPpTRUEBOOL
144 || ( PL_op->op_private & OPpMAYBE_TRUEBOOL
145 && block_gimme() == G_VOID ))
146 && (!SvRMAGICAL(TARG) || !mg_find(TARG, PERL_MAGIC_tied)))
147 SETs(HvUSEDKEYS(TARG) ? &PL_sv_yes : sv_2mortal(newSViv(0)));
148 else if (gimme == G_SCALAR) {
149 SV* const sv = Perl_hv_scalar(aTHX_ MUTABLE_HV(TARG));
158 assert(SvTYPE(TARG) == SVt_PVCV);
166 SvPADSTALE_off(TARG);
174 mg_find(PadlistNAMESARRAY(CvPADLIST(find_runcv(NULL)))[ARGTARG],
176 assert(SvTYPE(TARG) == SVt_PVCV);
179 if (CvISXSUB(mg->mg_obj)) { /* constant */
180 /* XXX Should we clone it here? */
181 /* If this changes to use SAVECLEARSV, we can move the SAVECLEARSV
182 to introcv and remove the SvPADSTALE_off. */
183 SAVEPADSVANDMORTALIZE(ARGTARG);
184 PAD_SVl(ARGTARG) = SvREFCNT_inc_simple_NN(mg->mg_obj);
187 if (CvROOT(mg->mg_obj)) {
188 assert(CvCLONE(mg->mg_obj));
189 assert(!CvCLONED(mg->mg_obj));
191 cv_clone_into((CV *)mg->mg_obj,(CV *)TARG);
192 SAVECLEARSV(PAD_SVl(ARGTARG));
199 static const char S_no_symref_sv[] =
200 "Can't use string (\"%" SVf32 "\"%s) as %s ref while \"strict refs\" in use";
202 /* In some cases this function inspects PL_op. If this function is called
203 for new op types, more bool parameters may need to be added in place of
206 When noinit is true, the absence of a gv will cause a retval of undef.
207 This is unrelated to the cv-to-gv assignment case.
211 S_rv2gv(pTHX_ SV *sv, const bool vivify_sv, const bool strict,
214 if (!isGV(sv) || SvFAKE(sv)) SvGETMAGIC(sv);
217 sv = amagic_deref_call(sv, to_gv_amg);
221 if (SvTYPE(sv) == SVt_PVIO) {
222 GV * const gv = MUTABLE_GV(sv_newmortal());
223 gv_init(gv, 0, "__ANONIO__", 10, 0);
224 GvIOp(gv) = MUTABLE_IO(sv);
225 SvREFCNT_inc_void_NN(sv);
228 else if (!isGV_with_GP(sv)) {
229 Perl_die(aTHX_ "Not a GLOB reference");
233 if (!isGV_with_GP(sv)) {
235 /* If this is a 'my' scalar and flag is set then vivify
238 if (vivify_sv && sv != &PL_sv_undef) {
241 Perl_croak_no_modify();
242 if (cUNOP->op_targ) {
243 SV * const namesv = PAD_SV(cUNOP->op_targ);
244 HV *stash = CopSTASH(PL_curcop);
245 if (SvTYPE(stash) != SVt_PVHV) stash = NULL;
246 gv = MUTABLE_GV(newSV(0));
247 gv_init_sv(gv, stash, namesv, 0);
250 const char * const name = CopSTASHPV(PL_curcop);
251 gv = newGVgen_flags(name,
252 HvNAMEUTF8(CopSTASH(PL_curcop)) ? SVf_UTF8 : 0 );
253 SvREFCNT_inc_simple_void_NN(gv);
255 prepare_SV_for_RV(sv);
256 SvRV_set(sv, MUTABLE_SV(gv));
261 if (PL_op->op_flags & OPf_REF || strict) {
262 Perl_die(aTHX_ PL_no_usym, "a symbol");
264 if (ckWARN(WARN_UNINITIALIZED))
270 if (!(sv = MUTABLE_SV(gv_fetchsv_nomg(
271 sv, GV_ADDMG, SVt_PVGV
280 (SvPOKp(sv) && SvCUR(sv)>32 ? "..." : ""),
284 if ((PL_op->op_private & (OPpLVAL_INTRO|OPpDONT_INIT_GV))
285 == OPpDONT_INIT_GV) {
286 /* We are the target of a coderef assignment. Return
287 the scalar unchanged, and let pp_sasssign deal with
291 sv = MUTABLE_SV(gv_fetchsv_nomg(sv, GV_ADD, SVt_PVGV));
293 /* FAKE globs in the symbol table cause weird bugs (#77810) */
297 if (SvFAKE(sv) && !(PL_op->op_private & OPpALLOW_FAKE)) {
298 SV *newsv = sv_newmortal();
299 sv_setsv_flags(newsv, sv, 0);
311 sv, PL_op->op_private & OPpDEREF,
312 PL_op->op_private & HINT_STRICT_REFS,
313 ((PL_op->op_flags & OPf_SPECIAL) && !(PL_op->op_flags & OPf_MOD))
314 || PL_op->op_type == OP_READLINE
316 if (PL_op->op_private & OPpLVAL_INTRO)
317 save_gp(MUTABLE_GV(sv), !(PL_op->op_flags & OPf_SPECIAL));
322 /* Helper function for pp_rv2sv and pp_rv2av */
324 Perl_softref2xv(pTHX_ SV *const sv, const char *const what,
325 const svtype type, SV ***spp)
329 PERL_ARGS_ASSERT_SOFTREF2XV;
331 if (PL_op->op_private & HINT_STRICT_REFS) {
333 Perl_die(aTHX_ S_no_symref_sv, sv,
334 (SvPOKp(sv) && SvCUR(sv)>32 ? "..." : ""), what);
336 Perl_die(aTHX_ PL_no_usym, what);
340 PL_op->op_flags & OPf_REF
342 Perl_die(aTHX_ PL_no_usym, what);
343 if (ckWARN(WARN_UNINITIALIZED))
345 if (type != SVt_PV && GIMME_V == G_ARRAY) {
349 **spp = &PL_sv_undef;
352 if ((PL_op->op_flags & OPf_SPECIAL) &&
353 !(PL_op->op_flags & OPf_MOD))
355 if (!(gv = gv_fetchsv_nomg(sv, GV_ADDMG, type)))
357 **spp = &PL_sv_undef;
362 gv = gv_fetchsv_nomg(sv, GV_ADD, type);
375 sv = amagic_deref_call(sv, to_sv_amg);
379 switch (SvTYPE(sv)) {
385 DIE(aTHX_ "Not a SCALAR reference");
392 if (!isGV_with_GP(gv)) {
393 gv = Perl_softref2xv(aTHX_ sv, "a SCALAR", SVt_PV, &sp);
399 if (PL_op->op_flags & OPf_MOD) {
400 if (PL_op->op_private & OPpLVAL_INTRO) {
401 if (cUNOP->op_first->op_type == OP_NULL)
402 sv = save_scalar(MUTABLE_GV(TOPs));
404 sv = save_scalar(gv);
406 Perl_croak(aTHX_ "%s", PL_no_localize_ref);
408 else if (PL_op->op_private & OPpDEREF)
409 sv = vivify_ref(sv, PL_op->op_private & OPpDEREF);
418 AV * const av = MUTABLE_AV(TOPs);
419 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
421 SV ** const svp = Perl_av_arylen_p(aTHX_ MUTABLE_AV(av));
423 *svp = newSV_type(SVt_PVMG);
424 sv_magic(*svp, MUTABLE_SV(av), PERL_MAGIC_arylen, NULL, 0);
428 SETs(sv_2mortal(newSViv(AvFILL(MUTABLE_AV(av)))));
437 if (PL_op->op_flags & OPf_MOD || LVRET) {
438 SV * const ret = sv_2mortal(newSV_type(SVt_PVLV));/* Not TARG RT#67838 */
439 sv_magic(ret, NULL, PERL_MAGIC_pos, NULL, 0);
441 LvTARG(ret) = SvREFCNT_inc_simple(sv);
442 PUSHs(ret); /* no SvSETMAGIC */
446 const MAGIC * const mg = mg_find_mglob(sv);
447 if (mg && mg->mg_len != -1) {
449 STRLEN i = mg->mg_len;
450 if (mg->mg_flags & MGf_BYTES && DO_UTF8(sv))
451 i = sv_pos_b2u_flags(sv, i, SV_GMAGIC|SV_CONST_RETURN);
464 const I32 flags = (PL_op->op_flags & OPf_SPECIAL)
466 : ((PL_op->op_private & (OPpLVAL_INTRO|OPpMAY_RETURN_CONSTANT))
467 == OPpMAY_RETURN_CONSTANT)
470 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
471 /* (But not in defined().) */
473 CV *cv = sv_2cv(TOPs, &stash_unused, &gv, flags);
475 else if ((flags == (GV_ADD|GV_NOEXPAND)) && gv && SvROK(gv)) {
476 cv = SvTYPE(SvRV(gv)) == SVt_PVCV
477 ? MUTABLE_CV(SvRV(gv))
481 cv = MUTABLE_CV(&PL_sv_undef);
482 SETs(MUTABLE_SV(cv));
492 SV *ret = &PL_sv_undef;
494 if (SvGMAGICAL(TOPs)) SETs(sv_mortalcopy(TOPs));
495 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
496 const char * s = SvPVX_const(TOPs);
497 if (strnEQ(s, "CORE::", 6)) {
498 const int code = keyword(s + 6, SvCUR(TOPs) - 6, 1);
500 DIE(aTHX_ "Can't find an opnumber for \"%"UTF8f"\"",
501 UTF8fARG(SvFLAGS(TOPs) & SVf_UTF8, SvCUR(TOPs)-6, s+6));
503 SV * const sv = core_prototype(NULL, s + 6, code, NULL);
509 cv = sv_2cv(TOPs, &stash, &gv, 0);
511 ret = newSVpvn_flags(
512 CvPROTO(cv), CvPROTOLEN(cv), SVs_TEMP | SvUTF8(cv)
522 CV *cv = MUTABLE_CV(PAD_SV(PL_op->op_targ));
524 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
526 PUSHs(MUTABLE_SV(cv));
540 if (GIMME != G_ARRAY) {
544 *MARK = &PL_sv_undef;
545 *MARK = refto(*MARK);
549 EXTEND_MORTAL(SP - MARK);
551 *MARK = refto(*MARK);
556 S_refto(pTHX_ SV *sv)
560 PERL_ARGS_ASSERT_REFTO;
562 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
565 if (!(sv = LvTARG(sv)))
568 SvREFCNT_inc_void_NN(sv);
570 else if (SvTYPE(sv) == SVt_PVAV) {
571 if (!AvREAL((const AV *)sv) && AvREIFY((const AV *)sv))
572 av_reify(MUTABLE_AV(sv));
574 SvREFCNT_inc_void_NN(sv);
576 else if (SvPADTMP(sv)) {
581 SvREFCNT_inc_void_NN(sv);
584 sv_upgrade(rv, SVt_IV);
593 SV * const sv = TOPs;
601 /* use the return value that is in a register, its the same as TARG */
602 TARG = sv_ref(TARG,SvRV(sv),TRUE);
617 stash = CopSTASH(PL_curcop);
618 if (SvTYPE(stash) != SVt_PVHV)
619 Perl_croak(aTHX_ "Attempt to bless into a freed package");
622 SV * const ssv = POPs;
626 if (!ssv) goto curstash;
629 if (!SvAMAGIC(ssv)) {
631 Perl_croak(aTHX_ "Attempt to bless into a reference");
633 /* SvAMAGIC is on here, but it only means potentially overloaded,
634 so after stringification: */
635 ptr = SvPV_nomg_const(ssv,len);
636 /* We need to check the flag again: */
637 if (!SvAMAGIC(ssv)) goto frog;
639 else ptr = SvPV_nomg_const(ssv,len);
641 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
642 "Explicit blessing to '' (assuming package main)");
643 stash = gv_stashpvn(ptr, len, GV_ADD|SvUTF8(ssv));
646 (void)sv_bless(TOPs, stash);
656 const char * const elem = SvPV_const(sv, len);
657 GV * const gv = MUTABLE_GV(POPs);
662 /* elem will always be NUL terminated. */
663 const char * const second_letter = elem + 1;
666 if (len == 5 && strEQ(second_letter, "RRAY"))
668 tmpRef = MUTABLE_SV(GvAV(gv));
669 if (tmpRef && !AvREAL((const AV *)tmpRef)
670 && AvREIFY((const AV *)tmpRef))
671 av_reify(MUTABLE_AV(tmpRef));
675 if (len == 4 && strEQ(second_letter, "ODE"))
676 tmpRef = MUTABLE_SV(GvCVu(gv));
679 if (len == 10 && strEQ(second_letter, "ILEHANDLE")) {
680 /* finally deprecated in 5.8.0 */
681 deprecate("*glob{FILEHANDLE}");
682 tmpRef = MUTABLE_SV(GvIOp(gv));
685 if (len == 6 && strEQ(second_letter, "ORMAT"))
686 tmpRef = MUTABLE_SV(GvFORM(gv));
689 if (len == 4 && strEQ(second_letter, "LOB"))
690 tmpRef = MUTABLE_SV(gv);
693 if (len == 4 && strEQ(second_letter, "ASH"))
694 tmpRef = MUTABLE_SV(GvHV(gv));
697 if (*second_letter == 'O' && !elem[2] && len == 2)
698 tmpRef = MUTABLE_SV(GvIOp(gv));
701 if (len == 4 && strEQ(second_letter, "AME"))
702 sv = newSVhek(GvNAME_HEK(gv));
705 if (len == 7 && strEQ(second_letter, "ACKAGE")) {
706 const HV * const stash = GvSTASH(gv);
707 const HEK * const hek = stash ? HvNAME_HEK(stash) : NULL;
708 sv = hek ? newSVhek(hek) : newSVpvs("__ANON__");
712 if (len == 6 && strEQ(second_letter, "CALAR"))
727 /* Pattern matching */
735 if (len == 0 || len > I32_MAX || !SvPOK(sv) || SvUTF8(sv) || SvVALID(sv)) {
736 /* Historically, study was skipped in these cases. */
740 /* Make study a no-op. It's no longer useful and its existence
741 complicates matters elsewhere. */
746 /* also used for: pp_transr() */
753 if (PL_op->op_flags & OPf_STACKED)
761 if(PL_op->op_type == OP_TRANSR) {
763 const char * const pv = SvPV(sv,len);
764 SV * const newsv = newSVpvn_flags(pv, len, SVs_TEMP|SvUTF8(sv));
769 TARG = sv_newmortal();
775 /* Lvalue operators. */
778 S_do_chomp(pTHX_ SV *retval, SV *sv, bool chomping)
783 PERL_ARGS_ASSERT_DO_CHOMP;
785 if (chomping && (RsSNARF(PL_rs) || RsRECORD(PL_rs)))
787 if (SvTYPE(sv) == SVt_PVAV) {
789 AV *const av = MUTABLE_AV(sv);
790 const I32 max = AvFILL(av);
792 for (i = 0; i <= max; i++) {
793 sv = MUTABLE_SV(av_fetch(av, i, FALSE));
794 if (sv && ((sv = *(SV**)sv), sv != &PL_sv_undef))
795 do_chomp(retval, sv, chomping);
799 else if (SvTYPE(sv) == SVt_PVHV) {
800 HV* const hv = MUTABLE_HV(sv);
802 (void)hv_iterinit(hv);
803 while ((entry = hv_iternext(hv)))
804 do_chomp(retval, hv_iterval(hv,entry), chomping);
807 else if (SvREADONLY(sv)) {
808 Perl_croak_no_modify();
810 else if (SvIsCOW(sv)) {
811 sv_force_normal_flags(sv, 0);
816 /* XXX, here sv is utf8-ized as a side-effect!
817 If encoding.pm is used properly, almost string-generating
818 operations, including literal strings, chr(), input data, etc.
819 should have been utf8-ized already, right?
821 sv_recode_to_utf8(sv, PL_encoding);
827 char *temp_buffer = NULL;
836 while (len && s[-1] == '\n') {
843 STRLEN rslen, rs_charlen;
844 const char *rsptr = SvPV_const(PL_rs, rslen);
846 rs_charlen = SvUTF8(PL_rs)
850 if (SvUTF8(PL_rs) != SvUTF8(sv)) {
851 /* Assumption is that rs is shorter than the scalar. */
853 /* RS is utf8, scalar is 8 bit. */
855 temp_buffer = (char*)bytes_from_utf8((U8*)rsptr,
858 /* Cannot downgrade, therefore cannot possibly match
860 assert (temp_buffer == rsptr);
866 else if (PL_encoding) {
867 /* RS is 8 bit, encoding.pm is used.
868 * Do not recode PL_rs as a side-effect. */
869 svrecode = newSVpvn(rsptr, rslen);
870 sv_recode_to_utf8(svrecode, PL_encoding);
871 rsptr = SvPV_const(svrecode, rslen);
872 rs_charlen = sv_len_utf8(svrecode);
875 /* RS is 8 bit, scalar is utf8. */
876 temp_buffer = (char*)bytes_to_utf8((U8*)rsptr, &rslen);
890 if (memNE(s, rsptr, rslen))
892 SvIVX(retval) += rs_charlen;
895 s = SvPV_force_nomg_nolen(sv);
903 SvREFCNT_dec(svrecode);
905 Safefree(temp_buffer);
907 if (len && !SvPOK(sv))
908 s = SvPV_force_nomg(sv, len);
911 char * const send = s + len;
912 char * const start = s;
914 while (s > start && UTF8_IS_CONTINUATION(*s))
916 if (is_utf8_string((U8*)s, send - s)) {
917 sv_setpvn(retval, s, send - s);
919 SvCUR_set(sv, s - start);
925 sv_setpvs(retval, "");
929 sv_setpvn(retval, s, 1);
936 sv_setpvs(retval, "");
942 /* also used for: pp_schomp() */
947 const bool chomping = PL_op->op_type == OP_SCHOMP;
951 do_chomp(TARG, TOPs, chomping);
957 /* also used for: pp_chomp() */
961 dSP; dMARK; dTARGET; dORIGMARK;
962 const bool chomping = PL_op->op_type == OP_CHOMP;
967 do_chomp(TARG, *++MARK, chomping);
978 if (!PL_op->op_private) {
987 if (SvTHINKFIRST(sv))
988 sv_force_normal_flags(sv, SV_COW_DROP_PV|SV_IMMEDIATE_UNREF);
990 switch (SvTYPE(sv)) {
994 av_undef(MUTABLE_AV(sv));
997 hv_undef(MUTABLE_HV(sv));
1000 if (cv_const_sv((const CV *)sv))
1001 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
1002 "Constant subroutine %"SVf" undefined",
1003 SVfARG(CvANON((const CV *)sv)
1004 ? newSVpvs_flags("(anonymous)", SVs_TEMP)
1005 : sv_2mortal(newSVhek(
1007 ? CvNAME_HEK((CV *)sv)
1008 : GvENAME_HEK(CvGV((const CV *)sv))
1013 /* let user-undef'd sub keep its identity */
1014 cv_undef_flags(MUTABLE_CV(sv), CV_UNDEF_KEEP_NAME);
1017 assert(isGV_with_GP(sv));
1018 assert(!SvFAKE(sv));
1023 /* undef *Pkg::meth_name ... */
1025 = GvCVu((const GV *)sv) && (stash = GvSTASH((const GV *)sv))
1026 && HvENAME_get(stash);
1028 if((stash = GvHV((const GV *)sv))) {
1029 if(HvENAME_get(stash))
1030 SvREFCNT_inc_simple_void_NN(sv_2mortal((SV *)stash));
1034 SvREFCNT_inc_simple_void_NN(sv_2mortal(sv));
1035 gp_free(MUTABLE_GV(sv));
1037 GvGP_set(sv, gp_ref(gp));
1038 #ifndef PERL_DONT_CREATE_GVSV
1039 GvSV(sv) = newSV(0);
1041 GvLINE(sv) = CopLINE(PL_curcop);
1042 GvEGV(sv) = MUTABLE_GV(sv);
1046 mro_package_moved(NULL, stash, (const GV *)sv, 0);
1048 /* undef *Foo::ISA */
1049 if( strEQ(GvNAME((const GV *)sv), "ISA")
1050 && (stash = GvSTASH((const GV *)sv))
1051 && (method_changed || HvENAME(stash)) )
1052 mro_isa_changed_in(stash);
1053 else if(method_changed)
1054 mro_method_changed_in(
1055 GvSTASH((const GV *)sv)
1061 if (SvTYPE(sv) >= SVt_PV && SvPVX_const(sv) && SvLEN(sv)) {
1074 /* also used for: pp_i_postdec() pp_i_postinc() pp_postdec() */
1080 PL_op->op_type == OP_POSTINC || PL_op->op_type == OP_I_POSTINC;
1081 if (SvTYPE(TOPs) >= SVt_PVAV || (isGV_with_GP(TOPs) && !SvFAKE(TOPs)))
1082 Perl_croak_no_modify();
1083 if (!(PL_op->op_private & OPpTARGET_MY) && SvROK(TOPs))
1084 TARG = sv_newmortal();
1085 sv_setsv(TARG, TOPs);
1086 if (!SvREADONLY(TOPs) && !SvGMAGICAL(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
1087 && SvIVX(TOPs) != (inc ? IV_MAX : IV_MIN))
1089 SvIV_set(TOPs, SvIVX(TOPs) + (inc ? 1 : -1));
1090 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
1094 else sv_dec_nomg(TOPs);
1096 /* special case for undef: see thread at 2003-03/msg00536.html in archive */
1097 if (inc && !SvOK(TARG))
1103 /* Ordinary operators. */
1107 dSP; dATARGET; SV *svl, *svr;
1108 #ifdef PERL_PRESERVE_IVUV
1111 tryAMAGICbin_MG(pow_amg, AMGf_assign|AMGf_numeric);
1114 #ifdef PERL_PRESERVE_IVUV
1115 /* For integer to integer power, we do the calculation by hand wherever
1116 we're sure it is safe; otherwise we call pow() and try to convert to
1117 integer afterwards. */
1118 if (SvIV_please_nomg(svr) && SvIV_please_nomg(svl)) {
1126 const IV iv = SvIVX(svr);
1130 goto float_it; /* Can't do negative powers this way. */
1134 baseuok = SvUOK(svl);
1136 baseuv = SvUVX(svl);
1138 const IV iv = SvIVX(svl);
1141 baseuok = TRUE; /* effectively it's a UV now */
1143 baseuv = -iv; /* abs, baseuok == false records sign */
1146 /* now we have integer ** positive integer. */
1149 /* foo & (foo - 1) is zero only for a power of 2. */
1150 if (!(baseuv & (baseuv - 1))) {
1151 /* We are raising power-of-2 to a positive integer.
1152 The logic here will work for any base (even non-integer
1153 bases) but it can be less accurate than
1154 pow (base,power) or exp (power * log (base)) when the
1155 intermediate values start to spill out of the mantissa.
1156 With powers of 2 we know this can't happen.
1157 And powers of 2 are the favourite thing for perl
1158 programmers to notice ** not doing what they mean. */
1160 NV base = baseuok ? baseuv : -(NV)baseuv;
1165 while (power >>= 1) {
1173 SvIV_please_nomg(svr);
1176 unsigned int highbit = 8 * sizeof(UV);
1177 unsigned int diff = 8 * sizeof(UV);
1178 while (diff >>= 1) {
1180 if (baseuv >> highbit) {
1184 /* we now have baseuv < 2 ** highbit */
1185 if (power * highbit <= 8 * sizeof(UV)) {
1186 /* result will definitely fit in UV, so use UV math
1187 on same algorithm as above */
1190 const bool odd_power = cBOOL(power & 1);
1194 while (power >>= 1) {
1201 if (baseuok || !odd_power)
1202 /* answer is positive */
1204 else if (result <= (UV)IV_MAX)
1205 /* answer negative, fits in IV */
1206 SETi( -(IV)result );
1207 else if (result == (UV)IV_MIN)
1208 /* 2's complement assumption: special case IV_MIN */
1211 /* answer negative, doesn't fit */
1212 SETn( -(NV)result );
1220 NV right = SvNV_nomg(svr);
1221 NV left = SvNV_nomg(svl);
1224 #if defined(USE_LONG_DOUBLE) && defined(HAS_AIX_POWL_NEG_BASE_BUG)
1226 We are building perl with long double support and are on an AIX OS
1227 afflicted with a powl() function that wrongly returns NaNQ for any
1228 negative base. This was reported to IBM as PMR #23047-379 on
1229 03/06/2006. The problem exists in at least the following versions
1230 of AIX and the libm fileset, and no doubt others as well:
1232 AIX 4.3.3-ML10 bos.adt.libm 4.3.3.50
1233 AIX 5.1.0-ML04 bos.adt.libm 5.1.0.29
1234 AIX 5.2.0 bos.adt.libm 5.2.0.85
1236 So, until IBM fixes powl(), we provide the following workaround to
1237 handle the problem ourselves. Our logic is as follows: for
1238 negative bases (left), we use fmod(right, 2) to check if the
1239 exponent is an odd or even integer:
1241 - if odd, powl(left, right) == -powl(-left, right)
1242 - if even, powl(left, right) == powl(-left, right)
1244 If the exponent is not an integer, the result is rightly NaNQ, so
1245 we just return that (as NV_NAN).
1249 NV mod2 = Perl_fmod( right, 2.0 );
1250 if (mod2 == 1.0 || mod2 == -1.0) { /* odd integer */
1251 SETn( -Perl_pow( -left, right) );
1252 } else if (mod2 == 0.0) { /* even integer */
1253 SETn( Perl_pow( -left, right) );
1254 } else { /* fractional power */
1258 SETn( Perl_pow( left, right) );
1261 SETn( Perl_pow( left, right) );
1262 #endif /* HAS_AIX_POWL_NEG_BASE_BUG */
1264 #ifdef PERL_PRESERVE_IVUV
1266 SvIV_please_nomg(svr);
1274 dSP; dATARGET; SV *svl, *svr;
1275 tryAMAGICbin_MG(mult_amg, AMGf_assign|AMGf_numeric);
1278 #ifdef PERL_PRESERVE_IVUV
1279 if (SvIV_please_nomg(svr)) {
1280 /* Unless the left argument is integer in range we are going to have to
1281 use NV maths. Hence only attempt to coerce the right argument if
1282 we know the left is integer. */
1283 /* Left operand is defined, so is it IV? */
1284 if (SvIV_please_nomg(svl)) {
1285 bool auvok = SvUOK(svl);
1286 bool buvok = SvUOK(svr);
1287 const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
1288 const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
1297 const IV aiv = SvIVX(svl);
1300 auvok = TRUE; /* effectively it's a UV now */
1302 alow = -aiv; /* abs, auvok == false records sign */
1308 const IV biv = SvIVX(svr);
1311 buvok = TRUE; /* effectively it's a UV now */
1313 blow = -biv; /* abs, buvok == false records sign */
1317 /* If this does sign extension on unsigned it's time for plan B */
1318 ahigh = alow >> (4 * sizeof (UV));
1320 bhigh = blow >> (4 * sizeof (UV));
1322 if (ahigh && bhigh) {
1324 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
1325 which is overflow. Drop to NVs below. */
1326 } else if (!ahigh && !bhigh) {
1327 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
1328 so the unsigned multiply cannot overflow. */
1329 const UV product = alow * blow;
1330 if (auvok == buvok) {
1331 /* -ve * -ve or +ve * +ve gives a +ve result. */
1335 } else if (product <= (UV)IV_MIN) {
1336 /* 2s complement assumption that (UV)-IV_MIN is correct. */
1337 /* -ve result, which could overflow an IV */
1339 SETi( -(IV)product );
1341 } /* else drop to NVs below. */
1343 /* One operand is large, 1 small */
1346 /* swap the operands */
1348 bhigh = blow; /* bhigh now the temp var for the swap */
1352 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1353 multiplies can't overflow. shift can, add can, -ve can. */
1354 product_middle = ahigh * blow;
1355 if (!(product_middle & topmask)) {
1356 /* OK, (ahigh * blow) won't lose bits when we shift it. */
1358 product_middle <<= (4 * sizeof (UV));
1359 product_low = alow * blow;
1361 /* as for pp_add, UV + something mustn't get smaller.
1362 IIRC ANSI mandates this wrapping *behaviour* for
1363 unsigned whatever the actual representation*/
1364 product_low += product_middle;
1365 if (product_low >= product_middle) {
1366 /* didn't overflow */
1367 if (auvok == buvok) {
1368 /* -ve * -ve or +ve * +ve gives a +ve result. */
1370 SETu( product_low );
1372 } else if (product_low <= (UV)IV_MIN) {
1373 /* 2s complement assumption again */
1374 /* -ve result, which could overflow an IV */
1376 SETi( -(IV)product_low );
1378 } /* else drop to NVs below. */
1380 } /* product_middle too large */
1381 } /* ahigh && bhigh */
1386 NV right = SvNV_nomg(svr);
1387 NV left = SvNV_nomg(svl);
1389 SETn( left * right );
1396 dSP; dATARGET; SV *svl, *svr;
1397 tryAMAGICbin_MG(div_amg, AMGf_assign|AMGf_numeric);
1400 /* Only try to do UV divide first
1401 if ((SLOPPYDIVIDE is true) or
1402 (PERL_PRESERVE_IVUV is true and one or both SV is a UV too large
1404 The assumption is that it is better to use floating point divide
1405 whenever possible, only doing integer divide first if we can't be sure.
1406 If NV_PRESERVES_UV is true then we know at compile time that no UV
1407 can be too large to preserve, so don't need to compile the code to
1408 test the size of UVs. */
1411 # define PERL_TRY_UV_DIVIDE
1412 /* ensure that 20./5. == 4. */
1414 # ifdef PERL_PRESERVE_IVUV
1415 # ifndef NV_PRESERVES_UV
1416 # define PERL_TRY_UV_DIVIDE
1421 #ifdef PERL_TRY_UV_DIVIDE
1422 if (SvIV_please_nomg(svr) && SvIV_please_nomg(svl)) {
1423 bool left_non_neg = SvUOK(svl);
1424 bool right_non_neg = SvUOK(svr);
1428 if (right_non_neg) {
1432 const IV biv = SvIVX(svr);
1435 right_non_neg = TRUE; /* effectively it's a UV now */
1441 /* historically undef()/0 gives a "Use of uninitialized value"
1442 warning before dieing, hence this test goes here.
1443 If it were immediately before the second SvIV_please, then
1444 DIE() would be invoked before left was even inspected, so
1445 no inspection would give no warning. */
1447 DIE(aTHX_ "Illegal division by zero");
1453 const IV aiv = SvIVX(svl);
1456 left_non_neg = TRUE; /* effectively it's a UV now */
1465 /* For sloppy divide we always attempt integer division. */
1467 /* Otherwise we only attempt it if either or both operands
1468 would not be preserved by an NV. If both fit in NVs
1469 we fall through to the NV divide code below. However,
1470 as left >= right to ensure integer result here, we know that
1471 we can skip the test on the right operand - right big
1472 enough not to be preserved can't get here unless left is
1475 && (left > ((UV)1 << NV_PRESERVES_UV_BITS))
1478 /* Integer division can't overflow, but it can be imprecise. */
1479 const UV result = left / right;
1480 if (result * right == left) {
1481 SP--; /* result is valid */
1482 if (left_non_neg == right_non_neg) {
1483 /* signs identical, result is positive. */
1487 /* 2s complement assumption */
1488 if (result <= (UV)IV_MIN)
1489 SETi( -(IV)result );
1491 /* It's exact but too negative for IV. */
1492 SETn( -(NV)result );
1495 } /* tried integer divide but it was not an integer result */
1496 } /* else (PERL_ABS(result) < 1.0) or (both UVs in range for NV) */
1497 } /* one operand wasn't SvIOK */
1498 #endif /* PERL_TRY_UV_DIVIDE */
1500 NV right = SvNV_nomg(svr);
1501 NV left = SvNV_nomg(svl);
1502 (void)POPs;(void)POPs;
1503 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1504 if (! Perl_isnan(right) && right == 0.0)
1508 DIE(aTHX_ "Illegal division by zero");
1509 PUSHn( left / right );
1517 tryAMAGICbin_MG(modulo_amg, AMGf_assign|AMGf_numeric);
1521 bool left_neg = FALSE;
1522 bool right_neg = FALSE;
1523 bool use_double = FALSE;
1524 bool dright_valid = FALSE;
1527 SV * const svr = TOPs;
1528 SV * const svl = TOPm1s;
1529 if (SvIV_please_nomg(svr)) {
1530 right_neg = !SvUOK(svr);
1534 const IV biv = SvIVX(svr);
1537 right_neg = FALSE; /* effectively it's a UV now */
1544 dright = SvNV_nomg(svr);
1545 right_neg = dright < 0;
1548 if (dright < UV_MAX_P1) {
1549 right = U_V(dright);
1550 dright_valid = TRUE; /* In case we need to use double below. */
1556 /* At this point use_double is only true if right is out of range for
1557 a UV. In range NV has been rounded down to nearest UV and
1558 use_double false. */
1559 if (!use_double && SvIV_please_nomg(svl)) {
1560 left_neg = !SvUOK(svl);
1564 const IV aiv = SvIVX(svl);
1567 left_neg = FALSE; /* effectively it's a UV now */
1574 dleft = SvNV_nomg(svl);
1575 left_neg = dleft < 0;
1579 /* This should be exactly the 5.6 behaviour - if left and right are
1580 both in range for UV then use U_V() rather than floor. */
1582 if (dleft < UV_MAX_P1) {
1583 /* right was in range, so is dleft, so use UVs not double.
1587 /* left is out of range for UV, right was in range, so promote
1588 right (back) to double. */
1590 /* The +0.5 is used in 5.6 even though it is not strictly
1591 consistent with the implicit +0 floor in the U_V()
1592 inside the #if 1. */
1593 dleft = Perl_floor(dleft + 0.5);
1596 dright = Perl_floor(dright + 0.5);
1607 DIE(aTHX_ "Illegal modulus zero");
1609 dans = Perl_fmod(dleft, dright);
1610 if ((left_neg != right_neg) && dans)
1611 dans = dright - dans;
1614 sv_setnv(TARG, dans);
1620 DIE(aTHX_ "Illegal modulus zero");
1623 if ((left_neg != right_neg) && ans)
1626 /* XXX may warn: unary minus operator applied to unsigned type */
1627 /* could change -foo to be (~foo)+1 instead */
1628 if (ans <= ~((UV)IV_MAX)+1)
1629 sv_setiv(TARG, ~ans+1);
1631 sv_setnv(TARG, -(NV)ans);
1634 sv_setuv(TARG, ans);
1647 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1648 /* TODO: think of some way of doing list-repeat overloading ??? */
1653 if (UNLIKELY(PL_op->op_private & OPpREPEAT_DOLIST)) {
1654 /* The parser saw this as a list repeat, and there
1655 are probably several items on the stack. But we're
1656 in scalar/void context, and there's no pp_list to save us
1657 now. So drop the rest of the items -- robin@kitsite.com
1660 if (MARK + 1 < SP) {
1666 ASSUME(MARK + 1 == SP);
1668 MARK[1] = &PL_sv_undef;
1672 tryAMAGICbin_MG(repeat_amg, AMGf_assign);
1678 const UV uv = SvUV_nomg(sv);
1680 count = IV_MAX; /* The best we can do? */
1684 count = SvIV_nomg(sv);
1687 else if (SvNOKp(sv)) {
1688 const NV nv = SvNV_nomg(sv);
1690 count = -1; /* An arbitrary negative integer */
1695 count = SvIV_nomg(sv);
1699 Perl_ck_warner(aTHX_ packWARN(WARN_NUMERIC),
1700 "Negative repeat count does nothing");
1703 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1705 static const char* const oom_list_extend = "Out of memory during list extend";
1706 const I32 items = SP - MARK;
1707 const I32 max = items * count;
1708 const U8 mod = PL_op->op_flags & OPf_MOD;
1710 MEM_WRAP_CHECK_1(max, SV*, oom_list_extend);
1711 /* Did the max computation overflow? */
1712 if (items > 0 && max > 0 && (max < items || max < count))
1713 Perl_croak(aTHX_ "%s", oom_list_extend);
1718 if (mod && SvPADTMP(*SP)) {
1719 *SP = sv_mortalcopy(*SP);
1726 repeatcpy((char*)(MARK + items), (char*)MARK,
1727 items * sizeof(const SV *), count - 1);
1730 else if (count <= 0)
1733 else { /* Note: mark already snarfed by pp_list */
1734 SV * const tmpstr = POPs;
1737 static const char* const oom_string_extend =
1738 "Out of memory during string extend";
1741 sv_setsv_nomg(TARG, tmpstr);
1742 SvPV_force_nomg(TARG, len);
1743 isutf = DO_UTF8(TARG);
1748 const STRLEN max = (UV)count * len;
1749 if (len > MEM_SIZE_MAX / count)
1750 Perl_croak(aTHX_ "%s", oom_string_extend);
1751 MEM_WRAP_CHECK_1(max, char, oom_string_extend);
1752 SvGROW(TARG, max + 1);
1753 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1754 SvCUR_set(TARG, SvCUR(TARG) * count);
1756 *SvEND(TARG) = '\0';
1759 (void)SvPOK_only_UTF8(TARG);
1761 (void)SvPOK_only(TARG);
1770 dSP; dATARGET; bool useleft; SV *svl, *svr;
1771 tryAMAGICbin_MG(subtr_amg, AMGf_assign|AMGf_numeric);
1774 useleft = USE_LEFT(svl);
1775 #ifdef PERL_PRESERVE_IVUV
1776 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1777 "bad things" happen if you rely on signed integers wrapping. */
1778 if (SvIV_please_nomg(svr)) {
1779 /* Unless the left argument is integer in range we are going to have to
1780 use NV maths. Hence only attempt to coerce the right argument if
1781 we know the left is integer. */
1788 a_valid = auvok = 1;
1789 /* left operand is undef, treat as zero. */
1791 /* Left operand is defined, so is it IV? */
1792 if (SvIV_please_nomg(svl)) {
1793 if ((auvok = SvUOK(svl)))
1796 const IV aiv = SvIVX(svl);
1799 auvok = 1; /* Now acting as a sign flag. */
1800 } else { /* 2s complement assumption for IV_MIN */
1808 bool result_good = 0;
1811 bool buvok = SvUOK(svr);
1816 const IV biv = SvIVX(svr);
1823 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1824 else "IV" now, independent of how it came in.
1825 if a, b represents positive, A, B negative, a maps to -A etc
1830 all UV maths. negate result if A negative.
1831 subtract if signs same, add if signs differ. */
1833 if (auvok ^ buvok) {
1842 /* Must get smaller */
1847 if (result <= buv) {
1848 /* result really should be -(auv-buv). as its negation
1849 of true value, need to swap our result flag */
1861 if (result <= (UV)IV_MIN)
1862 SETi( -(IV)result );
1864 /* result valid, but out of range for IV. */
1865 SETn( -(NV)result );
1869 } /* Overflow, drop through to NVs. */
1874 NV value = SvNV_nomg(svr);
1878 /* left operand is undef, treat as zero - value */
1882 SETn( SvNV_nomg(svl) - value );
1889 dSP; dATARGET; SV *svl, *svr;
1890 tryAMAGICbin_MG(lshift_amg, AMGf_assign|AMGf_numeric);
1894 const IV shift = SvIV_nomg(svr);
1895 if (PL_op->op_private & HINT_INTEGER) {
1896 const IV i = SvIV_nomg(svl);
1900 const UV u = SvUV_nomg(svl);
1909 dSP; dATARGET; SV *svl, *svr;
1910 tryAMAGICbin_MG(rshift_amg, AMGf_assign|AMGf_numeric);
1914 const IV shift = SvIV_nomg(svr);
1915 if (PL_op->op_private & HINT_INTEGER) {
1916 const IV i = SvIV_nomg(svl);
1920 const UV u = SvUV_nomg(svl);
1932 tryAMAGICbin_MG(lt_amg, AMGf_set|AMGf_numeric);
1936 (SvIOK_notUV(left) && SvIOK_notUV(right))
1937 ? (SvIVX(left) < SvIVX(right))
1938 : (do_ncmp(left, right) == -1)
1948 tryAMAGICbin_MG(gt_amg, AMGf_set|AMGf_numeric);
1952 (SvIOK_notUV(left) && SvIOK_notUV(right))
1953 ? (SvIVX(left) > SvIVX(right))
1954 : (do_ncmp(left, right) == 1)
1964 tryAMAGICbin_MG(le_amg, AMGf_set|AMGf_numeric);
1968 (SvIOK_notUV(left) && SvIOK_notUV(right))
1969 ? (SvIVX(left) <= SvIVX(right))
1970 : (do_ncmp(left, right) <= 0)
1980 tryAMAGICbin_MG(ge_amg, AMGf_set|AMGf_numeric);
1984 (SvIOK_notUV(left) && SvIOK_notUV(right))
1985 ? (SvIVX(left) >= SvIVX(right))
1986 : ( (do_ncmp(left, right) & 2) == 0)
1996 tryAMAGICbin_MG(ne_amg, AMGf_set|AMGf_numeric);
2000 (SvIOK_notUV(left) && SvIOK_notUV(right))
2001 ? (SvIVX(left) != SvIVX(right))
2002 : (do_ncmp(left, right) != 0)
2007 /* compare left and right SVs. Returns:
2011 * 2: left or right was a NaN
2014 Perl_do_ncmp(pTHX_ SV* const left, SV * const right)
2016 PERL_ARGS_ASSERT_DO_NCMP;
2017 #ifdef PERL_PRESERVE_IVUV
2018 /* Fortunately it seems NaN isn't IOK */
2019 if (SvIV_please_nomg(right) && SvIV_please_nomg(left)) {
2021 const IV leftiv = SvIVX(left);
2022 if (!SvUOK(right)) {
2023 /* ## IV <=> IV ## */
2024 const IV rightiv = SvIVX(right);
2025 return (leftiv > rightiv) - (leftiv < rightiv);
2027 /* ## IV <=> UV ## */
2029 /* As (b) is a UV, it's >=0, so it must be < */
2032 const UV rightuv = SvUVX(right);
2033 return ((UV)leftiv > rightuv) - ((UV)leftiv < rightuv);
2038 /* ## UV <=> UV ## */
2039 const UV leftuv = SvUVX(left);
2040 const UV rightuv = SvUVX(right);
2041 return (leftuv > rightuv) - (leftuv < rightuv);
2043 /* ## UV <=> IV ## */
2045 const IV rightiv = SvIVX(right);
2047 /* As (a) is a UV, it's >=0, so it cannot be < */
2050 const UV leftuv = SvUVX(left);
2051 return (leftuv > (UV)rightiv) - (leftuv < (UV)rightiv);
2054 assert(0); /* NOTREACHED */
2058 NV const rnv = SvNV_nomg(right);
2059 NV const lnv = SvNV_nomg(left);
2061 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2062 if (Perl_isnan(lnv) || Perl_isnan(rnv)) {
2065 return (lnv > rnv) - (lnv < rnv);
2084 tryAMAGICbin_MG(ncmp_amg, AMGf_numeric);
2087 value = do_ncmp(left, right);
2099 /* also used for: pp_sge() pp_sgt() pp_slt() */
2105 int amg_type = sle_amg;
2109 switch (PL_op->op_type) {
2128 tryAMAGICbin_MG(amg_type, AMGf_set);
2132 #ifdef USE_LOCALE_COLLATE
2133 (IN_LC_RUNTIME(LC_COLLATE))
2134 ? sv_cmp_locale_flags(left, right, 0)
2137 sv_cmp_flags(left, right, 0);
2138 SETs(boolSV(cmp * multiplier < rhs));
2146 tryAMAGICbin_MG(seq_amg, AMGf_set);
2149 SETs(boolSV(sv_eq_flags(left, right, 0)));
2157 tryAMAGICbin_MG(sne_amg, AMGf_set);
2160 SETs(boolSV(!sv_eq_flags(left, right, 0)));
2168 tryAMAGICbin_MG(scmp_amg, 0);
2172 #ifdef USE_LOCALE_COLLATE
2173 (IN_LC_RUNTIME(LC_COLLATE))
2174 ? sv_cmp_locale_flags(left, right, 0)
2177 sv_cmp_flags(left, right, 0);
2186 tryAMAGICbin_MG(band_amg, AMGf_assign);
2189 if (SvNIOKp(left) || SvNIOKp(right)) {
2190 const bool left_ro_nonnum = !SvNIOKp(left) && SvREADONLY(left);
2191 const bool right_ro_nonnum = !SvNIOKp(right) && SvREADONLY(right);
2192 if (PL_op->op_private & HINT_INTEGER) {
2193 const IV i = SvIV_nomg(left) & SvIV_nomg(right);
2197 const UV u = SvUV_nomg(left) & SvUV_nomg(right);
2200 if (left_ro_nonnum && left != TARG) SvNIOK_off(left);
2201 if (right_ro_nonnum) SvNIOK_off(right);
2204 do_vop(PL_op->op_type, TARG, left, right);
2212 /* also used for: pp_bit_xor() */
2217 const int op_type = PL_op->op_type;
2219 tryAMAGICbin_MG((op_type == OP_BIT_OR ? bor_amg : bxor_amg), AMGf_assign);
2222 if (SvNIOKp(left) || SvNIOKp(right)) {
2223 const bool left_ro_nonnum = !SvNIOKp(left) && SvREADONLY(left);
2224 const bool right_ro_nonnum = !SvNIOKp(right) && SvREADONLY(right);
2225 if (PL_op->op_private & HINT_INTEGER) {
2226 const IV l = (USE_LEFT(left) ? SvIV_nomg(left) : 0);
2227 const IV r = SvIV_nomg(right);
2228 const IV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2232 const UV l = (USE_LEFT(left) ? SvUV_nomg(left) : 0);
2233 const UV r = SvUV_nomg(right);
2234 const UV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2237 if (left_ro_nonnum && left != TARG) SvNIOK_off(left);
2238 if (right_ro_nonnum) SvNIOK_off(right);
2241 do_vop(op_type, TARG, left, right);
2248 PERL_STATIC_INLINE bool
2249 S_negate_string(pTHX)
2254 SV * const sv = TOPs;
2255 if (!SvPOKp(sv) || SvNIOK(sv) || (!SvPOK(sv) && SvNIOKp(sv)))
2257 s = SvPV_nomg_const(sv, len);
2258 if (isIDFIRST(*s)) {
2259 sv_setpvs(TARG, "-");
2262 else if (*s == '+' || (*s == '-' && !looks_like_number(sv))) {
2263 sv_setsv_nomg(TARG, sv);
2264 *SvPV_force_nomg(TARG, len) = *s == '-' ? '+' : '-';
2274 tryAMAGICun_MG(neg_amg, AMGf_numeric);
2275 if (S_negate_string(aTHX)) return NORMAL;
2277 SV * const sv = TOPs;
2280 /* It's publicly an integer */
2283 if (SvIVX(sv) == IV_MIN) {
2284 /* 2s complement assumption. */
2285 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) ==
2289 else if (SvUVX(sv) <= IV_MAX) {
2294 else if (SvIVX(sv) != IV_MIN) {
2298 #ifdef PERL_PRESERVE_IVUV
2305 if (SvNIOKp(sv) && (SvNIOK(sv) || !SvPOK(sv)))
2306 SETn(-SvNV_nomg(sv));
2307 else if (SvPOKp(sv) && SvIV_please_nomg(sv))
2308 goto oops_its_an_int;
2310 SETn(-SvNV_nomg(sv));
2318 tryAMAGICun_MG(not_amg, AMGf_set);
2319 *PL_stack_sp = boolSV(!SvTRUE_nomg(*PL_stack_sp));
2326 tryAMAGICun_MG(compl_amg, AMGf_numeric);
2330 if (PL_op->op_private & HINT_INTEGER) {
2331 const IV i = ~SvIV_nomg(sv);
2335 const UV u = ~SvUV_nomg(sv);
2344 sv_copypv_nomg(TARG, sv);
2345 tmps = (U8*)SvPV_nomg(TARG, len);
2348 /* Calculate exact length, let's not estimate. */
2353 U8 * const send = tmps + len;
2354 U8 * const origtmps = tmps;
2355 const UV utf8flags = UTF8_ALLOW_ANYUV;
2357 while (tmps < send) {
2358 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2360 targlen += UNISKIP(~c);
2366 /* Now rewind strings and write them. */
2373 Newx(result, targlen + 1, U8);
2375 while (tmps < send) {
2376 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2378 p = uvchr_to_utf8_flags(p, ~c, UNICODE_ALLOW_ANY);
2381 sv_usepvn_flags(TARG, (char*)result, targlen,
2382 SV_HAS_TRAILING_NUL);
2389 Newx(result, nchar + 1, U8);
2391 while (tmps < send) {
2392 const U8 c = (U8)utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2397 sv_usepvn_flags(TARG, (char*)result, nchar, SV_HAS_TRAILING_NUL);
2406 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2409 for ( ; anum >= (I32)sizeof(long); anum -= (I32)sizeof(long), tmpl++)
2414 for ( ; anum > 0; anum--, tmps++)
2422 /* integer versions of some of the above */
2427 tryAMAGICbin_MG(mult_amg, AMGf_assign);
2430 SETi( left * right );
2439 tryAMAGICbin_MG(div_amg, AMGf_assign);
2442 IV value = SvIV_nomg(right);
2444 DIE(aTHX_ "Illegal division by zero");
2445 num = SvIV_nomg(left);
2447 /* avoid FPE_INTOVF on some platforms when num is IV_MIN */
2451 value = num / value;
2457 #if defined(__GLIBC__) && IVSIZE == 8 && !defined(PERL_DEBUG_READONLY_OPS)
2464 /* This is the vanilla old i_modulo. */
2466 tryAMAGICbin_MG(modulo_amg, AMGf_assign);
2470 DIE(aTHX_ "Illegal modulus zero");
2471 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2475 SETi( left % right );
2480 #if defined(__GLIBC__) && IVSIZE == 8 && !defined(PERL_DEBUG_READONLY_OPS)
2485 /* This is the i_modulo with the workaround for the _moddi3 bug
2486 * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
2487 * See below for pp_i_modulo. */
2489 tryAMAGICbin_MG(modulo_amg, AMGf_assign);
2493 DIE(aTHX_ "Illegal modulus zero");
2494 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2498 SETi( left % PERL_ABS(right) );
2505 dVAR; dSP; dATARGET;
2506 tryAMAGICbin_MG(modulo_amg, AMGf_assign);
2510 DIE(aTHX_ "Illegal modulus zero");
2511 /* The assumption is to use hereafter the old vanilla version... */
2513 PL_ppaddr[OP_I_MODULO] =
2515 /* .. but if we have glibc, we might have a buggy _moddi3
2516 * (at least glicb 2.2.5 is known to have this bug), in other
2517 * words our integer modulus with negative quad as the second
2518 * argument might be broken. Test for this and re-patch the
2519 * opcode dispatch table if that is the case, remembering to
2520 * also apply the workaround so that this first round works
2521 * right, too. See [perl #9402] for more information. */
2525 /* Cannot do this check with inlined IV constants since
2526 * that seems to work correctly even with the buggy glibc. */
2528 /* Yikes, we have the bug.
2529 * Patch in the workaround version. */
2531 PL_ppaddr[OP_I_MODULO] =
2532 &Perl_pp_i_modulo_1;
2533 /* Make certain we work right this time, too. */
2534 right = PERL_ABS(right);
2537 /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2541 SETi( left % right );
2550 tryAMAGICbin_MG(add_amg, AMGf_assign);
2552 dPOPTOPiirl_ul_nomg;
2553 SETi( left + right );
2561 tryAMAGICbin_MG(subtr_amg, AMGf_assign);
2563 dPOPTOPiirl_ul_nomg;
2564 SETi( left - right );
2572 tryAMAGICbin_MG(lt_amg, AMGf_set);
2575 SETs(boolSV(left < right));
2583 tryAMAGICbin_MG(gt_amg, AMGf_set);
2586 SETs(boolSV(left > right));
2594 tryAMAGICbin_MG(le_amg, AMGf_set);
2597 SETs(boolSV(left <= right));
2605 tryAMAGICbin_MG(ge_amg, AMGf_set);
2608 SETs(boolSV(left >= right));
2616 tryAMAGICbin_MG(eq_amg, AMGf_set);
2619 SETs(boolSV(left == right));
2627 tryAMAGICbin_MG(ne_amg, AMGf_set);
2630 SETs(boolSV(left != right));
2638 tryAMAGICbin_MG(ncmp_amg, 0);
2645 else if (left < right)
2657 tryAMAGICun_MG(neg_amg, 0);
2658 if (S_negate_string(aTHX)) return NORMAL;
2660 SV * const sv = TOPs;
2661 IV const i = SvIV_nomg(sv);
2667 /* High falutin' math. */
2672 tryAMAGICbin_MG(atan2_amg, 0);
2675 SETn(Perl_atan2(left, right));
2681 /* also used for: pp_cos() pp_exp() pp_log() pp_sqrt() */
2686 int amg_type = fallback_amg;
2687 const char *neg_report = NULL;
2688 const int op_type = PL_op->op_type;
2691 case OP_SIN: amg_type = sin_amg; break;
2692 case OP_COS: amg_type = cos_amg; break;
2693 case OP_EXP: amg_type = exp_amg; break;
2694 case OP_LOG: amg_type = log_amg; neg_report = "log"; break;
2695 case OP_SQRT: amg_type = sqrt_amg; neg_report = "sqrt"; break;
2698 assert(amg_type != fallback_amg);
2700 tryAMAGICun_MG(amg_type, 0);
2702 SV * const arg = POPs;
2703 const NV value = SvNV_nomg(arg);
2705 if (neg_report) { /* log or sqrt */
2707 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2708 ! Perl_isnan(value) &&
2710 (op_type == OP_LOG ? (value <= 0.0) : (value < 0.0))) {
2711 SET_NUMERIC_STANDARD();
2712 /* diag_listed_as: Can't take log of %g */
2713 DIE(aTHX_ "Can't take %s of %"NVgf, neg_report, value);
2718 case OP_SIN: result = Perl_sin(value); break;
2719 case OP_COS: result = Perl_cos(value); break;
2720 case OP_EXP: result = Perl_exp(value); break;
2721 case OP_LOG: result = Perl_log(value); break;
2722 case OP_SQRT: result = Perl_sqrt(value); break;
2729 /* Support Configure command-line overrides for rand() functions.
2730 After 5.005, perhaps we should replace this by Configure support
2731 for drand48(), random(), or rand(). For 5.005, though, maintain
2732 compatibility by calling rand() but allow the user to override it.
2733 See INSTALL for details. --Andy Dougherty 15 July 1998
2735 /* Now it's after 5.005, and Configure supports drand48() and random(),
2736 in addition to rand(). So the overrides should not be needed any more.
2737 --Jarkko Hietaniemi 27 September 1998
2742 if (!PL_srand_called) {
2743 (void)seedDrand01((Rand_seed_t)seed());
2744 PL_srand_called = TRUE;
2754 SV * const sv = POPs;
2760 /* 1 of 2 things can be carried through SvNV, SP or TARG, SP was carried */
2761 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2762 if (! Perl_isnan(value) && value == 0.0)
2772 sv_setnv_mg(TARG, value);
2783 if (MAXARG >= 1 && (TOPs || POPs)) {
2790 pv = SvPV(top, len);
2791 flags = grok_number(pv, len, &anum);
2793 if (!(flags & IS_NUMBER_IN_UV)) {
2794 Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
2795 "Integer overflow in srand");
2803 (void)seedDrand01((Rand_seed_t)anum);
2804 PL_srand_called = TRUE;
2808 /* Historically srand always returned true. We can avoid breaking
2810 sv_setpvs(TARG, "0 but true");
2819 tryAMAGICun_MG(int_amg, AMGf_numeric);
2821 SV * const sv = TOPs;
2822 const IV iv = SvIV_nomg(sv);
2823 /* XXX it's arguable that compiler casting to IV might be subtly
2824 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2825 else preferring IV has introduced a subtle behaviour change bug. OTOH
2826 relying on floating point to be accurate is a bug. */
2831 else if (SvIOK(sv)) {
2833 SETu(SvUV_nomg(sv));
2838 const NV value = SvNV_nomg(sv);
2839 if (SvNOK(sv) && UNLIKELY(Perl_isinfnan(SvNV(sv))))
2841 else if (value >= 0.0) {
2842 if (value < (NV)UV_MAX + 0.5) {
2845 SETn(Perl_floor(value));
2849 if (value > (NV)IV_MIN - 0.5) {
2852 SETn(Perl_ceil(value));
2863 tryAMAGICun_MG(abs_amg, AMGf_numeric);
2865 SV * const sv = TOPs;
2866 /* This will cache the NV value if string isn't actually integer */
2867 const IV iv = SvIV_nomg(sv);
2872 else if (SvIOK(sv)) {
2873 /* IVX is precise */
2875 SETu(SvUV_nomg(sv)); /* force it to be numeric only */
2883 /* 2s complement assumption. Also, not really needed as
2884 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
2890 const NV value = SvNV_nomg(sv);
2901 /* also used for: pp_hex() */
2907 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2911 SV* const sv = POPs;
2913 tmps = (SvPV_const(sv, len));
2915 /* If Unicode, try to downgrade
2916 * If not possible, croak. */
2917 SV* const tsv = sv_2mortal(newSVsv(sv));
2920 sv_utf8_downgrade(tsv, FALSE);
2921 tmps = SvPV_const(tsv, len);
2923 if (PL_op->op_type == OP_HEX)
2926 while (*tmps && len && isSPACE(*tmps))
2930 if (isALPHA_FOLD_EQ(*tmps, 'x')) {
2932 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2934 else if (isALPHA_FOLD_EQ(*tmps, 'b'))
2935 result_uv = grok_bin (tmps, &len, &flags, &result_nv);
2937 result_uv = grok_oct (tmps, &len, &flags, &result_nv);
2939 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
2953 SV * const sv = TOPs;
2955 U32 in_bytes = IN_BYTES;
2956 /* simplest case shortcut */
2957 /* turn off SVf_UTF8 in tmp flags if HINT_BYTES on*/
2958 U32 svflags = (SvFLAGS(sv) ^ (in_bytes << 26)) & (SVf_POK|SVs_GMG|SVf_UTF8);
2959 assert(HINT_BYTES == 0x00000008 && SVf_UTF8 == 0x20000000 && (SVf_UTF8 == HINT_BYTES << 26));
2962 if(LIKELY(svflags == SVf_POK))
2964 if(svflags & SVs_GMG)
2967 if (!IN_BYTES) /* reread to avoid using an C auto/register */
2968 sv_setiv(TARG, (IV)sv_len_utf8_nomg(sv));
2972 /* unrolled SvPV_nomg_const(sv,len) */
2977 (void)sv_2pv_flags(sv, &len, 0|SV_CONST_RETURN);
2979 sv_setiv(TARG, (IV)(len));
2982 if (!SvPADTMP(TARG)) {
2983 sv_setsv_nomg(TARG, &PL_sv_undef);
2984 } else { /* TARG is on stack at this point and is overwriten by SETs.
2985 This branch is the odd one out, so put TARG by default on
2986 stack earlier to let local SP go out of liveness sooner */
2993 return NORMAL; /* no putback, SP didn't move in this opcode */
2996 /* Returns false if substring is completely outside original string.
2997 No length is indicated by len_iv = 0 and len_is_uv = 0. len_is_uv must
2998 always be true for an explicit 0.
3001 Perl_translate_substr_offsets( STRLEN curlen, IV pos1_iv,
3002 bool pos1_is_uv, IV len_iv,
3003 bool len_is_uv, STRLEN *posp,
3009 PERL_ARGS_ASSERT_TRANSLATE_SUBSTR_OFFSETS;
3011 if (!pos1_is_uv && pos1_iv < 0 && curlen) {
3012 pos1_is_uv = curlen-1 > ~(UV)pos1_iv;
3015 if ((pos1_is_uv || pos1_iv > 0) && (UV)pos1_iv > curlen)
3018 if (len_iv || len_is_uv) {
3019 if (!len_is_uv && len_iv < 0) {
3020 pos2_iv = curlen + len_iv;
3022 pos2_is_uv = curlen-1 > ~(UV)len_iv;
3025 } else { /* len_iv >= 0 */
3026 if (!pos1_is_uv && pos1_iv < 0) {
3027 pos2_iv = pos1_iv + len_iv;
3028 pos2_is_uv = (UV)len_iv > (UV)IV_MAX;
3030 if ((UV)len_iv > curlen-(UV)pos1_iv)
3033 pos2_iv = pos1_iv+len_iv;
3043 if (!pos2_is_uv && pos2_iv < 0) {
3044 if (!pos1_is_uv && pos1_iv < 0)
3048 else if (!pos1_is_uv && pos1_iv < 0)
3051 if ((UV)pos2_iv < (UV)pos1_iv)
3053 if ((UV)pos2_iv > curlen)
3056 /* pos1_iv and pos2_iv both in 0..curlen, so the cast is safe */
3057 *posp = (STRLEN)( (UV)pos1_iv );
3058 *lenp = (STRLEN)( (UV)pos2_iv - (UV)pos1_iv );
3075 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3076 const bool rvalue = (GIMME_V != G_VOID);
3079 const char *repl = NULL;
3081 int num_args = PL_op->op_private & 7;
3082 bool repl_need_utf8_upgrade = FALSE;
3086 if(!(repl_sv = POPs)) num_args--;
3088 if ((len_sv = POPs)) {
3089 len_iv = SvIV(len_sv);
3090 len_is_uv = len_iv ? SvIOK_UV(len_sv) : 1;
3095 pos1_iv = SvIV(pos_sv);
3096 pos1_is_uv = SvIOK_UV(pos_sv);
3098 if (PL_op->op_private & OPpSUBSTR_REPL_FIRST) {
3103 if (lvalue && !repl_sv) {
3105 ret = sv_2mortal(newSV_type(SVt_PVLV)); /* Not TARG RT#67838 */
3106 sv_magic(ret, NULL, PERL_MAGIC_substr, NULL, 0);
3108 LvTARG(ret) = SvREFCNT_inc_simple(sv);
3110 pos1_is_uv || pos1_iv >= 0
3111 ? (STRLEN)(UV)pos1_iv
3112 : (LvFLAGS(ret) |= 1, (STRLEN)(UV)-pos1_iv);
3114 len_is_uv || len_iv > 0
3115 ? (STRLEN)(UV)len_iv
3116 : (LvFLAGS(ret) |= 2, (STRLEN)(UV)-len_iv);
3119 PUSHs(ret); /* avoid SvSETMAGIC here */
3123 repl = SvPV_const(repl_sv, repl_len);
3126 Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR),
3127 "Attempt to use reference as lvalue in substr"
3129 tmps = SvPV_force_nomg(sv, curlen);
3130 if (DO_UTF8(repl_sv) && repl_len) {
3132 sv_utf8_upgrade_nomg(sv);
3136 else if (DO_UTF8(sv))
3137 repl_need_utf8_upgrade = TRUE;
3139 else tmps = SvPV_const(sv, curlen);
3141 utf8_curlen = sv_or_pv_len_utf8(sv, tmps, curlen);
3142 if (utf8_curlen == curlen)
3145 curlen = utf8_curlen;
3151 STRLEN pos, len, byte_len, byte_pos;
3153 if (!translate_substr_offsets(
3154 curlen, pos1_iv, pos1_is_uv, len_iv, len_is_uv, &pos, &len
3158 byte_pos = utf8_curlen
3159 ? sv_or_pv_pos_u2b(sv, tmps, pos, &byte_len) : pos;
3164 SvTAINTED_off(TARG); /* decontaminate */
3165 SvUTF8_off(TARG); /* decontaminate */
3166 sv_setpvn(TARG, tmps, byte_len);
3167 #ifdef USE_LOCALE_COLLATE
3168 sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3175 SV* repl_sv_copy = NULL;
3177 if (repl_need_utf8_upgrade) {
3178 repl_sv_copy = newSVsv(repl_sv);
3179 sv_utf8_upgrade(repl_sv_copy);
3180 repl = SvPV_const(repl_sv_copy, repl_len);
3184 sv_insert_flags(sv, byte_pos, byte_len, repl, repl_len, 0);
3185 SvREFCNT_dec(repl_sv_copy);
3189 if (PL_op->op_private & OPpSUBSTR_REPL_FIRST)
3199 Perl_croak(aTHX_ "substr outside of string");
3200 Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3207 const IV size = POPi;
3208 const IV offset = POPi;
3209 SV * const src = POPs;
3210 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3213 if (lvalue) { /* it's an lvalue! */
3214 ret = sv_2mortal(newSV_type(SVt_PVLV)); /* Not TARG RT#67838 */
3215 sv_magic(ret, NULL, PERL_MAGIC_vec, NULL, 0);
3217 LvTARG(ret) = SvREFCNT_inc_simple(src);
3218 LvTARGOFF(ret) = offset;
3219 LvTARGLEN(ret) = size;
3223 SvTAINTED_off(TARG); /* decontaminate */
3227 sv_setuv(ret, do_vecget(src, offset, size));
3233 /* also used for: pp_rindex() */
3246 const char *little_p;
3249 const bool is_index = PL_op->op_type == OP_INDEX;
3250 const bool threeargs = MAXARG >= 3 && (TOPs || ((void)POPs,0));
3256 big_p = SvPV_const(big, biglen);
3257 little_p = SvPV_const(little, llen);
3259 big_utf8 = DO_UTF8(big);
3260 little_utf8 = DO_UTF8(little);
3261 if (big_utf8 ^ little_utf8) {
3262 /* One needs to be upgraded. */
3263 if (little_utf8 && !PL_encoding) {
3264 /* Well, maybe instead we might be able to downgrade the small
3266 char * const pv = (char*)bytes_from_utf8((U8 *)little_p, &llen,
3269 /* If the large string is ISO-8859-1, and it's not possible to
3270 convert the small string to ISO-8859-1, then there is no
3271 way that it could be found anywhere by index. */
3276 /* At this point, pv is a malloc()ed string. So donate it to temp
3277 to ensure it will get free()d */
3278 little = temp = newSV(0);
3279 sv_usepvn(temp, pv, llen);
3280 little_p = SvPVX(little);
3283 ? newSVpvn(big_p, biglen) : newSVpvn(little_p, llen);
3286 sv_recode_to_utf8(temp, PL_encoding);
3288 sv_utf8_upgrade(temp);
3293 big_p = SvPV_const(big, biglen);
3296 little_p = SvPV_const(little, llen);
3300 if (SvGAMAGIC(big)) {
3301 /* Life just becomes a lot easier if I use a temporary here.
3302 Otherwise I need to avoid calls to sv_pos_u2b(), which (dangerously)
3303 will trigger magic and overloading again, as will fbm_instr()
3305 big = newSVpvn_flags(big_p, biglen,
3306 SVs_TEMP | (big_utf8 ? SVf_UTF8 : 0));
3309 if (SvGAMAGIC(little) || (is_index && !SvOK(little))) {
3310 /* index && SvOK() is a hack. fbm_instr() calls SvPV_const, which will
3311 warn on undef, and we've already triggered a warning with the
3312 SvPV_const some lines above. We can't remove that, as we need to
3313 call some SvPV to trigger overloading early and find out if the
3315 This is all getting to messy. The API isn't quite clean enough,
3316 because data access has side effects.
3318 little = newSVpvn_flags(little_p, llen,
3319 SVs_TEMP | (little_utf8 ? SVf_UTF8 : 0));
3320 little_p = SvPVX(little);
3324 offset = is_index ? 0 : biglen;
3326 if (big_utf8 && offset > 0)
3327 offset = sv_pos_u2b_flags(big, offset, 0, SV_CONST_RETURN);
3333 else if (offset > (SSize_t)biglen)
3335 if (!(little_p = is_index
3336 ? fbm_instr((unsigned char*)big_p + offset,
3337 (unsigned char*)big_p + biglen, little, 0)
3338 : rninstr(big_p, big_p + offset,
3339 little_p, little_p + llen)))
3342 retval = little_p - big_p;
3343 if (retval > 0 && big_utf8)
3344 retval = sv_pos_b2u_flags(big, retval, SV_CONST_RETURN);
3354 dSP; dMARK; dORIGMARK; dTARGET;
3355 SvTAINTED_off(TARG);
3356 do_sprintf(TARG, SP-MARK, MARK+1);
3357 TAINT_IF(SvTAINTED(TARG));
3369 const U8 *s = (U8*)SvPV_const(argsv, len);
3371 if (PL_encoding && SvPOK(argsv) && !DO_UTF8(argsv)) {
3372 SV * const tmpsv = sv_2mortal(newSVsv(argsv));
3373 s = (U8*)sv_recode_to_utf8(tmpsv, PL_encoding);
3374 len = UTF8SKIP(s); /* Should be well-formed; so this is its length */
3378 XPUSHu(DO_UTF8(argsv)
3379 ? utf8n_to_uvchr(s, len, 0, UTF8_ALLOW_ANYUV)
3393 if (UNLIKELY(isinfnansv(top)))
3394 Perl_croak(aTHX_ "Cannot chr %"NVgf, SvNV(top));
3396 if (!IN_BYTES /* under bytes, chr(-1) eq chr(0xff), etc. */
3397 && ((SvIOKp(top) && !SvIsUV(top) && SvIV_nomg(top) < 0)
3399 ((SvNOKp(top) || (SvOK(top) && !SvIsUV(top)))
3400 && SvNV_nomg(top) < 0.0))) {
3401 if (ckWARN(WARN_UTF8)) {
3402 if (SvGMAGICAL(top)) {
3403 SV *top2 = sv_newmortal();
3404 sv_setsv_nomg(top2, top);
3407 Perl_warner(aTHX_ packWARN(WARN_UTF8),
3408 "Invalid negative number (%"SVf") in chr", SVfARG(top));
3410 value = UNICODE_REPLACEMENT;
3412 value = SvUV_nomg(top);
3416 SvUPGRADE(TARG,SVt_PV);
3418 if (value > 255 && !IN_BYTES) {
3419 SvGROW(TARG, (STRLEN)UNISKIP(value)+1);
3420 tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3421 SvCUR_set(TARG, tmps - SvPVX_const(TARG));
3423 (void)SvPOK_only(TARG);
3432 *tmps++ = (char)value;
3434 (void)SvPOK_only(TARG);
3436 if (PL_encoding && !IN_BYTES) {
3437 sv_recode_to_utf8(TARG, PL_encoding);
3439 if (SvCUR(TARG) == 0
3440 || ! is_utf8_string((U8*)tmps, SvCUR(TARG))
3441 || UTF8_IS_REPLACEMENT((U8*) tmps, (U8*) tmps + SvCUR(TARG)))
3446 *tmps++ = (char)value;
3462 const char *tmps = SvPV_const(left, len);
3464 if (DO_UTF8(left)) {
3465 /* If Unicode, try to downgrade.
3466 * If not possible, croak.
3467 * Yes, we made this up. */
3468 SV* const tsv = sv_2mortal(newSVsv(left));
3471 sv_utf8_downgrade(tsv, FALSE);
3472 tmps = SvPV_const(tsv, len);
3474 # ifdef USE_ITHREADS
3476 if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3477 /* This should be threadsafe because in ithreads there is only
3478 * one thread per interpreter. If this would not be true,
3479 * we would need a mutex to protect this malloc. */
3480 PL_reentrant_buffer->_crypt_struct_buffer =
3481 (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3482 #if defined(__GLIBC__) || defined(__EMX__)
3483 if (PL_reentrant_buffer->_crypt_struct_buffer) {
3484 PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3485 /* work around glibc-2.2.5 bug */
3486 PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3490 # endif /* HAS_CRYPT_R */
3491 # endif /* USE_ITHREADS */
3493 sv_setpv(TARG, fcrypt(tmps, SvPV_nolen_const(right)));
3495 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV_nolen_const(right)));
3501 "The crypt() function is unimplemented due to excessive paranoia.");
3505 /* Generally UTF-8 and UTF-EBCDIC are indistinguishable at this level. So
3506 * most comments below say UTF-8, when in fact they mean UTF-EBCDIC as well */
3509 /* also used for: pp_lcfirst() */
3513 /* Actually is both lcfirst() and ucfirst(). Only the first character
3514 * changes. This means that possibly we can change in-place, ie., just
3515 * take the source and change that one character and store it back, but not
3516 * if read-only etc, or if the length changes */
3520 STRLEN slen; /* slen is the byte length of the whole SV. */
3523 bool inplace; /* ? Convert first char only, in-place */
3524 bool doing_utf8 = FALSE; /* ? using utf8 */
3525 bool convert_source_to_utf8 = FALSE; /* ? need to convert */
3526 const int op_type = PL_op->op_type;
3529 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3530 STRLEN ulen; /* ulen is the byte length of the original Unicode character
3531 * stored as UTF-8 at s. */
3532 STRLEN tculen; /* tculen is the byte length of the freshly titlecased (or
3533 * lowercased) character stored in tmpbuf. May be either
3534 * UTF-8 or not, but in either case is the number of bytes */
3536 s = (const U8*)SvPV_const(source, slen);
3538 /* We may be able to get away with changing only the first character, in
3539 * place, but not if read-only, etc. Later we may discover more reasons to
3540 * not convert in-place. */
3541 inplace = !SvREADONLY(source)
3542 && ( SvPADTMP(source)
3543 || ( SvTEMP(source) && !SvSMAGICAL(source)
3544 && SvREFCNT(source) == 1));
3546 /* First calculate what the changed first character should be. This affects
3547 * whether we can just swap it out, leaving the rest of the string unchanged,
3548 * or even if have to convert the dest to UTF-8 when the source isn't */
3550 if (! slen) { /* If empty */
3551 need = 1; /* still need a trailing NUL */
3554 else if (DO_UTF8(source)) { /* Is the source utf8? */
3557 if (op_type == OP_UCFIRST) {
3558 #ifdef USE_LOCALE_CTYPE
3559 _to_utf8_title_flags(s, tmpbuf, &tculen, IN_LC_RUNTIME(LC_CTYPE));
3561 _to_utf8_title_flags(s, tmpbuf, &tculen, 0);
3565 #ifdef USE_LOCALE_CTYPE
3566 _to_utf8_lower_flags(s, tmpbuf, &tculen, IN_LC_RUNTIME(LC_CTYPE));
3568 _to_utf8_lower_flags(s, tmpbuf, &tculen, 0);
3572 /* we can't do in-place if the length changes. */
3573 if (ulen != tculen) inplace = FALSE;
3574 need = slen + 1 - ulen + tculen;
3576 else { /* Non-zero length, non-UTF-8, Need to consider locale and if
3577 * latin1 is treated as caseless. Note that a locale takes
3579 ulen = 1; /* Original character is 1 byte */
3580 tculen = 1; /* Most characters will require one byte, but this will
3581 * need to be overridden for the tricky ones */
3584 if (op_type == OP_LCFIRST) {
3586 /* lower case the first letter: no trickiness for any character */
3588 #ifdef USE_LOCALE_CTYPE
3589 (IN_LC_RUNTIME(LC_CTYPE))
3594 ? toLOWER_LATIN1(*s)
3598 #ifdef USE_LOCALE_CTYPE
3599 else if (IN_LC_RUNTIME(LC_CTYPE)) {
3600 if (IN_UTF8_CTYPE_LOCALE) {
3604 *tmpbuf = (U8) toUPPER_LC(*s); /* This would be a bug if any
3605 locales have upper and title case
3609 else if (! IN_UNI_8_BIT) {
3610 *tmpbuf = toUPPER(*s); /* Returns caseless for non-ascii, or
3611 * on EBCDIC machines whatever the
3612 * native function does */
3615 /* Here, is ucfirst non-UTF-8, not in locale (unless that locale is
3616 * UTF-8, which we treat as not in locale), and cased latin1 */
3618 #ifdef USE_LOCALE_CTYPE
3622 title_ord = _to_upper_title_latin1(*s, tmpbuf, &tculen, 's');
3624 assert(tculen == 2);
3626 /* If the result is an upper Latin1-range character, it can
3627 * still be represented in one byte, which is its ordinal */
3628 if (UTF8_IS_DOWNGRADEABLE_START(*tmpbuf)) {
3629 *tmpbuf = (U8) title_ord;
3633 /* Otherwise it became more than one ASCII character (in
3634 * the case of LATIN_SMALL_LETTER_SHARP_S) or changed to
3635 * beyond Latin1, so the number of bytes changed, so can't
3636 * replace just the first character in place. */
3639 /* If the result won't fit in a byte, the entire result
3640 * will have to be in UTF-8. Assume worst case sizing in
3641 * conversion. (all latin1 characters occupy at most two
3643 if (title_ord > 255) {
3645 convert_source_to_utf8 = TRUE;
3646 need = slen * 2 + 1;
3648 /* The (converted) UTF-8 and UTF-EBCDIC lengths of all
3649 * (both) characters whose title case is above 255 is
3653 else { /* LATIN_SMALL_LETTER_SHARP_S expands by 1 byte */
3654 need = slen + 1 + 1;
3658 } /* End of use Unicode (Latin1) semantics */
3659 } /* End of changing the case of the first character */
3661 /* Here, have the first character's changed case stored in tmpbuf. Ready to
3662 * generate the result */
3665 /* We can convert in place. This means we change just the first
3666 * character without disturbing the rest; no need to grow */
3668 s = d = (U8*)SvPV_force_nomg(source, slen);
3674 /* Here, we can't convert in place; we earlier calculated how much
3675 * space we will need, so grow to accommodate that */
3676 SvUPGRADE(dest, SVt_PV);
3677 d = (U8*)SvGROW(dest, need);
3678 (void)SvPOK_only(dest);
3685 if (! convert_source_to_utf8) {
3687 /* Here both source and dest are in UTF-8, but have to create
3688 * the entire output. We initialize the result to be the
3689 * title/lower cased first character, and then append the rest
3691 sv_setpvn(dest, (char*)tmpbuf, tculen);
3693 sv_catpvn(dest, (char*)(s + ulen), slen - ulen);
3697 const U8 *const send = s + slen;
3699 /* Here the dest needs to be in UTF-8, but the source isn't,
3700 * except we earlier UTF-8'd the first character of the source
3701 * into tmpbuf. First put that into dest, and then append the
3702 * rest of the source, converting it to UTF-8 as we go. */
3704 /* Assert tculen is 2 here because the only two characters that
3705 * get to this part of the code have 2-byte UTF-8 equivalents */
3707 *d++ = *(tmpbuf + 1);
3708 s++; /* We have just processed the 1st char */
3710 for (; s < send; s++) {
3711 d = uvchr_to_utf8(d, *s);
3714 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3718 else { /* in-place UTF-8. Just overwrite the first character */
3719 Copy(tmpbuf, d, tculen, U8);
3720 SvCUR_set(dest, need - 1);
3724 else { /* Neither source nor dest are in or need to be UTF-8 */
3726 if (inplace) { /* in-place, only need to change the 1st char */
3729 else { /* Not in-place */
3731 /* Copy the case-changed character(s) from tmpbuf */
3732 Copy(tmpbuf, d, tculen, U8);
3733 d += tculen - 1; /* Code below expects d to point to final
3734 * character stored */
3737 else { /* empty source */
3738 /* See bug #39028: Don't taint if empty */
3742 /* In a "use bytes" we don't treat the source as UTF-8, but, still want
3743 * the destination to retain that flag */
3744 if (SvUTF8(source) && ! IN_BYTES)
3747 if (!inplace) { /* Finish the rest of the string, unchanged */
3748 /* This will copy the trailing NUL */
3749 Copy(s + 1, d + 1, slen, U8);
3750 SvCUR_set(dest, need - 1);
3753 #ifdef USE_LOCALE_CTYPE
3754 if (IN_LC_RUNTIME(LC_CTYPE)) {
3759 if (dest != source && SvTAINTED(source))
3765 /* There's so much setup/teardown code common between uc and lc, I wonder if
3766 it would be worth merging the two, and just having a switch outside each
3767 of the three tight loops. There is less and less commonality though */
3780 if ((SvPADTMP(source)
3782 (SvTEMP(source) && !SvSMAGICAL(source) && SvREFCNT(source) == 1))
3783 && !SvREADONLY(source) && SvPOK(source)
3786 #ifdef USE_LOCALE_CTYPE
3787 (IN_LC_RUNTIME(LC_CTYPE))
3788 ? ! IN_UTF8_CTYPE_LOCALE
3794 /* We can convert in place. The reason we can't if in UNI_8_BIT is to
3795 * make the loop tight, so we overwrite the source with the dest before
3796 * looking at it, and we need to look at the original source
3797 * afterwards. There would also need to be code added to handle
3798 * switching to not in-place in midstream if we run into characters
3799 * that change the length. Since being in locale overrides UNI_8_BIT,
3800 * that latter becomes irrelevant in the above test; instead for
3801 * locale, the size can't normally change, except if the locale is a
3804 s = d = (U8*)SvPV_force_nomg(source, len);
3811 s = (const U8*)SvPV_nomg_const(source, len);
3814 SvUPGRADE(dest, SVt_PV);
3815 d = (U8*)SvGROW(dest, min);
3816 (void)SvPOK_only(dest);
3821 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
3822 to check DO_UTF8 again here. */
3824 if (DO_UTF8(source)) {
3825 const U8 *const send = s + len;
3826 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3828 /* All occurrences of these are to be moved to follow any other marks.
3829 * This is context-dependent. We may not be passed enough context to
3830 * move the iota subscript beyond all of them, but we do the best we can
3831 * with what we're given. The result is always better than if we
3832 * hadn't done this. And, the problem would only arise if we are
3833 * passed a character without all its combining marks, which would be
3834 * the caller's mistake. The information this is based on comes from a
3835 * comment in Unicode SpecialCasing.txt, (and the Standard's text
3836 * itself) and so can't be checked properly to see if it ever gets
3837 * revised. But the likelihood of it changing is remote */
3838 bool in_iota_subscript = FALSE;
3844 if (in_iota_subscript && ! _is_utf8_mark(s)) {
3846 /* A non-mark. Time to output the iota subscript */
3847 Copy(GREEK_CAPITAL_LETTER_IOTA_UTF8, d, capital_iota_len, U8);
3848 d += capital_iota_len;
3849 in_iota_subscript = FALSE;
3852 /* Then handle the current character. Get the changed case value
3853 * and copy it to the output buffer */
3856 #ifdef USE_LOCALE_CTYPE
3857 uv = _to_utf8_upper_flags(s, tmpbuf, &ulen, IN_LC_RUNTIME(LC_CTYPE));
3859 uv = _to_utf8_upper_flags(s, tmpbuf, &ulen, 0);
3861 #define GREEK_CAPITAL_LETTER_IOTA 0x0399
3862 #define COMBINING_GREEK_YPOGEGRAMMENI 0x0345
3863 if (uv == GREEK_CAPITAL_LETTER_IOTA
3864 && utf8_to_uvchr_buf(s, send, 0) == COMBINING_GREEK_YPOGEGRAMMENI)
3866 in_iota_subscript = TRUE;
3869 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
3870 /* If the eventually required minimum size outgrows the
3871 * available space, we need to grow. */
3872 const UV o = d - (U8*)SvPVX_const(dest);
3874 /* If someone uppercases one million U+03B0s we SvGROW()
3875 * one million times. Or we could try guessing how much to
3876 * allocate without allocating too much. Such is life.
3877 * See corresponding comment in lc code for another option
3880 d = (U8*)SvPVX(dest) + o;
3882 Copy(tmpbuf, d, ulen, U8);
3887 if (in_iota_subscript) {
3888 Copy(GREEK_CAPITAL_LETTER_IOTA_UTF8, d, capital_iota_len, U8);
3889 d += capital_iota_len;
3894 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3896 else { /* Not UTF-8 */
3898 const U8 *const send = s + len;
3900 /* Use locale casing if in locale; regular style if not treating
3901 * latin1 as having case; otherwise the latin1 casing. Do the
3902 * whole thing in a tight loop, for speed, */
3903 #ifdef USE_LOCALE_CTYPE
3904 if (IN_LC_RUNTIME(LC_CTYPE)) {
3905 if (IN_UTF8_CTYPE_LOCALE) {
3908 for (; s < send; d++, s++)
3909 *d = (U8) toUPPER_LC(*s);
3913 if (! IN_UNI_8_BIT) {
3914 for (; s < send; d++, s++) {
3919 #ifdef USE_LOCALE_CTYPE
3922 for (; s < send; d++, s++) {
3923 *d = toUPPER_LATIN1_MOD(*s);
3924 if (LIKELY(*d != LATIN_SMALL_LETTER_Y_WITH_DIAERESIS)) {
3928 /* The mainstream case is the tight loop above. To avoid
3929 * extra tests in that, all three characters that require
3930 * special handling are mapped by the MOD to the one tested
3932 * Use the source to distinguish between the three cases */
3934 if (*s == LATIN_SMALL_LETTER_SHARP_S) {
3936 /* uc() of this requires 2 characters, but they are
3937 * ASCII. If not enough room, grow the string */
3938 if (SvLEN(dest) < ++min) {
3939 const UV o = d - (U8*)SvPVX_const(dest);
3941 d = (U8*)SvPVX(dest) + o;
3943 *d++ = 'S'; *d = 'S'; /* upper case is 'SS' */
3944 continue; /* Back to the tight loop; still in ASCII */
3947 /* The other two special handling characters have their
3948 * upper cases outside the latin1 range, hence need to be
3949 * in UTF-8, so the whole result needs to be in UTF-8. So,
3950 * here we are somewhere in the middle of processing a
3951 * non-UTF-8 string, and realize that we will have to convert
3952 * the whole thing to UTF-8. What to do? There are
3953 * several possibilities. The simplest to code is to
3954 * convert what we have so far, set a flag, and continue on
3955 * in the loop. The flag would be tested each time through
3956 * the loop, and if set, the next character would be
3957 * converted to UTF-8 and stored. But, I (khw) didn't want
3958 * to slow down the mainstream case at all for this fairly
3959 * rare case, so I didn't want to add a test that didn't
3960 * absolutely have to be there in the loop, besides the
3961 * possibility that it would get too complicated for
3962 * optimizers to deal with. Another possibility is to just
3963 * give up, convert the source to UTF-8, and restart the
3964 * function that way. Another possibility is to convert
3965 * both what has already been processed and what is yet to
3966 * come separately to UTF-8, then jump into the loop that
3967 * handles UTF-8. But the most efficient time-wise of the
3968 * ones I could think of is what follows, and turned out to
3969 * not require much extra code. */
3971 /* Convert what we have so far into UTF-8, telling the
3972 * function that we know it should be converted, and to
3973 * allow extra space for what we haven't processed yet.
3974 * Assume the worst case space requirements for converting
3975 * what we haven't processed so far: that it will require
3976 * two bytes for each remaining source character, plus the
3977 * NUL at the end. This may cause the string pointer to
3978 * move, so re-find it. */
3980 len = d - (U8*)SvPVX_const(dest);
3981 SvCUR_set(dest, len);
3982 len = sv_utf8_upgrade_flags_grow(dest,
3983 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
3985 d = (U8*)SvPVX(dest) + len;
3987 /* Now process the remainder of the source, converting to
3988 * upper and UTF-8. If a resulting byte is invariant in
3989 * UTF-8, output it as-is, otherwise convert to UTF-8 and
3990 * append it to the output. */
3991 for (; s < send; s++) {
3992 (void) _to_upper_title_latin1(*s, d, &len, 'S');
3996 /* Here have processed the whole source; no need to continue
3997 * with the outer loop. Each character has been converted
3998 * to upper case and converted to UTF-8 */
4001 } /* End of processing all latin1-style chars */
4002 } /* End of processing all chars */
4003 } /* End of source is not empty */
4005 if (source != dest) {
4006 *d = '\0'; /* Here d points to 1 after last char, add NUL */
4007 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4009 } /* End of isn't utf8 */
4010 #ifdef USE_LOCALE_CTYPE
4011 if (IN_LC_RUNTIME(LC_CTYPE)) {
4016 if (dest != source && SvTAINTED(source))
4034 if ( ( SvPADTMP(source)
4035 || ( SvTEMP(source) && !SvSMAGICAL(source)
4036 && SvREFCNT(source) == 1 )
4038 && !SvREADONLY(source) && SvPOK(source)
4039 && !DO_UTF8(source)) {
4041 /* We can convert in place, as lowercasing anything in the latin1 range
4042 * (or else DO_UTF8 would have been on) doesn't lengthen it */
4044 s = d = (U8*)SvPV_force_nomg(source, len);
4051 s = (const U8*)SvPV_nomg_const(source, len);
4054 SvUPGRADE(dest, SVt_PV);
4055 d = (U8*)SvGROW(dest, min);
4056 (void)SvPOK_only(dest);
4061 /* Overloaded values may have toggled the UTF-8 flag on source, so we need
4062 to check DO_UTF8 again here. */
4064 if (DO_UTF8(source)) {
4065 const U8 *const send = s + len;
4066 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
4069 const STRLEN u = UTF8SKIP(s);
4072 #ifdef USE_LOCALE_CTYPE
4073 _to_utf8_lower_flags(s, tmpbuf, &ulen, IN_LC_RUNTIME(LC_CTYPE));
4075 _to_utf8_lower_flags(s, tmpbuf, &ulen, 0);
4078 /* Here is where we would do context-sensitive actions. See the
4079 * commit message for 86510fb15 for why there isn't any */
4081 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4083 /* If the eventually required minimum size outgrows the
4084 * available space, we need to grow. */
4085 const UV o = d - (U8*)SvPVX_const(dest);
4087 /* If someone lowercases one million U+0130s we SvGROW() one
4088 * million times. Or we could try guessing how much to
4089 * allocate without allocating too much. Such is life.
4090 * Another option would be to grow an extra byte or two more
4091 * each time we need to grow, which would cut down the million
4092 * to 500K, with little waste */
4094 d = (U8*)SvPVX(dest) + o;
4097 /* Copy the newly lowercased letter to the output buffer we're
4099 Copy(tmpbuf, d, ulen, U8);
4102 } /* End of looping through the source string */
4105 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4106 } else { /* Not utf8 */
4108 const U8 *const send = s + len;
4110 /* Use locale casing if in locale; regular style if not treating
4111 * latin1 as having case; otherwise the latin1 casing. Do the
4112 * whole thing in a tight loop, for speed, */
4113 #ifdef USE_LOCALE_CTYPE
4114 if (IN_LC_RUNTIME(LC_CTYPE)) {
4115 for (; s < send; d++, s++)
4116 *d = toLOWER_LC(*s);
4120 if (! IN_UNI_8_BIT) {
4121 for (; s < send; d++, s++) {
4126 for (; s < send; d++, s++) {
4127 *d = toLOWER_LATIN1(*s);
4131 if (source != dest) {
4133 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4136 #ifdef USE_LOCALE_CTYPE
4137 if (IN_LC_RUNTIME(LC_CTYPE)) {
4142 if (dest != source && SvTAINTED(source))
4151 SV * const sv = TOPs;
4153 const char *s = SvPV_const(sv,len);
4155 SvUTF8_off(TARG); /* decontaminate */
4158 SvUPGRADE(TARG, SVt_PV);
4159 SvGROW(TARG, (len * 2) + 1);
4163 STRLEN ulen = UTF8SKIP(s);
4164 bool to_quote = FALSE;
4166 if (UTF8_IS_INVARIANT(*s)) {
4167 if (_isQUOTEMETA(*s)) {
4171 else if (UTF8_IS_DOWNGRADEABLE_START(*s)) {
4173 #ifdef USE_LOCALE_CTYPE
4174 /* In locale, we quote all non-ASCII Latin1 chars.
4175 * Otherwise use the quoting rules */
4177 IN_LC_RUNTIME(LC_CTYPE)
4180 _isQUOTEMETA(TWO_BYTE_UTF8_TO_NATIVE(*s, *(s + 1))))
4185 else if (is_QUOTEMETA_high(s)) {
4200 else if (IN_UNI_8_BIT) {
4202 if (_isQUOTEMETA(*s))
4208 /* For non UNI_8_BIT (and hence in locale) just quote all \W
4209 * including everything above ASCII */
4211 if (!isWORDCHAR_A(*s))
4217 SvCUR_set(TARG, d - SvPVX_const(TARG));
4218 (void)SvPOK_only_UTF8(TARG);
4221 sv_setpvn(TARG, s, len);
4237 U8 tmpbuf[UTF8_MAXBYTES_CASE + 1];
4238 const bool full_folding = TRUE; /* This variable is here so we can easily
4239 move to more generality later */
4240 const U8 flags = ( full_folding ? FOLD_FLAGS_FULL : 0 )
4241 #ifdef USE_LOCALE_CTYPE
4242 | ( IN_LC_RUNTIME(LC_CTYPE) ? FOLD_FLAGS_LOCALE : 0 )
4246 /* This is a facsimile of pp_lc, but with a thousand bugs thanks to me.
4247 * You are welcome(?) -Hugmeir
4255 s = (const U8*)SvPV_nomg_const(source, len);
4257 if (ckWARN(WARN_UNINITIALIZED))
4258 report_uninit(source);
4265 SvUPGRADE(dest, SVt_PV);
4266 d = (U8*)SvGROW(dest, min);
4267 (void)SvPOK_only(dest);
4272 if (DO_UTF8(source)) { /* UTF-8 flagged string. */
4274 const STRLEN u = UTF8SKIP(s);
4277 _to_utf8_fold_flags(s, tmpbuf, &ulen, flags);
4279 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4280 const UV o = d - (U8*)SvPVX_const(dest);
4282 d = (U8*)SvPVX(dest) + o;
4285 Copy(tmpbuf, d, ulen, U8);
4290 } /* Unflagged string */
4292 #ifdef USE_LOCALE_CTYPE
4293 if ( IN_LC_RUNTIME(LC_CTYPE) ) { /* Under locale */
4294 if (IN_UTF8_CTYPE_LOCALE) {
4295 goto do_uni_folding;
4297 for (; s < send; d++, s++)
4298 *d = (U8) toFOLD_LC(*s);
4302 if ( !IN_UNI_8_BIT ) { /* Under nothing, or bytes */
4303 for (; s < send; d++, s++)
4307 #ifdef USE_LOCALE_CTYPE
4310 /* For ASCII and the Latin-1 range, there's only two troublesome
4311 * folds, \x{DF} (\N{LATIN SMALL LETTER SHARP S}), which under full
4312 * casefolding becomes 'ss'; and \x{B5} (\N{MICRO SIGN}), which
4313 * under any fold becomes \x{3BC} (\N{GREEK SMALL LETTER MU}) --
4314 * For the rest, the casefold is their lowercase. */
4315 for (; s < send; d++, s++) {
4316 if (*s == MICRO_SIGN) {
4317 /* \N{MICRO SIGN}'s casefold is \N{GREEK SMALL LETTER MU},
4318 * which is outside of the latin-1 range. There's a couple
4319 * of ways to deal with this -- khw discusses them in
4320 * pp_lc/uc, so go there :) What we do here is upgrade what
4321 * we had already casefolded, then enter an inner loop that
4322 * appends the rest of the characters as UTF-8. */
4323 len = d - (U8*)SvPVX_const(dest);
4324 SvCUR_set(dest, len);
4325 len = sv_utf8_upgrade_flags_grow(dest,
4326 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
4327 /* The max expansion for latin1
4328 * chars is 1 byte becomes 2 */
4330 d = (U8*)SvPVX(dest) + len;
4332 Copy(GREEK_SMALL_LETTER_MU_UTF8, d, small_mu_len, U8);
4335 for (; s < send; s++) {
4337 UV fc = _to_uni_fold_flags(*s, tmpbuf, &ulen, flags);
4338 if UVCHR_IS_INVARIANT(fc) {
4340 && *s == LATIN_SMALL_LETTER_SHARP_S)
4349 Copy(tmpbuf, d, ulen, U8);
4355 else if (full_folding && *s == LATIN_SMALL_LETTER_SHARP_S) {
4356 /* Under full casefolding, LATIN SMALL LETTER SHARP S
4357 * becomes "ss", which may require growing the SV. */
4358 if (SvLEN(dest) < ++min) {
4359 const UV o = d - (U8*)SvPVX_const(dest);
4361 d = (U8*)SvPVX(dest) + o;
4366 else { /* If it's not one of those two, the fold is their lower
4368 *d = toLOWER_LATIN1(*s);
4374 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4376 #ifdef USE_LOCALE_CTYPE
4377 if (IN_LC_RUNTIME(LC_CTYPE)) {
4382 if (SvTAINTED(source))
4392 dSP; dMARK; dORIGMARK;
4393 AV *const av = MUTABLE_AV(POPs);
4394 const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
4396 if (SvTYPE(av) == SVt_PVAV) {
4397 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
4398 bool can_preserve = FALSE;
4404 can_preserve = SvCANEXISTDELETE(av);
4407 if (lval && localizing) {
4410 for (svp = MARK + 1; svp <= SP; svp++) {
4411 const SSize_t elem = SvIV(*svp);
4415 if (max > AvMAX(av))
4419 while (++MARK <= SP) {
4421 SSize_t elem = SvIV(*MARK);
4422 bool preeminent = TRUE;
4424 if (localizing && can_preserve) {
4425 /* If we can determine whether the element exist,
4426 * Try to preserve the existenceness of a tied array
4427 * element by using EXISTS and DELETE if possible.
4428 * Fallback to FETCH and STORE otherwise. */
4429 preeminent = av_exists(av, elem);
4432 svp = av_fetch(av, elem, lval);
4435 DIE(aTHX_ PL_no_aelem, elem);
4438 save_aelem(av, elem, svp);
4440 SAVEADELETE(av, elem);
4443 *MARK = svp ? *svp : &PL_sv_undef;
4446 if (GIMME != G_ARRAY) {
4448 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
4457 AV *const av = MUTABLE_AV(POPs);
4458 I32 lval = (PL_op->op_flags & OPf_MOD);
4459 SSize_t items = SP - MARK;
4461 if (PL_op->op_private & OPpMAYBE_LVSUB) {
4462 const I32 flags = is_lvalue_sub();
4464 if (!(flags & OPpENTERSUB_INARGS))
4465 /* diag_listed_as: Can't modify %s in %s */
4466 Perl_croak(aTHX_ "Can't modify index/value array slice in list assignment");
4473 *(MARK+items*2-1) = *(MARK+items);
4479 while (++MARK <= SP) {
4482 svp = av_fetch(av, SvIV(*MARK), lval);
4484 if (!svp || !*svp || *svp == &PL_sv_undef) {
4485 DIE(aTHX_ PL_no_aelem, SvIV(*MARK));
4487 *MARK = sv_mortalcopy(*MARK);
4489 *++MARK = svp ? *svp : &PL_sv_undef;
4491 if (GIMME != G_ARRAY) {
4492 MARK = SP - items*2;
4493 *++MARK = items > 0 ? *SP : &PL_sv_undef;
4500 /* Smart dereferencing for keys, values and each */
4502 /* also used for: pp_reach() pp_rvalues() */
4514 (SvTYPE(sv) != SVt_PVHV && SvTYPE(sv) != SVt_PVAV)
4519 "Type of argument to %s must be unblessed hashref or arrayref",
4520 PL_op_desc[PL_op->op_type] );
4523 if (PL_op->op_flags & OPf_SPECIAL && SvTYPE(sv) == SVt_PVAV)
4525 "Can't modify %s in %s",
4526 PL_op_desc[PL_op->op_type], PL_op_desc[PL_op->op_next->op_type]
4529 /* Delegate to correct function for op type */
4531 if (PL_op->op_type == OP_RKEYS || PL_op->op_type == OP_RVALUES) {
4532 return (SvTYPE(sv) == SVt_PVHV) ? Perl_do_kv(aTHX) : Perl_pp_akeys(aTHX);
4535 return (SvTYPE(sv) == SVt_PVHV)
4536 ? Perl_pp_each(aTHX)
4537 : Perl_pp_aeach(aTHX);
4544 AV *array = MUTABLE_AV(POPs);
4545 const I32 gimme = GIMME_V;
4546 IV *iterp = Perl_av_iter_p(aTHX_ array);
4547 const IV current = (*iterp)++;
4549 if (current > av_tindex(array)) {
4551 if (gimme == G_SCALAR)
4559 if (gimme == G_ARRAY) {
4560 SV **const element = av_fetch(array, current, 0);
4561 PUSHs(element ? *element : &PL_sv_undef);
4566 /* also used for: pp_avalues()*/
4570 AV *array = MUTABLE_AV(POPs);
4571 const I32 gimme = GIMME_V;
4573 *Perl_av_iter_p(aTHX_ array) = 0;
4575 if (gimme == G_SCALAR) {
4577 PUSHi(av_tindex(array) + 1);
4579 else if (gimme == G_ARRAY) {
4580 IV n = Perl_av_len(aTHX_ array);
4585 if (PL_op->op_type == OP_AKEYS || PL_op->op_type == OP_RKEYS) {
4586 for (i = 0; i <= n; i++) {
4591 for (i = 0; i <= n; i++) {
4592 SV *const *const elem = Perl_av_fetch(aTHX_ array, i, 0);
4593 PUSHs(elem ? *elem : &PL_sv_undef);
4600 /* Associative arrays. */
4605 HV * hash = MUTABLE_HV(POPs);
4607 const I32 gimme = GIMME_V;
4610 /* might clobber stack_sp */
4611 entry = hv_iternext(hash);
4616 SV* const sv = hv_iterkeysv(entry);
4617 PUSHs(sv); /* won't clobber stack_sp */
4618 if (gimme == G_ARRAY) {
4621 /* might clobber stack_sp */
4622 val = hv_iterval(hash, entry);
4627 else if (gimme == G_SCALAR)
4634 S_do_delete_local(pTHX)
4637 const I32 gimme = GIMME_V;
4640 const bool sliced = !!(PL_op->op_private & OPpSLICE);
4641 SV **unsliced_keysv = sliced ? NULL : sp--;
4642 SV * const osv = POPs;
4643 SV **mark = sliced ? PL_stack_base + POPMARK : unsliced_keysv-1;
4645 const bool tied = SvRMAGICAL(osv)
4646 && mg_find((const SV *)osv, PERL_MAGIC_tied);
4647 const bool can_preserve = SvCANEXISTDELETE(osv);
4648 const U32 type = SvTYPE(osv);
4649 SV ** const end = sliced ? SP : unsliced_keysv;
4651 if (type == SVt_PVHV) { /* hash element */
4652 HV * const hv = MUTABLE_HV(osv);
4653 while (++MARK <= end) {
4654 SV * const keysv = *MARK;
4656 bool preeminent = TRUE;
4658 preeminent = hv_exists_ent(hv, keysv, 0);
4660 HE *he = hv_fetch_ent(hv, keysv, 1, 0);
4667 sv = hv_delete_ent(hv, keysv, 0, 0);
4669 SvREFCNT_inc_simple_void(sv); /* De-mortalize */
4672 if (!sv) DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
4673 save_helem_flags(hv, keysv, &sv, SAVEf_KEEPOLDELEM);
4675 *MARK = sv_mortalcopy(sv);
4681 SAVEHDELETE(hv, keysv);
4682 *MARK = &PL_sv_undef;
4686 else if (type == SVt_PVAV) { /* array element */
4687 if (PL_op->op_flags & OPf_SPECIAL) {
4688 AV * const av = MUTABLE_AV(osv);
4689 while (++MARK <= end) {
4690 SSize_t idx = SvIV(*MARK);
4692 bool preeminent = TRUE;
4694 preeminent = av_exists(av, idx);
4696 SV **svp = av_fetch(av, idx, 1);
4703 sv = av_delete(av, idx, 0);
4705 SvREFCNT_inc_simple_void(sv); /* De-mortalize */
4708 save_aelem_flags(av, idx, &sv, SAVEf_KEEPOLDELEM);
4710 *MARK = sv_mortalcopy(sv);
4716 SAVEADELETE(av, idx);
4717 *MARK = &PL_sv_undef;
4722 DIE(aTHX_ "panic: avhv_delete no longer supported");
4725 DIE(aTHX_ "Not a HASH reference");
4727 if (gimme == G_VOID)
4729 else if (gimme == G_SCALAR) {
4734 *++MARK = &PL_sv_undef;
4738 else if (gimme != G_VOID)
4739 PUSHs(*unsliced_keysv);
4750 if (PL_op->op_private & OPpLVAL_INTRO)
4751 return do_delete_local();
4754 discard = (gimme == G_VOID) ? G_DISCARD : 0;
4756 if (PL_op->op_private & OPpSLICE) {
4758 HV * const hv = MUTABLE_HV(POPs);
4759 const U32 hvtype = SvTYPE(hv);
4760 if (hvtype == SVt_PVHV) { /* hash element */
4761 while (++MARK <= SP) {
4762 SV * const sv = hv_delete_ent(hv, *MARK, discard, 0);
4763 *MARK = sv ? sv : &PL_sv_undef;
4766 else if (hvtype == SVt_PVAV) { /* array element */
4767 if (PL_op->op_flags & OPf_SPECIAL) {
4768 while (++MARK <= SP) {
4769 SV * const sv = av_delete(MUTABLE_AV(hv), SvIV(*MARK), discard);
4770 *MARK = sv ? sv : &PL_sv_undef;
4775 DIE(aTHX_ "Not a HASH reference");
4778 else if (gimme == G_SCALAR) {
4783 *++MARK = &PL_sv_undef;
4789 HV * const hv = MUTABLE_HV(POPs);
4791 if (SvTYPE(hv) == SVt_PVHV)
4792 sv = hv_delete_ent(hv, keysv, discard, 0);
4793 else if (SvTYPE(hv) == SVt_PVAV) {
4794 if (PL_op->op_flags & OPf_SPECIAL)
4795 sv = av_delete(MUTABLE_AV(hv), SvIV(keysv), discard);
4797 DIE(aTHX_ "panic: avhv_delete no longer supported");
4800 DIE(aTHX_ "Not a HASH reference");
4815 if (UNLIKELY( PL_op->op_private & OPpEXISTS_SUB )) {
4817 SV * const sv = POPs;
4818 CV * const cv = sv_2cv(sv, &hv, &gv, 0);
4821 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
4826 hv = MUTABLE_HV(POPs);
4827 if (LIKELY( SvTYPE(hv) == SVt_PVHV )) {
4828 if (hv_exists_ent(hv, tmpsv, 0))
4831 else if (SvTYPE(hv) == SVt_PVAV) {
4832 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
4833 if (av_exists(MUTABLE_AV(hv), SvIV(tmpsv)))
4838 DIE(aTHX_ "Not a HASH reference");
4845 dSP; dMARK; dORIGMARK;
4846 HV * const hv = MUTABLE_HV(POPs);
4847 const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
4848 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
4849 bool can_preserve = FALSE;
4855 if (SvCANEXISTDELETE(hv))
4856 can_preserve = TRUE;
4859 while (++MARK <= SP) {
4860 SV * const keysv = *MARK;
4863 bool preeminent = TRUE;
4865 if (localizing && can_preserve) {
4866 /* If we can determine whether the element exist,
4867 * try to preserve the existenceness of a tied hash
4868 * element by using EXISTS and DELETE if possible.
4869 * Fallback to FETCH and STORE otherwise. */
4870 preeminent = hv_exists_ent(hv, keysv, 0);
4873 he = hv_fetch_ent(hv, keysv, lval, 0);
4874 svp = he ? &HeVAL(he) : NULL;
4877 if (!svp || !*svp || *svp == &PL_sv_undef) {
4878 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
4881 if (HvNAME_get(hv) && isGV(*svp))
4882 save_gp(MUTABLE_GV(*svp), !(PL_op->op_flags & OPf_SPECIAL));
4883 else if (preeminent)
4884 save_helem_flags(hv, keysv, svp,
4885 (PL_op->op_flags & OPf_SPECIAL) ? 0 : SAVEf_SETMAGIC);
4887 SAVEHDELETE(hv, keysv);
4890 *MARK = svp && *svp ? *svp : &PL_sv_undef;
4892 if (GIMME != G_ARRAY) {
4894 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
4903 HV * const hv = MUTABLE_HV(POPs);
4904 I32 lval = (PL_op->op_flags & OPf_MOD);
4905 SSize_t items = SP - MARK;
4907 if (PL_op->op_private & OPpMAYBE_LVSUB) {
4908 const I32 flags = is_lvalue_sub();
4910 if (!(flags & OPpENTERSUB_INARGS))
4911 /* diag_listed_as: Can't modify %s in %s */
4912 Perl_croak(aTHX_ "Can't modify key/value hash slice in list assignment");
4919 *(MARK+items*2-1) = *(MARK+items);
4925 while (++MARK <= SP) {
4926 SV * const keysv = *MARK;
4930 he = hv_fetch_ent(hv, keysv, lval, 0);
4931 svp = he ? &HeVAL(he) : NULL;
4934 if (!svp || !*svp || *svp == &PL_sv_undef) {
4935 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
4937 *MARK = sv_mortalcopy(*MARK);
4939 *++MARK = svp && *svp ? *svp : &PL_sv_undef;
4941 if (GIMME != G_ARRAY) {
4942 MARK = SP - items*2;
4943 *++MARK = items > 0 ? *SP : &PL_sv_undef;
4949 /* List operators. */
4953 I32 markidx = POPMARK;
4954 if (GIMME != G_ARRAY) {
4955 SV **mark = PL_stack_base + markidx;
4958 *MARK = *SP; /* unwanted list, return last item */
4960 *MARK = &PL_sv_undef;
4970 SV ** const lastrelem = PL_stack_sp;
4971 SV ** const lastlelem = PL_stack_base + POPMARK;
4972 SV ** const firstlelem = PL_stack_base + POPMARK + 1;
4973 SV ** const firstrelem = lastlelem + 1;
4974 I32 is_something_there = FALSE;
4975 const U8 mod = PL_op->op_flags & OPf_MOD;
4977 const I32 max = lastrelem - lastlelem;
4980 if (GIMME != G_ARRAY) {
4981 I32 ix = SvIV(*lastlelem);
4984 if (ix < 0 || ix >= max)
4985 *firstlelem = &PL_sv_undef;
4987 *firstlelem = firstrelem[ix];
4993 SP = firstlelem - 1;
4997 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
4998 I32 ix = SvIV(*lelem);
5001 if (ix < 0 || ix >= max)
5002 *lelem = &PL_sv_undef;
5004 is_something_there = TRUE;
5005 if (!(*lelem = firstrelem[ix]))
5006 *lelem = &PL_sv_undef;
5007 else if (mod && SvPADTMP(*lelem)) {
5008 *lelem = firstrelem[ix] = sv_mortalcopy(*lelem);
5012 if (is_something_there)
5015 SP = firstlelem - 1;
5022 const I32 items = SP - MARK;
5023 SV * const av = MUTABLE_SV(av_make(items, MARK+1));
5025 mXPUSHs((PL_op->op_flags & OPf_SPECIAL)
5026 ? newRV_noinc(av) : av);
5032 dSP; dMARK; dORIGMARK;
5033 HV* const hv = newHV();
5034 SV* const retval = sv_2mortal( PL_op->op_flags & OPf_SPECIAL
5035 ? newRV_noinc(MUTABLE_SV(hv))
5040 (MARK++, SvGMAGICAL(*MARK) ? sv_mortalcopy(*MARK) : *MARK);
5047 sv_setsv(val, *MARK);
5051 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
5054 (void)hv_store_ent(hv,key,val,0);
5062 S_deref_plain_array(pTHX_ AV *ary)
5064 if (SvTYPE(ary) == SVt_PVAV) return ary;
5065 SvGETMAGIC((SV *)ary);
5066 if (!SvROK(ary) || SvTYPE(SvRV(ary)) != SVt_PVAV)
5067 Perl_die(aTHX_ "Not an ARRAY reference");
5068 else if (SvOBJECT(SvRV(ary)))
5069 Perl_die(aTHX_ "Not an unblessed ARRAY reference");
5070 return (AV *)SvRV(ary);
5073 #if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
5074 # define DEREF_PLAIN_ARRAY(ary) \
5077 SvTYPE(aRrRay) == SVt_PVAV \
5079 : S_deref_plain_array(aTHX_ aRrRay); \
5082 # define DEREF_PLAIN_ARRAY(ary) \
5084 PL_Sv = (SV *)(ary), \
5085 SvTYPE(PL_Sv) == SVt_PVAV \
5087 : S_deref_plain_array(aTHX_ (AV *)PL_Sv) \
5093 dSP; dMARK; dORIGMARK;
5094 int num_args = (SP - MARK);
5095 AV *ary = DEREF_PLAIN_ARRAY(MUTABLE_AV(*++MARK));
5104 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
5107 return Perl_tied_method(aTHX_ SV_CONST(SPLICE), mark - 1, MUTABLE_SV(ary), mg,
5108 GIMME_V | TIED_METHOD_ARGUMENTS_ON_STACK,
5115 offset = i = SvIV(*MARK);
5117 offset += AvFILLp(ary) + 1;
5119 DIE(aTHX_ PL_no_aelem, i);
5121 length = SvIVx(*MARK++);
5123 length += AvFILLp(ary) - offset + 1;
5129 length = AvMAX(ary) + 1; /* close enough to infinity */
5133 length = AvMAX(ary) + 1;
5135 if (offset > AvFILLp(ary) + 1) {
5137 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
5138 offset = AvFILLp(ary) + 1;
5140 after = AvFILLp(ary) + 1 - (offset + length);
5141 if (after < 0) { /* not that much array */
5142 length += after; /* offset+length now in array */
5148 /* At this point, MARK .. SP-1 is our new LIST */
5151 diff = newlen - length;
5152 if (newlen && !AvREAL(ary) && AvREIFY(ary))
5155 /* make new elements SVs now: avoid problems if they're from the array */
5156 for (dst = MARK, i = newlen; i; i--) {
5157 SV * const h = *dst;
5158 *dst++ = newSVsv(h);
5161 if (diff < 0) { /* shrinking the area */
5162 SV **tmparyval = NULL;
5164 Newx(tmparyval, newlen, SV*); /* so remember insertion */
5165 Copy(MARK, tmparyval, newlen, SV*);
5168 MARK = ORIGMARK + 1;
5169 if (GIMME == G_ARRAY) { /* copy return vals to stack */
5170 const bool real = cBOOL(AvREAL(ary));
5171 MEXTEND(MARK, length);
5173 EXTEND_MORTAL(length);
5174 for (i = 0, dst = MARK; i < length; i++) {
5175 if ((*dst = AvARRAY(ary)[i+offset])) {
5177 sv_2mortal(*dst); /* free them eventually */
5180 *dst = &PL_sv_undef;
5186 *MARK = AvARRAY(ary)[offset+length-1];
5189 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
5190 SvREFCNT_dec(*dst++); /* free them now */
5193 AvFILLp(ary) += diff;
5195 /* pull up or down? */
5197 if (offset < after) { /* easier to pull up */
5198 if (offset) { /* esp. if nothing to pull */
5199 src = &AvARRAY(ary)[offset-1];
5200 dst = src - diff; /* diff is negative */
5201 for (i = offset; i > 0; i--) /* can't trust Copy */
5205 AvARRAY(ary) = AvARRAY(ary) - diff; /* diff is negative */
5209 if (after) { /* anything to pull down? */
5210 src = AvARRAY(ary) + offset + length;
5211 dst = src + diff; /* diff is negative */
5212 Move(src, dst, after, SV*);
5214 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
5215 /* avoid later double free */
5222 Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
5223 Safefree(tmparyval);
5226 else { /* no, expanding (or same) */
5227 SV** tmparyval = NULL;
5229 Newx(tmparyval, length, SV*); /* so remember deletion */
5230 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
5233 if (diff > 0) { /* expanding */
5234 /* push up or down? */
5235 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
5239 Move(src, dst, offset, SV*);
5241 AvARRAY(ary) = AvARRAY(ary) - diff;/* diff is positive */
5243 AvFILLp(ary) += diff;
5246 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
5247 av_extend(ary, AvFILLp(ary) + diff);
5248 AvFILLp(ary) += diff;
5251 dst = AvARRAY(ary) + AvFILLp(ary);
5253 for (i = after; i; i--) {
5261 Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
5264 MARK = ORIGMARK + 1;
5265 if (GIMME == G_ARRAY) { /* copy return vals to stack */
5267 const bool real = cBOOL(AvREAL(ary));
5269 EXTEND_MORTAL(length);
5270 for (i = 0, dst = MARK; i < length; i++) {
5271 if ((*dst = tmparyval[i])) {
5273 sv_2mortal(*dst); /* free them eventually */
5275 else *dst = &PL_sv_undef;
5281 else if (length--) {
5282 *MARK = tmparyval[length];
5285 while (length-- > 0)
5286 SvREFCNT_dec(tmparyval[length]);
5290 *MARK = &PL_sv_undef;
5291 Safefree(tmparyval);
5295 mg_set(MUTABLE_SV(ary));
5303 dSP; dMARK; dORIGMARK; dTARGET;
5304 AV * const ary = DEREF_PLAIN_ARRAY(MUTABLE_AV(*++MARK));
5305 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
5308 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
5311 ENTER_with_name("call_PUSH");
5312 call_sv(SV_CONST(PUSH),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
5313 LEAVE_with_name("call_PUSH");
5317 if (SvREADONLY(ary) && MARK < SP) Perl_croak_no_modify();
5318 PL_delaymagic = DM_DELAY;
5319 for (++MARK; MARK <= SP; MARK++) {
5321 if (*MARK) SvGETMAGIC(*MARK);
5324 sv_setsv_nomg(sv, *MARK);
5325 av_store(ary, AvFILLp(ary)+1, sv);
5327 if (PL_delaymagic & DM_ARRAY_ISA)
5328 mg_set(MUTABLE_SV(ary));
5333 if (OP_GIMME(PL_op, 0) != G_VOID) {
5334 PUSHi( AvFILL(ary) + 1 );
5339 /* also used for: pp_pop()*/
5343 AV * const av = PL_op->op_flags & OPf_SPECIAL
5344 ? MUTABLE_AV(GvAV(PL_defgv)) : DEREF_PLAIN_ARRAY(MUTABLE_AV(POPs));
5345 SV * const sv = PL_op->op_type == OP_SHIFT ? av_shift(av) : av_pop(av);
5349 (void)sv_2mortal(sv);
5356 dSP; dMARK; dORIGMARK; dTARGET;
5357 AV *ary = DEREF_PLAIN_ARRAY(MUTABLE_AV(*++MARK));
5358 const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
5361 *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
5364 ENTER_with_name("call_UNSHIFT");
5365 call_sv(SV_CONST(UNSHIFT),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
5366 LEAVE_with_name("call_UNSHIFT");
5371 av_unshift(ary, SP - MARK);
5373 SV * const sv = newSVsv(*++MARK);
5374 (void)av_store(ary, i++, sv);
5378 if (OP_GIMME(PL_op, 0) != G_VOID) {
5379 PUSHi( AvFILL(ary) + 1 );
5388 if (GIMME == G_ARRAY) {
5389 if (PL_op->op_private & OPpREVERSE_INPLACE) {
5393 assert( MARK+1 == SP && *SP && SvTYPE(*SP) == SVt_PVAV);
5394 (void)POPMARK; /* remove mark associated with ex-OP_AASSIGN */
5395 av = MUTABLE_AV((*SP));
5396 /* In-place reversing only happens in void context for the array
5397 * assignment. We don't need to push anything on the stack. */
5400 if (SvMAGICAL(av)) {
5402 SV *tmp = sv_newmortal();
5403 /* For SvCANEXISTDELETE */
5406 bool can_preserve = SvCANEXISTDELETE(av);
5408 for (i = 0, j = av_tindex(av); i < j; ++i, --j) {
5412 if (!av_exists(av, i)) {
5413 if (av_exists(av, j)) {
5414 SV *sv = av_delete(av, j, 0);
5415 begin = *av_fetch(av, i, TRUE);
5416 sv_setsv_mg(begin, sv);
5420 else if (!av_exists(av, j)) {
5421 SV *sv = av_delete(av, i, 0);
5422 end = *av_fetch(av, j, TRUE);
5423 sv_setsv_mg(end, sv);
5428 begin = *av_fetch(av, i, TRUE);
5429 end = *av_fetch(av, j, TRUE);
5430 sv_setsv(tmp, begin);
5431 sv_setsv_mg(begin, end);
5432 sv_setsv_mg(end, tmp);
5436 SV **begin = AvARRAY(av);
5439 SV **end = begin + AvFILLp(av);
5441 while (begin < end) {
5442 SV * const tmp = *begin;
5453 SV * const tmp = *MARK;
5457 /* safe as long as stack cannot get extended in the above */
5468 SvUTF8_off(TARG); /* decontaminate */
5470 do_join(TARG, &PL_sv_no, MARK, SP);
5472 sv_setsv(TARG, SP > MARK ? *SP : find_rundefsv());
5475 up = SvPV_force(TARG, len);
5477 if (DO_UTF8(TARG)) { /* first reverse each character */
5478 U8* s = (U8*)SvPVX(TARG);
5479 const U8* send = (U8*)(s + len);
5481 if (UTF8_IS_INVARIANT(*s)) {
5486 if (!utf8_to_uvchr_buf(s, send, 0))
5490 down = (char*)(s - 1);
5491 /* reverse this character */
5495 *down-- = (char)tmp;
5501 down = SvPVX(TARG) + len - 1;
5505 *down-- = (char)tmp;
5507 (void)SvPOK_only_UTF8(TARG);
5518 AV *ary = PL_op->op_flags & OPf_STACKED ? (AV *)POPs : NULL;
5519 IV limit = POPi; /* note, negative is forever */
5520 SV * const sv = POPs;
5522 const char *s = SvPV_const(sv, len);
5523 const bool do_utf8 = DO_UTF8(sv);
5524 const char *strend = s + len;
5530 const STRLEN slen = do_utf8
5531 ? utf8_length((U8*)s, (U8*)strend)
5532 : (STRLEN)(strend - s);
5533 SSize_t maxiters = slen + 10;
5534 I32 trailing_empty = 0;
5536 const I32 origlimit = limit;
5539 const I32 gimme = GIMME_V;
5541 const I32 oldsave = PL_savestack_ix;
5542 U32 make_mortal = SVs_TEMP;
5547 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
5552 DIE(aTHX_ "panic: pp_split, pm=%p, s=%p", pm, s);
5555 TAINT_IF(get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET &&
5556 (RX_EXTFLAGS(rx) & (RXf_WHITE | RXf_SKIPWHITE)));
5559 if (pm->op_pmreplrootu.op_pmtargetoff) {
5560 ary = GvAVn(MUTABLE_GV(PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff)));
5563 if (pm->op_pmreplrootu.op_pmtargetgv) {
5564 ary = GvAVn(pm->op_pmreplrootu.op_pmtargetgv);
5567 else if (pm->op_targ)
5568 ary = (AV *)PAD_SVl(pm->op_targ);
5573 (void)sv_2mortal(SvREFCNT_inc_simple_NN(sv));
5576 if ((mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied))) {
5578 XPUSHs(SvTIED_obj(MUTABLE_SV(ary), mg));
5585 for (i = AvFILLp(ary); i >= 0; i--)
5586 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
5588 /* temporarily switch stacks */
5589 SAVESWITCHSTACK(PL_curstack, ary);
5593 base = SP - PL_stack_base;
5595 if (RX_EXTFLAGS(rx) & RXf_SKIPWHITE) {
5597 while (isSPACE_utf8(s))
5600 else if (get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET) {
5601 while (isSPACE_LC(*s))
5609 if (RX_EXTFLAGS(rx) & RXf_PMf_MULTILINE) {
5613 gimme_scalar = gimme == G_SCALAR && !ary;
5616 limit = maxiters + 2;
5617 if (RX_EXTFLAGS(rx) & RXf_WHITE) {
5620 /* this one uses 'm' and is a negative test */
5622 while (m < strend && ! isSPACE_utf8(m) ) {
5623 const int t = UTF8SKIP(m);
5624 /* isSPACE_utf8 returns FALSE for malform utf8 */
5631 else if (get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET)
5633 while (m < strend && !isSPACE_LC(*m))
5636 while (m < strend && !isSPACE(*m))
5649 dstr = newSVpvn_flags(s, m-s,
5650 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
5654 /* skip the whitespace found last */
5656 s = m + UTF8SKIP(m);
5660 /* this one uses 's' and is a positive test */
5662 while (s < strend && isSPACE_utf8(s) )
5665 else if (get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET)
5667 while (s < strend && isSPACE_LC(*s))
5670 while (s < strend && isSPACE(*s))
5675 else if (RX_EXTFLAGS(rx) & RXf_START_ONLY) {
5677 for (m = s; m < strend && *m != '\n'; m++)
5690 dstr = newSVpvn_flags(s, m-s,
5691 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
5697 else if (RX_EXTFLAGS(rx) & RXf_NULL && !(s >= strend)) {
5699 Pre-extend the stack, either the number of bytes or
5700 characters in the string or a limited amount, triggered by:
5702 my ($x, $y) = split //, $str;
5706 if (!gimme_scalar) {
5707 const U32 items = limit - 1;
5716 /* keep track of how many bytes we skip over */
5726 dstr = newSVpvn_flags(m, s-m, SVf_UTF8 | make_mortal);
5739 dstr = newSVpvn(s, 1);
5755 else if (do_utf8 == (RX_UTF8(rx) != 0) &&
5756 (RX_EXTFLAGS(rx) & RXf_USE_INTUIT) && !RX_NPARENS(rx)
5757 && (RX_EXTFLAGS(rx) & RXf_CHECK_ALL)
5758 && !(RX_EXTFLAGS(rx) & RXf_IS_ANCHORED)) {
5759 const int tail = (RX_EXTFLAGS(rx) & RXf_INTUIT_TAIL);
5760 SV * const csv = CALLREG_INTUIT_STRING(rx);
5762 len = RX_MINLENRET(rx);
5763 if (len == 1 && !RX_UTF8(rx) && !tail) {
5764 const char c = *SvPV_nolen_const(csv);
5766 for (m = s; m < strend && *m != c; m++)
5777 dstr = newSVpvn_flags(s, m-s,
5778 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
5781 /* The rx->minlen is in characters but we want to step
5782 * s ahead by bytes. */
5784 s = (char*)utf8_hop((U8*)m, len);
5786 s = m + len; /* Fake \n at the end */
5790 while (s < strend && --limit &&
5791 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
5792 csv, multiline ? FBMrf_MULTILINE : 0)) )
5801 dstr = newSVpvn_flags(s, m-s,
5802 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
5805 /* The rx->minlen is in characters but we want to step
5806 * s ahead by bytes. */
5808 s = (char*)utf8_hop((U8*)m, len);
5810 s = m + len; /* Fake \n at the end */
5815 maxiters += slen * RX_NPARENS(rx);
5816 while (s < strend && --limit)
5820 rex_return = CALLREGEXEC(rx, (char*)s, (char*)strend, (char*)orig, 1,
5823 if (rex_return == 0)
5825 TAINT_IF(RX_MATCH_TAINTED(rx));
5826 /* we never pass the REXEC_COPY_STR flag, so it should
5827 * never get copied */
5828 assert(!RX_MATCH_COPIED(rx));
5829 m = RX_OFFS(rx)[0].start + orig;
5838 dstr = newSVpvn_flags(s, m-s,
5839 (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
5842 if (RX_NPARENS(rx)) {
5844 for (i = 1; i <= (I32)RX_NPARENS(rx); i++) {
5845 s = RX_OFFS(rx)[i].start + orig;
5846 m = RX_OFFS(rx)[i].end + orig;
5848 /* japhy (07/27/01) -- the (m && s) test doesn't catch
5849 parens that didn't match -- they should be set to
5850 undef, not the empty string */
5858 if (m >= orig && s >= orig) {
5859 dstr = newSVpvn_flags(s, m-s,
5860 (do_utf8 ? SVf_UTF8 : 0)
5864 dstr = &PL_sv_undef; /* undef, not "" */
5870 s = RX_OFFS(rx)[0].end + orig;
5874 if (!gimme_scalar) {
5875 iters = (SP - PL_stack_base) - base;
5877 if (iters > maxiters)
5878 DIE(aTHX_ "Split loop");
5880 /* keep field after final delim? */
5881 if (s < strend || (iters && origlimit)) {
5882 if (!gimme_scalar) {
5883 const STRLEN l = strend - s;
5884 dstr = newSVpvn_flags(s, l, (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
5889 else if (!origlimit) {
5891 iters -= trailing_empty;
5893 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
5894 if (TOPs && !make_mortal)
5896 *SP-- = &PL_sv_undef;
5903 LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */
5907 if (SvSMAGICAL(ary)) {
5909 mg_set(MUTABLE_SV(ary));
5912 if (gimme == G_ARRAY) {
5914 Copy(AvARRAY(ary), SP + 1, iters, SV*);
5921 ENTER_with_name("call_PUSH");
5922 call_sv(SV_CONST(PUSH),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
5923 LEAVE_with_name("call_PUSH");
5925 if (gimme == G_ARRAY) {
5927 /* EXTEND should not be needed - we just popped them */
5929 for (i=0; i < iters; i++) {
5930 SV **svp = av_fetch(ary, i, FALSE);
5931 PUSHs((svp) ? *svp : &PL_sv_undef);
5938 if (gimme == G_ARRAY)
5950 SV *const sv = PAD_SVl(PL_op->op_targ);
5952 if (SvPADSTALE(sv)) {
5955 RETURNOP(cLOGOP->op_other);
5957 RETURNOP(cLOGOP->op_next);
5966 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
5967 || SvTYPE(retsv) == SVt_PVCV) {
5968 retsv = refto(retsv);
5975 /* used for: pp_padany(), pp_mapstart(), pp_custom(); plus any system ops
5976 * that aren't implemented on a particular platform */
5978 PP(unimplemented_op)
5980 const Optype op_type = PL_op->op_type;
5981 /* Using OP_NAME() isn't going to be helpful here. Firstly, it doesn't cope
5982 with out of range op numbers - it only "special" cases op_custom.
5983 Secondly, as the three ops we "panic" on are padmy, mapstart and custom,
5984 if we get here for a custom op then that means that the custom op didn't
5985 have an implementation. Given that OP_NAME() looks up the custom op
5986 by its pp_addr, likely it will return NULL, unless someone (unhelpfully)
5987 registers &PL_unimplemented_op as the address of their custom op.
5988 NULL doesn't generate a useful error message. "custom" does. */
5989 const char *const name = op_type >= OP_max
5990 ? "[out of range]" : PL_op_name[PL_op->op_type];
5991 if(OP_IS_SOCKET(op_type))
5992 DIE(aTHX_ PL_no_sock_func, name);
5993 DIE(aTHX_ "panic: unimplemented op %s (#%d) called", name, op_type);
5996 /* For sorting out arguments passed to a &CORE:: subroutine */
6000 int opnum = SvIOK(cSVOP_sv) ? (int)SvUV(cSVOP_sv) : 0;
6001 int defgv = PL_opargs[opnum] & OA_DEFGV ||opnum==OP_GLOB, whicharg = 0;
6002 AV * const at_ = GvAV(PL_defgv);
6003 SV **svp = at_ ? AvARRAY(at_) : NULL;
6004 I32 minargs = 0, maxargs = 0, numargs = at_ ? AvFILLp(at_)+1 : 0;
6005 I32 oa = opnum ? PL_opargs[opnum] >> OASHIFT : 0;
6006 bool seen_question = 0;
6007 const char *err = NULL;
6008 const bool pushmark = PL_op->op_private & OPpCOREARGS_PUSHMARK;
6010 /* Count how many args there are first, to get some idea how far to
6011 extend the stack. */
6013 if ((oa & 7) == OA_LIST) { maxargs = I32_MAX; break; }
6015 if (oa & OA_OPTIONAL) seen_question = 1;
6016 if (!seen_question) minargs++;
6020 if(numargs < minargs) err = "Not enough";
6021 else if(numargs > maxargs) err = "Too many";
6023 /* diag_listed_as: Too many arguments for %s */
6025 "%s arguments for %s", err,
6026 opnum ? PL_op_desc[opnum] : SvPV_nolen_const(cSVOP_sv)
6029 /* Reset the stack pointer. Without this, we end up returning our own
6030 arguments in list context, in addition to the values we are supposed
6031 to return. nextstate usually does this on sub entry, but we need
6032 to run the next op with the caller's hints, so we cannot have a
6034 SP = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
6036 if(!maxargs) RETURN;
6038 /* We do this here, rather than with a separate pushmark op, as it has
6039 to come in between two things this function does (stack reset and
6040 arg pushing). This seems the easiest way to do it. */
6043 (void)Perl_pp_pushmark(aTHX);
6046 EXTEND(SP, maxargs == I32_MAX ? numargs : maxargs);
6047 PUTBACK; /* The code below can die in various places. */
6049 oa = PL_opargs[opnum] >> OASHIFT;
6050 for (; oa&&(numargs||!pushmark); (void)(numargs&&(++svp,--numargs))) {
6055 if (!numargs && defgv && whicharg == minargs + 1) {
6056 PUSHs(find_rundefsv2(
6057 find_runcv_where(FIND_RUNCV_level_eq, 1, NULL),
6058 cxstack[cxstack_ix].blk_oldcop->cop_seq
6061 else PUSHs(numargs ? svp && *svp ? *svp : &PL_sv_undef : NULL);
6065 PUSHs(svp && *svp ? *svp : &PL_sv_undef);
6070 if (!svp || !*svp || !SvROK(*svp)
6071 || SvTYPE(SvRV(*svp)) != SVt_PVHV)
6073 /* diag_listed_as: Type of arg %d to &CORE::%s must be %s*/
6074 "Type of arg %d to &CORE::%s must be hash reference",
6075 whicharg, OP_DESC(PL_op->op_next)
6080 if (!numargs) PUSHs(NULL);
6081 else if(svp && *svp && SvROK(*svp) && isGV_with_GP(SvRV(*svp)))
6082 /* no magic here, as the prototype will have added an extra
6083 refgen and we just want what was there before that */
6086 const bool constr = PL_op->op_private & whicharg;
6088 svp && *svp ? *svp : &PL_sv_undef,
6089 constr, cBOOL(CopHINTS_get(PL_curcop) & HINT_STRICT_REFS),
6095 if (!numargs) goto try_defsv;
6097 const bool wantscalar =
6098 PL_op->op_private & OPpCOREARGS_SCALARMOD;
6099 if (!svp || !*svp || !SvROK(*svp)
6100 /* We have to permit globrefs even for the \$ proto, as
6101 *foo is indistinguishable from ${\*foo}, and the proto-
6102 type permits the latter. */
6103 || SvTYPE(SvRV(*svp)) > (
6104 wantscalar ? SVt_PVLV
6105 : opnum == OP_LOCK || opnum == OP_UNDEF
6111 "Type of arg %d to &CORE::%s must be %s",
6112 whicharg, PL_op_name[opnum],
6114 ? "scalar reference"
6115 : opnum == OP_LOCK || opnum == OP_UNDEF
6116 ? "reference to one of [$@%&*]"
6117 : "reference to one of [$@%*]"
6120 if (opnum == OP_UNDEF && SvRV(*svp) == (SV *)PL_defgv
6121 && cxstack[cxstack_ix].cx_type & CXp_HASARGS) {
6122 /* Undo @_ localisation, so that sub exit does not undo
6123 part of our undeffing. */
6124 PERL_CONTEXT *cx = &cxstack[cxstack_ix];
6126 cx->cx_type &= ~ CXp_HASARGS;
6127 assert(!AvREAL(cx->blk_sub.argarray));
6132 DIE(aTHX_ "panic: unknown OA_*: %x", (unsigned)(oa&7));
6144 if (PL_op->op_private & OPpOFFBYONE) {
6145 cv = find_runcv_where(FIND_RUNCV_level_eq, 1, NULL);
6147 else cv = find_runcv(NULL);
6148 XPUSHs(CvEVAL(cv) ? &PL_sv_undef : sv_2mortal(newRV((SV *)cv)));
6153 S_localise_aelem_lval(pTHX_ AV * const av, SV * const keysv,
6154 const bool can_preserve)
6156 const SSize_t ix = SvIV(keysv);
6157 if (can_preserve ? av_exists(av, ix) : TRUE) {
6158 SV ** const svp = av_fetch(av, ix, 1);
6160 Perl_croak(aTHX_ PL_no_aelem, ix);
6161 save_aelem(av, ix, svp);
6164 SAVEADELETE(av, ix);
6168 S_localise_helem_lval(pTHX_ HV * const hv, SV * const keysv,
6169 const bool can_preserve)
6171 if (can_preserve ? hv_exists_ent(hv, keysv, 0) : TRUE) {
6172 HE * const he = hv_fetch_ent(hv, keysv, 1, 0);
6173 SV ** const svp = he ? &HeVAL(he) : NULL;
6175 Perl_croak(aTHX_ PL_no_helem_sv, SVfARG(keysv));
6176 save_helem_flags(hv, keysv, svp, 0);
6179 SAVEHDELETE(hv, keysv);
6183 S_localise_gv_slot(pTHX_ GV *gv, U8 type)
6185 if (type == OPpLVREF_SV) {
6186 save_pushptrptr(gv, SvREFCNT_inc_simple(GvSV(gv)), SAVEt_GVSV);
6189 else if (type == OPpLVREF_AV)
6190 /* XXX Inefficient, as it creates a new AV, which we are
6191 about to clobber. */
6194 assert(type == OPpLVREF_HV);
6195 /* XXX Likewise inefficient. */
6204 SV * const key = PL_op->op_private & OPpLVREF_ELEM ? POPs : NULL;
6205 SV * const left = PL_op->op_flags & OPf_STACKED ? POPs : NULL;
6207 const char *bad = NULL;
6208 const U8 type = PL_op->op_private & OPpLVREF_TYPE;
6209 if (!SvROK(sv)) DIE(aTHX_ "Assigned value is not a reference");
6212 if (SvTYPE(SvRV(sv)) > SVt_PVLV)
6216 if (SvTYPE(SvRV(sv)) != SVt_PVAV)
6220 if (SvTYPE(SvRV(sv)) != SVt_PVHV)
6224 if (SvTYPE(SvRV(sv)) != SVt_PVCV)
6228 /* diag_listed_as: Assigned value is not %s reference */
6229 DIE(aTHX_ "Assigned value is not a%s reference", bad);
6230 switch (left ? SvTYPE(left) : 0) {
6235 SV * const old = PAD_SV(ARGTARG);
6236 PAD_SETSV(ARGTARG, SvREFCNT_inc_NN(SvRV(sv)));
6238 if ((PL_op->op_private & (OPpLVAL_INTRO|OPpPAD_STATE))
6240 SAVECLEARSV(PAD_SVl(ARGTARG));
6244 if (PL_op->op_private & OPpLVAL_INTRO) {
6245 S_localise_gv_slot(aTHX_ (GV *)left, type);
6247 gv_setref(left, sv);
6251 if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO)) {
6252 S_localise_aelem_lval(aTHX_ (AV *)left, key,
6253 SvCANEXISTDELETE(left));
6255 av_store((AV *)left, SvIV(key), SvREFCNT_inc_simple_NN(SvRV(sv)));
6258 if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO))
6259 S_localise_helem_lval(aTHX_ (HV *)left, key,
6260 SvCANEXISTDELETE(left));
6261 hv_store_ent((HV *)left, key, SvREFCNT_inc_simple_NN(SvRV(sv)), 0);
6263 if (PL_op->op_flags & OPf_MOD)
6264 SETs(sv_2mortal(newSVsv(sv)));
6265 /* XXX else can weak references go stale before they are read, e.g.,
6273 SV * const ret = sv_2mortal(newSV_type(SVt_PVMG));
6274 SV * const elem = PL_op->op_private & OPpLVREF_ELEM ? POPs : NULL;
6275 SV * const arg = PL_op->op_flags & OPf_STACKED ? POPs : NULL;
6276 MAGIC * const mg = sv_magicext(ret, arg, PERL_MAGIC_lvref,
6277 &PL_vtbl_lvref, (char *)elem,
6278 elem ? HEf_SVKEY : (I32)ARGTARG);
6279 mg->mg_private = PL_op->op_private;
6280 if (PL_op->op_private & OPpLVREF_ITER)
6281 mg->mg_flags |= MGf_PERSIST;
6282 if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO)) {
6286 const bool can_preserve = SvCANEXISTDELETE(arg);
6287 if (SvTYPE(arg) == SVt_PVAV)
6288 S_localise_aelem_lval(aTHX_ (AV *)arg, elem, can_preserve);
6290 S_localise_helem_lval(aTHX_ (HV *)arg, elem, can_preserve);
6293 S_localise_gv_slot(aTHX_ (GV *)arg,
6294 PL_op->op_private & OPpLVREF_TYPE);
6296 else if (!(PL_op->op_private & OPpPAD_STATE))
6297 SAVECLEARSV(PAD_SVl(ARGTARG));
6306 AV * const av = (AV *)POPs;
6307 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
6308 bool can_preserve = FALSE;
6310 if (UNLIKELY(localizing)) {
6315 can_preserve = SvCANEXISTDELETE(av);
6317 if (SvTYPE(av) == SVt_PVAV) {
6320 for (svp = MARK + 1; svp <= SP; svp++) {
6321 const SSize_t elem = SvIV(*svp);
6325 if (max > AvMAX(av))
6330 while (++MARK <= SP) {
6331 SV * const elemsv = *MARK;
6332 if (SvTYPE(av) == SVt_PVAV)
6333 S_localise_aelem_lval(aTHX_ av, elemsv, can_preserve);
6335 S_localise_helem_lval(aTHX_ (HV *)av, elemsv, can_preserve);
6336 *MARK = sv_2mortal(newSV_type(SVt_PVMG));
6337 sv_magic(*MARK,(SV *)av,PERL_MAGIC_lvref,(char *)elemsv,HEf_SVKEY);
6344 if (PL_op->op_flags & OPf_STACKED)
6345 Perl_pp_rv2av(aTHX);
6347 Perl_pp_padav(aTHX);
6351 SETs(0); /* special alias marker that aassign recognises */
6359 * c-indentation-style: bsd
6361 * indent-tabs-mode: nil
6364 * ex: set ts=8 sts=4 sw=4 et: