3 * Copyright (c) 1991-2002, Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
11 * "It's a big house this, and very peculiar. Always a bit more to discover,
12 * and no knowing what you'll find around a corner. And Elves, sir!" --Samwise
22 /* XXX I can't imagine anyone who doesn't have this actually _needs_
23 it, since pid_t is an integral type.
26 #ifdef NEED_GETPID_PROTO
27 extern Pid_t getpid (void);
30 /* variations on pp_null */
35 if (GIMME_V == G_SCALAR)
51 if (PL_op->op_private & OPpLVAL_INTRO)
52 SAVECLEARSV(PL_curpad[PL_op->op_targ]);
54 if (PL_op->op_flags & OPf_REF) {
58 if (GIMME == G_SCALAR)
59 Perl_croak(aTHX_ "Can't return array to lvalue scalar context");
64 if (gimme == G_ARRAY) {
65 I32 maxarg = AvFILL((AV*)TARG) + 1;
67 if (SvMAGICAL(TARG)) {
69 for (i=0; i < (U32)maxarg; i++) {
70 SV **svp = av_fetch((AV*)TARG, i, FALSE);
71 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
75 Copy(AvARRAY((AV*)TARG), SP+1, maxarg, SV*);
79 else if (gimme == G_SCALAR) {
80 SV* sv = sv_newmortal();
81 I32 maxarg = AvFILL((AV*)TARG) + 1;
94 if (PL_op->op_private & OPpLVAL_INTRO)
95 SAVECLEARSV(PL_curpad[PL_op->op_targ]);
96 if (PL_op->op_flags & OPf_REF)
99 if (GIMME == G_SCALAR)
100 Perl_croak(aTHX_ "Can't return hash to lvalue scalar context");
104 if (gimme == G_ARRAY) {
107 else if (gimme == G_SCALAR) {
108 SV* sv = sv_newmortal();
109 if (HvFILL((HV*)TARG))
110 Perl_sv_setpvf(aTHX_ sv, "%ld/%ld",
111 (long)HvFILL((HV*)TARG), (long)HvMAX((HV*)TARG) + 1);
121 DIE(aTHX_ "NOT IMPL LINE %d",__LINE__);
132 tryAMAGICunDEREF(to_gv);
135 if (SvTYPE(sv) == SVt_PVIO) {
136 GV *gv = (GV*) sv_newmortal();
137 gv_init(gv, 0, "", 0, 0);
138 GvIOp(gv) = (IO *)sv;
139 (void)SvREFCNT_inc(sv);
142 else if (SvTYPE(sv) != SVt_PVGV)
143 DIE(aTHX_ "Not a GLOB reference");
146 if (SvTYPE(sv) != SVt_PVGV) {
150 if (SvGMAGICAL(sv)) {
155 if (!SvOK(sv) && sv != &PL_sv_undef) {
156 /* If this is a 'my' scalar and flag is set then vivify
159 if (PL_op->op_private & OPpDEREF) {
162 if (cUNOP->op_targ) {
164 SV *namesv = PL_curpad[cUNOP->op_targ];
165 name = SvPV(namesv, len);
166 gv = (GV*)NEWSV(0,0);
167 gv_init(gv, CopSTASH(PL_curcop), name, len, 0);
170 name = CopSTASHPV(PL_curcop);
173 if (SvTYPE(sv) < SVt_RV)
174 sv_upgrade(sv, SVt_RV);
180 if (PL_op->op_flags & OPf_REF ||
181 PL_op->op_private & HINT_STRICT_REFS)
182 DIE(aTHX_ PL_no_usym, "a symbol");
183 if (ckWARN(WARN_UNINITIALIZED))
188 if ((PL_op->op_flags & OPf_SPECIAL) &&
189 !(PL_op->op_flags & OPf_MOD))
191 sv = (SV*)gv_fetchpv(sym, FALSE, SVt_PVGV);
193 && (!is_gv_magical(sym,len,0)
194 || !(sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV))))
200 if (PL_op->op_private & HINT_STRICT_REFS)
201 DIE(aTHX_ PL_no_symref, sym, "a symbol");
202 sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV);
206 if (PL_op->op_private & OPpLVAL_INTRO)
207 save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
218 tryAMAGICunDEREF(to_sv);
221 switch (SvTYPE(sv)) {
225 DIE(aTHX_ "Not a SCALAR reference");
233 if (SvTYPE(gv) != SVt_PVGV) {
234 if (SvGMAGICAL(sv)) {
240 if (PL_op->op_flags & OPf_REF ||
241 PL_op->op_private & HINT_STRICT_REFS)
242 DIE(aTHX_ PL_no_usym, "a SCALAR");
243 if (ckWARN(WARN_UNINITIALIZED))
248 if ((PL_op->op_flags & OPf_SPECIAL) &&
249 !(PL_op->op_flags & OPf_MOD))
251 gv = (GV*)gv_fetchpv(sym, FALSE, SVt_PV);
253 && (!is_gv_magical(sym,len,0)
254 || !(gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV))))
260 if (PL_op->op_private & HINT_STRICT_REFS)
261 DIE(aTHX_ PL_no_symref, sym, "a SCALAR");
262 gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV);
267 if (PL_op->op_flags & OPf_MOD) {
268 if (PL_op->op_private & OPpLVAL_INTRO)
269 sv = save_scalar((GV*)TOPs);
270 else if (PL_op->op_private & OPpDEREF)
271 vivify_ref(sv, PL_op->op_private & OPpDEREF);
281 SV *sv = AvARYLEN(av);
283 AvARYLEN(av) = sv = NEWSV(0,0);
284 sv_upgrade(sv, SVt_IV);
285 sv_magic(sv, (SV*)av, PERL_MAGIC_arylen, Nullch, 0);
293 dSP; dTARGET; dPOPss;
295 if (PL_op->op_flags & OPf_MOD || LVRET) {
296 if (SvTYPE(TARG) < SVt_PVLV) {
297 sv_upgrade(TARG, SVt_PVLV);
298 sv_magic(TARG, Nullsv, PERL_MAGIC_pos, Nullch, 0);
302 if (LvTARG(TARG) != sv) {
304 SvREFCNT_dec(LvTARG(TARG));
305 LvTARG(TARG) = SvREFCNT_inc(sv);
307 PUSHs(TARG); /* no SvSETMAGIC */
313 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
314 mg = mg_find(sv, PERL_MAGIC_regex_global);
315 if (mg && mg->mg_len >= 0) {
319 PUSHi(i + PL_curcop->cop_arybase);
333 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
334 /* (But not in defined().) */
335 CV *cv = sv_2cv(TOPs, &stash, &gv, !(PL_op->op_flags & OPf_SPECIAL));
338 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
339 if ((PL_op->op_private & OPpLVAL_INTRO)) {
340 if (gv && GvCV(gv) == cv && (gv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv), FALSE)))
343 DIE(aTHX_ "Can't modify non-lvalue subroutine call");
347 cv = (CV*)&PL_sv_undef;
361 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
362 char *s = SvPVX(TOPs);
363 if (strnEQ(s, "CORE::", 6)) {
366 code = keyword(s + 6, SvCUR(TOPs) - 6);
367 if (code < 0) { /* Overridable. */
368 #define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
369 int i = 0, n = 0, seen_question = 0;
371 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
373 if (code == -KEY_chop || code == -KEY_chomp)
375 while (i < MAXO) { /* The slow way. */
376 if (strEQ(s + 6, PL_op_name[i])
377 || strEQ(s + 6, PL_op_desc[i]))
383 goto nonesuch; /* Should not happen... */
385 oa = PL_opargs[i] >> OASHIFT;
387 if (oa & OA_OPTIONAL && !seen_question) {
391 else if (n && str[0] == ';' && seen_question)
392 goto set; /* XXXX system, exec */
393 if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
394 && (oa & (OA_OPTIONAL - 1)) <= OA_SCALARREF
395 /* But globs are already references (kinda) */
396 && (oa & (OA_OPTIONAL - 1)) != OA_FILEREF
400 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
404 ret = sv_2mortal(newSVpvn(str, n - 1));
406 else if (code) /* Non-Overridable */
408 else { /* None such */
410 DIE(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
414 cv = sv_2cv(TOPs, &stash, &gv, FALSE);
416 ret = sv_2mortal(newSVpvn(SvPVX(cv), SvCUR(cv)));
425 CV* cv = (CV*)PL_curpad[PL_op->op_targ];
427 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
443 if (GIMME != G_ARRAY) {
447 *MARK = &PL_sv_undef;
448 *MARK = refto(*MARK);
452 EXTEND_MORTAL(SP - MARK);
454 *MARK = refto(*MARK);
459 S_refto(pTHX_ SV *sv)
463 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
466 if (!(sv = LvTARG(sv)))
469 (void)SvREFCNT_inc(sv);
471 else if (SvTYPE(sv) == SVt_PVAV) {
472 if (!AvREAL((AV*)sv) && AvREIFY((AV*)sv))
475 (void)SvREFCNT_inc(sv);
477 else if (SvPADTMP(sv) && !IS_PADGV(sv))
481 (void)SvREFCNT_inc(sv);
484 sv_upgrade(rv, SVt_RV);
498 if (sv && SvGMAGICAL(sv))
501 if (!sv || !SvROK(sv))
505 pv = sv_reftype(sv,TRUE);
506 PUSHp(pv, strlen(pv));
516 stash = CopSTASH(PL_curcop);
522 if (ssv && !SvGMAGICAL(ssv) && !SvAMAGIC(ssv) && SvROK(ssv))
523 Perl_croak(aTHX_ "Attempt to bless into a reference");
525 if (ckWARN(WARN_MISC) && len == 0)
526 Perl_warner(aTHX_ packWARN(WARN_MISC),
527 "Explicit blessing to '' (assuming package main)");
528 stash = gv_stashpvn(ptr, len, TRUE);
531 (void)sv_bless(TOPs, stash);
545 elem = SvPV(sv, n_a);
549 switch (elem ? *elem : '\0')
552 if (strEQ(elem, "ARRAY"))
553 tmpRef = (SV*)GvAV(gv);
556 if (strEQ(elem, "CODE"))
557 tmpRef = (SV*)GvCVu(gv);
560 if (strEQ(elem, "FILEHANDLE")) {
561 /* finally deprecated in 5.8.0 */
562 deprecate("*glob{FILEHANDLE}");
563 tmpRef = (SV*)GvIOp(gv);
566 if (strEQ(elem, "FORMAT"))
567 tmpRef = (SV*)GvFORM(gv);
570 if (strEQ(elem, "GLOB"))
574 if (strEQ(elem, "HASH"))
575 tmpRef = (SV*)GvHV(gv);
578 if (strEQ(elem, "IO"))
579 tmpRef = (SV*)GvIOp(gv);
582 if (strEQ(elem, "NAME"))
583 sv = newSVpvn(GvNAME(gv), GvNAMELEN(gv));
586 if (strEQ(elem, "PACKAGE"))
587 sv = newSVpv(HvNAME(GvSTASH(gv)), 0);
590 if (strEQ(elem, "SCALAR"))
604 /* Pattern matching */
609 register unsigned char *s;
612 register I32 *sfirst;
616 if (sv == PL_lastscream) {
622 SvSCREAM_off(PL_lastscream);
623 SvREFCNT_dec(PL_lastscream);
625 PL_lastscream = SvREFCNT_inc(sv);
628 s = (unsigned char*)(SvPV(sv, len));
632 if (pos > PL_maxscream) {
633 if (PL_maxscream < 0) {
634 PL_maxscream = pos + 80;
635 New(301, PL_screamfirst, 256, I32);
636 New(302, PL_screamnext, PL_maxscream, I32);
639 PL_maxscream = pos + pos / 4;
640 Renew(PL_screamnext, PL_maxscream, I32);
644 sfirst = PL_screamfirst;
645 snext = PL_screamnext;
647 if (!sfirst || !snext)
648 DIE(aTHX_ "do_study: out of memory");
650 for (ch = 256; ch; --ch)
657 snext[pos] = sfirst[ch] - pos;
664 /* piggyback on m//g magic */
665 sv_magic(sv, Nullsv, PERL_MAGIC_regex_global, Nullch, 0);
674 if (PL_op->op_flags & OPf_STACKED)
680 TARG = sv_newmortal();
685 /* Lvalue operators. */
697 dSP; dMARK; dTARGET; dORIGMARK;
699 do_chop(TARG, *++MARK);
708 SETi(do_chomp(TOPs));
715 register I32 count = 0;
718 count += do_chomp(POPs);
729 if (!sv || !SvANY(sv))
731 switch (SvTYPE(sv)) {
733 if (AvMAX(sv) >= 0 || SvGMAGICAL(sv)
734 || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
738 if (HvARRAY(sv) || SvGMAGICAL(sv)
739 || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
743 if (CvROOT(sv) || CvXSUB(sv))
760 if (!PL_op->op_private) {
769 if (SvTHINKFIRST(sv))
772 switch (SvTYPE(sv)) {
782 if (ckWARN(WARN_MISC) && cv_const_sv((CV*)sv))
783 Perl_warner(aTHX_ packWARN(WARN_MISC), "Constant subroutine %s undefined",
784 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
788 /* let user-undef'd sub keep its identity */
789 GV* gv = CvGV((CV*)sv);
796 SvSetMagicSV(sv, &PL_sv_undef);
800 Newz(602, gp, 1, GP);
801 GvGP(sv) = gp_ref(gp);
802 GvSV(sv) = NEWSV(72,0);
803 GvLINE(sv) = CopLINE(PL_curcop);
809 if (SvTYPE(sv) >= SVt_PV && SvPVX(sv) && SvLEN(sv)) {
812 SvPV_set(sv, Nullch);
825 if (SvTYPE(TOPs) > SVt_PVLV)
826 DIE(aTHX_ PL_no_modify);
827 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
828 && SvIVX(TOPs) != IV_MIN)
831 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
842 if (SvTYPE(TOPs) > SVt_PVLV)
843 DIE(aTHX_ PL_no_modify);
844 sv_setsv(TARG, TOPs);
845 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
846 && SvIVX(TOPs) != IV_MAX)
849 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
863 if (SvTYPE(TOPs) > SVt_PVLV)
864 DIE(aTHX_ PL_no_modify);
865 sv_setsv(TARG, TOPs);
866 if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
867 && SvIVX(TOPs) != IV_MIN)
870 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
879 /* Ordinary operators. */
883 dSP; dATARGET; tryAMAGICbin(pow,opASSIGN);
884 #ifdef PERL_PRESERVE_IVUV
885 /* ** is implemented with pow. pow is floating point. Perl programmers
886 write 2 ** 31 and expect it to be 2147483648
887 pow never made any guarantee to deliver a result to 53 (or whatever)
888 bits of accuracy. Which is unfortunate, as perl programmers expect it
889 to, and on some platforms (eg Irix with long doubles) it doesn't in
890 a very visible case. (2 ** 31, which a regression test uses)
891 So we'll implement power-of-2 ** +ve integer with multiplies, to avoid
896 bool baseuok = SvUOK(TOPm1s);
900 baseuv = SvUVX(TOPm1s);
902 IV iv = SvIVX(TOPm1s);
905 baseuok = TRUE; /* effectively it's a UV now */
907 baseuv = -iv; /* abs, baseuok == false records sign */
921 goto float_it; /* Can't do negative powers this way. */
924 /* now we have integer ** positive integer.
925 foo & (foo - 1) is zero only for a power of 2. */
926 if (!(baseuv & (baseuv - 1))) {
927 /* We are raising power-of-2 to postive integer.
928 The logic here will work for any base (even non-integer
929 bases) but it can be less accurate than
930 pow (base,power) or exp (power * log (base)) when the
931 intermediate values start to spill out of the mantissa.
932 With powers of 2 we know this can't happen.
933 And powers of 2 are the favourite thing for perl
934 programmers to notice ** not doing what they mean. */
936 NV base = baseuok ? baseuv : -(NV)baseuv;
939 /* The logic is this.
940 x ** n === x ** m1 * x ** m2 where n = m1 + m2
941 so as 42 is 32 + 8 + 2
942 x ** 42 can be written as
943 x ** 32 * x ** 8 * x ** 2
944 I can calculate x ** 2, x ** 4, x ** 8 etc trivially:
945 x ** 2n is x ** n * x ** n
946 So I loop round, squaring x each time
947 (x, x ** 2, x ** 4, x ** 8) and multiply the result
948 by the x-value whenever that bit is set in the power.
949 To finish as soon as possible I zero bits in the power
950 when I've done them, so that power becomes zero when
951 I clear the last bit (no more to do), and the loop
953 for (; power; base *= base, n++) {
954 /* Do I look like I trust gcc with long longs here?
956 UV bit = (UV)1 << (UV)n;
959 /* Only bother to clear the bit if it is set. */
961 /* Avoid squaring base again if we're done. */
962 if (power == 0) break;
976 SETn( Perl_pow( left, right) );
983 dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
984 #ifdef PERL_PRESERVE_IVUV
987 /* Unless the left argument is integer in range we are going to have to
988 use NV maths. Hence only attempt to coerce the right argument if
989 we know the left is integer. */
990 /* Left operand is defined, so is it IV? */
993 bool auvok = SvUOK(TOPm1s);
994 bool buvok = SvUOK(TOPs);
995 const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
996 const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
1003 alow = SvUVX(TOPm1s);
1005 IV aiv = SvIVX(TOPm1s);
1008 auvok = TRUE; /* effectively it's a UV now */
1010 alow = -aiv; /* abs, auvok == false records sign */
1016 IV biv = SvIVX(TOPs);
1019 buvok = TRUE; /* effectively it's a UV now */
1021 blow = -biv; /* abs, buvok == false records sign */
1025 /* If this does sign extension on unsigned it's time for plan B */
1026 ahigh = alow >> (4 * sizeof (UV));
1028 bhigh = blow >> (4 * sizeof (UV));
1030 if (ahigh && bhigh) {
1031 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
1032 which is overflow. Drop to NVs below. */
1033 } else if (!ahigh && !bhigh) {
1034 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
1035 so the unsigned multiply cannot overflow. */
1036 UV product = alow * blow;
1037 if (auvok == buvok) {
1038 /* -ve * -ve or +ve * +ve gives a +ve result. */
1042 } else if (product <= (UV)IV_MIN) {
1043 /* 2s complement assumption that (UV)-IV_MIN is correct. */
1044 /* -ve result, which could overflow an IV */
1046 SETi( -(IV)product );
1048 } /* else drop to NVs below. */
1050 /* One operand is large, 1 small */
1053 /* swap the operands */
1055 bhigh = blow; /* bhigh now the temp var for the swap */
1059 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1060 multiplies can't overflow. shift can, add can, -ve can. */
1061 product_middle = ahigh * blow;
1062 if (!(product_middle & topmask)) {
1063 /* OK, (ahigh * blow) won't lose bits when we shift it. */
1065 product_middle <<= (4 * sizeof (UV));
1066 product_low = alow * blow;
1068 /* as for pp_add, UV + something mustn't get smaller.
1069 IIRC ANSI mandates this wrapping *behaviour* for
1070 unsigned whatever the actual representation*/
1071 product_low += product_middle;
1072 if (product_low >= product_middle) {
1073 /* didn't overflow */
1074 if (auvok == buvok) {
1075 /* -ve * -ve or +ve * +ve gives a +ve result. */
1077 SETu( product_low );
1079 } else if (product_low <= (UV)IV_MIN) {
1080 /* 2s complement assumption again */
1081 /* -ve result, which could overflow an IV */
1083 SETi( -(IV)product_low );
1085 } /* else drop to NVs below. */
1087 } /* product_middle too large */
1088 } /* ahigh && bhigh */
1089 } /* SvIOK(TOPm1s) */
1094 SETn( left * right );
1101 dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
1102 /* Only try to do UV divide first
1103 if ((SLOPPYDIVIDE is true) or
1104 (PERL_PRESERVE_IVUV is true and one or both SV is a UV too large
1106 The assumption is that it is better to use floating point divide
1107 whenever possible, only doing integer divide first if we can't be sure.
1108 If NV_PRESERVES_UV is true then we know at compile time that no UV
1109 can be too large to preserve, so don't need to compile the code to
1110 test the size of UVs. */
1113 # define PERL_TRY_UV_DIVIDE
1114 /* ensure that 20./5. == 4. */
1116 # ifdef PERL_PRESERVE_IVUV
1117 # ifndef NV_PRESERVES_UV
1118 # define PERL_TRY_UV_DIVIDE
1123 #ifdef PERL_TRY_UV_DIVIDE
1126 SvIV_please(TOPm1s);
1127 if (SvIOK(TOPm1s)) {
1128 bool left_non_neg = SvUOK(TOPm1s);
1129 bool right_non_neg = SvUOK(TOPs);
1133 if (right_non_neg) {
1134 right = SvUVX(TOPs);
1137 IV biv = SvIVX(TOPs);
1140 right_non_neg = TRUE; /* effectively it's a UV now */
1146 /* historically undef()/0 gives a "Use of uninitialized value"
1147 warning before dieing, hence this test goes here.
1148 If it were immediately before the second SvIV_please, then
1149 DIE() would be invoked before left was even inspected, so
1150 no inpsection would give no warning. */
1152 DIE(aTHX_ "Illegal division by zero");
1155 left = SvUVX(TOPm1s);
1158 IV aiv = SvIVX(TOPm1s);
1161 left_non_neg = TRUE; /* effectively it's a UV now */
1170 /* For sloppy divide we always attempt integer division. */
1172 /* Otherwise we only attempt it if either or both operands
1173 would not be preserved by an NV. If both fit in NVs
1174 we fall through to the NV divide code below. However,
1175 as left >= right to ensure integer result here, we know that
1176 we can skip the test on the right operand - right big
1177 enough not to be preserved can't get here unless left is
1180 && (left > ((UV)1 << NV_PRESERVES_UV_BITS))
1183 /* Integer division can't overflow, but it can be imprecise. */
1184 UV result = left / right;
1185 if (result * right == left) {
1186 SP--; /* result is valid */
1187 if (left_non_neg == right_non_neg) {
1188 /* signs identical, result is positive. */
1192 /* 2s complement assumption */
1193 if (result <= (UV)IV_MIN)
1194 SETi( -(IV)result );
1196 /* It's exact but too negative for IV. */
1197 SETn( -(NV)result );
1200 } /* tried integer divide but it was not an integer result */
1201 } /* else (abs(result) < 1.0) or (both UVs in range for NV) */
1202 } /* left wasn't SvIOK */
1203 } /* right wasn't SvIOK */
1204 #endif /* PERL_TRY_UV_DIVIDE */
1208 DIE(aTHX_ "Illegal division by zero");
1209 PUSHn( left / right );
1216 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1220 bool left_neg = FALSE;
1221 bool right_neg = FALSE;
1222 bool use_double = FALSE;
1223 bool dright_valid = FALSE;
1229 right_neg = !SvUOK(TOPs);
1231 right = SvUVX(POPs);
1233 IV biv = SvIVX(POPs);
1236 right_neg = FALSE; /* effectively it's a UV now */
1244 right_neg = dright < 0;
1247 if (dright < UV_MAX_P1) {
1248 right = U_V(dright);
1249 dright_valid = TRUE; /* In case we need to use double below. */
1255 /* At this point use_double is only true if right is out of range for
1256 a UV. In range NV has been rounded down to nearest UV and
1257 use_double false. */
1259 if (!use_double && SvIOK(TOPs)) {
1261 left_neg = !SvUOK(TOPs);
1265 IV aiv = SvIVX(POPs);
1268 left_neg = FALSE; /* effectively it's a UV now */
1277 left_neg = dleft < 0;
1281 /* This should be exactly the 5.6 behaviour - if left and right are
1282 both in range for UV then use U_V() rather than floor. */
1284 if (dleft < UV_MAX_P1) {
1285 /* right was in range, so is dleft, so use UVs not double.
1289 /* left is out of range for UV, right was in range, so promote
1290 right (back) to double. */
1292 /* The +0.5 is used in 5.6 even though it is not strictly
1293 consistent with the implicit +0 floor in the U_V()
1294 inside the #if 1. */
1295 dleft = Perl_floor(dleft + 0.5);
1298 dright = Perl_floor(dright + 0.5);
1308 DIE(aTHX_ "Illegal modulus zero");
1310 dans = Perl_fmod(dleft, dright);
1311 if ((left_neg != right_neg) && dans)
1312 dans = dright - dans;
1315 sv_setnv(TARG, dans);
1321 DIE(aTHX_ "Illegal modulus zero");
1324 if ((left_neg != right_neg) && ans)
1327 /* XXX may warn: unary minus operator applied to unsigned type */
1328 /* could change -foo to be (~foo)+1 instead */
1329 if (ans <= ~((UV)IV_MAX)+1)
1330 sv_setiv(TARG, ~ans+1);
1332 sv_setnv(TARG, -(NV)ans);
1335 sv_setuv(TARG, ans);
1344 dSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
1346 register IV count = POPi;
1347 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1349 I32 items = SP - MARK;
1352 max = items * count;
1357 /* This code was intended to fix 20010809.028:
1360 for (($x =~ /./g) x 2) {
1361 print chop; # "abcdabcd" expected as output.
1364 * but that change (#11635) broke this code:
1366 $x = [("foo")x2]; # only one "foo" ended up in the anonlist.
1368 * I can't think of a better fix that doesn't introduce
1369 * an efficiency hit by copying the SVs. The stack isn't
1370 * refcounted, and mortalisation obviously doesn't
1371 * Do The Right Thing when the stack has more than
1372 * one pointer to the same mortal value.
1376 *SP = sv_2mortal(newSVsv(*SP));
1386 repeatcpy((char*)(MARK + items), (char*)MARK,
1387 items * sizeof(SV*), count - 1);
1390 else if (count <= 0)
1393 else { /* Note: mark already snarfed by pp_list */
1398 SvSetSV(TARG, tmpstr);
1399 SvPV_force(TARG, len);
1400 isutf = DO_UTF8(TARG);
1405 SvGROW(TARG, (count * len) + 1);
1406 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1407 SvCUR(TARG) *= count;
1409 *SvEND(TARG) = '\0';
1412 (void)SvPOK_only_UTF8(TARG);
1414 (void)SvPOK_only(TARG);
1416 if (PL_op->op_private & OPpREPEAT_DOLIST) {
1417 /* The parser saw this as a list repeat, and there
1418 are probably several items on the stack. But we're
1419 in scalar context, and there's no pp_list to save us
1420 now. So drop the rest of the items -- robin@kitsite.com
1433 dSP; dATARGET; bool useleft; tryAMAGICbin(subtr,opASSIGN);
1434 useleft = USE_LEFT(TOPm1s);
1435 #ifdef PERL_PRESERVE_IVUV
1436 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1437 "bad things" happen if you rely on signed integers wrapping. */
1440 /* Unless the left argument is integer in range we are going to have to
1441 use NV maths. Hence only attempt to coerce the right argument if
1442 we know the left is integer. */
1443 register UV auv = 0;
1449 a_valid = auvok = 1;
1450 /* left operand is undef, treat as zero. */
1452 /* Left operand is defined, so is it IV? */
1453 SvIV_please(TOPm1s);
1454 if (SvIOK(TOPm1s)) {
1455 if ((auvok = SvUOK(TOPm1s)))
1456 auv = SvUVX(TOPm1s);
1458 register IV aiv = SvIVX(TOPm1s);
1461 auvok = 1; /* Now acting as a sign flag. */
1462 } else { /* 2s complement assumption for IV_MIN */
1470 bool result_good = 0;
1473 bool buvok = SvUOK(TOPs);
1478 register IV biv = SvIVX(TOPs);
1485 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1486 else "IV" now, independent of how it came in.
1487 if a, b represents positive, A, B negative, a maps to -A etc
1492 all UV maths. negate result if A negative.
1493 subtract if signs same, add if signs differ. */
1495 if (auvok ^ buvok) {
1504 /* Must get smaller */
1509 if (result <= buv) {
1510 /* result really should be -(auv-buv). as its negation
1511 of true value, need to swap our result flag */
1523 if (result <= (UV)IV_MIN)
1524 SETi( -(IV)result );
1526 /* result valid, but out of range for IV. */
1527 SETn( -(NV)result );
1531 } /* Overflow, drop through to NVs. */
1535 useleft = USE_LEFT(TOPm1s);
1539 /* left operand is undef, treat as zero - value */
1543 SETn( TOPn - value );
1550 dSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1553 if (PL_op->op_private & HINT_INTEGER) {
1567 dSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1570 if (PL_op->op_private & HINT_INTEGER) {
1584 dSP; tryAMAGICbinSET(lt,0);
1585 #ifdef PERL_PRESERVE_IVUV
1588 SvIV_please(TOPm1s);
1589 if (SvIOK(TOPm1s)) {
1590 bool auvok = SvUOK(TOPm1s);
1591 bool buvok = SvUOK(TOPs);
1593 if (!auvok && !buvok) { /* ## IV < IV ## */
1594 IV aiv = SvIVX(TOPm1s);
1595 IV biv = SvIVX(TOPs);
1598 SETs(boolSV(aiv < biv));
1601 if (auvok && buvok) { /* ## UV < UV ## */
1602 UV auv = SvUVX(TOPm1s);
1603 UV buv = SvUVX(TOPs);
1606 SETs(boolSV(auv < buv));
1609 if (auvok) { /* ## UV < IV ## */
1616 /* As (a) is a UV, it's >=0, so it cannot be < */
1621 SETs(boolSV(auv < (UV)biv));
1624 { /* ## IV < UV ## */
1628 aiv = SvIVX(TOPm1s);
1630 /* As (b) is a UV, it's >=0, so it must be < */
1637 SETs(boolSV((UV)aiv < buv));
1643 #ifndef NV_PRESERVES_UV
1644 #ifdef PERL_PRESERVE_IVUV
1647 if (SvROK(TOPs) && SvROK(TOPm1s)) {
1649 SETs(boolSV(SvRV(TOPs) < SvRV(TOPp1s)));
1655 SETs(boolSV(TOPn < value));
1662 dSP; tryAMAGICbinSET(gt,0);
1663 #ifdef PERL_PRESERVE_IVUV
1666 SvIV_please(TOPm1s);
1667 if (SvIOK(TOPm1s)) {
1668 bool auvok = SvUOK(TOPm1s);
1669 bool buvok = SvUOK(TOPs);
1671 if (!auvok && !buvok) { /* ## IV > IV ## */
1672 IV aiv = SvIVX(TOPm1s);
1673 IV biv = SvIVX(TOPs);
1676 SETs(boolSV(aiv > biv));
1679 if (auvok && buvok) { /* ## UV > UV ## */
1680 UV auv = SvUVX(TOPm1s);
1681 UV buv = SvUVX(TOPs);
1684 SETs(boolSV(auv > buv));
1687 if (auvok) { /* ## UV > IV ## */
1694 /* As (a) is a UV, it's >=0, so it must be > */
1699 SETs(boolSV(auv > (UV)biv));
1702 { /* ## IV > UV ## */
1706 aiv = SvIVX(TOPm1s);
1708 /* As (b) is a UV, it's >=0, so it cannot be > */
1715 SETs(boolSV((UV)aiv > buv));
1721 #ifndef NV_PRESERVES_UV
1722 #ifdef PERL_PRESERVE_IVUV
1725 if (SvROK(TOPs) && SvROK(TOPm1s)) {
1727 SETs(boolSV(SvRV(TOPs) > SvRV(TOPp1s)));
1733 SETs(boolSV(TOPn > value));
1740 dSP; tryAMAGICbinSET(le,0);
1741 #ifdef PERL_PRESERVE_IVUV
1744 SvIV_please(TOPm1s);
1745 if (SvIOK(TOPm1s)) {
1746 bool auvok = SvUOK(TOPm1s);
1747 bool buvok = SvUOK(TOPs);
1749 if (!auvok && !buvok) { /* ## IV <= IV ## */
1750 IV aiv = SvIVX(TOPm1s);
1751 IV biv = SvIVX(TOPs);
1754 SETs(boolSV(aiv <= biv));
1757 if (auvok && buvok) { /* ## UV <= UV ## */
1758 UV auv = SvUVX(TOPm1s);
1759 UV buv = SvUVX(TOPs);
1762 SETs(boolSV(auv <= buv));
1765 if (auvok) { /* ## UV <= IV ## */
1772 /* As (a) is a UV, it's >=0, so a cannot be <= */
1777 SETs(boolSV(auv <= (UV)biv));
1780 { /* ## IV <= UV ## */
1784 aiv = SvIVX(TOPm1s);
1786 /* As (b) is a UV, it's >=0, so a must be <= */
1793 SETs(boolSV((UV)aiv <= buv));
1799 #ifndef NV_PRESERVES_UV
1800 #ifdef PERL_PRESERVE_IVUV
1803 if (SvROK(TOPs) && SvROK(TOPm1s)) {
1805 SETs(boolSV(SvRV(TOPs) <= SvRV(TOPp1s)));
1811 SETs(boolSV(TOPn <= value));
1818 dSP; tryAMAGICbinSET(ge,0);
1819 #ifdef PERL_PRESERVE_IVUV
1822 SvIV_please(TOPm1s);
1823 if (SvIOK(TOPm1s)) {
1824 bool auvok = SvUOK(TOPm1s);
1825 bool buvok = SvUOK(TOPs);
1827 if (!auvok && !buvok) { /* ## IV >= IV ## */
1828 IV aiv = SvIVX(TOPm1s);
1829 IV biv = SvIVX(TOPs);
1832 SETs(boolSV(aiv >= biv));
1835 if (auvok && buvok) { /* ## UV >= UV ## */
1836 UV auv = SvUVX(TOPm1s);
1837 UV buv = SvUVX(TOPs);
1840 SETs(boolSV(auv >= buv));
1843 if (auvok) { /* ## UV >= IV ## */
1850 /* As (a) is a UV, it's >=0, so it must be >= */
1855 SETs(boolSV(auv >= (UV)biv));
1858 { /* ## IV >= UV ## */
1862 aiv = SvIVX(TOPm1s);
1864 /* As (b) is a UV, it's >=0, so a cannot be >= */
1871 SETs(boolSV((UV)aiv >= buv));
1877 #ifndef NV_PRESERVES_UV
1878 #ifdef PERL_PRESERVE_IVUV
1881 if (SvROK(TOPs) && SvROK(TOPm1s)) {
1883 SETs(boolSV(SvRV(TOPs) >= SvRV(TOPp1s)));
1889 SETs(boolSV(TOPn >= value));
1896 dSP; tryAMAGICbinSET(ne,0);
1897 #ifndef NV_PRESERVES_UV
1898 if (SvROK(TOPs) && SvROK(TOPm1s)) {
1900 SETs(boolSV(SvRV(TOPs) != SvRV(TOPp1s)));
1904 #ifdef PERL_PRESERVE_IVUV
1907 SvIV_please(TOPm1s);
1908 if (SvIOK(TOPm1s)) {
1909 bool auvok = SvUOK(TOPm1s);
1910 bool buvok = SvUOK(TOPs);
1912 if (auvok == buvok) { /* ## IV == IV or UV == UV ## */
1913 /* Casting IV to UV before comparison isn't going to matter
1914 on 2s complement. On 1s complement or sign&magnitude
1915 (if we have any of them) it could make negative zero
1916 differ from normal zero. As I understand it. (Need to
1917 check - is negative zero implementation defined behaviour
1919 UV buv = SvUVX(POPs);
1920 UV auv = SvUVX(TOPs);
1922 SETs(boolSV(auv != buv));
1925 { /* ## Mixed IV,UV ## */
1929 /* != is commutative so swap if needed (save code) */
1931 /* swap. top of stack (b) is the iv */
1935 /* As (a) is a UV, it's >0, so it cannot be == */
1944 /* As (b) is a UV, it's >0, so it cannot be == */
1948 uv = SvUVX(*(SP+1)); /* Do I want TOPp1s() ? */
1950 SETs(boolSV((UV)iv != uv));
1958 SETs(boolSV(TOPn != value));
1965 dSP; dTARGET; tryAMAGICbin(ncmp,0);
1966 #ifndef NV_PRESERVES_UV
1967 if (SvROK(TOPs) && SvROK(TOPm1s)) {
1968 UV right = PTR2UV(SvRV(POPs));
1969 UV left = PTR2UV(SvRV(TOPs));
1970 SETi((left > right) - (left < right));
1974 #ifdef PERL_PRESERVE_IVUV
1975 /* Fortunately it seems NaN isn't IOK */
1978 SvIV_please(TOPm1s);
1979 if (SvIOK(TOPm1s)) {
1980 bool leftuvok = SvUOK(TOPm1s);
1981 bool rightuvok = SvUOK(TOPs);
1983 if (!leftuvok && !rightuvok) { /* ## IV <=> IV ## */
1984 IV leftiv = SvIVX(TOPm1s);
1985 IV rightiv = SvIVX(TOPs);
1987 if (leftiv > rightiv)
1989 else if (leftiv < rightiv)
1993 } else if (leftuvok && rightuvok) { /* ## UV <=> UV ## */
1994 UV leftuv = SvUVX(TOPm1s);
1995 UV rightuv = SvUVX(TOPs);
1997 if (leftuv > rightuv)
1999 else if (leftuv < rightuv)
2003 } else if (leftuvok) { /* ## UV <=> IV ## */
2007 rightiv = SvIVX(TOPs);
2009 /* As (a) is a UV, it's >=0, so it cannot be < */
2012 leftuv = SvUVX(TOPm1s);
2013 if (leftuv > (UV)rightiv) {
2015 } else if (leftuv < (UV)rightiv) {
2021 } else { /* ## IV <=> UV ## */
2025 leftiv = SvIVX(TOPm1s);
2027 /* As (b) is a UV, it's >=0, so it must be < */
2030 rightuv = SvUVX(TOPs);
2031 if ((UV)leftiv > rightuv) {
2033 } else if ((UV)leftiv < rightuv) {
2051 if (Perl_isnan(left) || Perl_isnan(right)) {
2055 value = (left > right) - (left < right);
2059 else if (left < right)
2061 else if (left > right)
2075 dSP; tryAMAGICbinSET(slt,0);
2078 int cmp = (IN_LOCALE_RUNTIME
2079 ? sv_cmp_locale(left, right)
2080 : sv_cmp(left, right));
2081 SETs(boolSV(cmp < 0));
2088 dSP; tryAMAGICbinSET(sgt,0);
2091 int cmp = (IN_LOCALE_RUNTIME
2092 ? sv_cmp_locale(left, right)
2093 : sv_cmp(left, right));
2094 SETs(boolSV(cmp > 0));
2101 dSP; tryAMAGICbinSET(sle,0);
2104 int cmp = (IN_LOCALE_RUNTIME
2105 ? sv_cmp_locale(left, right)
2106 : sv_cmp(left, right));
2107 SETs(boolSV(cmp <= 0));
2114 dSP; tryAMAGICbinSET(sge,0);
2117 int cmp = (IN_LOCALE_RUNTIME
2118 ? sv_cmp_locale(left, right)
2119 : sv_cmp(left, right));
2120 SETs(boolSV(cmp >= 0));
2127 dSP; tryAMAGICbinSET(seq,0);
2130 SETs(boolSV(sv_eq(left, right)));
2137 dSP; tryAMAGICbinSET(sne,0);
2140 SETs(boolSV(!sv_eq(left, right)));
2147 dSP; dTARGET; tryAMAGICbin(scmp,0);
2150 int cmp = (IN_LOCALE_RUNTIME
2151 ? sv_cmp_locale(left, right)
2152 : sv_cmp(left, right));
2160 dSP; dATARGET; tryAMAGICbin(band,opASSIGN);
2163 if (SvNIOKp(left) || SvNIOKp(right)) {
2164 if (PL_op->op_private & HINT_INTEGER) {
2165 IV i = SvIV(left) & SvIV(right);
2169 UV u = SvUV(left) & SvUV(right);
2174 do_vop(PL_op->op_type, TARG, left, right);
2183 dSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
2186 if (SvNIOKp(left) || SvNIOKp(right)) {
2187 if (PL_op->op_private & HINT_INTEGER) {
2188 IV i = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right);
2192 UV u = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right);
2197 do_vop(PL_op->op_type, TARG, left, right);
2206 dSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
2209 if (SvNIOKp(left) || SvNIOKp(right)) {
2210 if (PL_op->op_private & HINT_INTEGER) {
2211 IV i = (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right);
2215 UV u = (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right);
2220 do_vop(PL_op->op_type, TARG, left, right);
2229 dSP; dTARGET; tryAMAGICun(neg);
2232 int flags = SvFLAGS(sv);
2235 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
2236 /* It's publicly an integer, or privately an integer-not-float */
2239 if (SvIVX(sv) == IV_MIN) {
2240 /* 2s complement assumption. */
2241 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
2244 else if (SvUVX(sv) <= IV_MAX) {
2249 else if (SvIVX(sv) != IV_MIN) {
2253 #ifdef PERL_PRESERVE_IVUV
2262 else if (SvPOKp(sv)) {
2264 char *s = SvPV(sv, len);
2265 if (isIDFIRST(*s)) {
2266 sv_setpvn(TARG, "-", 1);
2269 else if (*s == '+' || *s == '-') {
2271 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
2273 else if (DO_UTF8(sv)) {
2276 goto oops_its_an_int;
2278 sv_setnv(TARG, -SvNV(sv));
2280 sv_setpvn(TARG, "-", 1);
2287 goto oops_its_an_int;
2288 sv_setnv(TARG, -SvNV(sv));
2300 dSP; tryAMAGICunSET(not);
2301 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
2307 dSP; dTARGET; tryAMAGICun(compl);
2311 if (PL_op->op_private & HINT_INTEGER) {
2326 tmps = (U8*)SvPV_force(TARG, len);
2329 /* Calculate exact length, let's not estimate. */
2338 while (tmps < send) {
2339 UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2340 tmps += UTF8SKIP(tmps);
2341 targlen += UNISKIP(~c);
2347 /* Now rewind strings and write them. */
2351 Newz(0, result, targlen + 1, U8);
2352 while (tmps < send) {
2353 UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2354 tmps += UTF8SKIP(tmps);
2355 result = uvchr_to_utf8_flags(result, ~c, UNICODE_ALLOW_ANY);
2359 sv_setpvn(TARG, (char*)result, targlen);
2363 Newz(0, result, nchar + 1, U8);
2364 while (tmps < send) {
2365 U8 c = (U8)utf8n_to_uvchr(tmps, 0, &l, UTF8_ALLOW_ANY);
2366 tmps += UTF8SKIP(tmps);
2371 sv_setpvn(TARG, (char*)result, nchar);
2379 register long *tmpl;
2380 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2383 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
2388 for ( ; anum > 0; anum--, tmps++)
2397 /* integer versions of some of the above */
2401 dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
2404 SETi( left * right );
2411 dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
2415 DIE(aTHX_ "Illegal division by zero");
2416 value = POPi / value;
2424 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2428 DIE(aTHX_ "Illegal modulus zero");
2429 SETi( left % right );
2436 dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
2439 SETi( left + right );
2446 dSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
2449 SETi( left - right );
2456 dSP; tryAMAGICbinSET(lt,0);
2459 SETs(boolSV(left < right));
2466 dSP; tryAMAGICbinSET(gt,0);
2469 SETs(boolSV(left > right));
2476 dSP; tryAMAGICbinSET(le,0);
2479 SETs(boolSV(left <= right));
2486 dSP; tryAMAGICbinSET(ge,0);
2489 SETs(boolSV(left >= right));
2496 dSP; tryAMAGICbinSET(eq,0);
2499 SETs(boolSV(left == right));
2506 dSP; tryAMAGICbinSET(ne,0);
2509 SETs(boolSV(left != right));
2516 dSP; dTARGET; tryAMAGICbin(ncmp,0);
2523 else if (left < right)
2534 dSP; dTARGET; tryAMAGICun(neg);
2539 /* High falutin' math. */
2543 dSP; dTARGET; tryAMAGICbin(atan2,0);
2546 SETn(Perl_atan2(left, right));
2553 dSP; dTARGET; tryAMAGICun(sin);
2557 value = Perl_sin(value);
2565 dSP; dTARGET; tryAMAGICun(cos);
2569 value = Perl_cos(value);
2575 /* Support Configure command-line overrides for rand() functions.
2576 After 5.005, perhaps we should replace this by Configure support
2577 for drand48(), random(), or rand(). For 5.005, though, maintain
2578 compatibility by calling rand() but allow the user to override it.
2579 See INSTALL for details. --Andy Dougherty 15 July 1998
2581 /* Now it's after 5.005, and Configure supports drand48() and random(),
2582 in addition to rand(). So the overrides should not be needed any more.
2583 --Jarkko Hietaniemi 27 September 1998
2586 #ifndef HAS_DRAND48_PROTO
2587 extern double drand48 (void);
2600 if (!PL_srand_called) {
2601 (void)seedDrand01((Rand_seed_t)seed());
2602 PL_srand_called = TRUE;
2617 (void)seedDrand01((Rand_seed_t)anum);
2618 PL_srand_called = TRUE;
2627 * This is really just a quick hack which grabs various garbage
2628 * values. It really should be a real hash algorithm which
2629 * spreads the effect of every input bit onto every output bit,
2630 * if someone who knows about such things would bother to write it.
2631 * Might be a good idea to add that function to CORE as well.
2632 * No numbers below come from careful analysis or anything here,
2633 * except they are primes and SEED_C1 > 1E6 to get a full-width
2634 * value from (tv_sec * SEED_C1 + tv_usec). The multipliers should
2635 * probably be bigger too.
2638 # define SEED_C1 1000003
2639 #define SEED_C4 73819
2641 # define SEED_C1 25747
2642 #define SEED_C4 20639
2646 #define SEED_C5 26107
2648 #ifndef PERL_NO_DEV_RANDOM
2653 # include <starlet.h>
2654 /* when[] = (low 32 bits, high 32 bits) of time since epoch
2655 * in 100-ns units, typically incremented ever 10 ms. */
2656 unsigned int when[2];
2658 # ifdef HAS_GETTIMEOFDAY
2659 struct timeval when;
2665 /* This test is an escape hatch, this symbol isn't set by Configure. */
2666 #ifndef PERL_NO_DEV_RANDOM
2667 #ifndef PERL_RANDOM_DEVICE
2668 /* /dev/random isn't used by default because reads from it will block
2669 * if there isn't enough entropy available. You can compile with
2670 * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
2671 * is enough real entropy to fill the seed. */
2672 # define PERL_RANDOM_DEVICE "/dev/urandom"
2674 fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0);
2676 if (PerlLIO_read(fd, &u, sizeof u) != sizeof u)
2685 _ckvmssts(sys$gettim(when));
2686 u = (U32)SEED_C1 * when[0] + (U32)SEED_C2 * when[1];
2688 # ifdef HAS_GETTIMEOFDAY
2689 PerlProc_gettimeofday(&when,NULL);
2690 u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
2693 u = (U32)SEED_C1 * when;
2696 u += SEED_C3 * (U32)PerlProc_getpid();
2697 u += SEED_C4 * (U32)PTR2UV(PL_stack_sp);
2698 #ifndef PLAN9 /* XXX Plan9 assembler chokes on this; fix needed */
2699 u += SEED_C5 * (U32)PTR2UV(&when);
2706 dSP; dTARGET; tryAMAGICun(exp);
2710 value = Perl_exp(value);
2718 dSP; dTARGET; tryAMAGICun(log);
2723 SET_NUMERIC_STANDARD();
2724 DIE(aTHX_ "Can't take log of %"NVgf, value);
2726 value = Perl_log(value);
2734 dSP; dTARGET; tryAMAGICun(sqrt);
2739 SET_NUMERIC_STANDARD();
2740 DIE(aTHX_ "Can't take sqrt of %"NVgf, value);
2742 value = Perl_sqrt(value);
2749 * There are strange code-generation bugs caused on sparc64 by gcc-2.95.2.
2750 * These need to be revisited when a newer toolchain becomes available.
2752 #if defined(__sparc64__) && defined(__GNUC__)
2753 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
2754 # undef SPARC64_MODF_WORKAROUND
2755 # define SPARC64_MODF_WORKAROUND 1
2759 #if defined(SPARC64_MODF_WORKAROUND)
2761 sparc64_workaround_modf(NV theVal, NV *theIntRes)
2764 ret = Perl_modf(theVal, &res);
2772 dSP; dTARGET; tryAMAGICun(int);
2775 IV iv = TOPi; /* attempt to convert to IV if possible. */
2776 /* XXX it's arguable that compiler casting to IV might be subtly
2777 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2778 else preferring IV has introduced a subtle behaviour change bug. OTOH
2779 relying on floating point to be accurate is a bug. */
2790 if (value < (NV)UV_MAX + 0.5) {
2793 #if defined(SPARC64_MODF_WORKAROUND)
2794 (void)sparc64_workaround_modf(value, &value);
2796 # if defined(HAS_MODFL) || defined(LONG_DOUBLE_EQUALS_DOUBLE)
2797 # ifdef HAS_MODFL_POW32_BUG
2798 /* some versions of glibc split (i + d) into (i-1, d+1) for 2^32 <= i < 2^64 */
2800 NV offset = Perl_modf(value, &value);
2801 (void)Perl_modf(offset, &offset);
2805 (void)Perl_modf(value, &value);
2808 double tmp = (double)value;
2809 (void)Perl_modf(tmp, &tmp);
2817 if (value > (NV)IV_MIN - 0.5) {
2820 #if defined(HAS_MODFL) || defined(LONG_DOUBLE_EQUALS_DOUBLE)
2821 # ifdef HAS_MODFL_POW32_BUG
2822 /* some versions of glibc split (i + d) into (i-1, d+1) for 2^32 <= i < 2^64 */
2824 NV offset = Perl_modf(-value, &value);
2825 (void)Perl_modf(offset, &offset);
2829 (void)Perl_modf(-value, &value);
2833 double tmp = (double)value;
2834 (void)Perl_modf(-tmp, &tmp);
2847 dSP; dTARGET; tryAMAGICun(abs);
2849 /* This will cache the NV value if string isn't actually integer */
2853 /* IVX is precise */
2855 SETu(TOPu); /* force it to be numeric only */
2863 /* 2s complement assumption. Also, not really needed as
2864 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
2884 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2890 tmps = (SvPVx(sv, len));
2892 /* If Unicode, try to downgrade
2893 * If not possible, croak. */
2894 SV* tsv = sv_2mortal(newSVsv(sv));
2897 sv_utf8_downgrade(tsv, FALSE);
2900 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2901 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
2914 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2920 tmps = (SvPVx(sv, len));
2922 /* If Unicode, try to downgrade
2923 * If not possible, croak. */
2924 SV* tsv = sv_2mortal(newSVsv(sv));
2927 sv_utf8_downgrade(tsv, FALSE);
2930 while (*tmps && len && isSPACE(*tmps))
2935 result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2936 else if (*tmps == 'b')
2937 result_uv = grok_bin (tmps, &len, &flags, &result_nv);
2939 result_uv = grok_oct (tmps, &len, &flags, &result_nv);
2941 if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
2958 SETi(sv_len_utf8(sv));
2974 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
2976 I32 arybase = PL_curcop->cop_arybase;
2980 int num_args = PL_op->op_private & 7;
2981 bool repl_need_utf8_upgrade = FALSE;
2982 bool repl_is_utf8 = FALSE;
2984 SvTAINTED_off(TARG); /* decontaminate */
2985 SvUTF8_off(TARG); /* decontaminate */
2989 repl = SvPV(repl_sv, repl_len);
2990 repl_is_utf8 = DO_UTF8(repl_sv) && SvCUR(repl_sv);
3000 sv_utf8_upgrade(sv);
3002 else if (DO_UTF8(sv))
3003 repl_need_utf8_upgrade = TRUE;
3005 tmps = SvPV(sv, curlen);
3007 utf8_curlen = sv_len_utf8(sv);
3008 if (utf8_curlen == curlen)
3011 curlen = utf8_curlen;
3016 if (pos >= arybase) {
3034 else if (len >= 0) {
3036 if (rem > (I32)curlen)
3051 Perl_croak(aTHX_ "substr outside of string");
3052 if (ckWARN(WARN_SUBSTR))
3053 Perl_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3060 sv_pos_u2b(sv, &pos, &rem);
3062 sv_setpvn(TARG, tmps, rem);
3063 #ifdef USE_LOCALE_COLLATE
3064 sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3069 SV* repl_sv_copy = NULL;
3071 if (repl_need_utf8_upgrade) {
3072 repl_sv_copy = newSVsv(repl_sv);
3073 sv_utf8_upgrade(repl_sv_copy);
3074 repl = SvPV(repl_sv_copy, repl_len);
3075 repl_is_utf8 = DO_UTF8(repl_sv_copy) && SvCUR(sv);
3077 sv_insert(sv, pos, rem, repl, repl_len);
3081 SvREFCNT_dec(repl_sv_copy);
3083 else if (lvalue) { /* it's an lvalue! */
3084 if (!SvGMAGICAL(sv)) {
3088 if (ckWARN(WARN_SUBSTR))
3089 Perl_warner(aTHX_ packWARN(WARN_SUBSTR),
3090 "Attempt to use reference as lvalue in substr");
3092 if (SvOK(sv)) /* is it defined ? */
3093 (void)SvPOK_only_UTF8(sv);
3095 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
3098 if (SvTYPE(TARG) < SVt_PVLV) {
3099 sv_upgrade(TARG, SVt_PVLV);
3100 sv_magic(TARG, Nullsv, PERL_MAGIC_substr, Nullch, 0);
3104 if (LvTARG(TARG) != sv) {
3106 SvREFCNT_dec(LvTARG(TARG));
3107 LvTARG(TARG) = SvREFCNT_inc(sv);
3109 LvTARGOFF(TARG) = upos;
3110 LvTARGLEN(TARG) = urem;
3114 PUSHs(TARG); /* avoid SvSETMAGIC here */
3121 register IV size = POPi;
3122 register IV offset = POPi;
3123 register SV *src = POPs;
3124 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3126 SvTAINTED_off(TARG); /* decontaminate */
3127 if (lvalue) { /* it's an lvalue! */
3128 if (SvTYPE(TARG) < SVt_PVLV) {
3129 sv_upgrade(TARG, SVt_PVLV);
3130 sv_magic(TARG, Nullsv, PERL_MAGIC_vec, Nullch, 0);
3133 if (LvTARG(TARG) != src) {
3135 SvREFCNT_dec(LvTARG(TARG));
3136 LvTARG(TARG) = SvREFCNT_inc(src);
3138 LvTARGOFF(TARG) = offset;
3139 LvTARGLEN(TARG) = size;
3142 sv_setuv(TARG, do_vecget(src, offset, size));
3157 I32 arybase = PL_curcop->cop_arybase;
3162 offset = POPi - arybase;
3165 tmps = SvPV(big, biglen);
3166 if (offset > 0 && DO_UTF8(big))
3167 sv_pos_u2b(big, &offset, 0);
3170 else if (offset > (I32)biglen)
3172 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
3173 (unsigned char*)tmps + biglen, little, 0)))
3176 retval = tmps2 - tmps;
3177 if (retval > 0 && DO_UTF8(big))
3178 sv_pos_b2u(big, &retval);
3179 PUSHi(retval + arybase);
3194 I32 arybase = PL_curcop->cop_arybase;
3200 tmps2 = SvPV(little, llen);
3201 tmps = SvPV(big, blen);
3205 if (offset > 0 && DO_UTF8(big))
3206 sv_pos_u2b(big, &offset, 0);
3207 offset = offset - arybase + llen;
3211 else if (offset > (I32)blen)
3213 if (!(tmps2 = rninstr(tmps, tmps + offset,
3214 tmps2, tmps2 + llen)))
3217 retval = tmps2 - tmps;
3218 if (retval > 0 && DO_UTF8(big))
3219 sv_pos_b2u(big, &retval);
3220 PUSHi(retval + arybase);
3226 dSP; dMARK; dORIGMARK; dTARGET;
3227 do_sprintf(TARG, SP-MARK, MARK+1);
3228 TAINT_IF(SvTAINTED(TARG));
3229 if (DO_UTF8(*(MARK+1)))
3241 U8 *s = (U8*)SvPVx(argsv, len);
3244 if (PL_encoding && SvPOK(argsv) && !DO_UTF8(argsv)) {
3245 tmpsv = sv_2mortal(newSVsv(argsv));
3246 s = (U8*)sv_recode_to_utf8(tmpsv, PL_encoding);
3250 XPUSHu(DO_UTF8(argsv) ?
3251 utf8n_to_uvchr(s, UTF8_MAXLEN, 0, UTF8_ALLOW_ANYUV) :
3263 (void)SvUPGRADE(TARG,SVt_PV);
3265 if (value > 255 && !IN_BYTES) {
3266 SvGROW(TARG, (STRLEN)UNISKIP(value)+1);
3267 tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3268 SvCUR_set(TARG, tmps - SvPVX(TARG));
3270 (void)SvPOK_only(TARG);
3279 *tmps++ = (char)value;
3281 (void)SvPOK_only(TARG);
3282 if (PL_encoding && !IN_BYTES) {
3283 sv_recode_to_utf8(TARG, PL_encoding);
3285 if (SvCUR(TARG) == 0 || !is_utf8_string((U8*)tmps, SvCUR(TARG)) ||
3286 memEQ(tmps, "\xef\xbf\xbd\0", 4)) {
3289 *tmps++ = (U8)UTF8_EIGHT_BIT_HI(value);
3290 *tmps++ = (U8)UTF8_EIGHT_BIT_LO(value);
3306 char *tmps = SvPV(left, len);
3308 if (DO_UTF8(left)) {
3309 /* If Unicode, try to downgrade.
3310 * If not possible, croak.
3311 * Yes, we made this up. */
3312 SV* tsv = sv_2mortal(newSVsv(left));
3315 sv_utf8_downgrade(tsv, FALSE);
3319 sv_setpv(TARG, fcrypt(tmps, SvPV(right, n_a)));
3321 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV(right, n_a)));
3327 "The crypt() function is unimplemented due to excessive paranoia.");
3340 (s = (U8*)SvPV_nomg(sv, slen)) && slen &&
3341 UTF8_IS_START(*s)) {
3342 U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3346 utf8_to_uvchr(s, &ulen);
3347 toTITLE_utf8(s, tmpbuf, &tculen);
3348 utf8_to_uvchr(tmpbuf, 0);
3350 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3352 /* slen is the byte length of the whole SV.
3353 * ulen is the byte length of the original Unicode character
3354 * stored as UTF-8 at s.
3355 * tculen is the byte length of the freshly titlecased
3356 * Unicode character stored as UTF-8 at tmpbuf.
3357 * We first set the result to be the titlecased character,
3358 * and then append the rest of the SV data. */
3359 sv_setpvn(TARG, (char*)tmpbuf, tculen);
3361 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3366 s = (U8*)SvPV_force_nomg(sv, slen);
3367 Copy(tmpbuf, s, tculen, U8);
3371 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3373 SvUTF8_off(TARG); /* decontaminate */
3374 sv_setsv_nomg(TARG, sv);
3378 s = (U8*)SvPV_force_nomg(sv, slen);
3380 if (IN_LOCALE_RUNTIME) {
3383 *s = toUPPER_LC(*s);
3402 (s = (U8*)SvPV_nomg(sv, slen)) && slen &&
3403 UTF8_IS_START(*s)) {
3405 U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3409 toLOWER_utf8(s, tmpbuf, &ulen);
3410 uv = utf8_to_uvchr(tmpbuf, 0);
3411 tend = uvchr_to_utf8(tmpbuf, uv);
3413 if (!SvPADTMP(sv) || (STRLEN)(tend - tmpbuf) != ulen || SvREADONLY(sv)) {
3415 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
3417 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3422 s = (U8*)SvPV_force_nomg(sv, slen);
3423 Copy(tmpbuf, s, ulen, U8);
3427 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3429 SvUTF8_off(TARG); /* decontaminate */
3430 sv_setsv_nomg(TARG, sv);
3434 s = (U8*)SvPV_force_nomg(sv, slen);
3436 if (IN_LOCALE_RUNTIME) {
3439 *s = toLOWER_LC(*s);
3462 U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3464 s = (U8*)SvPV_nomg(sv,len);
3466 SvUTF8_off(TARG); /* decontaminate */
3467 sv_setpvn(TARG, "", 0);
3471 STRLEN nchar = utf8_length(s, s + len);
3473 (void)SvUPGRADE(TARG, SVt_PV);
3474 SvGROW(TARG, (nchar * UTF8_MAXLEN_UCLC) + 1);
3475 (void)SvPOK_only(TARG);
3476 d = (U8*)SvPVX(TARG);
3479 toUPPER_utf8(s, tmpbuf, &ulen);
3480 Copy(tmpbuf, d, ulen, U8);
3486 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
3491 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3493 SvUTF8_off(TARG); /* decontaminate */
3494 sv_setsv_nomg(TARG, sv);
3498 s = (U8*)SvPV_force_nomg(sv, len);
3500 register U8 *send = s + len;
3502 if (IN_LOCALE_RUNTIME) {
3505 for (; s < send; s++)
3506 *s = toUPPER_LC(*s);
3509 for (; s < send; s++)
3531 U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3533 s = (U8*)SvPV_nomg(sv,len);
3535 SvUTF8_off(TARG); /* decontaminate */
3536 sv_setpvn(TARG, "", 0);
3540 STRLEN nchar = utf8_length(s, s + len);
3542 (void)SvUPGRADE(TARG, SVt_PV);
3543 SvGROW(TARG, (nchar * UTF8_MAXLEN_UCLC) + 1);
3544 (void)SvPOK_only(TARG);
3545 d = (U8*)SvPVX(TARG);
3548 UV uv = toLOWER_utf8(s, tmpbuf, &ulen);
3549 #define GREEK_CAPITAL_LETTER_SIGMA 0x03A3 /* Unicode */
3550 if (uv == GREEK_CAPITAL_LETTER_SIGMA) {
3552 * Now if the sigma is NOT followed by
3553 * /$ignorable_sequence$cased_letter/;
3554 * and it IS preceded by
3555 * /$cased_letter$ignorable_sequence/;
3556 * where $ignorable_sequence is
3557 * [\x{2010}\x{AD}\p{Mn}]*
3558 * and $cased_letter is
3559 * [\p{Ll}\p{Lo}\p{Lt}]
3560 * then it should be mapped to 0x03C2,
3561 * (GREEK SMALL LETTER FINAL SIGMA),
3562 * instead of staying 0x03A3.
3563 * See lib/unicore/SpecCase.txt.
3566 Copy(tmpbuf, d, ulen, U8);
3572 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
3577 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3579 SvUTF8_off(TARG); /* decontaminate */
3580 sv_setsv_nomg(TARG, sv);
3585 s = (U8*)SvPV_force_nomg(sv, len);
3587 register U8 *send = s + len;
3589 if (IN_LOCALE_RUNTIME) {
3592 for (; s < send; s++)
3593 *s = toLOWER_LC(*s);
3596 for (; s < send; s++)
3610 register char *s = SvPV(sv,len);
3613 SvUTF8_off(TARG); /* decontaminate */
3615 (void)SvUPGRADE(TARG, SVt_PV);
3616 SvGROW(TARG, (len * 2) + 1);
3620 if (UTF8_IS_CONTINUED(*s)) {
3621 STRLEN ulen = UTF8SKIP(s);
3645 SvCUR_set(TARG, d - SvPVX(TARG));
3646 (void)SvPOK_only_UTF8(TARG);
3649 sv_setpvn(TARG, s, len);
3651 if (SvSMAGICAL(TARG))
3660 dSP; dMARK; dORIGMARK;
3662 register AV* av = (AV*)POPs;
3663 register I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3664 I32 arybase = PL_curcop->cop_arybase;
3667 if (SvTYPE(av) == SVt_PVAV) {
3668 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
3670 for (svp = MARK + 1; svp <= SP; svp++) {
3675 if (max > AvMAX(av))
3678 while (++MARK <= SP) {
3679 elem = SvIVx(*MARK);
3683 svp = av_fetch(av, elem, lval);
3685 if (!svp || *svp == &PL_sv_undef)
3686 DIE(aTHX_ PL_no_aelem, elem);
3687 if (PL_op->op_private & OPpLVAL_INTRO)
3688 save_aelem(av, elem, svp);
3690 *MARK = svp ? *svp : &PL_sv_undef;
3693 if (GIMME != G_ARRAY) {
3701 /* Associative arrays. */
3706 HV *hash = (HV*)POPs;
3708 I32 gimme = GIMME_V;
3709 I32 realhv = (SvTYPE(hash) == SVt_PVHV);
3712 /* might clobber stack_sp */
3713 entry = realhv ? hv_iternext(hash) : avhv_iternext((AV*)hash);
3718 SV* sv = hv_iterkeysv(entry);
3719 PUSHs(sv); /* won't clobber stack_sp */
3720 if (gimme == G_ARRAY) {
3723 /* might clobber stack_sp */
3725 hv_iterval(hash, entry) : avhv_iterval((AV*)hash, entry);
3730 else if (gimme == G_SCALAR)
3749 I32 gimme = GIMME_V;
3750 I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
3754 if (PL_op->op_private & OPpSLICE) {
3758 hvtype = SvTYPE(hv);
3759 if (hvtype == SVt_PVHV) { /* hash element */
3760 while (++MARK <= SP) {
3761 sv = hv_delete_ent(hv, *MARK, discard, 0);
3762 *MARK = sv ? sv : &PL_sv_undef;
3765 else if (hvtype == SVt_PVAV) {
3766 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
3767 while (++MARK <= SP) {
3768 sv = av_delete((AV*)hv, SvIV(*MARK), discard);
3769 *MARK = sv ? sv : &PL_sv_undef;
3772 else { /* pseudo-hash element */
3773 while (++MARK <= SP) {
3774 sv = avhv_delete_ent((AV*)hv, *MARK, discard, 0);
3775 *MARK = sv ? sv : &PL_sv_undef;
3780 DIE(aTHX_ "Not a HASH reference");
3783 else if (gimme == G_SCALAR) {
3792 if (SvTYPE(hv) == SVt_PVHV)
3793 sv = hv_delete_ent(hv, keysv, discard, 0);
3794 else if (SvTYPE(hv) == SVt_PVAV) {
3795 if (PL_op->op_flags & OPf_SPECIAL)
3796 sv = av_delete((AV*)hv, SvIV(keysv), discard);
3798 sv = avhv_delete_ent((AV*)hv, keysv, discard, 0);
3801 DIE(aTHX_ "Not a HASH reference");
3816 if (PL_op->op_private & OPpEXISTS_SUB) {
3820 cv = sv_2cv(sv, &hv, &gv, FALSE);
3823 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
3829 if (SvTYPE(hv) == SVt_PVHV) {
3830 if (hv_exists_ent(hv, tmpsv, 0))
3833 else if (SvTYPE(hv) == SVt_PVAV) {
3834 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
3835 if (av_exists((AV*)hv, SvIV(tmpsv)))
3838 else if (avhv_exists_ent((AV*)hv, tmpsv, 0)) /* pseudo-hash element */
3842 DIE(aTHX_ "Not a HASH reference");
3849 dSP; dMARK; dORIGMARK;
3850 register HV *hv = (HV*)POPs;
3851 register I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3852 I32 realhv = (SvTYPE(hv) == SVt_PVHV);
3853 bool localizing = PL_op->op_private & OPpLVAL_INTRO ? TRUE : FALSE;
3854 bool other_magic = FALSE;
3860 other_magic = mg_find((SV*)hv, PERL_MAGIC_env) ||
3861 ((mg = mg_find((SV*)hv, PERL_MAGIC_tied))
3862 /* Try to preserve the existenceness of a tied hash
3863 * element by using EXISTS and DELETE if possible.
3864 * Fallback to FETCH and STORE otherwise */
3865 && (stash = SvSTASH(SvRV(SvTIED_obj((SV*)hv, mg))))
3866 && gv_fetchmethod_autoload(stash, "EXISTS", TRUE)
3867 && gv_fetchmethod_autoload(stash, "DELETE", TRUE));
3870 if (!realhv && localizing)
3871 DIE(aTHX_ "Can't localize pseudo-hash element");
3873 if (realhv || SvTYPE(hv) == SVt_PVAV) {
3874 while (++MARK <= SP) {
3877 bool preeminent = FALSE;
3880 preeminent = SvRMAGICAL(hv) && !other_magic ? 1 :
3881 realhv ? hv_exists_ent(hv, keysv, 0)
3882 : avhv_exists_ent((AV*)hv, keysv, 0);
3886 HE *he = hv_fetch_ent(hv, keysv, lval, 0);
3887 svp = he ? &HeVAL(he) : 0;
3890 svp = avhv_fetch_ent((AV*)hv, keysv, lval, 0);
3893 if (!svp || *svp == &PL_sv_undef) {
3895 DIE(aTHX_ PL_no_helem, SvPV(keysv, n_a));
3899 save_helem(hv, keysv, svp);
3902 char *key = SvPV(keysv, keylen);
3903 SAVEDELETE(hv, savepvn(key,keylen), keylen);
3907 *MARK = svp ? *svp : &PL_sv_undef;
3910 if (GIMME != G_ARRAY) {
3918 /* List operators. */
3923 if (GIMME != G_ARRAY) {
3925 *MARK = *SP; /* unwanted list, return last item */
3927 *MARK = &PL_sv_undef;
3936 SV **lastrelem = PL_stack_sp;
3937 SV **lastlelem = PL_stack_base + POPMARK;
3938 SV **firstlelem = PL_stack_base + POPMARK + 1;
3939 register SV **firstrelem = lastlelem + 1;
3940 I32 arybase = PL_curcop->cop_arybase;
3941 I32 lval = PL_op->op_flags & OPf_MOD;
3942 I32 is_something_there = lval;
3944 register I32 max = lastrelem - lastlelem;
3945 register SV **lelem;
3948 if (GIMME != G_ARRAY) {
3949 ix = SvIVx(*lastlelem);
3954 if (ix < 0 || ix >= max)
3955 *firstlelem = &PL_sv_undef;
3957 *firstlelem = firstrelem[ix];
3963 SP = firstlelem - 1;
3967 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
3973 if (ix < 0 || ix >= max)
3974 *lelem = &PL_sv_undef;
3976 is_something_there = TRUE;
3977 if (!(*lelem = firstrelem[ix]))
3978 *lelem = &PL_sv_undef;
3981 if (is_something_there)
3984 SP = firstlelem - 1;
3990 dSP; dMARK; dORIGMARK;
3991 I32 items = SP - MARK;
3992 SV *av = sv_2mortal((SV*)av_make(items, MARK+1));
3993 SP = ORIGMARK; /* av_make() might realloc stack_sp */
4000 dSP; dMARK; dORIGMARK;
4001 HV* hv = (HV*)sv_2mortal((SV*)newHV());
4005 SV *val = NEWSV(46, 0);
4007 sv_setsv(val, *++MARK);
4008 else if (ckWARN(WARN_MISC))
4009 Perl_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
4010 (void)hv_store_ent(hv,key,val,0);
4019 dSP; dMARK; dORIGMARK;
4020 register AV *ary = (AV*)*++MARK;
4024 register I32 offset;
4025 register I32 length;
4032 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4033 *MARK-- = SvTIED_obj((SV*)ary, mg);
4037 call_method("SPLICE",GIMME_V);
4046 offset = i = SvIVx(*MARK);
4048 offset += AvFILLp(ary) + 1;
4050 offset -= PL_curcop->cop_arybase;
4052 DIE(aTHX_ PL_no_aelem, i);
4054 length = SvIVx(*MARK++);
4056 length += AvFILLp(ary) - offset + 1;
4062 length = AvMAX(ary) + 1; /* close enough to infinity */
4066 length = AvMAX(ary) + 1;
4068 if (offset > AvFILLp(ary) + 1) {
4069 if (ckWARN(WARN_MISC))
4070 Perl_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
4071 offset = AvFILLp(ary) + 1;
4073 after = AvFILLp(ary) + 1 - (offset + length);
4074 if (after < 0) { /* not that much array */
4075 length += after; /* offset+length now in array */
4081 /* At this point, MARK .. SP-1 is our new LIST */
4084 diff = newlen - length;
4085 if (newlen && !AvREAL(ary) && AvREIFY(ary))
4088 if (diff < 0) { /* shrinking the area */
4090 New(451, tmparyval, newlen, SV*); /* so remember insertion */
4091 Copy(MARK, tmparyval, newlen, SV*);
4094 MARK = ORIGMARK + 1;
4095 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4096 MEXTEND(MARK, length);
4097 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
4099 EXTEND_MORTAL(length);
4100 for (i = length, dst = MARK; i; i--) {
4101 sv_2mortal(*dst); /* free them eventualy */
4108 *MARK = AvARRAY(ary)[offset+length-1];
4111 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
4112 SvREFCNT_dec(*dst++); /* free them now */
4115 AvFILLp(ary) += diff;
4117 /* pull up or down? */
4119 if (offset < after) { /* easier to pull up */
4120 if (offset) { /* esp. if nothing to pull */
4121 src = &AvARRAY(ary)[offset-1];
4122 dst = src - diff; /* diff is negative */
4123 for (i = offset; i > 0; i--) /* can't trust Copy */
4127 SvPVX(ary) = (char*)(AvARRAY(ary) - diff); /* diff is negative */
4131 if (after) { /* anything to pull down? */
4132 src = AvARRAY(ary) + offset + length;
4133 dst = src + diff; /* diff is negative */
4134 Move(src, dst, after, SV*);
4136 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
4137 /* avoid later double free */
4141 dst[--i] = &PL_sv_undef;
4144 for (src = tmparyval, dst = AvARRAY(ary) + offset;
4146 *dst = NEWSV(46, 0);
4147 sv_setsv(*dst++, *src++);
4149 Safefree(tmparyval);
4152 else { /* no, expanding (or same) */
4154 New(452, tmparyval, length, SV*); /* so remember deletion */
4155 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
4158 if (diff > 0) { /* expanding */
4160 /* push up or down? */
4162 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
4166 Move(src, dst, offset, SV*);
4168 SvPVX(ary) = (char*)(AvARRAY(ary) - diff);/* diff is positive */
4170 AvFILLp(ary) += diff;
4173 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
4174 av_extend(ary, AvFILLp(ary) + diff);
4175 AvFILLp(ary) += diff;
4178 dst = AvARRAY(ary) + AvFILLp(ary);
4180 for (i = after; i; i--) {
4187 for (src = MARK, dst = AvARRAY(ary) + offset; newlen; newlen--) {
4188 *dst = NEWSV(46, 0);
4189 sv_setsv(*dst++, *src++);
4191 MARK = ORIGMARK + 1;
4192 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4194 Copy(tmparyval, MARK, length, SV*);
4196 EXTEND_MORTAL(length);
4197 for (i = length, dst = MARK; i; i--) {
4198 sv_2mortal(*dst); /* free them eventualy */
4202 Safefree(tmparyval);
4206 else if (length--) {
4207 *MARK = tmparyval[length];
4210 while (length-- > 0)
4211 SvREFCNT_dec(tmparyval[length]);
4213 Safefree(tmparyval);
4216 *MARK = &PL_sv_undef;
4224 dSP; dMARK; dORIGMARK; dTARGET;
4225 register AV *ary = (AV*)*++MARK;
4226 register SV *sv = &PL_sv_undef;
4229 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4230 *MARK-- = SvTIED_obj((SV*)ary, mg);
4234 call_method("PUSH",G_SCALAR|G_DISCARD);
4239 /* Why no pre-extend of ary here ? */
4240 for (++MARK; MARK <= SP; MARK++) {
4243 sv_setsv(sv, *MARK);
4248 PUSHi( AvFILL(ary) + 1 );
4256 SV *sv = av_pop(av);
4258 (void)sv_2mortal(sv);
4267 SV *sv = av_shift(av);
4272 (void)sv_2mortal(sv);
4279 dSP; dMARK; dORIGMARK; dTARGET;
4280 register AV *ary = (AV*)*++MARK;
4285 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4286 *MARK-- = SvTIED_obj((SV*)ary, mg);
4290 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
4295 av_unshift(ary, SP - MARK);
4298 sv_setsv(sv, *++MARK);
4299 (void)av_store(ary, i++, sv);
4303 PUSHi( AvFILL(ary) + 1 );
4313 if (GIMME == G_ARRAY) {
4320 /* safe as long as stack cannot get extended in the above */
4325 register char *down;
4330 SvUTF8_off(TARG); /* decontaminate */
4332 do_join(TARG, &PL_sv_no, MARK, SP);
4334 sv_setsv(TARG, (SP > MARK) ? *SP : DEFSV);
4335 up = SvPV_force(TARG, len);
4337 if (DO_UTF8(TARG)) { /* first reverse each character */
4338 U8* s = (U8*)SvPVX(TARG);
4339 U8* send = (U8*)(s + len);
4341 if (UTF8_IS_INVARIANT(*s)) {
4346 if (!utf8_to_uvchr(s, 0))
4350 down = (char*)(s - 1);
4351 /* reverse this character */
4355 *down-- = (char)tmp;
4361 down = SvPVX(TARG) + len - 1;
4365 *down-- = (char)tmp;
4367 (void)SvPOK_only_UTF8(TARG);
4379 register IV limit = POPi; /* note, negative is forever */
4382 register char *s = SvPV(sv, len);
4383 bool do_utf8 = DO_UTF8(sv);
4384 char *strend = s + len;
4386 register REGEXP *rx;
4390 STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (strend - s);
4391 I32 maxiters = slen + 10;
4394 I32 origlimit = limit;
4397 AV *oldstack = PL_curstack;
4398 I32 gimme = GIMME_V;
4399 I32 oldsave = PL_savestack_ix;
4400 I32 make_mortal = 1;
4401 MAGIC *mg = (MAGIC *) NULL;
4404 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4409 DIE(aTHX_ "panic: pp_split");
4412 TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
4413 (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
4415 RX_MATCH_UTF8_set(rx, do_utf8);
4417 if (pm->op_pmreplroot) {
4419 ary = GvAVn((GV*)PL_curpad[INT2PTR(PADOFFSET, pm->op_pmreplroot)]);
4421 ary = GvAVn((GV*)pm->op_pmreplroot);
4424 else if (gimme != G_ARRAY)
4425 #ifdef USE_5005THREADS
4426 ary = (AV*)PL_curpad[0];
4428 ary = GvAVn(PL_defgv);
4429 #endif /* USE_5005THREADS */
4432 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4438 if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4440 XPUSHs(SvTIED_obj((SV*)ary, mg));
4446 for (i = AvFILLp(ary); i >= 0; i--)
4447 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
4449 /* temporarily switch stacks */
4450 SWITCHSTACK(PL_curstack, ary);
4454 base = SP - PL_stack_base;
4456 if (pm->op_pmflags & PMf_SKIPWHITE) {
4457 if (pm->op_pmflags & PMf_LOCALE) {
4458 while (isSPACE_LC(*s))
4466 if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
4467 SAVEINT(PL_multiline);
4468 PL_multiline = pm->op_pmflags & PMf_MULTILINE;
4472 limit = maxiters + 2;
4473 if (pm->op_pmflags & PMf_WHITE) {
4476 while (m < strend &&
4477 !((pm->op_pmflags & PMf_LOCALE)
4478 ? isSPACE_LC(*m) : isSPACE(*m)))
4483 dstr = NEWSV(30, m-s);
4484 sv_setpvn(dstr, s, m-s);
4488 (void)SvUTF8_on(dstr);
4492 while (s < strend &&
4493 ((pm->op_pmflags & PMf_LOCALE)
4494 ? isSPACE_LC(*s) : isSPACE(*s)))
4498 else if (strEQ("^", rx->precomp)) {
4501 for (m = s; m < strend && *m != '\n'; m++) ;
4505 dstr = NEWSV(30, m-s);
4506 sv_setpvn(dstr, s, m-s);
4510 (void)SvUTF8_on(dstr);
4515 else if (do_utf8 == ((rx->reganch & ROPT_UTF8) != 0) &&
4516 (rx->reganch & RE_USE_INTUIT) && !rx->nparens
4517 && (rx->reganch & ROPT_CHECK_ALL)
4518 && !(rx->reganch & ROPT_ANCH)) {
4519 int tail = (rx->reganch & RE_INTUIT_TAIL);
4520 SV *csv = CALLREG_INTUIT_STRING(aTHX_ rx);
4523 if (len == 1 && !(rx->reganch & ROPT_UTF8) && !tail) {
4525 char c = *SvPV(csv, n_a);
4528 for (m = s; m < strend && *m != c; m++) ;
4531 dstr = NEWSV(30, m-s);
4532 sv_setpvn(dstr, s, m-s);
4536 (void)SvUTF8_on(dstr);
4538 /* The rx->minlen is in characters but we want to step
4539 * s ahead by bytes. */
4541 s = (char*)utf8_hop((U8*)m, len);
4543 s = m + len; /* Fake \n at the end */
4548 while (s < strend && --limit &&
4549 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
4550 csv, PL_multiline ? FBMrf_MULTILINE : 0)) )
4553 dstr = NEWSV(31, m-s);
4554 sv_setpvn(dstr, s, m-s);
4558 (void)SvUTF8_on(dstr);
4560 /* The rx->minlen is in characters but we want to step
4561 * s ahead by bytes. */
4563 s = (char*)utf8_hop((U8*)m, len);
4565 s = m + len; /* Fake \n at the end */
4570 maxiters += slen * rx->nparens;
4571 while (s < strend && --limit
4572 /* && (!rx->check_substr
4573 || ((s = CALLREG_INTUIT_START(aTHX_ rx, sv, s, strend,
4575 */ && CALLREGEXEC(aTHX_ rx, s, strend, orig,
4576 1 /* minend */, sv, NULL, 0))
4578 TAINT_IF(RX_MATCH_TAINTED(rx));
4579 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
4584 strend = s + (strend - m);
4586 m = rx->startp[0] + orig;
4587 dstr = NEWSV(32, m-s);
4588 sv_setpvn(dstr, s, m-s);
4592 (void)SvUTF8_on(dstr);
4595 for (i = 1; i <= (I32)rx->nparens; i++) {
4596 s = rx->startp[i] + orig;
4597 m = rx->endp[i] + orig;
4599 /* japhy (07/27/01) -- the (m && s) test doesn't catch
4600 parens that didn't match -- they should be set to
4601 undef, not the empty string */
4602 if (m >= orig && s >= orig) {
4603 dstr = NEWSV(33, m-s);
4604 sv_setpvn(dstr, s, m-s);
4607 dstr = &PL_sv_undef; /* undef, not "" */
4611 (void)SvUTF8_on(dstr);
4615 s = rx->endp[0] + orig;
4619 LEAVE_SCOPE(oldsave);
4620 iters = (SP - PL_stack_base) - base;
4621 if (iters > maxiters)
4622 DIE(aTHX_ "Split loop");
4624 /* keep field after final delim? */
4625 if (s < strend || (iters && origlimit)) {
4626 STRLEN l = strend - s;
4627 dstr = NEWSV(34, l);
4628 sv_setpvn(dstr, s, l);
4632 (void)SvUTF8_on(dstr);
4636 else if (!origlimit) {
4637 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
4638 if (TOPs && !make_mortal)
4647 SWITCHSTACK(ary, oldstack);
4648 if (SvSMAGICAL(ary)) {
4653 if (gimme == G_ARRAY) {
4655 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4663 call_method("PUSH",G_SCALAR|G_DISCARD);
4666 if (gimme == G_ARRAY) {
4667 /* EXTEND should not be needed - we just popped them */
4669 for (i=0; i < iters; i++) {
4670 SV **svp = av_fetch(ary, i, FALSE);
4671 PUSHs((svp) ? *svp : &PL_sv_undef);
4678 if (gimme == G_ARRAY)
4681 if (iters || !pm->op_pmreplroot) {
4689 #ifdef USE_5005THREADS
4691 Perl_unlock_condpair(pTHX_ void *svv)
4693 MAGIC *mg = mg_find((SV*)svv, PERL_MAGIC_mutex);
4696 Perl_croak(aTHX_ "panic: unlock_condpair unlocking non-mutex");
4697 MUTEX_LOCK(MgMUTEXP(mg));
4698 if (MgOWNER(mg) != thr)
4699 Perl_croak(aTHX_ "panic: unlock_condpair unlocking mutex that we don't own");
4701 COND_SIGNAL(MgOWNERCONDP(mg));
4702 DEBUG_S(PerlIO_printf(Perl_debug_log, "0x%"UVxf": unlock 0x%"UVxf"\n",
4703 PTR2UV(thr), PTR2UV(svv)));
4704 MUTEX_UNLOCK(MgMUTEXP(mg));
4706 #endif /* USE_5005THREADS */
4714 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
4715 || SvTYPE(retsv) == SVt_PVCV) {
4716 retsv = refto(retsv);
4724 #ifdef USE_5005THREADS
4727 if (PL_op->op_private & OPpLVAL_INTRO)
4728 PUSHs(*save_threadsv(PL_op->op_targ));
4730 PUSHs(THREADSV(PL_op->op_targ));
4733 DIE(aTHX_ "tried to access per-thread data in non-threaded perl");
4734 #endif /* USE_5005THREADS */