3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * "It's a big house this, and very peculiar. Always a bit more to discover,
13 * and no knowing what you'll find around a corner. And Elves, sir!" --Samwise
16 /* This file contains general pp ("push/pop") functions that execute the
17 * opcodes that make up a perl program. A typical pp function expects to
18 * find its arguments on the stack, and usually pushes its results onto
19 * the stack, hence the 'pp' terminology. Each OP structure contains
20 * a pointer to the relevant pp_foo() function.
30 /* XXX I can't imagine anyone who doesn't have this actually _needs_
31 it, since pid_t is an integral type.
34 #ifdef NEED_GETPID_PROTO
35 extern Pid_t getpid (void);
39 * Some BSDs and Cygwin default to POSIX math instead of IEEE.
40 * This switches them over to IEEE.
42 #if defined(LIBM_LIB_VERSION)
43 _LIB_VERSION_TYPE _LIB_VERSION = _IEEE_;
46 /* variations on pp_null */
52 if (GIMME_V == G_SCALAR)
63 if (PL_op->op_private & OPpLVAL_INTRO)
64 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
66 if (PL_op->op_flags & OPf_REF) {
70 if (GIMME == G_SCALAR)
71 Perl_croak(aTHX_ "Can't return array to lvalue scalar context");
76 if (gimme == G_ARRAY) {
77 const I32 maxarg = AvFILL((AV*)TARG) + 1;
79 if (SvMAGICAL(TARG)) {
81 for (i=0; i < (U32)maxarg; i++) {
82 SV * const * const svp = av_fetch((AV*)TARG, i, FALSE);
83 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
87 Copy(AvARRAY((AV*)TARG), SP+1, maxarg, SV*);
91 else if (gimme == G_SCALAR) {
92 SV* const sv = sv_newmortal();
93 const I32 maxarg = AvFILL((AV*)TARG) + 1;
106 if (PL_op->op_private & OPpLVAL_INTRO)
107 SAVECLEARSV(PAD_SVl(PL_op->op_targ));
108 if (PL_op->op_flags & OPf_REF)
111 if (GIMME == G_SCALAR)
112 Perl_croak(aTHX_ "Can't return hash to lvalue scalar context");
116 if (gimme == G_ARRAY) {
119 else if (gimme == G_SCALAR) {
120 SV* const sv = Perl_hv_scalar(aTHX_ (HV*)TARG);
134 tryAMAGICunDEREF(to_gv);
137 if (SvTYPE(sv) == SVt_PVIO) {
138 GV * const gv = (GV*) sv_newmortal();
139 gv_init(gv, 0, "", 0, 0);
140 GvIOp(gv) = (IO *)sv;
141 (void)SvREFCNT_inc(sv);
144 else if (SvTYPE(sv) != SVt_PVGV)
145 DIE(aTHX_ "Not a GLOB reference");
148 if (SvTYPE(sv) != SVt_PVGV) {
149 if (SvGMAGICAL(sv)) {
154 if (!SvOK(sv) && sv != &PL_sv_undef) {
155 /* If this is a 'my' scalar and flag is set then vivify
159 Perl_croak(aTHX_ PL_no_modify);
160 if (PL_op->op_private & OPpDEREF) {
162 if (cUNOP->op_targ) {
164 SV * const namesv = PAD_SV(cUNOP->op_targ);
165 const char * const name = SvPV(namesv, len);
167 gv_init(gv, CopSTASH(PL_curcop), name, len, 0);
170 const char * const name = CopSTASHPV(PL_curcop);
173 if (SvTYPE(sv) < SVt_RV)
174 sv_upgrade(sv, SVt_RV);
175 if (SvPVX_const(sv)) {
180 SvRV_set(sv, (SV*)gv);
185 if (PL_op->op_flags & OPf_REF ||
186 PL_op->op_private & HINT_STRICT_REFS)
187 DIE(aTHX_ PL_no_usym, "a symbol");
188 if (ckWARN(WARN_UNINITIALIZED))
192 if ((PL_op->op_flags & OPf_SPECIAL) &&
193 !(PL_op->op_flags & OPf_MOD))
195 SV * const temp = (SV*)gv_fetchsv(sv, 0, SVt_PVGV);
197 && (!is_gv_magical_sv(sv,0)
198 || !(sv = (SV*)gv_fetchsv(sv, GV_ADD, SVt_PVGV)))) {
204 if (PL_op->op_private & HINT_STRICT_REFS)
205 DIE(aTHX_ PL_no_symref_sv, sv, "a symbol");
206 if ((PL_op->op_private & (OPpLVAL_INTRO|OPpDONT_INIT_GV))
207 == OPpDONT_INIT_GV) {
208 /* We are the target of a coderef assignment. Return
209 the scalar unchanged, and let pp_sasssign deal with
213 sv = (SV*)gv_fetchsv(sv, GV_ADD, SVt_PVGV);
217 if (PL_op->op_private & OPpLVAL_INTRO)
218 save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
230 tryAMAGICunDEREF(to_sv);
233 switch (SvTYPE(sv)) {
237 DIE(aTHX_ "Not a SCALAR reference");
243 if (SvTYPE(gv) != SVt_PVGV) {
244 if (SvGMAGICAL(sv)) {
249 if (PL_op->op_private & HINT_STRICT_REFS) {
251 DIE(aTHX_ PL_no_symref_sv, sv, "a SCALAR");
253 DIE(aTHX_ PL_no_usym, "a SCALAR");
256 if (PL_op->op_flags & OPf_REF)
257 DIE(aTHX_ PL_no_usym, "a SCALAR");
258 if (ckWARN(WARN_UNINITIALIZED))
262 if ((PL_op->op_flags & OPf_SPECIAL) &&
263 !(PL_op->op_flags & OPf_MOD))
265 gv = (GV*)gv_fetchsv(sv, 0, SVt_PV);
267 && (!is_gv_magical_sv(sv, 0)
268 || !(gv = (GV*)gv_fetchsv(sv, GV_ADD, SVt_PV))))
274 gv = (GV*)gv_fetchsv(sv, GV_ADD, SVt_PV);
279 if (PL_op->op_flags & OPf_MOD) {
280 if (PL_op->op_private & OPpLVAL_INTRO) {
281 if (cUNOP->op_first->op_type == OP_NULL)
282 sv = save_scalar((GV*)TOPs);
284 sv = save_scalar(gv);
286 Perl_croak(aTHX_ PL_no_localize_ref);
288 else if (PL_op->op_private & OPpDEREF)
289 vivify_ref(sv, PL_op->op_private & OPpDEREF);
298 AV * const av = (AV*)TOPs;
299 SV ** const sv = Perl_av_arylen_p(aTHX_ (AV*)av);
302 sv_upgrade(*sv, SVt_PVMG);
303 sv_magic(*sv, (SV*)av, PERL_MAGIC_arylen, NULL, 0);
311 dVAR; dSP; dTARGET; dPOPss;
313 if (PL_op->op_flags & OPf_MOD || LVRET) {
314 if (SvTYPE(TARG) < SVt_PVLV) {
315 sv_upgrade(TARG, SVt_PVLV);
316 sv_magic(TARG, NULL, PERL_MAGIC_pos, NULL, 0);
320 if (LvTARG(TARG) != sv) {
322 SvREFCNT_dec(LvTARG(TARG));
323 LvTARG(TARG) = SvREFCNT_inc(sv);
325 PUSHs(TARG); /* no SvSETMAGIC */
329 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
330 const MAGIC * const mg = mg_find(sv, PERL_MAGIC_regex_global);
331 if (mg && mg->mg_len >= 0) {
335 PUSHi(i + PL_curcop->cop_arybase);
348 const I32 flags = (PL_op->op_flags & OPf_SPECIAL)
350 : ((PL_op->op_private & (OPpLVAL_INTRO|OPpMAY_RETURN_CONSTANT)) == OPpMAY_RETURN_CONSTANT)
353 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
354 /* (But not in defined().) */
356 CV *cv = sv_2cv(TOPs, &stash, &gv, flags);
359 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
360 if ((PL_op->op_private & OPpLVAL_INTRO)) {
361 if (gv && GvCV(gv) == cv && (gv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv), FALSE)))
364 DIE(aTHX_ "Can't modify non-lvalue subroutine call");
367 else if ((flags == (GV_ADD|GV_NOEXPAND)) && gv && SvROK(gv)) {
371 cv = (CV*)&PL_sv_undef;
382 SV *ret = &PL_sv_undef;
384 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
385 const char * const s = SvPVX_const(TOPs);
386 if (strnEQ(s, "CORE::", 6)) {
387 const int code = keyword(s + 6, SvCUR(TOPs) - 6);
388 if (code < 0) { /* Overridable. */
389 #define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
390 int i = 0, n = 0, seen_question = 0;
392 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
394 if (code == -KEY_chop || code == -KEY_chomp
395 || code == -KEY_exec || code == -KEY_system)
397 while (i < MAXO) { /* The slow way. */
398 if (strEQ(s + 6, PL_op_name[i])
399 || strEQ(s + 6, PL_op_desc[i]))
405 goto nonesuch; /* Should not happen... */
407 oa = PL_opargs[i] >> OASHIFT;
409 if (oa & OA_OPTIONAL && !seen_question) {
413 if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
414 && (oa & (OA_OPTIONAL - 1)) <= OA_SCALARREF
415 /* But globs are already references (kinda) */
416 && (oa & (OA_OPTIONAL - 1)) != OA_FILEREF
420 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
424 ret = sv_2mortal(newSVpvn(str, n - 1));
426 else if (code) /* Non-Overridable */
428 else { /* None such */
430 DIE(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
434 cv = sv_2cv(TOPs, &stash, &gv, 0);
436 ret = sv_2mortal(newSVpvn(SvPVX_const(cv), SvCUR(cv)));
445 CV* cv = (CV*)PAD_SV(PL_op->op_targ);
447 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
463 if (GIMME != G_ARRAY) {
467 *MARK = &PL_sv_undef;
468 *MARK = refto(*MARK);
472 EXTEND_MORTAL(SP - MARK);
474 *MARK = refto(*MARK);
479 S_refto(pTHX_ SV *sv)
484 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
487 if (!(sv = LvTARG(sv)))
490 (void)SvREFCNT_inc(sv);
492 else if (SvTYPE(sv) == SVt_PVAV) {
493 if (!AvREAL((AV*)sv) && AvREIFY((AV*)sv))
496 (void)SvREFCNT_inc(sv);
498 else if (SvPADTMP(sv) && !IS_PADGV(sv))
502 (void)SvREFCNT_inc(sv);
505 sv_upgrade(rv, SVt_RV);
515 SV * const sv = POPs;
520 if (!sv || !SvROK(sv))
523 pv = sv_reftype(SvRV(sv),TRUE);
524 PUSHp(pv, strlen(pv));
534 stash = CopSTASH(PL_curcop);
536 SV * const ssv = POPs;
540 if (ssv && !SvGMAGICAL(ssv) && !SvAMAGIC(ssv) && SvROK(ssv))
541 Perl_croak(aTHX_ "Attempt to bless into a reference");
542 ptr = SvPV_const(ssv,len);
543 if (len == 0 && ckWARN(WARN_MISC))
544 Perl_warner(aTHX_ packWARN(WARN_MISC),
545 "Explicit blessing to '' (assuming package main)");
546 stash = gv_stashpvn(ptr, len, TRUE);
549 (void)sv_bless(TOPs, stash);
558 const char * const elem = SvPV_nolen_const(sv);
559 GV * const gv = (GV*)POPs;
564 /* elem will always be NUL terminated. */
565 const char * const second_letter = elem + 1;
568 if (strEQ(second_letter, "RRAY"))
569 tmpRef = (SV*)GvAV(gv);
572 if (strEQ(second_letter, "ODE"))
573 tmpRef = (SV*)GvCVu(gv);
576 if (strEQ(second_letter, "ILEHANDLE")) {
577 /* finally deprecated in 5.8.0 */
578 deprecate("*glob{FILEHANDLE}");
579 tmpRef = (SV*)GvIOp(gv);
582 if (strEQ(second_letter, "ORMAT"))
583 tmpRef = (SV*)GvFORM(gv);
586 if (strEQ(second_letter, "LOB"))
590 if (strEQ(second_letter, "ASH"))
591 tmpRef = (SV*)GvHV(gv);
594 if (*second_letter == 'O' && !elem[2])
595 tmpRef = (SV*)GvIOp(gv);
598 if (strEQ(second_letter, "AME"))
599 sv = newSVpvn(GvNAME(gv), GvNAMELEN(gv));
602 if (strEQ(second_letter, "ACKAGE")) {
603 const HV * const stash = GvSTASH(gv);
604 const HEK * const hek = stash ? HvNAME_HEK(stash) : NULL;
605 sv = hek ? newSVhek(hek) : newSVpvs("__ANON__");
609 if (strEQ(second_letter, "CALAR"))
624 /* Pattern matching */
629 register unsigned char *s;
632 register I32 *sfirst;
636 if (sv == PL_lastscream) {
642 SvSCREAM_off(PL_lastscream);
643 SvREFCNT_dec(PL_lastscream);
645 PL_lastscream = SvREFCNT_inc(sv);
648 s = (unsigned char*)(SvPV(sv, len));
652 if (pos > PL_maxscream) {
653 if (PL_maxscream < 0) {
654 PL_maxscream = pos + 80;
655 Newx(PL_screamfirst, 256, I32);
656 Newx(PL_screamnext, PL_maxscream, I32);
659 PL_maxscream = pos + pos / 4;
660 Renew(PL_screamnext, PL_maxscream, I32);
664 sfirst = PL_screamfirst;
665 snext = PL_screamnext;
667 if (!sfirst || !snext)
668 DIE(aTHX_ "do_study: out of memory");
670 for (ch = 256; ch; --ch)
675 register const I32 ch = s[pos];
677 snext[pos] = sfirst[ch] - pos;
684 /* piggyback on m//g magic */
685 sv_magic(sv, NULL, PERL_MAGIC_regex_global, NULL, 0);
694 if (PL_op->op_flags & OPf_STACKED)
696 else if (PL_op->op_private & OPpTARGET_MY)
702 TARG = sv_newmortal();
707 /* Lvalue operators. */
719 dVAR; dSP; dMARK; dTARGET; dORIGMARK;
721 do_chop(TARG, *++MARK);
730 SETi(do_chomp(TOPs));
736 dVAR; dSP; dMARK; dTARGET;
737 register I32 count = 0;
740 count += do_chomp(POPs);
750 if (!PL_op->op_private) {
759 SV_CHECK_THINKFIRST_COW_DROP(sv);
761 switch (SvTYPE(sv)) {
771 if (cv_const_sv((CV*)sv) && ckWARN(WARN_MISC))
772 Perl_warner(aTHX_ packWARN(WARN_MISC), "Constant subroutine %s undefined",
773 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
777 /* let user-undef'd sub keep its identity */
778 GV* const gv = CvGV((CV*)sv);
785 SvSetMagicSV(sv, &PL_sv_undef);
790 GvGP(sv) = gp_ref(gp);
792 GvLINE(sv) = CopLINE(PL_curcop);
798 if (SvTYPE(sv) >= SVt_PV && SvPVX_const(sv) && SvLEN(sv)) {
813 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
814 DIE(aTHX_ PL_no_modify);
815 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
816 && SvIVX(TOPs) != IV_MIN)
818 SvIV_set(TOPs, SvIVX(TOPs) - 1);
819 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
830 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
831 DIE(aTHX_ PL_no_modify);
832 sv_setsv(TARG, TOPs);
833 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
834 && SvIVX(TOPs) != IV_MAX)
836 SvIV_set(TOPs, SvIVX(TOPs) + 1);
837 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
842 /* special case for undef: see thread at 2003-03/msg00536.html in archive */
852 if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
853 DIE(aTHX_ PL_no_modify);
854 sv_setsv(TARG, TOPs);
855 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
856 && SvIVX(TOPs) != IV_MIN)
858 SvIV_set(TOPs, SvIVX(TOPs) - 1);
859 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
868 /* Ordinary operators. */
873 #ifdef PERL_PRESERVE_IVUV
876 tryAMAGICbin(pow,opASSIGN);
877 #ifdef PERL_PRESERVE_IVUV
878 /* For integer to integer power, we do the calculation by hand wherever
879 we're sure it is safe; otherwise we call pow() and try to convert to
880 integer afterwards. */
893 const IV iv = SvIVX(TOPs);
897 goto float_it; /* Can't do negative powers this way. */
901 baseuok = SvUOK(TOPm1s);
903 baseuv = SvUVX(TOPm1s);
905 const IV iv = SvIVX(TOPm1s);
908 baseuok = TRUE; /* effectively it's a UV now */
910 baseuv = -iv; /* abs, baseuok == false records sign */
913 /* now we have integer ** positive integer. */
916 /* foo & (foo - 1) is zero only for a power of 2. */
917 if (!(baseuv & (baseuv - 1))) {
918 /* We are raising power-of-2 to a positive integer.
919 The logic here will work for any base (even non-integer
920 bases) but it can be less accurate than
921 pow (base,power) or exp (power * log (base)) when the
922 intermediate values start to spill out of the mantissa.
923 With powers of 2 we know this can't happen.
924 And powers of 2 are the favourite thing for perl
925 programmers to notice ** not doing what they mean. */
927 NV base = baseuok ? baseuv : -(NV)baseuv;
932 while (power >>= 1) {
943 register unsigned int highbit = 8 * sizeof(UV);
944 register unsigned int diff = 8 * sizeof(UV);
947 if (baseuv >> highbit) {
951 /* we now have baseuv < 2 ** highbit */
952 if (power * highbit <= 8 * sizeof(UV)) {
953 /* result will definitely fit in UV, so use UV math
954 on same algorithm as above */
955 register UV result = 1;
956 register UV base = baseuv;
957 const bool odd_power = (bool)(power & 1);
961 while (power >>= 1) {
968 if (baseuok || !odd_power)
969 /* answer is positive */
971 else if (result <= (UV)IV_MAX)
972 /* answer negative, fits in IV */
974 else if (result == (UV)IV_MIN)
975 /* 2's complement assumption: special case IV_MIN */
978 /* answer negative, doesn't fit */
990 SETn( Perl_pow( left, right) );
991 #ifdef PERL_PRESERVE_IVUV
1001 dVAR; dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
1002 #ifdef PERL_PRESERVE_IVUV
1005 /* Unless the left argument is integer in range we are going to have to
1006 use NV maths. Hence only attempt to coerce the right argument if
1007 we know the left is integer. */
1008 /* Left operand is defined, so is it IV? */
1009 SvIV_please(TOPm1s);
1010 if (SvIOK(TOPm1s)) {
1011 bool auvok = SvUOK(TOPm1s);
1012 bool buvok = SvUOK(TOPs);
1013 const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
1014 const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
1021 alow = SvUVX(TOPm1s);
1023 const IV aiv = SvIVX(TOPm1s);
1026 auvok = TRUE; /* effectively it's a UV now */
1028 alow = -aiv; /* abs, auvok == false records sign */
1034 const IV biv = SvIVX(TOPs);
1037 buvok = TRUE; /* effectively it's a UV now */
1039 blow = -biv; /* abs, buvok == false records sign */
1043 /* If this does sign extension on unsigned it's time for plan B */
1044 ahigh = alow >> (4 * sizeof (UV));
1046 bhigh = blow >> (4 * sizeof (UV));
1048 if (ahigh && bhigh) {
1049 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
1050 which is overflow. Drop to NVs below. */
1051 } else if (!ahigh && !bhigh) {
1052 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
1053 so the unsigned multiply cannot overflow. */
1054 const UV product = alow * blow;
1055 if (auvok == buvok) {
1056 /* -ve * -ve or +ve * +ve gives a +ve result. */
1060 } else if (product <= (UV)IV_MIN) {
1061 /* 2s complement assumption that (UV)-IV_MIN is correct. */
1062 /* -ve result, which could overflow an IV */
1064 SETi( -(IV)product );
1066 } /* else drop to NVs below. */
1068 /* One operand is large, 1 small */
1071 /* swap the operands */
1073 bhigh = blow; /* bhigh now the temp var for the swap */
1077 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1078 multiplies can't overflow. shift can, add can, -ve can. */
1079 product_middle = ahigh * blow;
1080 if (!(product_middle & topmask)) {
1081 /* OK, (ahigh * blow) won't lose bits when we shift it. */
1083 product_middle <<= (4 * sizeof (UV));
1084 product_low = alow * blow;
1086 /* as for pp_add, UV + something mustn't get smaller.
1087 IIRC ANSI mandates this wrapping *behaviour* for
1088 unsigned whatever the actual representation*/
1089 product_low += product_middle;
1090 if (product_low >= product_middle) {
1091 /* didn't overflow */
1092 if (auvok == buvok) {
1093 /* -ve * -ve or +ve * +ve gives a +ve result. */
1095 SETu( product_low );
1097 } else if (product_low <= (UV)IV_MIN) {
1098 /* 2s complement assumption again */
1099 /* -ve result, which could overflow an IV */
1101 SETi( -(IV)product_low );
1103 } /* else drop to NVs below. */
1105 } /* product_middle too large */
1106 } /* ahigh && bhigh */
1107 } /* SvIOK(TOPm1s) */
1112 SETn( left * right );
1119 dVAR; dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
1120 /* Only try to do UV divide first
1121 if ((SLOPPYDIVIDE is true) or
1122 (PERL_PRESERVE_IVUV is true and one or both SV is a UV too large
1124 The assumption is that it is better to use floating point divide
1125 whenever possible, only doing integer divide first if we can't be sure.
1126 If NV_PRESERVES_UV is true then we know at compile time that no UV
1127 can be too large to preserve, so don't need to compile the code to
1128 test the size of UVs. */
1131 # define PERL_TRY_UV_DIVIDE
1132 /* ensure that 20./5. == 4. */
1134 # ifdef PERL_PRESERVE_IVUV
1135 # ifndef NV_PRESERVES_UV
1136 # define PERL_TRY_UV_DIVIDE
1141 #ifdef PERL_TRY_UV_DIVIDE
1144 SvIV_please(TOPm1s);
1145 if (SvIOK(TOPm1s)) {
1146 bool left_non_neg = SvUOK(TOPm1s);
1147 bool right_non_neg = SvUOK(TOPs);
1151 if (right_non_neg) {
1152 right = SvUVX(TOPs);
1155 const IV biv = SvIVX(TOPs);
1158 right_non_neg = TRUE; /* effectively it's a UV now */
1164 /* historically undef()/0 gives a "Use of uninitialized value"
1165 warning before dieing, hence this test goes here.
1166 If it were immediately before the second SvIV_please, then
1167 DIE() would be invoked before left was even inspected, so
1168 no inpsection would give no warning. */
1170 DIE(aTHX_ "Illegal division by zero");
1173 left = SvUVX(TOPm1s);
1176 const IV aiv = SvIVX(TOPm1s);
1179 left_non_neg = TRUE; /* effectively it's a UV now */
1188 /* For sloppy divide we always attempt integer division. */
1190 /* Otherwise we only attempt it if either or both operands
1191 would not be preserved by an NV. If both fit in NVs
1192 we fall through to the NV divide code below. However,
1193 as left >= right to ensure integer result here, we know that
1194 we can skip the test on the right operand - right big
1195 enough not to be preserved can't get here unless left is
1198 && (left > ((UV)1 << NV_PRESERVES_UV_BITS))
1201 /* Integer division can't overflow, but it can be imprecise. */
1202 const UV result = left / right;
1203 if (result * right == left) {
1204 SP--; /* result is valid */
1205 if (left_non_neg == right_non_neg) {
1206 /* signs identical, result is positive. */
1210 /* 2s complement assumption */
1211 if (result <= (UV)IV_MIN)
1212 SETi( -(IV)result );
1214 /* It's exact but too negative for IV. */
1215 SETn( -(NV)result );
1218 } /* tried integer divide but it was not an integer result */
1219 } /* else (PERL_ABS(result) < 1.0) or (both UVs in range for NV) */
1220 } /* left wasn't SvIOK */
1221 } /* right wasn't SvIOK */
1222 #endif /* PERL_TRY_UV_DIVIDE */
1226 DIE(aTHX_ "Illegal division by zero");
1227 PUSHn( left / right );
1234 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1238 bool left_neg = FALSE;
1239 bool right_neg = FALSE;
1240 bool use_double = FALSE;
1241 bool dright_valid = FALSE;
1247 right_neg = !SvUOK(TOPs);
1249 right = SvUVX(POPs);
1251 const IV biv = SvIVX(POPs);
1254 right_neg = FALSE; /* effectively it's a UV now */
1262 right_neg = dright < 0;
1265 if (dright < UV_MAX_P1) {
1266 right = U_V(dright);
1267 dright_valid = TRUE; /* In case we need to use double below. */
1273 /* At this point use_double is only true if right is out of range for
1274 a UV. In range NV has been rounded down to nearest UV and
1275 use_double false. */
1277 if (!use_double && SvIOK(TOPs)) {
1279 left_neg = !SvUOK(TOPs);
1283 const IV aiv = SvIVX(POPs);
1286 left_neg = FALSE; /* effectively it's a UV now */
1295 left_neg = dleft < 0;
1299 /* This should be exactly the 5.6 behaviour - if left and right are
1300 both in range for UV then use U_V() rather than floor. */
1302 if (dleft < UV_MAX_P1) {
1303 /* right was in range, so is dleft, so use UVs not double.
1307 /* left is out of range for UV, right was in range, so promote
1308 right (back) to double. */
1310 /* The +0.5 is used in 5.6 even though it is not strictly
1311 consistent with the implicit +0 floor in the U_V()
1312 inside the #if 1. */
1313 dleft = Perl_floor(dleft + 0.5);
1316 dright = Perl_floor(dright + 0.5);
1326 DIE(aTHX_ "Illegal modulus zero");
1328 dans = Perl_fmod(dleft, dright);
1329 if ((left_neg != right_neg) && dans)
1330 dans = dright - dans;
1333 sv_setnv(TARG, dans);
1339 DIE(aTHX_ "Illegal modulus zero");
1342 if ((left_neg != right_neg) && ans)
1345 /* XXX may warn: unary minus operator applied to unsigned type */
1346 /* could change -foo to be (~foo)+1 instead */
1347 if (ans <= ~((UV)IV_MAX)+1)
1348 sv_setiv(TARG, ~ans+1);
1350 sv_setnv(TARG, -(NV)ans);
1353 sv_setuv(TARG, ans);
1362 dVAR; dSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
1369 const UV uv = SvUV(sv);
1371 count = IV_MAX; /* The best we can do? */
1375 const IV iv = SvIV(sv);
1382 else if (SvNOKp(sv)) {
1383 const NV nv = SvNV(sv);
1391 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1393 static const char oom_list_extend[] = "Out of memory during list extend";
1394 const I32 items = SP - MARK;
1395 const I32 max = items * count;
1397 MEM_WRAP_CHECK_1(max, SV*, oom_list_extend);
1398 /* Did the max computation overflow? */
1399 if (items > 0 && max > 0 && (max < items || max < count))
1400 Perl_croak(aTHX_ oom_list_extend);
1405 /* This code was intended to fix 20010809.028:
1408 for (($x =~ /./g) x 2) {
1409 print chop; # "abcdabcd" expected as output.
1412 * but that change (#11635) broke this code:
1414 $x = [("foo")x2]; # only one "foo" ended up in the anonlist.
1416 * I can't think of a better fix that doesn't introduce
1417 * an efficiency hit by copying the SVs. The stack isn't
1418 * refcounted, and mortalisation obviously doesn't
1419 * Do The Right Thing when the stack has more than
1420 * one pointer to the same mortal value.
1424 *SP = sv_2mortal(newSVsv(*SP));
1434 repeatcpy((char*)(MARK + items), (char*)MARK,
1435 items * sizeof(SV*), count - 1);
1438 else if (count <= 0)
1441 else { /* Note: mark already snarfed by pp_list */
1442 SV * const tmpstr = POPs;
1445 static const char oom_string_extend[] =
1446 "Out of memory during string extend";
1448 SvSetSV(TARG, tmpstr);
1449 SvPV_force(TARG, len);
1450 isutf = DO_UTF8(TARG);
1455 const STRLEN max = (UV)count * len;
1456 if (len > ((MEM_SIZE)~0)/count)
1457 Perl_croak(aTHX_ oom_string_extend);
1458 MEM_WRAP_CHECK_1(max, char, oom_string_extend);
1459 SvGROW(TARG, max + 1);
1460 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1461 SvCUR_set(TARG, SvCUR(TARG) * count);
1463 *SvEND(TARG) = '\0';
1466 (void)SvPOK_only_UTF8(TARG);
1468 (void)SvPOK_only(TARG);
1470 if (PL_op->op_private & OPpREPEAT_DOLIST) {
1471 /* The parser saw this as a list repeat, and there
1472 are probably several items on the stack. But we're
1473 in scalar context, and there's no pp_list to save us
1474 now. So drop the rest of the items -- robin@kitsite.com
1487 dVAR; dSP; dATARGET; bool useleft; tryAMAGICbin(subtr,opASSIGN);
1488 useleft = USE_LEFT(TOPm1s);
1489 #ifdef PERL_PRESERVE_IVUV
1490 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1491 "bad things" happen if you rely on signed integers wrapping. */
1494 /* Unless the left argument is integer in range we are going to have to
1495 use NV maths. Hence only attempt to coerce the right argument if
1496 we know the left is integer. */
1497 register UV auv = 0;
1503 a_valid = auvok = 1;
1504 /* left operand is undef, treat as zero. */
1506 /* Left operand is defined, so is it IV? */
1507 SvIV_please(TOPm1s);
1508 if (SvIOK(TOPm1s)) {
1509 if ((auvok = SvUOK(TOPm1s)))
1510 auv = SvUVX(TOPm1s);
1512 register const IV aiv = SvIVX(TOPm1s);
1515 auvok = 1; /* Now acting as a sign flag. */
1516 } else { /* 2s complement assumption for IV_MIN */
1524 bool result_good = 0;
1527 bool buvok = SvUOK(TOPs);
1532 register const IV biv = SvIVX(TOPs);
1539 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1540 else "IV" now, independent of how it came in.
1541 if a, b represents positive, A, B negative, a maps to -A etc
1546 all UV maths. negate result if A negative.
1547 subtract if signs same, add if signs differ. */
1549 if (auvok ^ buvok) {
1558 /* Must get smaller */
1563 if (result <= buv) {
1564 /* result really should be -(auv-buv). as its negation
1565 of true value, need to swap our result flag */
1577 if (result <= (UV)IV_MIN)
1578 SETi( -(IV)result );
1580 /* result valid, but out of range for IV. */
1581 SETn( -(NV)result );
1585 } /* Overflow, drop through to NVs. */
1589 useleft = USE_LEFT(TOPm1s);
1593 /* left operand is undef, treat as zero - value */
1597 SETn( TOPn - value );
1604 dVAR; dSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1606 const IV shift = POPi;
1607 if (PL_op->op_private & HINT_INTEGER) {
1621 dVAR; dSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1623 const IV shift = POPi;
1624 if (PL_op->op_private & HINT_INTEGER) {
1638 dVAR; dSP; tryAMAGICbinSET(lt,0);
1639 #ifdef PERL_PRESERVE_IVUV
1642 SvIV_please(TOPm1s);
1643 if (SvIOK(TOPm1s)) {
1644 bool auvok = SvUOK(TOPm1s);
1645 bool buvok = SvUOK(TOPs);
1647 if (!auvok && !buvok) { /* ## IV < IV ## */
1648 const IV aiv = SvIVX(TOPm1s);
1649 const IV biv = SvIVX(TOPs);
1652 SETs(boolSV(aiv < biv));
1655 if (auvok && buvok) { /* ## UV < UV ## */
1656 const UV auv = SvUVX(TOPm1s);
1657 const UV buv = SvUVX(TOPs);
1660 SETs(boolSV(auv < buv));
1663 if (auvok) { /* ## UV < IV ## */
1665 const IV biv = SvIVX(TOPs);
1668 /* As (a) is a UV, it's >=0, so it cannot be < */
1673 SETs(boolSV(auv < (UV)biv));
1676 { /* ## IV < UV ## */
1677 const IV aiv = SvIVX(TOPm1s);
1681 /* As (b) is a UV, it's >=0, so it must be < */
1688 SETs(boolSV((UV)aiv < buv));
1694 #ifndef NV_PRESERVES_UV
1695 #ifdef PERL_PRESERVE_IVUV
1698 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1700 SETs(boolSV(SvRV(TOPs) < SvRV(TOPp1s)));
1706 SETs(boolSV(TOPn < value));
1713 dVAR; dSP; tryAMAGICbinSET(gt,0);
1714 #ifdef PERL_PRESERVE_IVUV
1717 SvIV_please(TOPm1s);
1718 if (SvIOK(TOPm1s)) {
1719 bool auvok = SvUOK(TOPm1s);
1720 bool buvok = SvUOK(TOPs);
1722 if (!auvok && !buvok) { /* ## IV > IV ## */
1723 const IV aiv = SvIVX(TOPm1s);
1724 const IV biv = SvIVX(TOPs);
1727 SETs(boolSV(aiv > biv));
1730 if (auvok && buvok) { /* ## UV > UV ## */
1731 const UV auv = SvUVX(TOPm1s);
1732 const UV buv = SvUVX(TOPs);
1735 SETs(boolSV(auv > buv));
1738 if (auvok) { /* ## UV > IV ## */
1740 const IV biv = SvIVX(TOPs);
1744 /* As (a) is a UV, it's >=0, so it must be > */
1749 SETs(boolSV(auv > (UV)biv));
1752 { /* ## IV > UV ## */
1753 const IV aiv = SvIVX(TOPm1s);
1757 /* As (b) is a UV, it's >=0, so it cannot be > */
1764 SETs(boolSV((UV)aiv > buv));
1770 #ifndef NV_PRESERVES_UV
1771 #ifdef PERL_PRESERVE_IVUV
1774 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1776 SETs(boolSV(SvRV(TOPs) > SvRV(TOPp1s)));
1782 SETs(boolSV(TOPn > value));
1789 dVAR; dSP; tryAMAGICbinSET(le,0);
1790 #ifdef PERL_PRESERVE_IVUV
1793 SvIV_please(TOPm1s);
1794 if (SvIOK(TOPm1s)) {
1795 bool auvok = SvUOK(TOPm1s);
1796 bool buvok = SvUOK(TOPs);
1798 if (!auvok && !buvok) { /* ## IV <= IV ## */
1799 const IV aiv = SvIVX(TOPm1s);
1800 const IV biv = SvIVX(TOPs);
1803 SETs(boolSV(aiv <= biv));
1806 if (auvok && buvok) { /* ## UV <= UV ## */
1807 UV auv = SvUVX(TOPm1s);
1808 UV buv = SvUVX(TOPs);
1811 SETs(boolSV(auv <= buv));
1814 if (auvok) { /* ## UV <= IV ## */
1816 const IV biv = SvIVX(TOPs);
1820 /* As (a) is a UV, it's >=0, so a cannot be <= */
1825 SETs(boolSV(auv <= (UV)biv));
1828 { /* ## IV <= UV ## */
1829 const IV aiv = SvIVX(TOPm1s);
1833 /* As (b) is a UV, it's >=0, so a must be <= */
1840 SETs(boolSV((UV)aiv <= buv));
1846 #ifndef NV_PRESERVES_UV
1847 #ifdef PERL_PRESERVE_IVUV
1850 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1852 SETs(boolSV(SvRV(TOPs) <= SvRV(TOPp1s)));
1858 SETs(boolSV(TOPn <= value));
1865 dVAR; dSP; tryAMAGICbinSET(ge,0);
1866 #ifdef PERL_PRESERVE_IVUV
1869 SvIV_please(TOPm1s);
1870 if (SvIOK(TOPm1s)) {
1871 bool auvok = SvUOK(TOPm1s);
1872 bool buvok = SvUOK(TOPs);
1874 if (!auvok && !buvok) { /* ## IV >= IV ## */
1875 const IV aiv = SvIVX(TOPm1s);
1876 const IV biv = SvIVX(TOPs);
1879 SETs(boolSV(aiv >= biv));
1882 if (auvok && buvok) { /* ## UV >= UV ## */
1883 const UV auv = SvUVX(TOPm1s);
1884 const UV buv = SvUVX(TOPs);
1887 SETs(boolSV(auv >= buv));
1890 if (auvok) { /* ## UV >= IV ## */
1892 const IV biv = SvIVX(TOPs);
1896 /* As (a) is a UV, it's >=0, so it must be >= */
1901 SETs(boolSV(auv >= (UV)biv));
1904 { /* ## IV >= UV ## */
1905 const IV aiv = SvIVX(TOPm1s);
1909 /* As (b) is a UV, it's >=0, so a cannot be >= */
1916 SETs(boolSV((UV)aiv >= buv));
1922 #ifndef NV_PRESERVES_UV
1923 #ifdef PERL_PRESERVE_IVUV
1926 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1928 SETs(boolSV(SvRV(TOPs) >= SvRV(TOPp1s)));
1934 SETs(boolSV(TOPn >= value));
1941 dVAR; dSP; tryAMAGICbinSET(ne,0);
1942 #ifndef NV_PRESERVES_UV
1943 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1945 SETs(boolSV(SvRV(TOPs) != SvRV(TOPp1s)));
1949 #ifdef PERL_PRESERVE_IVUV
1952 SvIV_please(TOPm1s);
1953 if (SvIOK(TOPm1s)) {
1954 const bool auvok = SvUOK(TOPm1s);
1955 const bool buvok = SvUOK(TOPs);
1957 if (auvok == buvok) { /* ## IV == IV or UV == UV ## */
1958 /* Casting IV to UV before comparison isn't going to matter
1959 on 2s complement. On 1s complement or sign&magnitude
1960 (if we have any of them) it could make negative zero
1961 differ from normal zero. As I understand it. (Need to
1962 check - is negative zero implementation defined behaviour
1964 const UV buv = SvUVX(POPs);
1965 const UV auv = SvUVX(TOPs);
1967 SETs(boolSV(auv != buv));
1970 { /* ## Mixed IV,UV ## */
1974 /* != is commutative so swap if needed (save code) */
1976 /* swap. top of stack (b) is the iv */
1980 /* As (a) is a UV, it's >0, so it cannot be == */
1989 /* As (b) is a UV, it's >0, so it cannot be == */
1993 uv = SvUVX(*(SP+1)); /* Do I want TOPp1s() ? */
1995 SETs(boolSV((UV)iv != uv));
2003 SETs(boolSV(TOPn != value));
2010 dVAR; dSP; dTARGET; tryAMAGICbin(ncmp,0);
2011 #ifndef NV_PRESERVES_UV
2012 if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2013 const UV right = PTR2UV(SvRV(POPs));
2014 const UV left = PTR2UV(SvRV(TOPs));
2015 SETi((left > right) - (left < right));
2019 #ifdef PERL_PRESERVE_IVUV
2020 /* Fortunately it seems NaN isn't IOK */
2023 SvIV_please(TOPm1s);
2024 if (SvIOK(TOPm1s)) {
2025 const bool leftuvok = SvUOK(TOPm1s);
2026 const bool rightuvok = SvUOK(TOPs);
2028 if (!leftuvok && !rightuvok) { /* ## IV <=> IV ## */
2029 const IV leftiv = SvIVX(TOPm1s);
2030 const IV rightiv = SvIVX(TOPs);
2032 if (leftiv > rightiv)
2034 else if (leftiv < rightiv)
2038 } else if (leftuvok && rightuvok) { /* ## UV <=> UV ## */
2039 const UV leftuv = SvUVX(TOPm1s);
2040 const UV rightuv = SvUVX(TOPs);
2042 if (leftuv > rightuv)
2044 else if (leftuv < rightuv)
2048 } else if (leftuvok) { /* ## UV <=> IV ## */
2049 const IV rightiv = SvIVX(TOPs);
2051 /* As (a) is a UV, it's >=0, so it cannot be < */
2054 const UV leftuv = SvUVX(TOPm1s);
2055 if (leftuv > (UV)rightiv) {
2057 } else if (leftuv < (UV)rightiv) {
2063 } else { /* ## IV <=> UV ## */
2064 const IV leftiv = SvIVX(TOPm1s);
2066 /* As (b) is a UV, it's >=0, so it must be < */
2069 const UV rightuv = SvUVX(TOPs);
2070 if ((UV)leftiv > rightuv) {
2072 } else if ((UV)leftiv < rightuv) {
2090 if (Perl_isnan(left) || Perl_isnan(right)) {
2094 value = (left > right) - (left < right);
2098 else if (left < right)
2100 else if (left > right)
2116 int amg_type = sle_amg;
2120 switch (PL_op->op_type) {
2139 tryAMAGICbinSET_var(amg_type,0);
2142 const int cmp = (IN_LOCALE_RUNTIME
2143 ? sv_cmp_locale(left, right)
2144 : sv_cmp(left, right));
2145 SETs(boolSV(cmp * multiplier < rhs));
2152 dVAR; dSP; tryAMAGICbinSET(seq,0);
2155 SETs(boolSV(sv_eq(left, right)));
2162 dVAR; dSP; tryAMAGICbinSET(sne,0);
2165 SETs(boolSV(!sv_eq(left, right)));
2172 dVAR; dSP; dTARGET; tryAMAGICbin(scmp,0);
2175 const int cmp = (IN_LOCALE_RUNTIME
2176 ? sv_cmp_locale(left, right)
2177 : sv_cmp(left, right));
2185 dVAR; dSP; dATARGET; tryAMAGICbin(band,opASSIGN);
2190 if (SvNIOKp(left) || SvNIOKp(right)) {
2191 if (PL_op->op_private & HINT_INTEGER) {
2192 const IV i = SvIV_nomg(left) & SvIV_nomg(right);
2196 const UV u = SvUV_nomg(left) & SvUV_nomg(right);
2201 do_vop(PL_op->op_type, TARG, left, right);
2210 dVAR; dSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
2215 if (SvNIOKp(left) || SvNIOKp(right)) {
2216 if (PL_op->op_private & HINT_INTEGER) {
2217 const IV i = (USE_LEFT(left) ? SvIV_nomg(left) : 0) ^ SvIV_nomg(right);
2221 const UV u = (USE_LEFT(left) ? SvUV_nomg(left) : 0) ^ SvUV_nomg(right);
2226 do_vop(PL_op->op_type, TARG, left, right);
2235 dVAR; dSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
2240 if (SvNIOKp(left) || SvNIOKp(right)) {
2241 if (PL_op->op_private & HINT_INTEGER) {
2242 const IV i = (USE_LEFT(left) ? SvIV_nomg(left) : 0) | SvIV_nomg(right);
2246 const UV u = (USE_LEFT(left) ? SvUV_nomg(left) : 0) | SvUV_nomg(right);
2251 do_vop(PL_op->op_type, TARG, left, right);
2260 dVAR; dSP; dTARGET; tryAMAGICun(neg);
2263 const int flags = SvFLAGS(sv);
2265 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
2266 /* It's publicly an integer, or privately an integer-not-float */
2269 if (SvIVX(sv) == IV_MIN) {
2270 /* 2s complement assumption. */
2271 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
2274 else if (SvUVX(sv) <= IV_MAX) {
2279 else if (SvIVX(sv) != IV_MIN) {
2283 #ifdef PERL_PRESERVE_IVUV
2292 else if (SvPOKp(sv)) {
2294 const char * const s = SvPV_const(sv, len);
2295 if (isIDFIRST(*s)) {
2296 sv_setpvn(TARG, "-", 1);
2299 else if (*s == '+' || *s == '-') {
2301 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
2303 else if (DO_UTF8(sv)) {
2306 goto oops_its_an_int;
2308 sv_setnv(TARG, -SvNV(sv));
2310 sv_setpvn(TARG, "-", 1);
2317 goto oops_its_an_int;
2318 sv_setnv(TARG, -SvNV(sv));
2330 dVAR; dSP; tryAMAGICunSET(not);
2331 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
2337 dVAR; dSP; dTARGET; tryAMAGICun(compl);
2342 if (PL_op->op_private & HINT_INTEGER) {
2343 const IV i = ~SvIV_nomg(sv);
2347 const UV u = ~SvUV_nomg(sv);
2356 (void)SvPV_nomg_const(sv,len); /* force check for uninit var */
2357 sv_setsv_nomg(TARG, sv);
2358 tmps = (U8*)SvPV_force(TARG, len);
2361 /* Calculate exact length, let's not estimate. */
2370 while (tmps < send) {
2371 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2372 tmps += UTF8SKIP(tmps);
2373 targlen += UNISKIP(~c);
2379 /* Now rewind strings and write them. */
2383 Newxz(result, targlen + 1, U8);
2384 while (tmps < send) {
2385 const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2386 tmps += UTF8SKIP(tmps);
2387 result = uvchr_to_utf8_flags(result, ~c, UNICODE_ALLOW_ANY);
2391 sv_setpvn(TARG, (char*)result, targlen);
2395 Newxz(result, nchar + 1, U8);
2396 while (tmps < send) {
2397 const U8 c = (U8)utf8n_to_uvchr(tmps, 0, &l, UTF8_ALLOW_ANY);
2398 tmps += UTF8SKIP(tmps);
2403 sv_setpvn(TARG, (char*)result, nchar);
2412 register long *tmpl;
2413 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2416 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
2421 for ( ; anum > 0; anum--, tmps++)
2430 /* integer versions of some of the above */
2434 dVAR; dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
2437 SETi( left * right );
2444 dVAR; dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
2448 DIE(aTHX_ "Illegal division by zero");
2449 value = POPi / value;
2458 /* This is the vanilla old i_modulo. */
2459 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2463 DIE(aTHX_ "Illegal modulus zero");
2464 SETi( left % right );
2469 #if defined(__GLIBC__) && IVSIZE == 8
2473 /* This is the i_modulo with the workaround for the _moddi3 bug
2474 * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
2475 * See below for pp_i_modulo. */
2476 dVAR; dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2480 DIE(aTHX_ "Illegal modulus zero");
2481 SETi( left % PERL_ABS(right) );
2489 dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2493 DIE(aTHX_ "Illegal modulus zero");
2494 /* The assumption is to use hereafter the old vanilla version... */
2496 PL_ppaddr[OP_I_MODULO] =
2498 /* .. but if we have glibc, we might have a buggy _moddi3
2499 * (at least glicb 2.2.5 is known to have this bug), in other
2500 * words our integer modulus with negative quad as the second
2501 * argument might be broken. Test for this and re-patch the
2502 * opcode dispatch table if that is the case, remembering to
2503 * also apply the workaround so that this first round works
2504 * right, too. See [perl #9402] for more information. */
2505 #if defined(__GLIBC__) && IVSIZE == 8
2509 /* Cannot do this check with inlined IV constants since
2510 * that seems to work correctly even with the buggy glibc. */
2512 /* Yikes, we have the bug.
2513 * Patch in the workaround version. */
2515 PL_ppaddr[OP_I_MODULO] =
2516 &Perl_pp_i_modulo_1;
2517 /* Make certain we work right this time, too. */
2518 right = PERL_ABS(right);
2522 SETi( left % right );
2529 dVAR; dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
2532 SETi( left + right );
2539 dVAR; dSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
2542 SETi( left - right );
2549 dVAR; dSP; tryAMAGICbinSET(lt,0);
2552 SETs(boolSV(left < right));
2559 dVAR; dSP; tryAMAGICbinSET(gt,0);
2562 SETs(boolSV(left > right));
2569 dVAR; dSP; tryAMAGICbinSET(le,0);
2572 SETs(boolSV(left <= right));
2579 dVAR; dSP; tryAMAGICbinSET(ge,0);
2582 SETs(boolSV(left >= right));
2589 dVAR; dSP; tryAMAGICbinSET(eq,0);
2592 SETs(boolSV(left == right));
2599 dVAR; dSP; tryAMAGICbinSET(ne,0);
2602 SETs(boolSV(left != right));
2609 dVAR; dSP; dTARGET; tryAMAGICbin(ncmp,0);
2616 else if (left < right)
2627 dVAR; dSP; dTARGET; tryAMAGICun(neg);
2632 /* High falutin' math. */
2636 dVAR; dSP; dTARGET; tryAMAGICbin(atan2,0);
2639 SETn(Perl_atan2(left, right));
2646 dVAR; dSP; dTARGET; tryAMAGICun(sin);
2648 const NV value = POPn;
2649 XPUSHn(Perl_sin(value));
2656 dVAR; dSP; dTARGET; tryAMAGICun(cos);
2658 const NV value = POPn;
2659 XPUSHn(Perl_cos(value));
2664 /* Support Configure command-line overrides for rand() functions.
2665 After 5.005, perhaps we should replace this by Configure support
2666 for drand48(), random(), or rand(). For 5.005, though, maintain
2667 compatibility by calling rand() but allow the user to override it.
2668 See INSTALL for details. --Andy Dougherty 15 July 1998
2670 /* Now it's after 5.005, and Configure supports drand48() and random(),
2671 in addition to rand(). So the overrides should not be needed any more.
2672 --Jarkko Hietaniemi 27 September 1998
2675 #ifndef HAS_DRAND48_PROTO
2676 extern double drand48 (void);
2689 if (!PL_srand_called) {
2690 (void)seedDrand01((Rand_seed_t)seed());
2691 PL_srand_called = TRUE;
2701 const UV anum = (MAXARG < 1) ? seed() : POPu;
2702 (void)seedDrand01((Rand_seed_t)anum);
2703 PL_srand_called = TRUE;
2710 dVAR; dSP; dTARGET; tryAMAGICun(exp);
2714 value = Perl_exp(value);
2722 dVAR; dSP; dTARGET; tryAMAGICun(log);
2724 const NV value = POPn;
2726 SET_NUMERIC_STANDARD();
2727 DIE(aTHX_ "Can't take log of %"NVgf, value);
2729 XPUSHn(Perl_log(value));
2736 dVAR; dSP; dTARGET; tryAMAGICun(sqrt);
2738 const NV value = POPn;
2740 SET_NUMERIC_STANDARD();
2741 DIE(aTHX_ "Can't take sqrt of %"NVgf, value);
2743 XPUSHn(Perl_sqrt(value));
2750 dVAR; dSP; dTARGET; tryAMAGICun(int);
2752 const IV iv = TOPi; /* attempt to convert to IV if possible. */
2753 /* XXX it's arguable that compiler casting to IV might be subtly
2754 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2755 else preferring IV has introduced a subtle behaviour change bug. OTOH
2756 relying on floating point to be accurate is a bug. */
2760 else if (SvIOK(TOPs)) {
2767 const NV value = TOPn;
2769 if (value < (NV)UV_MAX + 0.5) {
2772 SETn(Perl_floor(value));
2776 if (value > (NV)IV_MIN - 0.5) {
2779 SETn(Perl_ceil(value));
2789 dVAR; dSP; dTARGET; tryAMAGICun(abs);
2791 /* This will cache the NV value if string isn't actually integer */
2796 else if (SvIOK(TOPs)) {
2797 /* IVX is precise */
2799 SETu(TOPu); /* force it to be numeric only */
2807 /* 2s complement assumption. Also, not really needed as
2808 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
2814 const NV value = TOPn;
2829 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2833 SV* const sv = POPs;
2835 tmps = (SvPV_const(sv, len));
2837 /* If Unicode, try to downgrade
2838 * If not possible, croak. */
2839 SV* const tsv = sv_2mortal(newSVsv(sv));
2842 sv_utf8_downgrade(tsv, FALSE);
2843 tmps = SvPV_const(tsv, len);
2845 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2846 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
2859 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2863 SV* const sv = POPs;
2865 tmps = (SvPV_const(sv, len));
2867 /* If Unicode, try to downgrade
2868 * If not possible, croak. */
2869 SV* const tsv = sv_2mortal(newSVsv(sv));
2872 sv_utf8_downgrade(tsv, FALSE);
2873 tmps = SvPV_const(tsv, len);
2875 while (*tmps && len && isSPACE(*tmps))
2880 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2881 else if (*tmps == 'b')
2882 result_uv = grok_bin (tmps, &len, &flags, &result_nv);
2884 result_uv = grok_oct (tmps, &len, &flags, &result_nv);
2886 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
2900 SV * const sv = TOPs;
2903 SETi(sv_len_utf8(sv));
2919 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
2921 const I32 arybase = PL_curcop->cop_arybase;
2923 const char *repl = NULL;
2925 const int num_args = PL_op->op_private & 7;
2926 bool repl_need_utf8_upgrade = FALSE;
2927 bool repl_is_utf8 = FALSE;
2929 SvTAINTED_off(TARG); /* decontaminate */
2930 SvUTF8_off(TARG); /* decontaminate */
2934 repl = SvPV_const(repl_sv, repl_len);
2935 repl_is_utf8 = DO_UTF8(repl_sv) && SvCUR(repl_sv);
2945 sv_utf8_upgrade(sv);
2947 else if (DO_UTF8(sv))
2948 repl_need_utf8_upgrade = TRUE;
2950 tmps = SvPV_const(sv, curlen);
2952 utf8_curlen = sv_len_utf8(sv);
2953 if (utf8_curlen == curlen)
2956 curlen = utf8_curlen;
2961 if (pos >= arybase) {
2979 else if (len >= 0) {
2981 if (rem > (I32)curlen)
2996 Perl_croak(aTHX_ "substr outside of string");
2997 if (ckWARN(WARN_SUBSTR))
2998 Perl_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3002 const I32 upos = pos;
3003 const I32 urem = rem;
3005 sv_pos_u2b(sv, &pos, &rem);
3007 /* we either return a PV or an LV. If the TARG hasn't been used
3008 * before, or is of that type, reuse it; otherwise use a mortal
3009 * instead. Note that LVs can have an extended lifetime, so also
3010 * dont reuse if refcount > 1 (bug #20933) */
3011 if (SvTYPE(TARG) > SVt_NULL) {
3012 if ( (SvTYPE(TARG) == SVt_PVLV)
3013 ? (!lvalue || SvREFCNT(TARG) > 1)
3016 TARG = sv_newmortal();
3020 sv_setpvn(TARG, tmps, rem);
3021 #ifdef USE_LOCALE_COLLATE
3022 sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3027 SV* repl_sv_copy = NULL;
3029 if (repl_need_utf8_upgrade) {
3030 repl_sv_copy = newSVsv(repl_sv);
3031 sv_utf8_upgrade(repl_sv_copy);
3032 repl = SvPV_const(repl_sv_copy, repl_len);
3033 repl_is_utf8 = DO_UTF8(repl_sv_copy) && SvCUR(sv);
3035 sv_insert(sv, pos, rem, repl, repl_len);
3039 SvREFCNT_dec(repl_sv_copy);
3041 else if (lvalue) { /* it's an lvalue! */
3042 if (!SvGMAGICAL(sv)) {
3044 SvPV_force_nolen(sv);
3045 if (ckWARN(WARN_SUBSTR))
3046 Perl_warner(aTHX_ packWARN(WARN_SUBSTR),
3047 "Attempt to use reference as lvalue in substr");
3049 if (SvOK(sv)) /* is it defined ? */
3050 (void)SvPOK_only_UTF8(sv);
3052 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
3055 if (SvTYPE(TARG) < SVt_PVLV) {
3056 sv_upgrade(TARG, SVt_PVLV);
3057 sv_magic(TARG, NULL, PERL_MAGIC_substr, NULL, 0);
3063 if (LvTARG(TARG) != sv) {
3065 SvREFCNT_dec(LvTARG(TARG));
3066 LvTARG(TARG) = SvREFCNT_inc(sv);
3068 LvTARGOFF(TARG) = upos;
3069 LvTARGLEN(TARG) = urem;
3073 PUSHs(TARG); /* avoid SvSETMAGIC here */
3080 register const IV size = POPi;
3081 register const IV offset = POPi;
3082 register SV * const src = POPs;
3083 const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3085 SvTAINTED_off(TARG); /* decontaminate */
3086 if (lvalue) { /* it's an lvalue! */
3087 if (SvREFCNT(TARG) > 1) /* don't share the TARG (#20933) */
3088 TARG = sv_newmortal();
3089 if (SvTYPE(TARG) < SVt_PVLV) {
3090 sv_upgrade(TARG, SVt_PVLV);
3091 sv_magic(TARG, NULL, PERL_MAGIC_vec, NULL, 0);
3094 if (LvTARG(TARG) != src) {
3096 SvREFCNT_dec(LvTARG(TARG));
3097 LvTARG(TARG) = SvREFCNT_inc(src);
3099 LvTARGOFF(TARG) = offset;
3100 LvTARGLEN(TARG) = size;
3103 sv_setuv(TARG, do_vecget(src, offset, size));
3119 const I32 arybase = PL_curcop->cop_arybase;
3126 offset = POPi - arybase;
3129 big_utf8 = DO_UTF8(big);
3130 little_utf8 = DO_UTF8(little);
3131 if (big_utf8 ^ little_utf8) {
3132 /* One needs to be upgraded. */
3133 if (little_utf8 && !PL_encoding) {
3134 /* Well, maybe instead we might be able to downgrade the small
3137 const U8 * const little_pv = (U8*) SvPV_const(little, little_len);
3138 char * const pv = (char*)bytes_from_utf8(little_pv, &little_len,
3141 /* If the large string is ISO-8859-1, and it's not possible to
3142 convert the small string to ISO-8859-1, then there is no
3143 way that it could be found anywhere by index. */
3148 /* At this point, pv is a malloc()ed string. So donate it to temp
3149 to ensure it will get free()d */
3150 little = temp = newSV(0);
3151 sv_usepvn(temp, pv, little_len);
3153 SV * const bytes = little_utf8 ? big : little;
3155 const char * const p = SvPV_const(bytes, len);
3157 temp = newSVpvn(p, len);
3160 sv_recode_to_utf8(temp, PL_encoding);
3162 sv_utf8_upgrade(temp);
3172 if (big_utf8 && offset > 0)
3173 sv_pos_u2b(big, &offset, 0);
3174 tmps = SvPV_const(big, biglen);
3177 else if (offset > (I32)biglen)
3179 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
3180 (unsigned char*)tmps + biglen, little, 0)))
3183 retval = tmps2 - tmps;
3185 sv_pos_b2u(big, &retval);
3190 PUSHi(retval + arybase);
3206 const I32 arybase = PL_curcop->cop_arybase;
3214 big_utf8 = DO_UTF8(big);
3215 little_utf8 = DO_UTF8(little);
3216 if (big_utf8 ^ little_utf8) {
3217 /* One needs to be upgraded. */
3218 SV * const bytes = little_utf8 ? big : little;
3220 const char *p = SvPV_const(bytes, len);
3222 temp = newSVpvn(p, len);
3225 sv_recode_to_utf8(temp, PL_encoding);
3227 sv_utf8_upgrade(temp);
3236 tmps2 = SvPV_const(little, llen);
3237 tmps = SvPV_const(big, blen);
3242 /* arybase is in characters, like offset, so combine prior to the
3243 UTF-8 to bytes calculation. */
3245 if (offset > 0 && big_utf8)
3246 sv_pos_u2b(big, &offset, 0);
3247 /* llen is in bytes. */
3252 else if (offset > (I32)blen)
3254 if (!(tmps2 = rninstr(tmps, tmps + offset,
3255 tmps2, tmps2 + llen)))
3258 retval = tmps2 - tmps;
3259 if (retval > 0 && big_utf8)
3260 sv_pos_b2u(big, &retval);
3263 PUSHi(retval + arybase);
3269 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
3270 do_sprintf(TARG, SP-MARK, MARK+1);
3271 TAINT_IF(SvTAINTED(TARG));
3282 const U8 *s = (U8*)SvPV_const(argsv, len);
3285 if (PL_encoding && SvPOK(argsv) && !DO_UTF8(argsv)) {
3286 tmpsv = sv_2mortal(newSVsv(argsv));
3287 s = (U8*)sv_recode_to_utf8(tmpsv, PL_encoding);
3291 XPUSHu(DO_UTF8(argsv) ?
3292 utf8n_to_uvchr(s, UTF8_MAXBYTES, 0, UTF8_ALLOW_ANYUV) :
3304 if (((SvIOK_notUV(TOPs) && SvIV(TOPs) < 0)
3306 (SvNOK(TOPs) && SvNV(TOPs) < 0.0))) {
3308 value = POPu; /* chr(-1) eq chr(0xff), etc. */
3310 (void) POPs; /* Ignore the argument value. */
3311 value = UNICODE_REPLACEMENT;
3317 SvUPGRADE(TARG,SVt_PV);
3319 if (value > 255 && !IN_BYTES) {
3320 SvGROW(TARG, (STRLEN)UNISKIP(value)+1);
3321 tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3322 SvCUR_set(TARG, tmps - SvPVX_const(TARG));
3324 (void)SvPOK_only(TARG);
3333 *tmps++ = (char)value;
3335 (void)SvPOK_only(TARG);
3336 if (PL_encoding && !IN_BYTES) {
3337 sv_recode_to_utf8(TARG, PL_encoding);
3339 if (SvCUR(TARG) == 0 || !is_utf8_string((U8*)tmps, SvCUR(TARG)) ||
3340 memEQ(tmps, "\xef\xbf\xbd\0", 4)) {
3344 *tmps++ = (U8)UTF8_EIGHT_BIT_HI(value);
3345 *tmps++ = (U8)UTF8_EIGHT_BIT_LO(value);
3360 const char *tmps = SvPV_const(left, len);
3362 if (DO_UTF8(left)) {
3363 /* If Unicode, try to downgrade.
3364 * If not possible, croak.
3365 * Yes, we made this up. */
3366 SV* const tsv = sv_2mortal(newSVsv(left));
3369 sv_utf8_downgrade(tsv, FALSE);
3370 tmps = SvPV_const(tsv, len);
3372 # ifdef USE_ITHREADS
3374 if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3375 /* This should be threadsafe because in ithreads there is only
3376 * one thread per interpreter. If this would not be true,
3377 * we would need a mutex to protect this malloc. */
3378 PL_reentrant_buffer->_crypt_struct_buffer =
3379 (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3380 #if defined(__GLIBC__) || defined(__EMX__)
3381 if (PL_reentrant_buffer->_crypt_struct_buffer) {
3382 PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3383 /* work around glibc-2.2.5 bug */
3384 PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3388 # endif /* HAS_CRYPT_R */
3389 # endif /* USE_ITHREADS */
3391 sv_setpv(TARG, fcrypt(tmps, SvPV_nolen_const(right)));
3393 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV_nolen_const(right)));
3399 "The crypt() function is unimplemented due to excessive paranoia.");
3410 const int op_type = PL_op->op_type;
3414 (s = (const U8*)SvPV_nomg_const(sv, slen)) && slen &&
3415 UTF8_IS_START(*s)) {
3416 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3420 utf8_to_uvchr(s, &ulen);
3421 if (op_type == OP_UCFIRST) {
3422 toTITLE_utf8(s, tmpbuf, &tculen);
3424 toLOWER_utf8(s, tmpbuf, &tculen);
3427 if (!SvPADTMP(sv) || SvREADONLY(sv) || ulen != tculen) {
3429 /* slen is the byte length of the whole SV.
3430 * ulen is the byte length of the original Unicode character
3431 * stored as UTF-8 at s.
3432 * tculen is the byte length of the freshly titlecased (or
3433 * lowercased) Unicode character stored as UTF-8 at tmpbuf.
3434 * We first set the result to be the titlecased (/lowercased)
3435 * character, and then append the rest of the SV data. */
3436 sv_setpvn(TARG, (char*)tmpbuf, tculen);
3438 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3443 s = (U8*)SvPV_force_nomg(sv, slen);
3444 Copy(tmpbuf, s, tculen, U8);
3449 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3451 SvUTF8_off(TARG); /* decontaminate */
3452 sv_setsv_nomg(TARG, sv);
3456 s1 = (U8*)SvPV_force_nomg(sv, slen);
3458 if (IN_LOCALE_RUNTIME) {
3461 *s1 = (op_type == OP_UCFIRST)
3462 ? toUPPER_LC(*s1) : toLOWER_LC(*s1);
3465 *s1 = (op_type == OP_UCFIRST) ? toUPPER(*s1) : toLOWER(*s1);
3486 U8 tmpbuf[UTF8_MAXBYTES+1];
3488 s = (const U8*)SvPV_nomg_const(sv,len);
3490 SvUTF8_off(TARG); /* decontaminate */
3491 sv_setpvn(TARG, "", 0);
3495 STRLEN min = len + 1;
3497 SvUPGRADE(TARG, SVt_PV);
3499 (void)SvPOK_only(TARG);
3500 d = (U8*)SvPVX(TARG);
3503 STRLEN u = UTF8SKIP(s);
3505 toUPPER_utf8(s, tmpbuf, &ulen);
3506 if (ulen > u && (SvLEN(TARG) < (min += ulen - u))) {
3507 /* If the eventually required minimum size outgrows
3508 * the available space, we need to grow. */
3509 const UV o = d - (U8*)SvPVX_const(TARG);
3511 /* If someone uppercases one million U+03B0s we
3512 * SvGROW() one million times. Or we could try
3513 * guessing how much to allocate without allocating
3514 * too much. Such is life. */
3516 d = (U8*)SvPVX(TARG) + o;
3518 Copy(tmpbuf, d, ulen, U8);
3524 SvCUR_set(TARG, d - (U8*)SvPVX_const(TARG));
3530 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3532 SvUTF8_off(TARG); /* decontaminate */
3533 sv_setsv_nomg(TARG, sv);
3537 s = (U8*)SvPV_force_nomg(sv, len);
3539 register const U8 *send = s + len;
3541 if (IN_LOCALE_RUNTIME) {
3544 for (; s < send; s++)
3545 *s = toUPPER_LC(*s);
3548 for (; s < send; s++)
3571 U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3573 s = (const U8*)SvPV_nomg_const(sv,len);
3575 SvUTF8_off(TARG); /* decontaminate */
3576 sv_setpvn(TARG, "", 0);
3580 STRLEN min = len + 1;
3582 SvUPGRADE(TARG, SVt_PV);
3584 (void)SvPOK_only(TARG);
3585 d = (U8*)SvPVX(TARG);
3588 const STRLEN u = UTF8SKIP(s);
3589 const UV uv = toLOWER_utf8(s, tmpbuf, &ulen);
3591 #define GREEK_CAPITAL_LETTER_SIGMA 0x03A3 /* Unicode U+03A3 */
3592 if (uv == GREEK_CAPITAL_LETTER_SIGMA) {
3594 * Now if the sigma is NOT followed by
3595 * /$ignorable_sequence$cased_letter/;
3596 * and it IS preceded by
3597 * /$cased_letter$ignorable_sequence/;
3598 * where $ignorable_sequence is
3599 * [\x{2010}\x{AD}\p{Mn}]*
3600 * and $cased_letter is
3601 * [\p{Ll}\p{Lo}\p{Lt}]
3602 * then it should be mapped to 0x03C2,
3603 * (GREEK SMALL LETTER FINAL SIGMA),
3604 * instead of staying 0x03A3.
3605 * "should be": in other words,
3606 * this is not implemented yet.
3607 * See lib/unicore/SpecialCasing.txt.
3610 if (ulen > u && (SvLEN(TARG) < (min += ulen - u))) {
3611 /* If the eventually required minimum size outgrows
3612 * the available space, we need to grow. */
3613 const UV o = d - (U8*)SvPVX_const(TARG);
3615 /* If someone lowercases one million U+0130s we
3616 * SvGROW() one million times. Or we could try
3617 * guessing how much to allocate without allocating.
3618 * too much. Such is life. */
3620 d = (U8*)SvPVX(TARG) + o;
3622 Copy(tmpbuf, d, ulen, U8);
3628 SvCUR_set(TARG, d - (U8*)SvPVX_const(TARG));
3634 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3636 SvUTF8_off(TARG); /* decontaminate */
3637 sv_setsv_nomg(TARG, sv);
3642 s = (U8*)SvPV_force_nomg(sv, len);
3644 register const U8 * const send = s + len;
3646 if (IN_LOCALE_RUNTIME) {
3649 for (; s < send; s++)
3650 *s = toLOWER_LC(*s);
3653 for (; s < send; s++)
3665 SV * const sv = TOPs;
3667 register const char *s = SvPV_const(sv,len);
3669 SvUTF8_off(TARG); /* decontaminate */
3672 SvUPGRADE(TARG, SVt_PV);
3673 SvGROW(TARG, (len * 2) + 1);
3677 if (UTF8_IS_CONTINUED(*s)) {
3678 STRLEN ulen = UTF8SKIP(s);
3702 SvCUR_set(TARG, d - SvPVX_const(TARG));
3703 (void)SvPOK_only_UTF8(TARG);
3706 sv_setpvn(TARG, s, len);
3708 if (SvSMAGICAL(TARG))
3717 dVAR; dSP; dMARK; dORIGMARK;
3718 register AV* const av = (AV*)POPs;
3719 register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3721 if (SvTYPE(av) == SVt_PVAV) {
3722 const I32 arybase = PL_curcop->cop_arybase;
3723 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
3726 for (svp = MARK + 1; svp <= SP; svp++) {
3727 const I32 elem = SvIVx(*svp);
3731 if (max > AvMAX(av))
3734 while (++MARK <= SP) {
3736 I32 elem = SvIVx(*MARK);
3740 svp = av_fetch(av, elem, lval);
3742 if (!svp || *svp == &PL_sv_undef)
3743 DIE(aTHX_ PL_no_aelem, elem);
3744 if (PL_op->op_private & OPpLVAL_INTRO)
3745 save_aelem(av, elem, svp);
3747 *MARK = svp ? *svp : &PL_sv_undef;
3750 if (GIMME != G_ARRAY) {
3752 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
3758 /* Associative arrays. */
3764 HV * const hash = (HV*)POPs;
3766 const I32 gimme = GIMME_V;
3769 /* might clobber stack_sp */
3770 entry = hv_iternext(hash);
3775 SV* const sv = hv_iterkeysv(entry);
3776 PUSHs(sv); /* won't clobber stack_sp */
3777 if (gimme == G_ARRAY) {
3780 /* might clobber stack_sp */
3781 val = hv_iterval(hash, entry);
3786 else if (gimme == G_SCALAR)
3796 const I32 gimme = GIMME_V;
3797 const I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
3799 if (PL_op->op_private & OPpSLICE) {
3801 HV * const hv = (HV*)POPs;
3802 const U32 hvtype = SvTYPE(hv);
3803 if (hvtype == SVt_PVHV) { /* hash element */
3804 while (++MARK <= SP) {
3805 SV * const sv = hv_delete_ent(hv, *MARK, discard, 0);
3806 *MARK = sv ? sv : &PL_sv_undef;
3809 else if (hvtype == SVt_PVAV) { /* array element */
3810 if (PL_op->op_flags & OPf_SPECIAL) {
3811 while (++MARK <= SP) {
3812 SV * const sv = av_delete((AV*)hv, SvIV(*MARK), discard);
3813 *MARK = sv ? sv : &PL_sv_undef;
3818 DIE(aTHX_ "Not a HASH reference");
3821 else if (gimme == G_SCALAR) {
3826 *++MARK = &PL_sv_undef;
3832 HV * const hv = (HV*)POPs;
3834 if (SvTYPE(hv) == SVt_PVHV)
3835 sv = hv_delete_ent(hv, keysv, discard, 0);
3836 else if (SvTYPE(hv) == SVt_PVAV) {
3837 if (PL_op->op_flags & OPf_SPECIAL)
3838 sv = av_delete((AV*)hv, SvIV(keysv), discard);
3840 DIE(aTHX_ "panic: avhv_delete no longer supported");
3843 DIE(aTHX_ "Not a HASH reference");
3859 if (PL_op->op_private & OPpEXISTS_SUB) {
3861 SV * const sv = POPs;
3862 CV * const cv = sv_2cv(sv, &hv, &gv, 0);
3865 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
3871 if (SvTYPE(hv) == SVt_PVHV) {
3872 if (hv_exists_ent(hv, tmpsv, 0))
3875 else if (SvTYPE(hv) == SVt_PVAV) {
3876 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
3877 if (av_exists((AV*)hv, SvIV(tmpsv)))
3882 DIE(aTHX_ "Not a HASH reference");
3889 dVAR; dSP; dMARK; dORIGMARK;
3890 register HV * const hv = (HV*)POPs;
3891 register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3892 const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
3893 bool other_magic = FALSE;
3899 other_magic = mg_find((SV*)hv, PERL_MAGIC_env) ||
3900 ((mg = mg_find((SV*)hv, PERL_MAGIC_tied))
3901 /* Try to preserve the existenceness of a tied hash
3902 * element by using EXISTS and DELETE if possible.
3903 * Fallback to FETCH and STORE otherwise */
3904 && (stash = SvSTASH(SvRV(SvTIED_obj((SV*)hv, mg))))
3905 && gv_fetchmethod_autoload(stash, "EXISTS", TRUE)
3906 && gv_fetchmethod_autoload(stash, "DELETE", TRUE));
3909 while (++MARK <= SP) {
3910 SV * const keysv = *MARK;
3913 bool preeminent = FALSE;
3916 preeminent = SvRMAGICAL(hv) && !other_magic ? 1 :
3917 hv_exists_ent(hv, keysv, 0);
3920 he = hv_fetch_ent(hv, keysv, lval, 0);
3921 svp = he ? &HeVAL(he) : 0;
3924 if (!svp || *svp == &PL_sv_undef) {
3925 DIE(aTHX_ PL_no_helem_sv, keysv);
3929 save_helem(hv, keysv, svp);
3932 const char *key = SvPV_const(keysv, keylen);
3933 SAVEDELETE(hv, savepvn(key,keylen), keylen);
3937 *MARK = svp ? *svp : &PL_sv_undef;
3939 if (GIMME != G_ARRAY) {
3941 *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
3947 /* List operators. */
3952 if (GIMME != G_ARRAY) {
3954 *MARK = *SP; /* unwanted list, return last item */
3956 *MARK = &PL_sv_undef;
3966 SV ** const lastrelem = PL_stack_sp;
3967 SV ** const lastlelem = PL_stack_base + POPMARK;
3968 SV ** const firstlelem = PL_stack_base + POPMARK + 1;
3969 register SV ** const firstrelem = lastlelem + 1;
3970 const I32 arybase = PL_curcop->cop_arybase;
3971 I32 is_something_there = PL_op->op_flags & OPf_MOD;
3973 register const I32 max = lastrelem - lastlelem;
3974 register SV **lelem;
3976 if (GIMME != G_ARRAY) {
3977 I32 ix = SvIVx(*lastlelem);
3982 if (ix < 0 || ix >= max)
3983 *firstlelem = &PL_sv_undef;
3985 *firstlelem = firstrelem[ix];
3991 SP = firstlelem - 1;
3995 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
3996 I32 ix = SvIVx(*lelem);
4001 if (ix < 0 || ix >= max)
4002 *lelem = &PL_sv_undef;
4004 is_something_there = TRUE;
4005 if (!(*lelem = firstrelem[ix]))
4006 *lelem = &PL_sv_undef;
4009 if (is_something_there)
4012 SP = firstlelem - 1;
4018 dVAR; dSP; dMARK; dORIGMARK;
4019 const I32 items = SP - MARK;
4020 SV * const av = sv_2mortal((SV*)av_make(items, MARK+1));
4021 SP = ORIGMARK; /* av_make() might realloc stack_sp */
4028 dVAR; dSP; dMARK; dORIGMARK;
4029 HV* const hv = (HV*)sv_2mortal((SV*)newHV());
4032 SV * const key = *++MARK;
4033 SV * const val = newSV(0);
4035 sv_setsv(val, *++MARK);
4036 else if (ckWARN(WARN_MISC))
4037 Perl_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
4038 (void)hv_store_ent(hv,key,val,0);
4047 dVAR; dSP; dMARK; dORIGMARK;
4048 register AV *ary = (AV*)*++MARK;
4052 register I32 offset;
4053 register I32 length;
4057 SV **tmparyval = NULL;
4058 const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4061 *MARK-- = SvTIED_obj((SV*)ary, mg);
4065 call_method("SPLICE",GIMME_V);
4074 offset = i = SvIVx(*MARK);
4076 offset += AvFILLp(ary) + 1;
4078 offset -= PL_curcop->cop_arybase;
4080 DIE(aTHX_ PL_no_aelem, i);
4082 length = SvIVx(*MARK++);
4084 length += AvFILLp(ary) - offset + 1;
4090 length = AvMAX(ary) + 1; /* close enough to infinity */
4094 length = AvMAX(ary) + 1;
4096 if (offset > AvFILLp(ary) + 1) {
4097 if (ckWARN(WARN_MISC))
4098 Perl_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
4099 offset = AvFILLp(ary) + 1;
4101 after = AvFILLp(ary) + 1 - (offset + length);
4102 if (after < 0) { /* not that much array */
4103 length += after; /* offset+length now in array */
4109 /* At this point, MARK .. SP-1 is our new LIST */
4112 diff = newlen - length;
4113 if (newlen && !AvREAL(ary) && AvREIFY(ary))
4116 /* make new elements SVs now: avoid problems if they're from the array */
4117 for (dst = MARK, i = newlen; i; i--) {
4118 SV * const h = *dst;
4119 *dst++ = newSVsv(h);
4122 if (diff < 0) { /* shrinking the area */
4124 Newx(tmparyval, newlen, SV*); /* so remember insertion */
4125 Copy(MARK, tmparyval, newlen, SV*);
4128 MARK = ORIGMARK + 1;
4129 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4130 MEXTEND(MARK, length);
4131 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
4133 EXTEND_MORTAL(length);
4134 for (i = length, dst = MARK; i; i--) {
4135 sv_2mortal(*dst); /* free them eventualy */
4142 *MARK = AvARRAY(ary)[offset+length-1];
4145 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
4146 SvREFCNT_dec(*dst++); /* free them now */
4149 AvFILLp(ary) += diff;
4151 /* pull up or down? */
4153 if (offset < after) { /* easier to pull up */
4154 if (offset) { /* esp. if nothing to pull */
4155 src = &AvARRAY(ary)[offset-1];
4156 dst = src - diff; /* diff is negative */
4157 for (i = offset; i > 0; i--) /* can't trust Copy */
4161 SvPV_set(ary, (char*)(AvARRAY(ary) - diff)); /* diff is negative */
4165 if (after) { /* anything to pull down? */
4166 src = AvARRAY(ary) + offset + length;
4167 dst = src + diff; /* diff is negative */
4168 Move(src, dst, after, SV*);
4170 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
4171 /* avoid later double free */
4175 dst[--i] = &PL_sv_undef;
4178 Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
4179 Safefree(tmparyval);
4182 else { /* no, expanding (or same) */
4184 Newx(tmparyval, length, SV*); /* so remember deletion */
4185 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
4188 if (diff > 0) { /* expanding */
4190 /* push up or down? */
4192 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
4196 Move(src, dst, offset, SV*);
4198 SvPV_set(ary, (char*)(AvARRAY(ary) - diff));/* diff is positive */
4200 AvFILLp(ary) += diff;
4203 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
4204 av_extend(ary, AvFILLp(ary) + diff);
4205 AvFILLp(ary) += diff;
4208 dst = AvARRAY(ary) + AvFILLp(ary);
4210 for (i = after; i; i--) {
4218 Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
4221 MARK = ORIGMARK + 1;
4222 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4224 Copy(tmparyval, MARK, length, SV*);
4226 EXTEND_MORTAL(length);
4227 for (i = length, dst = MARK; i; i--) {
4228 sv_2mortal(*dst); /* free them eventualy */
4232 Safefree(tmparyval);
4236 else if (length--) {
4237 *MARK = tmparyval[length];
4240 while (length-- > 0)
4241 SvREFCNT_dec(tmparyval[length]);
4243 Safefree(tmparyval);
4246 *MARK = &PL_sv_undef;
4254 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4255 register AV *ary = (AV*)*++MARK;
4256 const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4259 *MARK-- = SvTIED_obj((SV*)ary, mg);
4263 call_method("PUSH",G_SCALAR|G_DISCARD);
4267 PUSHi( AvFILL(ary) + 1 );
4270 for (++MARK; MARK <= SP; MARK++) {
4271 SV * const sv = newSV(0);
4273 sv_setsv(sv, *MARK);
4274 av_store(ary, AvFILLp(ary)+1, sv);
4277 PUSHi( AvFILLp(ary) + 1 );
4286 AV * const av = (AV*)POPs;
4287 SV * const sv = av_pop(av);
4289 (void)sv_2mortal(sv);
4298 AV * const av = (AV*)POPs;
4299 SV * const sv = av_shift(av);
4304 (void)sv_2mortal(sv);
4311 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4312 register AV *ary = (AV*)*++MARK;
4313 const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4316 *MARK-- = SvTIED_obj((SV*)ary, mg);
4320 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
4326 av_unshift(ary, SP - MARK);
4328 SV * const sv = newSVsv(*++MARK);
4329 (void)av_store(ary, i++, sv);
4333 PUSHi( AvFILL(ary) + 1 );
4340 SV ** const oldsp = SP;
4342 if (GIMME == G_ARRAY) {
4345 register SV * const tmp = *MARK;
4349 /* safe as long as stack cannot get extended in the above */
4354 register char *down;
4360 SvUTF8_off(TARG); /* decontaminate */
4362 do_join(TARG, &PL_sv_no, MARK, SP);
4364 sv_setsv(TARG, (SP > MARK)
4366 : (padoff_du = find_rundefsvoffset(),
4367 (padoff_du == NOT_IN_PAD || PAD_COMPNAME_FLAGS(padoff_du) & SVpad_OUR)
4368 ? DEFSV : PAD_SVl(padoff_du)));
4369 up = SvPV_force(TARG, len);
4371 if (DO_UTF8(TARG)) { /* first reverse each character */
4372 U8* s = (U8*)SvPVX(TARG);
4373 const U8* send = (U8*)(s + len);
4375 if (UTF8_IS_INVARIANT(*s)) {
4380 if (!utf8_to_uvchr(s, 0))
4384 down = (char*)(s - 1);
4385 /* reverse this character */
4389 *down-- = (char)tmp;
4395 down = SvPVX(TARG) + len - 1;
4399 *down-- = (char)tmp;
4401 (void)SvPOK_only_UTF8(TARG);
4413 register IV limit = POPi; /* note, negative is forever */
4414 SV * const sv = POPs;
4416 register const char *s = SvPV_const(sv, len);
4417 const bool do_utf8 = DO_UTF8(sv);
4418 const char *strend = s + len;
4420 register REGEXP *rx;
4422 register const char *m;
4424 const STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (strend - s);
4425 I32 maxiters = slen + 10;
4427 const I32 origlimit = limit;
4430 const I32 gimme = GIMME_V;
4431 const I32 oldsave = PL_savestack_ix;
4432 I32 make_mortal = 1;
4434 MAGIC *mg = (MAGIC *) NULL;
4437 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4442 DIE(aTHX_ "panic: pp_split");
4445 TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
4446 (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
4448 RX_MATCH_UTF8_set(rx, do_utf8);
4450 if (pm->op_pmreplroot) {
4452 ary = GvAVn((GV*)PAD_SVl(INT2PTR(PADOFFSET, pm->op_pmreplroot)));
4454 ary = GvAVn((GV*)pm->op_pmreplroot);
4457 else if (gimme != G_ARRAY)
4458 ary = GvAVn(PL_defgv);
4461 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4467 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4469 XPUSHs(SvTIED_obj((SV*)ary, mg));
4476 for (i = AvFILLp(ary); i >= 0; i--)
4477 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
4479 /* temporarily switch stacks */
4480 SAVESWITCHSTACK(PL_curstack, ary);
4484 base = SP - PL_stack_base;
4486 if (pm->op_pmflags & PMf_SKIPWHITE) {
4487 if (pm->op_pmflags & PMf_LOCALE) {
4488 while (isSPACE_LC(*s))
4496 if (pm->op_pmflags & PMf_MULTILINE) {
4501 limit = maxiters + 2;
4502 if (pm->op_pmflags & PMf_WHITE) {
4505 while (m < strend &&
4506 !((pm->op_pmflags & PMf_LOCALE)
4507 ? isSPACE_LC(*m) : isSPACE(*m)))
4512 dstr = newSVpvn(s, m-s);
4516 (void)SvUTF8_on(dstr);
4520 while (s < strend &&
4521 ((pm->op_pmflags & PMf_LOCALE)
4522 ? isSPACE_LC(*s) : isSPACE(*s)))
4526 else if (rx->precomp[0] == '^' && rx->precomp[1] == '\0') {
4528 for (m = s; m < strend && *m != '\n'; m++)
4533 dstr = newSVpvn(s, m-s);
4537 (void)SvUTF8_on(dstr);
4542 else if (do_utf8 == ((rx->reganch & ROPT_UTF8) != 0) &&
4543 (rx->reganch & RE_USE_INTUIT) && !rx->nparens
4544 && (rx->reganch & ROPT_CHECK_ALL)
4545 && !(rx->reganch & ROPT_ANCH)) {
4546 const int tail = (rx->reganch & RE_INTUIT_TAIL);
4547 SV * const csv = CALLREG_INTUIT_STRING(aTHX_ rx);
4550 if (len == 1 && !(rx->reganch & ROPT_UTF8) && !tail) {
4551 const char c = *SvPV_nolen_const(csv);
4553 for (m = s; m < strend && *m != c; m++)
4557 dstr = newSVpvn(s, m-s);
4561 (void)SvUTF8_on(dstr);
4563 /* The rx->minlen is in characters but we want to step
4564 * s ahead by bytes. */
4566 s = (char*)utf8_hop((U8*)m, len);
4568 s = m + len; /* Fake \n at the end */
4572 while (s < strend && --limit &&
4573 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
4574 csv, multiline ? FBMrf_MULTILINE : 0)) )
4576 dstr = newSVpvn(s, m-s);
4580 (void)SvUTF8_on(dstr);
4582 /* The rx->minlen is in characters but we want to step
4583 * s ahead by bytes. */
4585 s = (char*)utf8_hop((U8*)m, len);
4587 s = m + len; /* Fake \n at the end */
4592 maxiters += slen * rx->nparens;
4593 while (s < strend && --limit)
4597 rex_return = CALLREGEXEC(aTHX_ rx, (char*)s, (char*)strend, (char*)orig, 1 ,
4600 if (rex_return == 0)
4602 TAINT_IF(RX_MATCH_TAINTED(rx));
4603 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
4608 strend = s + (strend - m);
4610 m = rx->startp[0] + orig;
4611 dstr = newSVpvn(s, m-s);
4615 (void)SvUTF8_on(dstr);
4619 for (i = 1; i <= (I32)rx->nparens; i++) {
4620 s = rx->startp[i] + orig;
4621 m = rx->endp[i] + orig;
4623 /* japhy (07/27/01) -- the (m && s) test doesn't catch
4624 parens that didn't match -- they should be set to
4625 undef, not the empty string */
4626 if (m >= orig && s >= orig) {
4627 dstr = newSVpvn(s, m-s);
4630 dstr = &PL_sv_undef; /* undef, not "" */
4634 (void)SvUTF8_on(dstr);
4638 s = rx->endp[0] + orig;
4642 iters = (SP - PL_stack_base) - base;
4643 if (iters > maxiters)
4644 DIE(aTHX_ "Split loop");
4646 /* keep field after final delim? */
4647 if (s < strend || (iters && origlimit)) {
4648 const STRLEN l = strend - s;
4649 dstr = newSVpvn(s, l);
4653 (void)SvUTF8_on(dstr);
4657 else if (!origlimit) {
4658 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
4659 if (TOPs && !make_mortal)
4662 *SP-- = &PL_sv_undef;
4667 LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */
4671 if (SvSMAGICAL(ary)) {
4676 if (gimme == G_ARRAY) {
4678 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4686 call_method("PUSH",G_SCALAR|G_DISCARD);
4689 if (gimme == G_ARRAY) {
4691 /* EXTEND should not be needed - we just popped them */
4693 for (i=0; i < iters; i++) {
4694 SV **svp = av_fetch(ary, i, FALSE);
4695 PUSHs((svp) ? *svp : &PL_sv_undef);
4702 if (gimme == G_ARRAY)
4718 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
4719 || SvTYPE(retsv) == SVt_PVCV) {
4720 retsv = refto(retsv);
4727 PP(unimplemented_op)
4730 DIE(aTHX_ "panic: unimplemented op %s (#%d) called", OP_NAME(PL_op),
4736 * c-indentation-style: bsd
4738 * indent-tabs-mode: t
4741 * ex: set ts=8 sts=4 sw=4 noet: