This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
regen/mk_PL_charclass.pl: sort output table
[perl5.git] / pp.c
1 /*    pp.c
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4  *    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
5  *
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.
8  *
9  */
10
11 /*
12  * 'It's a big house this, and very peculiar.  Always a bit more
13  *  to discover, and no knowing what you'll find round a corner.
14  *  And Elves, sir!'                            --Samwise Gamgee
15  *
16  *     [p.225 of _The Lord of the Rings_, II/i: "Many Meetings"]
17  */
18
19 /* This file contains general pp ("push/pop") functions that execute the
20  * opcodes that make up a perl program. A typical pp function expects to
21  * find its arguments on the stack, and usually pushes its results onto
22  * the stack, hence the 'pp' terminology. Each OP structure contains
23  * a pointer to the relevant pp_foo() function.
24  */
25
26 #include "EXTERN.h"
27 #define PERL_IN_PP_C
28 #include "perl.h"
29 #include "keywords.h"
30
31 #include "reentr.h"
32 #include "regcharclass.h"
33
34 static const STRLEN small_mu_len = sizeof(GREEK_SMALL_LETTER_MU_UTF8) - 1;
35 static const STRLEN capital_iota_len = sizeof(GREEK_CAPITAL_LETTER_IOTA_UTF8) - 1;
36
37 /* variations on pp_null */
38
39 PP(pp_stub)
40 {
41     dSP;
42     if (GIMME_V == G_SCALAR)
43         XPUSHs(&PL_sv_undef);
44     RETURN;
45 }
46
47 /* Pushy stuff. */
48
49
50
51 PP(pp_padcv)
52 {
53     dSP; dTARGET;
54     assert(SvTYPE(TARG) == SVt_PVCV);
55     XPUSHs(TARG);
56     RETURN;
57 }
58
59 PP(pp_introcv)
60 {
61     dTARGET;
62     SvPADSTALE_off(TARG);
63     return NORMAL;
64 }
65
66 PP(pp_clonecv)
67 {
68     dTARGET;
69     CV * const protocv = PadnamePROTOCV(
70         PadlistNAMESARRAY(CvPADLIST(find_runcv(NULL)))[ARGTARG]
71     );
72     assert(SvTYPE(TARG) == SVt_PVCV);
73     assert(protocv);
74     if (CvISXSUB(protocv)) { /* constant */
75         /* XXX Should we clone it here? */
76         /* If this changes to use SAVECLEARSV, we can move the SAVECLEARSV
77            to introcv and remove the SvPADSTALE_off. */
78         SAVEPADSVANDMORTALIZE(ARGTARG);
79         PAD_SVl(ARGTARG) = SvREFCNT_inc_simple_NN(protocv);
80     }
81     else {
82         if (CvROOT(protocv)) {
83             assert(CvCLONE(protocv));
84             assert(!CvCLONED(protocv));
85         }
86         cv_clone_into(protocv,(CV *)TARG);
87         SAVECLEARSV(PAD_SVl(ARGTARG));
88     }
89     return NORMAL;
90 }
91
92 /* Translations. */
93
94 /* In some cases this function inspects PL_op.  If this function is called
95    for new op types, more bool parameters may need to be added in place of
96    the checks.
97
98    When noinit is true, the absence of a gv will cause a retval of undef.
99    This is unrelated to the cv-to-gv assignment case.
100 */
101
102 static SV *
103 S_rv2gv(pTHX_ SV *sv, const bool vivify_sv, const bool strict,
104               const bool noinit)
105 {
106     if (!isGV(sv) || SvFAKE(sv)) SvGETMAGIC(sv);
107     if (SvROK(sv)) {
108         if (SvAMAGIC(sv)) {
109             sv = amagic_deref_call(sv, to_gv_amg);
110         }
111       wasref:
112         sv = SvRV(sv);
113         if (SvTYPE(sv) == SVt_PVIO) {
114             GV * const gv = MUTABLE_GV(sv_newmortal());
115             gv_init(gv, 0, "__ANONIO__", 10, 0);
116             GvIOp(gv) = MUTABLE_IO(sv);
117             SvREFCNT_inc_void_NN(sv);
118             sv = MUTABLE_SV(gv);
119         }
120         else if (!isGV_with_GP(sv)) {
121             Perl_die(aTHX_ "Not a GLOB reference");
122         }
123     }
124     else {
125         if (!isGV_with_GP(sv)) {
126             if (!SvOK(sv)) {
127                 /* If this is a 'my' scalar and flag is set then vivify
128                  * NI-S 1999/05/07
129                  */
130                 if (vivify_sv && sv != &PL_sv_undef) {
131                     GV *gv;
132                     HV *stash;
133                     if (SvREADONLY(sv))
134                         Perl_croak_no_modify();
135                     gv = MUTABLE_GV(newSV(0));
136                     stash = CopSTASH(PL_curcop);
137                     if (SvTYPE(stash) != SVt_PVHV) stash = NULL;
138                     if (cUNOP->op_targ) {
139                         SV * const namesv = PAD_SV(cUNOP->op_targ);
140                         gv_init_sv(gv, stash, namesv, 0);
141                     }
142                     else {
143                         gv_init_pv(gv, stash, "__ANONIO__", 0);
144                     }
145                     prepare_SV_for_RV(sv);
146                     SvRV_set(sv, MUTABLE_SV(gv));
147                     SvROK_on(sv);
148                     SvSETMAGIC(sv);
149                     goto wasref;
150                 }
151                 if (PL_op->op_flags & OPf_REF || strict) {
152                     Perl_die(aTHX_ PL_no_usym, "a symbol");
153                 }
154                 if (ckWARN(WARN_UNINITIALIZED))
155                     report_uninit(sv);
156                 return &PL_sv_undef;
157             }
158             if (noinit)
159             {
160                 if (!(sv = MUTABLE_SV(gv_fetchsv_nomg(
161                            sv, GV_ADDMG, SVt_PVGV
162                    ))))
163                     return &PL_sv_undef;
164             }
165             else {
166                 if (strict) {
167                     Perl_die(aTHX_
168                              PL_no_symref_sv,
169                              sv,
170                              (SvPOKp(sv) && SvCUR(sv)>32 ? "..." : ""),
171                              "a symbol"
172                              );
173                 }
174                 if ((PL_op->op_private & (OPpLVAL_INTRO|OPpDONT_INIT_GV))
175                     == OPpDONT_INIT_GV) {
176                     /* We are the target of a coderef assignment.  Return
177                        the scalar unchanged, and let pp_sasssign deal with
178                        things.  */
179                     return sv;
180                 }
181                 sv = MUTABLE_SV(gv_fetchsv_nomg(sv, GV_ADD, SVt_PVGV));
182             }
183             /* FAKE globs in the symbol table cause weird bugs (#77810) */
184             SvFAKE_off(sv);
185         }
186     }
187     if (SvFAKE(sv) && !(PL_op->op_private & OPpALLOW_FAKE)) {
188         SV *newsv = sv_newmortal();
189         sv_setsv_flags(newsv, sv, 0);
190         SvFAKE_off(newsv);
191         sv = newsv;
192     }
193     return sv;
194 }
195
196 PP(pp_rv2gv)
197 {
198     dSP; dTOPss;
199
200     sv = S_rv2gv(aTHX_
201           sv, PL_op->op_private & OPpDEREF,
202           PL_op->op_private & HINT_STRICT_REFS,
203           ((PL_op->op_flags & OPf_SPECIAL) && !(PL_op->op_flags & OPf_MOD))
204              || PL_op->op_type == OP_READLINE
205          );
206     if (PL_op->op_private & OPpLVAL_INTRO)
207         save_gp(MUTABLE_GV(sv), !(PL_op->op_flags & OPf_SPECIAL));
208     SETs(sv);
209     RETURN;
210 }
211
212 /* Helper function for pp_rv2sv and pp_rv2av  */
213 GV *
214 Perl_softref2xv(pTHX_ SV *const sv, const char *const what,
215                 const svtype type, SV ***spp)
216 {
217     GV *gv;
218
219     PERL_ARGS_ASSERT_SOFTREF2XV;
220
221     if (PL_op->op_private & HINT_STRICT_REFS) {
222         if (SvOK(sv))
223             Perl_die(aTHX_ PL_no_symref_sv, sv,
224                      (SvPOKp(sv) && SvCUR(sv)>32 ? "..." : ""), what);
225         else
226             Perl_die(aTHX_ PL_no_usym, what);
227     }
228     if (!SvOK(sv)) {
229         if (
230           PL_op->op_flags & OPf_REF
231         )
232             Perl_die(aTHX_ PL_no_usym, what);
233         if (ckWARN(WARN_UNINITIALIZED))
234             report_uninit(sv);
235         if (type != SVt_PV && GIMME_V == G_ARRAY) {
236             (*spp)--;
237             return NULL;
238         }
239         **spp = &PL_sv_undef;
240         return NULL;
241     }
242     if ((PL_op->op_flags & OPf_SPECIAL) &&
243         !(PL_op->op_flags & OPf_MOD))
244         {
245             if (!(gv = gv_fetchsv_nomg(sv, GV_ADDMG, type)))
246                 {
247                     **spp = &PL_sv_undef;
248                     return NULL;
249                 }
250         }
251     else {
252         gv = gv_fetchsv_nomg(sv, GV_ADD, type);
253     }
254     return gv;
255 }
256
257 PP(pp_rv2sv)
258 {
259     dSP; dTOPss;
260     GV *gv = NULL;
261
262     SvGETMAGIC(sv);
263     if (SvROK(sv)) {
264         if (SvAMAGIC(sv)) {
265             sv = amagic_deref_call(sv, to_sv_amg);
266         }
267
268         sv = SvRV(sv);
269         if (SvTYPE(sv) >= SVt_PVAV)
270             DIE(aTHX_ "Not a SCALAR reference");
271     }
272     else {
273         gv = MUTABLE_GV(sv);
274
275         if (!isGV_with_GP(gv)) {
276             gv = Perl_softref2xv(aTHX_ sv, "a SCALAR", SVt_PV, &sp);
277             if (!gv)
278                 RETURN;
279         }
280         sv = GvSVn(gv);
281     }
282     if (PL_op->op_flags & OPf_MOD) {
283         if (PL_op->op_private & OPpLVAL_INTRO) {
284             if (cUNOP->op_first->op_type == OP_NULL)
285                 sv = save_scalar(MUTABLE_GV(TOPs));
286             else if (gv)
287                 sv = save_scalar(gv);
288             else
289                 Perl_croak(aTHX_ "%s", PL_no_localize_ref);
290         }
291         else if (PL_op->op_private & OPpDEREF)
292             sv = vivify_ref(sv, PL_op->op_private & OPpDEREF);
293     }
294     SPAGAIN; /* in case chasing soft refs reallocated the stack */
295     SETs(sv);
296     RETURN;
297 }
298
299 PP(pp_av2arylen)
300 {
301     dSP;
302     AV * const av = MUTABLE_AV(TOPs);
303     const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
304     if (lvalue) {
305         SV ** const svp = Perl_av_arylen_p(aTHX_ MUTABLE_AV(av));
306         if (!*svp) {
307             *svp = newSV_type(SVt_PVMG);
308             sv_magic(*svp, MUTABLE_SV(av), PERL_MAGIC_arylen, NULL, 0);
309         }
310         SETs(*svp);
311     } else {
312         SETs(sv_2mortal(newSViv(AvFILL(MUTABLE_AV(av)))));
313     }
314     RETURN;
315 }
316
317 PP(pp_pos)
318 {
319     dSP; dTOPss;
320
321     if (PL_op->op_flags & OPf_MOD || LVRET) {
322         SV * const ret = sv_2mortal(newSV_type(SVt_PVLV));/* Not TARG RT#67838 */
323         sv_magic(ret, NULL, PERL_MAGIC_pos, NULL, 0);
324         LvTYPE(ret) = '.';
325         LvTARG(ret) = SvREFCNT_inc_simple(sv);
326         SETs(ret);    /* no SvSETMAGIC */
327     }
328     else {
329             const MAGIC * const mg = mg_find_mglob(sv);
330             if (mg && mg->mg_len != -1) {
331                 STRLEN i = mg->mg_len;
332                 if (PL_op->op_private & OPpTRUEBOOL)
333                     SETs(i ? &PL_sv_yes : &PL_sv_zero);
334                 else {
335                     dTARGET;
336                     if (mg->mg_flags & MGf_BYTES && DO_UTF8(sv))
337                         i = sv_pos_b2u_flags(sv, i, SV_GMAGIC|SV_CONST_RETURN);
338                     SETu(i);
339                 }
340                 return NORMAL;
341             }
342             SETs(&PL_sv_undef);
343     }
344     return NORMAL;
345 }
346
347 PP(pp_rv2cv)
348 {
349     dSP;
350     GV *gv;
351     HV *stash_unused;
352     const I32 flags = (PL_op->op_flags & OPf_SPECIAL)
353         ? GV_ADDMG
354         : ((PL_op->op_private & (OPpLVAL_INTRO|OPpMAY_RETURN_CONSTANT))
355                                                     == OPpMAY_RETURN_CONSTANT)
356             ? GV_ADD|GV_NOEXPAND
357             : GV_ADD;
358     /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
359     /* (But not in defined().) */
360
361     CV *cv = sv_2cv(TOPs, &stash_unused, &gv, flags);
362     if (cv) NOOP;
363     else if ((flags == (GV_ADD|GV_NOEXPAND)) && gv && SvROK(gv)) {
364         cv = SvTYPE(SvRV(gv)) == SVt_PVCV
365             ? MUTABLE_CV(SvRV(gv))
366             : MUTABLE_CV(gv);
367     }    
368     else
369         cv = MUTABLE_CV(&PL_sv_undef);
370     SETs(MUTABLE_SV(cv));
371     return NORMAL;
372 }
373
374 PP(pp_prototype)
375 {
376     dSP;
377     CV *cv;
378     HV *stash;
379     GV *gv;
380     SV *ret = &PL_sv_undef;
381
382     if (SvGMAGICAL(TOPs)) SETs(sv_mortalcopy(TOPs));
383     if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
384         const char * s = SvPVX_const(TOPs);
385         if (memBEGINs(s, SvCUR(TOPs), "CORE::")) {
386             const int code = keyword(s + 6, SvCUR(TOPs) - 6, 1);
387             if (!code)
388                 DIE(aTHX_ "Can't find an opnumber for \"%" UTF8f "\"",
389                    UTF8fARG(SvFLAGS(TOPs) & SVf_UTF8, SvCUR(TOPs)-6, s+6));
390             {
391                 SV * const sv = core_prototype(NULL, s + 6, code, NULL);
392                 if (sv) ret = sv;
393             }
394             goto set;
395         }
396     }
397     cv = sv_2cv(TOPs, &stash, &gv, 0);
398     if (cv && SvPOK(cv))
399         ret = newSVpvn_flags(
400             CvPROTO(cv), CvPROTOLEN(cv), SVs_TEMP | SvUTF8(cv)
401         );
402   set:
403     SETs(ret);
404     RETURN;
405 }
406
407 PP(pp_anoncode)
408 {
409     dSP;
410     CV *cv = MUTABLE_CV(PAD_SV(PL_op->op_targ));
411     if (CvCLONE(cv))
412         cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
413     EXTEND(SP,1);
414     PUSHs(MUTABLE_SV(cv));
415     RETURN;
416 }
417
418 PP(pp_srefgen)
419 {
420     dSP;
421     *SP = refto(*SP);
422     return NORMAL;
423 }
424
425 PP(pp_refgen)
426 {
427     dSP; dMARK;
428     if (GIMME_V != G_ARRAY) {
429         if (++MARK <= SP)
430             *MARK = *SP;
431         else
432         {
433             MEXTEND(SP, 1);
434             *MARK = &PL_sv_undef;
435         }
436         *MARK = refto(*MARK);
437         SP = MARK;
438         RETURN;
439     }
440     EXTEND_MORTAL(SP - MARK);
441     while (++MARK <= SP)
442         *MARK = refto(*MARK);
443     RETURN;
444 }
445
446 STATIC SV*
447 S_refto(pTHX_ SV *sv)
448 {
449     SV* rv;
450
451     PERL_ARGS_ASSERT_REFTO;
452
453     if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
454         if (LvTARGLEN(sv))
455             vivify_defelem(sv);
456         if (!(sv = LvTARG(sv)))
457             sv = &PL_sv_undef;
458         else
459             SvREFCNT_inc_void_NN(sv);
460     }
461     else if (SvTYPE(sv) == SVt_PVAV) {
462         if (!AvREAL((const AV *)sv) && AvREIFY((const AV *)sv))
463             av_reify(MUTABLE_AV(sv));
464         SvTEMP_off(sv);
465         SvREFCNT_inc_void_NN(sv);
466     }
467     else if (SvPADTMP(sv)) {
468         sv = newSVsv(sv);
469     }
470     else if (UNLIKELY(SvSMAGICAL(sv) && mg_find(sv, PERL_MAGIC_nonelem)))
471         sv_unmagic(SvREFCNT_inc_simple_NN(sv), PERL_MAGIC_nonelem);
472     else {
473         SvTEMP_off(sv);
474         SvREFCNT_inc_void_NN(sv);
475     }
476     rv = sv_newmortal();
477     sv_upgrade(rv, SVt_IV);
478     SvRV_set(rv, sv);
479     SvROK_on(rv);
480     return rv;
481 }
482
483 PP(pp_ref)
484 {
485     dSP;
486     SV * const sv = TOPs;
487
488     SvGETMAGIC(sv);
489     if (!SvROK(sv)) {
490         SETs(&PL_sv_no);
491         return NORMAL;
492     }
493
494     /* op is in boolean context? */
495     if (   (PL_op->op_private & OPpTRUEBOOL)
496         || (   (PL_op->op_private & OPpMAYBE_TRUEBOOL)
497             && block_gimme() == G_VOID))
498     {
499         /* refs are always true - unless it's to an object blessed into a
500          * class with a false name, i.e. "0". So we have to check for
501          * that remote possibility. The following is is basically an
502          * unrolled SvTRUE(sv_reftype(rv)) */
503         SV * const rv = SvRV(sv);
504         if (SvOBJECT(rv)) {
505             HV *stash = SvSTASH(rv);
506             HEK *hek = HvNAME_HEK(stash);
507             if (hek) {
508                 I32 len = HEK_LEN(hek);
509                 /* bail out and do it the hard way? */
510                 if (UNLIKELY(
511                        len == HEf_SVKEY
512                     || (len == 1 && HEK_KEY(hek)[0] == '0')
513                 ))
514                     goto do_sv_ref;
515             }
516         }
517         SETs(&PL_sv_yes);
518         return NORMAL;
519     }
520
521   do_sv_ref:
522     {
523         dTARGET;
524         SETs(TARG);
525         sv_ref(TARG, SvRV(sv), TRUE);
526         SvSETMAGIC(TARG);
527         return NORMAL;
528     }
529
530 }
531
532
533 PP(pp_bless)
534 {
535     dSP;
536     HV *stash;
537
538     if (MAXARG == 1)
539     {
540       curstash:
541         stash = CopSTASH(PL_curcop);
542         if (SvTYPE(stash) != SVt_PVHV)
543             Perl_croak(aTHX_ "Attempt to bless into a freed package");
544     }
545     else {
546         SV * const ssv = POPs;
547         STRLEN len;
548         const char *ptr;
549
550         if (!ssv) goto curstash;
551         SvGETMAGIC(ssv);
552         if (SvROK(ssv)) {
553           if (!SvAMAGIC(ssv)) {
554            frog:
555             Perl_croak(aTHX_ "Attempt to bless into a reference");
556           }
557           /* SvAMAGIC is on here, but it only means potentially overloaded,
558              so after stringification: */
559           ptr = SvPV_nomg_const(ssv,len);
560           /* We need to check the flag again: */
561           if (!SvAMAGIC(ssv)) goto frog;
562         }
563         else ptr = SvPV_nomg_const(ssv,len);
564         if (len == 0)
565             Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
566                            "Explicit blessing to '' (assuming package main)");
567         stash = gv_stashpvn(ptr, len, GV_ADD|SvUTF8(ssv));
568     }
569
570     (void)sv_bless(TOPs, stash);
571     RETURN;
572 }
573
574 PP(pp_gelem)
575 {
576     dSP;
577
578     SV *sv = POPs;
579     STRLEN len;
580     const char * const elem = SvPV_const(sv, len);
581     GV * const gv = MUTABLE_GV(TOPs);
582     SV * tmpRef = NULL;
583
584     sv = NULL;
585     if (elem) {
586         /* elem will always be NUL terminated.  */
587         switch (*elem) {
588         case 'A':
589             if (memEQs(elem, len, "ARRAY"))
590             {
591                 tmpRef = MUTABLE_SV(GvAV(gv));
592                 if (tmpRef && !AvREAL((const AV *)tmpRef)
593                  && AvREIFY((const AV *)tmpRef))
594                     av_reify(MUTABLE_AV(tmpRef));
595             }
596             break;
597         case 'C':
598             if (memEQs(elem, len, "CODE"))
599                 tmpRef = MUTABLE_SV(GvCVu(gv));
600             break;
601         case 'F':
602             if (memEQs(elem, len, "FILEHANDLE")) {
603                 tmpRef = MUTABLE_SV(GvIOp(gv));
604             }
605             else
606                 if (memEQs(elem, len, "FORMAT"))
607                     tmpRef = MUTABLE_SV(GvFORM(gv));
608             break;
609         case 'G':
610             if (memEQs(elem, len, "GLOB"))
611                 tmpRef = MUTABLE_SV(gv);
612             break;
613         case 'H':
614             if (memEQs(elem, len, "HASH"))
615                 tmpRef = MUTABLE_SV(GvHV(gv));
616             break;
617         case 'I':
618             if (memEQs(elem, len, "IO"))
619                 tmpRef = MUTABLE_SV(GvIOp(gv));
620             break;
621         case 'N':
622             if (memEQs(elem, len, "NAME"))
623                 sv = newSVhek(GvNAME_HEK(gv));
624             break;
625         case 'P':
626             if (memEQs(elem, len, "PACKAGE")) {
627                 const HV * const stash = GvSTASH(gv);
628                 const HEK * const hek = stash ? HvNAME_HEK(stash) : NULL;
629                 sv = hek ? newSVhek(hek) : newSVpvs("__ANON__");
630             }
631             break;
632         case 'S':
633             if (memEQs(elem, len, "SCALAR"))
634                 tmpRef = GvSVn(gv);
635             break;
636         }
637     }
638     if (tmpRef)
639         sv = newRV(tmpRef);
640     if (sv)
641         sv_2mortal(sv);
642     else
643         sv = &PL_sv_undef;
644     SETs(sv);
645     RETURN;
646 }
647
648 /* Pattern matching */
649
650 PP(pp_study)
651 {
652     dSP; dTOPss;
653     STRLEN len;
654
655     (void)SvPV(sv, len);
656     if (len == 0 || len > I32_MAX || !SvPOK(sv) || SvUTF8(sv) || SvVALID(sv)) {
657         /* Historically, study was skipped in these cases. */
658         SETs(&PL_sv_no);
659         return NORMAL;
660     }
661
662     /* Make study a no-op. It's no longer useful and its existence
663        complicates matters elsewhere. */
664     SETs(&PL_sv_yes);
665     return NORMAL;
666 }
667
668
669 /* also used for: pp_transr() */
670
671 PP(pp_trans)
672 {
673     dSP; 
674     SV *sv;
675
676     if (PL_op->op_flags & OPf_STACKED)
677         sv = POPs;
678     else {
679         EXTEND(SP,1);
680         if (ARGTARG)
681             sv = PAD_SV(ARGTARG);
682         else {
683             sv = DEFSV;
684         }
685     }
686     if(PL_op->op_type == OP_TRANSR) {
687         STRLEN len;
688         const char * const pv = SvPV(sv,len);
689         SV * const newsv = newSVpvn_flags(pv, len, SVs_TEMP|SvUTF8(sv));
690         do_trans(newsv);
691         PUSHs(newsv);
692     }
693     else {
694         Size_t i = do_trans(sv);
695         mPUSHi((UV)i);
696     }
697     RETURN;
698 }
699
700 /* Lvalue operators. */
701
702 static size_t
703 S_do_chomp(pTHX_ SV *retval, SV *sv, bool chomping)
704 {
705     STRLEN len;
706     char *s;
707     size_t count = 0;
708
709     PERL_ARGS_ASSERT_DO_CHOMP;
710
711     if (chomping && (RsSNARF(PL_rs) || RsRECORD(PL_rs)))
712         return 0;
713     if (SvTYPE(sv) == SVt_PVAV) {
714         I32 i;
715         AV *const av = MUTABLE_AV(sv);
716         const I32 max = AvFILL(av);
717
718         for (i = 0; i <= max; i++) {
719             sv = MUTABLE_SV(av_fetch(av, i, FALSE));
720             if (sv && ((sv = *(SV**)sv), sv != &PL_sv_undef))
721                 count += do_chomp(retval, sv, chomping);
722         }
723         return count;
724     }
725     else if (SvTYPE(sv) == SVt_PVHV) {
726         HV* const hv = MUTABLE_HV(sv);
727         HE* entry;
728         (void)hv_iterinit(hv);
729         while ((entry = hv_iternext(hv)))
730             count += do_chomp(retval, hv_iterval(hv,entry), chomping);
731         return count;
732     }
733     else if (SvREADONLY(sv)) {
734             Perl_croak_no_modify();
735     }
736
737     s = SvPV(sv, len);
738     if (chomping) {
739         if (s && len) {
740             char *temp_buffer = NULL;
741             SV *svrecode = NULL;
742             s += --len;
743             if (RsPARA(PL_rs)) {
744                 if (*s != '\n')
745                     goto nope_free_nothing;
746                 ++count;
747                 while (len && s[-1] == '\n') {
748                     --len;
749                     --s;
750                     ++count;
751                 }
752             }
753             else {
754                 STRLEN rslen, rs_charlen;
755                 const char *rsptr = SvPV_const(PL_rs, rslen);
756
757                 rs_charlen = SvUTF8(PL_rs)
758                     ? sv_len_utf8(PL_rs)
759                     : rslen;
760
761                 if (SvUTF8(PL_rs) != SvUTF8(sv)) {
762                     /* Assumption is that rs is shorter than the scalar.  */
763                     if (SvUTF8(PL_rs)) {
764                         /* RS is utf8, scalar is 8 bit.  */
765                         bool is_utf8 = TRUE;
766                         temp_buffer = (char*)bytes_from_utf8((U8*)rsptr,
767                                                              &rslen, &is_utf8);
768                         if (is_utf8) {
769                             /* Cannot downgrade, therefore cannot possibly match.
770                                At this point, temp_buffer is not alloced, and
771                                is the buffer inside PL_rs, so dont free it.
772                              */
773                             assert (temp_buffer == rsptr);
774                             goto nope_free_sv;
775                         }
776                         rsptr = temp_buffer;
777                     }
778                     else {
779                         /* RS is 8 bit, scalar is utf8.  */
780                         temp_buffer = (char*)bytes_to_utf8((U8*)rsptr, &rslen);
781                         rsptr = temp_buffer;
782                     }
783                 }
784                 if (rslen == 1) {
785                     if (*s != *rsptr)
786                         goto nope_free_all;
787                     ++count;
788                 }
789                 else {
790                     if (len < rslen - 1)
791                         goto nope_free_all;
792                     len -= rslen - 1;
793                     s -= rslen - 1;
794                     if (memNE(s, rsptr, rslen))
795                         goto nope_free_all;
796                     count += rs_charlen;
797                 }
798             }
799             SvPV_force_nomg_nolen(sv);
800             SvCUR_set(sv, len);
801             *SvEND(sv) = '\0';
802             SvNIOK_off(sv);
803             SvSETMAGIC(sv);
804
805             nope_free_all:
806             Safefree(temp_buffer);
807             nope_free_sv:
808             SvREFCNT_dec(svrecode);
809             nope_free_nothing: ;
810         }
811     } else {
812         if (len && (!SvPOK(sv) || SvIsCOW(sv)))
813             s = SvPV_force_nomg(sv, len);
814         if (DO_UTF8(sv)) {
815             if (s && len) {
816                 char * const send = s + len;
817                 char * const start = s;
818                 s = send - 1;
819                 while (s > start && UTF8_IS_CONTINUATION(*s))
820                     s--;
821                 if (is_utf8_string((U8*)s, send - s)) {
822                     sv_setpvn(retval, s, send - s);
823                     *s = '\0';
824                     SvCUR_set(sv, s - start);
825                     SvNIOK_off(sv);
826                     SvUTF8_on(retval);
827                 }
828             }
829             else
830                 SvPVCLEAR(retval);
831         }
832         else if (s && len) {
833             s += --len;
834             sv_setpvn(retval, s, 1);
835             *s = '\0';
836             SvCUR_set(sv, len);
837             SvUTF8_off(sv);
838             SvNIOK_off(sv);
839         }
840         else
841             SvPVCLEAR(retval);
842         SvSETMAGIC(sv);
843     }
844     return count;
845 }
846
847
848 /* also used for: pp_schomp() */
849
850 PP(pp_schop)
851 {
852     dSP; dTARGET;
853     const bool chomping = PL_op->op_type == OP_SCHOMP;
854
855     const size_t count = do_chomp(TARG, TOPs, chomping);
856     if (chomping)
857         sv_setiv(TARG, count);
858     SETTARG;
859     return NORMAL;
860 }
861
862
863 /* also used for: pp_chomp() */
864
865 PP(pp_chop)
866 {
867     dSP; dMARK; dTARGET; dORIGMARK;
868     const bool chomping = PL_op->op_type == OP_CHOMP;
869     size_t count = 0;
870
871     while (MARK < SP)
872         count += do_chomp(TARG, *++MARK, chomping);
873     if (chomping)
874         sv_setiv(TARG, count);
875     SP = ORIGMARK;
876     XPUSHTARG;
877     RETURN;
878 }
879
880 PP(pp_undef)
881 {
882     dSP;
883     SV *sv;
884
885     if (!PL_op->op_private) {
886         EXTEND(SP, 1);
887         RETPUSHUNDEF;
888     }
889
890     sv = TOPs;
891     if (!sv)
892     {
893         SETs(&PL_sv_undef);
894         return NORMAL;
895     }
896
897     if (SvTHINKFIRST(sv))
898         sv_force_normal_flags(sv, SV_COW_DROP_PV|SV_IMMEDIATE_UNREF);
899
900     switch (SvTYPE(sv)) {
901     case SVt_NULL:
902         break;
903     case SVt_PVAV:
904         av_undef(MUTABLE_AV(sv));
905         break;
906     case SVt_PVHV:
907         hv_undef(MUTABLE_HV(sv));
908         break;
909     case SVt_PVCV:
910         if (cv_const_sv((const CV *)sv))
911             Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
912                           "Constant subroutine %" SVf " undefined",
913                            SVfARG(CvANON((const CV *)sv)
914                              ? newSVpvs_flags("(anonymous)", SVs_TEMP)
915                              : sv_2mortal(newSVhek(
916                                 CvNAMED(sv)
917                                  ? CvNAME_HEK((CV *)sv)
918                                  : GvENAME_HEK(CvGV((const CV *)sv))
919                                ))
920                            ));
921         /* FALLTHROUGH */
922     case SVt_PVFM:
923             /* let user-undef'd sub keep its identity */
924         cv_undef_flags(MUTABLE_CV(sv), CV_UNDEF_KEEP_NAME);
925         break;
926     case SVt_PVGV:
927         assert(isGV_with_GP(sv));
928         assert(!SvFAKE(sv));
929         {
930             GP *gp;
931             HV *stash;
932
933             /* undef *Pkg::meth_name ... */
934             bool method_changed
935              =   GvCVu((const GV *)sv) && (stash = GvSTASH((const GV *)sv))
936               && HvENAME_get(stash);
937             /* undef *Foo:: */
938             if((stash = GvHV((const GV *)sv))) {
939                 if(HvENAME_get(stash))
940                     SvREFCNT_inc_simple_void_NN(sv_2mortal((SV *)stash));
941                 else stash = NULL;
942             }
943
944             SvREFCNT_inc_simple_void_NN(sv_2mortal(sv));
945             gp_free(MUTABLE_GV(sv));
946             Newxz(gp, 1, GP);
947             GvGP_set(sv, gp_ref(gp));
948 #ifndef PERL_DONT_CREATE_GVSV
949             GvSV(sv) = newSV(0);
950 #endif
951             GvLINE(sv) = CopLINE(PL_curcop);
952             GvEGV(sv) = MUTABLE_GV(sv);
953             GvMULTI_on(sv);
954
955             if(stash)
956                 mro_package_moved(NULL, stash, (const GV *)sv, 0);
957             stash = NULL;
958             /* undef *Foo::ISA */
959             if( strEQ(GvNAME((const GV *)sv), "ISA")
960              && (stash = GvSTASH((const GV *)sv))
961              && (method_changed || HvENAME(stash)) )
962                 mro_isa_changed_in(stash);
963             else if(method_changed)
964                 mro_method_changed_in(
965                  GvSTASH((const GV *)sv)
966                 );
967
968             break;
969         }
970     default:
971         if (SvTYPE(sv) >= SVt_PV && SvPVX_const(sv) && SvLEN(sv)) {
972             SvPV_free(sv);
973             SvPV_set(sv, NULL);
974             SvLEN_set(sv, 0);
975         }
976         SvOK_off(sv);
977         SvSETMAGIC(sv);
978     }
979
980     SETs(&PL_sv_undef);
981     return NORMAL;
982 }
983
984
985 /* common "slow" code for pp_postinc and pp_postdec */
986
987 static OP *
988 S_postincdec_common(pTHX_ SV *sv, SV *targ)
989 {
990     dSP;
991     const bool inc =
992         PL_op->op_type == OP_POSTINC || PL_op->op_type == OP_I_POSTINC;
993
994     if (SvROK(sv))
995         TARG = sv_newmortal();
996     sv_setsv(TARG, sv);
997     if (inc)
998         sv_inc_nomg(sv);
999     else
1000         sv_dec_nomg(sv);
1001     SvSETMAGIC(sv);
1002     /* special case for undef: see thread at 2003-03/msg00536.html in archive */
1003     if (inc && !SvOK(TARG))
1004         sv_setiv(TARG, 0);
1005     SETTARG;
1006     return NORMAL;
1007 }
1008
1009
1010 /* also used for: pp_i_postinc() */
1011
1012 PP(pp_postinc)
1013 {
1014     dSP; dTARGET;
1015     SV *sv = TOPs;
1016
1017     /* special-case sv being a simple integer */
1018     if (LIKELY(((sv->sv_flags &
1019                         (SVf_THINKFIRST|SVs_GMG|SVf_IVisUV|
1020                          SVf_IOK|SVf_NOK|SVf_POK|SVp_NOK|SVp_POK|SVf_ROK))
1021                 == SVf_IOK))
1022         && SvIVX(sv) != IV_MAX)
1023     {
1024         IV iv = SvIVX(sv);
1025         SvIV_set(sv,  iv + 1);
1026         TARGi(iv, 0); /* arg not GMG, so can't be tainted */
1027         SETs(TARG);
1028         return NORMAL;
1029     }
1030
1031     return S_postincdec_common(aTHX_ sv, TARG);
1032 }
1033
1034
1035 /* also used for: pp_i_postdec() */
1036
1037 PP(pp_postdec)
1038 {
1039     dSP; dTARGET;
1040     SV *sv = TOPs;
1041
1042     /* special-case sv being a simple integer */
1043     if (LIKELY(((sv->sv_flags &
1044                         (SVf_THINKFIRST|SVs_GMG|SVf_IVisUV|
1045                          SVf_IOK|SVf_NOK|SVf_POK|SVp_NOK|SVp_POK|SVf_ROK))
1046                 == SVf_IOK))
1047         && SvIVX(sv) != IV_MIN)
1048     {
1049         IV iv = SvIVX(sv);
1050         SvIV_set(sv,  iv - 1);
1051         TARGi(iv, 0); /* arg not GMG, so can't be tainted */
1052         SETs(TARG);
1053         return NORMAL;
1054     }
1055
1056     return S_postincdec_common(aTHX_ sv, TARG);
1057 }
1058
1059
1060 /* Ordinary operators. */
1061
1062 PP(pp_pow)
1063 {
1064     dSP; dATARGET; SV *svl, *svr;
1065 #ifdef PERL_PRESERVE_IVUV
1066     bool is_int = 0;
1067 #endif
1068     tryAMAGICbin_MG(pow_amg, AMGf_assign|AMGf_numeric);
1069     svr = TOPs;
1070     svl = TOPm1s;
1071 #ifdef PERL_PRESERVE_IVUV
1072     /* For integer to integer power, we do the calculation by hand wherever
1073        we're sure it is safe; otherwise we call pow() and try to convert to
1074        integer afterwards. */
1075     if (SvIV_please_nomg(svr) && SvIV_please_nomg(svl)) {
1076                 UV power;
1077                 bool baseuok;
1078                 UV baseuv;
1079
1080                 if (SvUOK(svr)) {
1081                     power = SvUVX(svr);
1082                 } else {
1083                     const IV iv = SvIVX(svr);
1084                     if (iv >= 0) {
1085                         power = iv;
1086                     } else {
1087                         goto float_it; /* Can't do negative powers this way.  */
1088                     }
1089                 }
1090
1091                 baseuok = SvUOK(svl);
1092                 if (baseuok) {
1093                     baseuv = SvUVX(svl);
1094                 } else {
1095                     const IV iv = SvIVX(svl);
1096                     if (iv >= 0) {
1097                         baseuv = iv;
1098                         baseuok = TRUE; /* effectively it's a UV now */
1099                     } else {
1100                         baseuv = -iv; /* abs, baseuok == false records sign */
1101                     }
1102                 }
1103                 /* now we have integer ** positive integer. */
1104                 is_int = 1;
1105
1106                 /* foo & (foo - 1) is zero only for a power of 2.  */
1107                 if (!(baseuv & (baseuv - 1))) {
1108                     /* We are raising power-of-2 to a positive integer.
1109                        The logic here will work for any base (even non-integer
1110                        bases) but it can be less accurate than
1111                        pow (base,power) or exp (power * log (base)) when the
1112                        intermediate values start to spill out of the mantissa.
1113                        With powers of 2 we know this can't happen.
1114                        And powers of 2 are the favourite thing for perl
1115                        programmers to notice ** not doing what they mean. */
1116                     NV result = 1.0;
1117                     NV base = baseuok ? baseuv : -(NV)baseuv;
1118
1119                     if (power & 1) {
1120                         result *= base;
1121                     }
1122                     while (power >>= 1) {
1123                         base *= base;
1124                         if (power & 1) {
1125                             result *= base;
1126                         }
1127                     }
1128                     SP--;
1129                     SETn( result );
1130                     SvIV_please_nomg(svr);
1131                     RETURN;
1132                 } else {
1133                     unsigned int highbit = 8 * sizeof(UV);
1134                     unsigned int diff = 8 * sizeof(UV);
1135                     while (diff >>= 1) {
1136                         highbit -= diff;
1137                         if (baseuv >> highbit) {
1138                             highbit += diff;
1139                         }
1140                     }
1141                     /* we now have baseuv < 2 ** highbit */
1142                     if (power * highbit <= 8 * sizeof(UV)) {
1143                         /* result will definitely fit in UV, so use UV math
1144                            on same algorithm as above */
1145                         UV result = 1;
1146                         UV base = baseuv;
1147                         const bool odd_power = cBOOL(power & 1);
1148                         if (odd_power) {
1149                             result *= base;
1150                         }
1151                         while (power >>= 1) {
1152                             base *= base;
1153                             if (power & 1) {
1154                                 result *= base;
1155                             }
1156                         }
1157                         SP--;
1158                         if (baseuok || !odd_power)
1159                             /* answer is positive */
1160                             SETu( result );
1161                         else if (result <= (UV)IV_MAX)
1162                             /* answer negative, fits in IV */
1163                             SETi( -(IV)result );
1164                         else if (result == (UV)IV_MIN) 
1165                             /* 2's complement assumption: special case IV_MIN */
1166                             SETi( IV_MIN );
1167                         else
1168                             /* answer negative, doesn't fit */
1169                             SETn( -(NV)result );
1170                         RETURN;
1171                     } 
1172                 }
1173     }
1174   float_it:
1175 #endif    
1176     {
1177         NV right = SvNV_nomg(svr);
1178         NV left  = SvNV_nomg(svl);
1179         (void)POPs;
1180
1181 #if defined(USE_LONG_DOUBLE) && defined(HAS_AIX_POWL_NEG_BASE_BUG)
1182     /*
1183     We are building perl with long double support and are on an AIX OS
1184     afflicted with a powl() function that wrongly returns NaNQ for any
1185     negative base.  This was reported to IBM as PMR #23047-379 on
1186     03/06/2006.  The problem exists in at least the following versions
1187     of AIX and the libm fileset, and no doubt others as well:
1188
1189         AIX 4.3.3-ML10      bos.adt.libm 4.3.3.50
1190         AIX 5.1.0-ML04      bos.adt.libm 5.1.0.29
1191         AIX 5.2.0           bos.adt.libm 5.2.0.85
1192
1193     So, until IBM fixes powl(), we provide the following workaround to
1194     handle the problem ourselves.  Our logic is as follows: for
1195     negative bases (left), we use fmod(right, 2) to check if the
1196     exponent is an odd or even integer:
1197
1198         - if odd,  powl(left, right) == -powl(-left, right)
1199         - if even, powl(left, right) ==  powl(-left, right)
1200
1201     If the exponent is not an integer, the result is rightly NaNQ, so
1202     we just return that (as NV_NAN).
1203     */
1204
1205         if (left < 0.0) {
1206             NV mod2 = Perl_fmod( right, 2.0 );
1207             if (mod2 == 1.0 || mod2 == -1.0) {  /* odd integer */
1208                 SETn( -Perl_pow( -left, right) );
1209             } else if (mod2 == 0.0) {           /* even integer */
1210                 SETn( Perl_pow( -left, right) );
1211             } else {                            /* fractional power */
1212                 SETn( NV_NAN );
1213             }
1214         } else {
1215             SETn( Perl_pow( left, right) );
1216         }
1217 #else
1218         SETn( Perl_pow( left, right) );
1219 #endif  /* HAS_AIX_POWL_NEG_BASE_BUG */
1220
1221 #ifdef PERL_PRESERVE_IVUV
1222         if (is_int)
1223             SvIV_please_nomg(svr);
1224 #endif
1225         RETURN;
1226     }
1227 }
1228
1229 PP(pp_multiply)
1230 {
1231     dSP; dATARGET; SV *svl, *svr;
1232     tryAMAGICbin_MG(mult_amg, AMGf_assign|AMGf_numeric);
1233     svr = TOPs;
1234     svl = TOPm1s;
1235
1236 #ifdef PERL_PRESERVE_IVUV
1237
1238     /* special-case some simple common cases */
1239     if (!((svl->sv_flags|svr->sv_flags) & (SVf_IVisUV|SVs_GMG))) {
1240         IV il, ir;
1241         U32 flags = (svl->sv_flags & svr->sv_flags);
1242         if (flags & SVf_IOK) {
1243             /* both args are simple IVs */
1244             UV topl, topr;
1245             il = SvIVX(svl);
1246             ir = SvIVX(svr);
1247           do_iv:
1248             topl = ((UV)il) >> (UVSIZE * 4 - 1);
1249             topr = ((UV)ir) >> (UVSIZE * 4 - 1);
1250
1251             /* if both are in a range that can't under/overflow, do a
1252              * simple integer multiply: if the top halves(*) of both numbers
1253              * are 00...00  or 11...11, then it's safe.
1254              * (*) for 32-bits, the "top half" is the top 17 bits,
1255              *     for 64-bits, its 33 bits */
1256             if (!(
1257                       ((topl+1) | (topr+1))
1258                     & ( (((UV)1) << (UVSIZE * 4 + 1)) - 2) /* 11..110 */
1259             )) {
1260                 SP--;
1261                 TARGi(il * ir, 0); /* args not GMG, so can't be tainted */
1262                 SETs(TARG);
1263                 RETURN;
1264             }
1265             goto generic;
1266         }
1267         else if (flags & SVf_NOK) {
1268             /* both args are NVs */
1269             NV nl = SvNVX(svl);
1270             NV nr = SvNVX(svr);
1271             NV result;
1272
1273             if (
1274 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1275                 !Perl_isnan(nl) && nl == (NV)(il = (IV)nl)
1276                 && !Perl_isnan(nr) && nr == (NV)(ir = (IV)nr)
1277 #else
1278                 nl == (NV)(il = (IV)nl) && nr == (NV)(ir = (IV)nr)
1279 #endif
1280                 )
1281                 /* nothing was lost by converting to IVs */
1282                 goto do_iv;
1283             SP--;
1284             result = nl * nr;
1285 #  if defined(__sgi) && defined(USE_LONG_DOUBLE) && LONG_DOUBLEKIND == LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE && NVSIZE == 16
1286             if (Perl_isinf(result)) {
1287                 Zero((U8*)&result + 8, 8, U8);
1288             }
1289 #  endif
1290             TARGn(result, 0); /* args not GMG, so can't be tainted */
1291             SETs(TARG);
1292             RETURN;
1293         }
1294     }
1295
1296   generic:
1297
1298     if (SvIV_please_nomg(svr)) {
1299         /* Unless the left argument is integer in range we are going to have to
1300            use NV maths. Hence only attempt to coerce the right argument if
1301            we know the left is integer.  */
1302         /* Left operand is defined, so is it IV? */
1303         if (SvIV_please_nomg(svl)) {
1304             bool auvok = SvUOK(svl);
1305             bool buvok = SvUOK(svr);
1306             const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
1307             const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
1308             UV alow;
1309             UV ahigh;
1310             UV blow;
1311             UV bhigh;
1312
1313             if (auvok) {
1314                 alow = SvUVX(svl);
1315             } else {
1316                 const IV aiv = SvIVX(svl);
1317                 if (aiv >= 0) {
1318                     alow = aiv;
1319                     auvok = TRUE; /* effectively it's a UV now */
1320                 } else {
1321                     /* abs, auvok == false records sign */
1322                     alow = (aiv == IV_MIN) ? (UV)aiv : (UV)(-aiv);
1323                 }
1324             }
1325             if (buvok) {
1326                 blow = SvUVX(svr);
1327             } else {
1328                 const IV biv = SvIVX(svr);
1329                 if (biv >= 0) {
1330                     blow = biv;
1331                     buvok = TRUE; /* effectively it's a UV now */
1332                 } else {
1333                     /* abs, buvok == false records sign */
1334                     blow = (biv == IV_MIN) ? (UV)biv : (UV)(-biv);
1335                 }
1336             }
1337
1338             /* If this does sign extension on unsigned it's time for plan B  */
1339             ahigh = alow >> (4 * sizeof (UV));
1340             alow &= botmask;
1341             bhigh = blow >> (4 * sizeof (UV));
1342             blow &= botmask;
1343             if (ahigh && bhigh) {
1344                 NOOP;
1345                 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
1346                    which is overflow. Drop to NVs below.  */
1347             } else if (!ahigh && !bhigh) {
1348                 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
1349                    so the unsigned multiply cannot overflow.  */
1350                 const UV product = alow * blow;
1351                 if (auvok == buvok) {
1352                     /* -ve * -ve or +ve * +ve gives a +ve result.  */
1353                     SP--;
1354                     SETu( product );
1355                     RETURN;
1356                 } else if (product <= (UV)IV_MIN) {
1357                     /* 2s complement assumption that (UV)-IV_MIN is correct.  */
1358                     /* -ve result, which could overflow an IV  */
1359                     SP--;
1360                     /* can't negate IV_MIN, but there are aren't two
1361                      * integers such that !ahigh && !bhigh, where the
1362                      * product equals 0x800....000 */
1363                     assert(product != (UV)IV_MIN);
1364                     SETi( -(IV)product );
1365                     RETURN;
1366                 } /* else drop to NVs below. */
1367             } else {
1368                 /* One operand is large, 1 small */
1369                 UV product_middle;
1370                 if (bhigh) {
1371                     /* swap the operands */
1372                     ahigh = bhigh;
1373                     bhigh = blow; /* bhigh now the temp var for the swap */
1374                     blow = alow;
1375                     alow = bhigh;
1376                 }
1377                 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1378                    multiplies can't overflow. shift can, add can, -ve can.  */
1379                 product_middle = ahigh * blow;
1380                 if (!(product_middle & topmask)) {
1381                     /* OK, (ahigh * blow) won't lose bits when we shift it.  */
1382                     UV product_low;
1383                     product_middle <<= (4 * sizeof (UV));
1384                     product_low = alow * blow;
1385
1386                     /* as for pp_add, UV + something mustn't get smaller.
1387                        IIRC ANSI mandates this wrapping *behaviour* for
1388                        unsigned whatever the actual representation*/
1389                     product_low += product_middle;
1390                     if (product_low >= product_middle) {
1391                         /* didn't overflow */
1392                         if (auvok == buvok) {
1393                             /* -ve * -ve or +ve * +ve gives a +ve result.  */
1394                             SP--;
1395                             SETu( product_low );
1396                             RETURN;
1397                         } else if (product_low <= (UV)IV_MIN) {
1398                             /* 2s complement assumption again  */
1399                             /* -ve result, which could overflow an IV  */
1400                             SP--;
1401                             SETi(product_low == (UV)IV_MIN
1402                                     ? IV_MIN : -(IV)product_low);
1403                             RETURN;
1404                         } /* else drop to NVs below. */
1405                     }
1406                 } /* product_middle too large */
1407             } /* ahigh && bhigh */
1408         } /* SvIOK(svl) */
1409     } /* SvIOK(svr) */
1410 #endif
1411     {
1412       NV right = SvNV_nomg(svr);
1413       NV left  = SvNV_nomg(svl);
1414       NV result = left * right;
1415
1416       (void)POPs;
1417 #if defined(__sgi) && defined(USE_LONG_DOUBLE) && LONG_DOUBLEKIND == LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE && NVSIZE == 16
1418       if (Perl_isinf(result)) {
1419           Zero((U8*)&result + 8, 8, U8);
1420       }
1421 #endif
1422       SETn(result);
1423       RETURN;
1424     }
1425 }
1426
1427 PP(pp_divide)
1428 {
1429     dSP; dATARGET; SV *svl, *svr;
1430     tryAMAGICbin_MG(div_amg, AMGf_assign|AMGf_numeric);
1431     svr = TOPs;
1432     svl = TOPm1s;
1433     /* Only try to do UV divide first
1434        if ((SLOPPYDIVIDE is true) or
1435            (PERL_PRESERVE_IVUV is true and one or both SV is a UV too large
1436             to preserve))
1437        The assumption is that it is better to use floating point divide
1438        whenever possible, only doing integer divide first if we can't be sure.
1439        If NV_PRESERVES_UV is true then we know at compile time that no UV
1440        can be too large to preserve, so don't need to compile the code to
1441        test the size of UVs.  */
1442
1443 #if defined(SLOPPYDIVIDE) || (defined(PERL_PRESERVE_IVUV) && !defined(NV_PRESERVES_UV))
1444 #  define PERL_TRY_UV_DIVIDE
1445     /* ensure that 20./5. == 4. */
1446 #endif
1447
1448 #ifdef PERL_TRY_UV_DIVIDE
1449     if (SvIV_please_nomg(svr) && SvIV_please_nomg(svl)) {
1450             bool left_non_neg = SvUOK(svl);
1451             bool right_non_neg = SvUOK(svr);
1452             UV left;
1453             UV right;
1454
1455             if (right_non_neg) {
1456                 right = SvUVX(svr);
1457             }
1458             else {
1459                 const IV biv = SvIVX(svr);
1460                 if (biv >= 0) {
1461                     right = biv;
1462                     right_non_neg = TRUE; /* effectively it's a UV now */
1463                 }
1464                 else {
1465                     right = (biv == IV_MIN) ? (UV)biv : (UV)(-biv);
1466                 }
1467             }
1468             /* historically undef()/0 gives a "Use of uninitialized value"
1469                warning before dieing, hence this test goes here.
1470                If it were immediately before the second SvIV_please, then
1471                DIE() would be invoked before left was even inspected, so
1472                no inspection would give no warning.  */
1473             if (right == 0)
1474                 DIE(aTHX_ "Illegal division by zero");
1475
1476             if (left_non_neg) {
1477                 left = SvUVX(svl);
1478             }
1479             else {
1480                 const IV aiv = SvIVX(svl);
1481                 if (aiv >= 0) {
1482                     left = aiv;
1483                     left_non_neg = TRUE; /* effectively it's a UV now */
1484                 }
1485                 else {
1486                     left = (aiv == IV_MIN) ? (UV)aiv : (UV)(-aiv);
1487                 }
1488             }
1489
1490             if (left >= right
1491 #ifdef SLOPPYDIVIDE
1492                 /* For sloppy divide we always attempt integer division.  */
1493 #else
1494                 /* Otherwise we only attempt it if either or both operands
1495                    would not be preserved by an NV.  If both fit in NVs
1496                    we fall through to the NV divide code below.  However,
1497                    as left >= right to ensure integer result here, we know that
1498                    we can skip the test on the right operand - right big
1499                    enough not to be preserved can't get here unless left is
1500                    also too big.  */
1501
1502                 && (left > ((UV)1 << NV_PRESERVES_UV_BITS))
1503 #endif
1504                 ) {
1505                 /* Integer division can't overflow, but it can be imprecise.  */
1506                 const UV result = left / right;
1507                 if (result * right == left) {
1508                     SP--; /* result is valid */
1509                     if (left_non_neg == right_non_neg) {
1510                         /* signs identical, result is positive.  */
1511                         SETu( result );
1512                         RETURN;
1513                     }
1514                     /* 2s complement assumption */
1515                     if (result <= (UV)IV_MIN)
1516                         SETi(result == (UV)IV_MIN ? IV_MIN : -(IV)result);
1517                     else {
1518                         /* It's exact but too negative for IV. */
1519                         SETn( -(NV)result );
1520                     }
1521                     RETURN;
1522                 } /* tried integer divide but it was not an integer result */
1523             } /* else (PERL_ABS(result) < 1.0) or (both UVs in range for NV) */
1524     } /* one operand wasn't SvIOK */
1525 #endif /* PERL_TRY_UV_DIVIDE */
1526     {
1527         NV right = SvNV_nomg(svr);
1528         NV left  = SvNV_nomg(svl);
1529         (void)POPs;(void)POPs;
1530 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1531         if (! Perl_isnan(right) && right == 0.0)
1532 #else
1533         if (right == 0.0)
1534 #endif
1535             DIE(aTHX_ "Illegal division by zero");
1536         PUSHn( left / right );
1537         RETURN;
1538     }
1539 }
1540
1541 PP(pp_modulo)
1542 {
1543     dSP; dATARGET;
1544     tryAMAGICbin_MG(modulo_amg, AMGf_assign|AMGf_numeric);
1545     {
1546         UV left  = 0;
1547         UV right = 0;
1548         bool left_neg = FALSE;
1549         bool right_neg = FALSE;
1550         bool use_double = FALSE;
1551         bool dright_valid = FALSE;
1552         NV dright = 0.0;
1553         NV dleft  = 0.0;
1554         SV * const svr = TOPs;
1555         SV * const svl = TOPm1s;
1556         if (SvIV_please_nomg(svr)) {
1557             right_neg = !SvUOK(svr);
1558             if (!right_neg) {
1559                 right = SvUVX(svr);
1560             } else {
1561                 const IV biv = SvIVX(svr);
1562                 if (biv >= 0) {
1563                     right = biv;
1564                     right_neg = FALSE; /* effectively it's a UV now */
1565                 } else {
1566                     right = (biv == IV_MIN) ? (UV)biv : (UV)(-biv);
1567                 }
1568             }
1569         }
1570         else {
1571             dright = SvNV_nomg(svr);
1572             right_neg = dright < 0;
1573             if (right_neg)
1574                 dright = -dright;
1575             if (dright < UV_MAX_P1) {
1576                 right = U_V(dright);
1577                 dright_valid = TRUE; /* In case we need to use double below.  */
1578             } else {
1579                 use_double = TRUE;
1580             }
1581         }
1582
1583         /* At this point use_double is only true if right is out of range for
1584            a UV.  In range NV has been rounded down to nearest UV and
1585            use_double false.  */
1586         if (!use_double && SvIV_please_nomg(svl)) {
1587                 left_neg = !SvUOK(svl);
1588                 if (!left_neg) {
1589                     left = SvUVX(svl);
1590                 } else {
1591                     const IV aiv = SvIVX(svl);
1592                     if (aiv >= 0) {
1593                         left = aiv;
1594                         left_neg = FALSE; /* effectively it's a UV now */
1595                     } else {
1596                         left = (aiv == IV_MIN) ? (UV)aiv : (UV)(-aiv);
1597                     }
1598                 }
1599         }
1600         else {
1601             dleft = SvNV_nomg(svl);
1602             left_neg = dleft < 0;
1603             if (left_neg)
1604                 dleft = -dleft;
1605
1606             /* This should be exactly the 5.6 behaviour - if left and right are
1607                both in range for UV then use U_V() rather than floor.  */
1608             if (!use_double) {
1609                 if (dleft < UV_MAX_P1) {
1610                     /* right was in range, so is dleft, so use UVs not double.
1611                      */
1612                     left = U_V(dleft);
1613                 }
1614                 /* left is out of range for UV, right was in range, so promote
1615                    right (back) to double.  */
1616                 else {
1617                     /* The +0.5 is used in 5.6 even though it is not strictly
1618                        consistent with the implicit +0 floor in the U_V()
1619                        inside the #if 1. */
1620                     dleft = Perl_floor(dleft + 0.5);
1621                     use_double = TRUE;
1622                     if (dright_valid)
1623                         dright = Perl_floor(dright + 0.5);
1624                     else
1625                         dright = right;
1626                 }
1627             }
1628         }
1629         sp -= 2;
1630         if (use_double) {
1631             NV dans;
1632
1633             if (!dright)
1634                 DIE(aTHX_ "Illegal modulus zero");
1635
1636             dans = Perl_fmod(dleft, dright);
1637             if ((left_neg != right_neg) && dans)
1638                 dans = dright - dans;
1639             if (right_neg)
1640                 dans = -dans;
1641             sv_setnv(TARG, dans);
1642         }
1643         else {
1644             UV ans;
1645
1646             if (!right)
1647                 DIE(aTHX_ "Illegal modulus zero");
1648
1649             ans = left % right;
1650             if ((left_neg != right_neg) && ans)
1651                 ans = right - ans;
1652             if (right_neg) {
1653                 /* XXX may warn: unary minus operator applied to unsigned type */
1654                 /* could change -foo to be (~foo)+1 instead     */
1655                 if (ans <= ~((UV)IV_MAX)+1)
1656                     sv_setiv(TARG, ~ans+1);
1657                 else
1658                     sv_setnv(TARG, -(NV)ans);
1659             }
1660             else
1661                 sv_setuv(TARG, ans);
1662         }
1663         PUSHTARG;
1664         RETURN;
1665     }
1666 }
1667
1668 PP(pp_repeat)
1669 {
1670     dSP; dATARGET;
1671     IV count;
1672     SV *sv;
1673     bool infnan = FALSE;
1674     const U8 gimme = GIMME_V;
1675
1676     if (gimme == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1677         /* TODO: think of some way of doing list-repeat overloading ??? */
1678         sv = POPs;
1679         SvGETMAGIC(sv);
1680     }
1681     else {
1682         if (UNLIKELY(PL_op->op_private & OPpREPEAT_DOLIST)) {
1683             /* The parser saw this as a list repeat, and there
1684                are probably several items on the stack. But we're
1685                in scalar/void context, and there's no pp_list to save us
1686                now. So drop the rest of the items -- robin@kitsite.com
1687              */
1688             dMARK;
1689             if (MARK + 1 < SP) {
1690                 MARK[1] = TOPm1s;
1691                 MARK[2] = TOPs;
1692             }
1693             else {
1694                 dTOPss;
1695                 ASSUME(MARK + 1 == SP);
1696                 XPUSHs(sv);
1697                 MARK[1] = &PL_sv_undef;
1698             }
1699             SP = MARK + 2;
1700         }
1701         tryAMAGICbin_MG(repeat_amg, AMGf_assign);
1702         sv = POPs;
1703     }
1704
1705     if (SvIOKp(sv)) {
1706          if (SvUOK(sv)) {
1707               const UV uv = SvUV_nomg(sv);
1708               if (uv > IV_MAX)
1709                    count = IV_MAX; /* The best we can do? */
1710               else
1711                    count = uv;
1712          } else {
1713               count = SvIV_nomg(sv);
1714          }
1715     }
1716     else if (SvNOKp(sv)) {
1717         const NV nv = SvNV_nomg(sv);
1718         infnan = Perl_isinfnan(nv);
1719         if (UNLIKELY(infnan)) {
1720             count = 0;
1721         } else {
1722             if (nv < 0.0)
1723                 count = -1;   /* An arbitrary negative integer */
1724             else
1725                 count = (IV)nv;
1726         }
1727     }
1728     else
1729         count = SvIV_nomg(sv);
1730
1731     if (infnan) {
1732         Perl_ck_warner(aTHX_ packWARN(WARN_NUMERIC),
1733                        "Non-finite repeat count does nothing");
1734     } else if (count < 0) {
1735         count = 0;
1736         Perl_ck_warner(aTHX_ packWARN(WARN_NUMERIC),
1737                        "Negative repeat count does nothing");
1738     }
1739
1740     if (gimme == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1741         dMARK;
1742         const SSize_t items = SP - MARK;
1743         const U8 mod = PL_op->op_flags & OPf_MOD;
1744
1745         if (count > 1) {
1746             SSize_t max;
1747
1748             if (  items > SSize_t_MAX / count   /* max would overflow */
1749                                                 /* repeatcpy would overflow */
1750                || items > I32_MAX / (I32)sizeof(SV *)
1751             )
1752                Perl_croak(aTHX_ "%s","Out of memory during list extend");
1753             max = items * count;
1754             MEXTEND(MARK, max);
1755
1756             while (SP > MARK) {
1757                 if (*SP) {
1758                    if (mod && SvPADTMP(*SP)) {
1759                        *SP = sv_mortalcopy(*SP);
1760                    }
1761                    SvTEMP_off((*SP));
1762                 }
1763                 SP--;
1764             }
1765             MARK++;
1766             repeatcpy((char*)(MARK + items), (char*)MARK,
1767                 items * sizeof(const SV *), count - 1);
1768             SP += max;
1769         }
1770         else if (count <= 0)
1771             SP = MARK;
1772     }
1773     else {      /* Note: mark already snarfed by pp_list */
1774         SV * const tmpstr = POPs;
1775         STRLEN len;
1776         bool isutf;
1777
1778         if (TARG != tmpstr)
1779             sv_setsv_nomg(TARG, tmpstr);
1780         SvPV_force_nomg(TARG, len);
1781         isutf = DO_UTF8(TARG);
1782         if (count != 1) {
1783             if (count < 1)
1784                 SvCUR_set(TARG, 0);
1785             else {
1786                 STRLEN max;
1787
1788                 if (   len > (MEM_SIZE_MAX-1) / (UV)count /* max would overflow */
1789                     || len > (U32)I32_MAX  /* repeatcpy would overflow */
1790                 )
1791                      Perl_croak(aTHX_ "%s",
1792                                         "Out of memory during string extend");
1793                 max = (UV)count * len + 1;
1794                 SvGROW(TARG, max);
1795
1796                 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1797                 SvCUR_set(TARG, SvCUR(TARG) * count);
1798             }
1799             *SvEND(TARG) = '\0';
1800         }
1801         if (isutf)
1802             (void)SvPOK_only_UTF8(TARG);
1803         else
1804             (void)SvPOK_only(TARG);
1805
1806         PUSHTARG;
1807     }
1808     RETURN;
1809 }
1810
1811 PP(pp_subtract)
1812 {
1813     dSP; dATARGET; bool useleft; SV *svl, *svr;
1814     tryAMAGICbin_MG(subtr_amg, AMGf_assign|AMGf_numeric);
1815     svr = TOPs;
1816     svl = TOPm1s;
1817
1818 #ifdef PERL_PRESERVE_IVUV
1819
1820     /* special-case some simple common cases */
1821     if (!((svl->sv_flags|svr->sv_flags) & (SVf_IVisUV|SVs_GMG))) {
1822         IV il, ir;
1823         U32 flags = (svl->sv_flags & svr->sv_flags);
1824         if (flags & SVf_IOK) {
1825             /* both args are simple IVs */
1826             UV topl, topr;
1827             il = SvIVX(svl);
1828             ir = SvIVX(svr);
1829           do_iv:
1830             topl = ((UV)il) >> (UVSIZE * 8 - 2);
1831             topr = ((UV)ir) >> (UVSIZE * 8 - 2);
1832
1833             /* if both are in a range that can't under/overflow, do a
1834              * simple integer subtract: if the top of both numbers
1835              * are 00  or 11, then it's safe */
1836             if (!( ((topl+1) | (topr+1)) & 2)) {
1837                 SP--;
1838                 TARGi(il - ir, 0); /* args not GMG, so can't be tainted */
1839                 SETs(TARG);
1840                 RETURN;
1841             }
1842             goto generic;
1843         }
1844         else if (flags & SVf_NOK) {
1845             /* both args are NVs */
1846             NV nl = SvNVX(svl);
1847             NV nr = SvNVX(svr);
1848
1849             if (
1850 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1851                 !Perl_isnan(nl) && nl == (NV)(il = (IV)nl)
1852                 && !Perl_isnan(nr) && nr == (NV)(ir = (IV)nr)
1853 #else
1854                 nl == (NV)(il = (IV)nl) && nr == (NV)(ir = (IV)nr)
1855 #endif
1856                 )
1857                 /* nothing was lost by converting to IVs */
1858                 goto do_iv;
1859             SP--;
1860             TARGn(nl - nr, 0); /* args not GMG, so can't be tainted */
1861             SETs(TARG);
1862             RETURN;
1863         }
1864     }
1865
1866   generic:
1867
1868     useleft = USE_LEFT(svl);
1869     /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1870        "bad things" happen if you rely on signed integers wrapping.  */
1871     if (SvIV_please_nomg(svr)) {
1872         /* Unless the left argument is integer in range we are going to have to
1873            use NV maths. Hence only attempt to coerce the right argument if
1874            we know the left is integer.  */
1875         UV auv = 0;
1876         bool auvok = FALSE;
1877         bool a_valid = 0;
1878
1879         if (!useleft) {
1880             auv = 0;
1881             a_valid = auvok = 1;
1882             /* left operand is undef, treat as zero.  */
1883         } else {
1884             /* Left operand is defined, so is it IV? */
1885             if (SvIV_please_nomg(svl)) {
1886                 if ((auvok = SvUOK(svl)))
1887                     auv = SvUVX(svl);
1888                 else {
1889                     const IV aiv = SvIVX(svl);
1890                     if (aiv >= 0) {
1891                         auv = aiv;
1892                         auvok = 1;      /* Now acting as a sign flag.  */
1893                     } else { /* 2s complement assumption for IV_MIN */
1894                         auv = (aiv == IV_MIN) ? (UV)aiv : (UV)-aiv;
1895                     }
1896                 }
1897                 a_valid = 1;
1898             }
1899         }
1900         if (a_valid) {
1901             bool result_good = 0;
1902             UV result;
1903             UV buv;
1904             bool buvok = SvUOK(svr);
1905         
1906             if (buvok)
1907                 buv = SvUVX(svr);
1908             else {
1909                 const IV biv = SvIVX(svr);
1910                 if (biv >= 0) {
1911                     buv = biv;
1912                     buvok = 1;
1913                 } else
1914                     buv = (biv == IV_MIN) ? (UV)biv : (UV)-biv;
1915             }
1916             /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1917                else "IV" now, independent of how it came in.
1918                if a, b represents positive, A, B negative, a maps to -A etc
1919                a - b =>  (a - b)
1920                A - b => -(a + b)
1921                a - B =>  (a + b)
1922                A - B => -(a - b)
1923                all UV maths. negate result if A negative.
1924                subtract if signs same, add if signs differ. */
1925
1926             if (auvok ^ buvok) {
1927                 /* Signs differ.  */
1928                 result = auv + buv;
1929                 if (result >= auv)
1930                     result_good = 1;
1931             } else {
1932                 /* Signs same */
1933                 if (auv >= buv) {
1934                     result = auv - buv;
1935                     /* Must get smaller */
1936                     if (result <= auv)
1937                         result_good = 1;
1938                 } else {
1939                     result = buv - auv;
1940                     if (result <= buv) {
1941                         /* result really should be -(auv-buv). as its negation
1942                            of true value, need to swap our result flag  */
1943                         auvok = !auvok;
1944                         result_good = 1;
1945                     }
1946                 }
1947             }
1948             if (result_good) {
1949                 SP--;
1950                 if (auvok)
1951                     SETu( result );
1952                 else {
1953                     /* Negate result */
1954                     if (result <= (UV)IV_MIN)
1955                         SETi(result == (UV)IV_MIN
1956                                 ? IV_MIN : -(IV)result);
1957                     else {
1958                         /* result valid, but out of range for IV.  */
1959                         SETn( -(NV)result );
1960                     }
1961                 }
1962                 RETURN;
1963             } /* Overflow, drop through to NVs.  */
1964         }
1965     }
1966 #else
1967     useleft = USE_LEFT(svl);
1968 #endif
1969     {
1970         NV value = SvNV_nomg(svr);
1971         (void)POPs;
1972
1973         if (!useleft) {
1974             /* left operand is undef, treat as zero - value */
1975             SETn(-value);
1976             RETURN;
1977         }
1978         SETn( SvNV_nomg(svl) - value );
1979         RETURN;
1980     }
1981 }
1982
1983 #define IV_BITS (IVSIZE * 8)
1984
1985 static UV S_uv_shift(UV uv, int shift, bool left)
1986 {
1987    if (shift < 0) {
1988        shift = -shift;
1989        left = !left;
1990    }
1991    if (shift >= IV_BITS) {
1992        return 0;
1993    }
1994    return left ? uv << shift : uv >> shift;
1995 }
1996
1997 static IV S_iv_shift(IV iv, int shift, bool left)
1998 {
1999    if (shift < 0) {
2000        shift = -shift;
2001        left = !left;
2002    }
2003    if (shift >= IV_BITS) {
2004        return iv < 0 && !left ? -1 : 0;
2005    }
2006    return left ? iv << shift : iv >> shift;
2007 }
2008
2009 #define UV_LEFT_SHIFT(uv, shift) S_uv_shift(uv, shift, TRUE)
2010 #define UV_RIGHT_SHIFT(uv, shift) S_uv_shift(uv, shift, FALSE)
2011 #define IV_LEFT_SHIFT(iv, shift) S_iv_shift(iv, shift, TRUE)
2012 #define IV_RIGHT_SHIFT(iv, shift) S_iv_shift(iv, shift, FALSE)
2013
2014 PP(pp_left_shift)
2015 {
2016     dSP; dATARGET; SV *svl, *svr;
2017     tryAMAGICbin_MG(lshift_amg, AMGf_assign|AMGf_numeric);
2018     svr = POPs;
2019     svl = TOPs;
2020     {
2021       const IV shift = SvIV_nomg(svr);
2022       if (PL_op->op_private & HINT_INTEGER) {
2023           SETi(IV_LEFT_SHIFT(SvIV_nomg(svl), shift));
2024       }
2025       else {
2026           SETu(UV_LEFT_SHIFT(SvUV_nomg(svl), shift));
2027       }
2028       RETURN;
2029     }
2030 }
2031
2032 PP(pp_right_shift)
2033 {
2034     dSP; dATARGET; SV *svl, *svr;
2035     tryAMAGICbin_MG(rshift_amg, AMGf_assign|AMGf_numeric);
2036     svr = POPs;
2037     svl = TOPs;
2038     {
2039       const IV shift = SvIV_nomg(svr);
2040       if (PL_op->op_private & HINT_INTEGER) {
2041           SETi(IV_RIGHT_SHIFT(SvIV_nomg(svl), shift));
2042       }
2043       else {
2044           SETu(UV_RIGHT_SHIFT(SvUV_nomg(svl), shift));
2045       }
2046       RETURN;
2047     }
2048 }
2049
2050 PP(pp_lt)
2051 {
2052     dSP;
2053     SV *left, *right;
2054
2055     tryAMAGICbin_MG(lt_amg, AMGf_set|AMGf_numeric);
2056     right = POPs;
2057     left  = TOPs;
2058     SETs(boolSV(
2059         (SvIOK_notUV(left) && SvIOK_notUV(right))
2060         ? (SvIVX(left) < SvIVX(right))
2061         : (do_ncmp(left, right) == -1)
2062     ));
2063     RETURN;
2064 }
2065
2066 PP(pp_gt)
2067 {
2068     dSP;
2069     SV *left, *right;
2070
2071     tryAMAGICbin_MG(gt_amg, AMGf_set|AMGf_numeric);
2072     right = POPs;
2073     left  = TOPs;
2074     SETs(boolSV(
2075         (SvIOK_notUV(left) && SvIOK_notUV(right))
2076         ? (SvIVX(left) > SvIVX(right))
2077         : (do_ncmp(left, right) == 1)
2078     ));
2079     RETURN;
2080 }
2081
2082 PP(pp_le)
2083 {
2084     dSP;
2085     SV *left, *right;
2086
2087     tryAMAGICbin_MG(le_amg, AMGf_set|AMGf_numeric);
2088     right = POPs;
2089     left  = TOPs;
2090     SETs(boolSV(
2091         (SvIOK_notUV(left) && SvIOK_notUV(right))
2092         ? (SvIVX(left) <= SvIVX(right))
2093         : (do_ncmp(left, right) <= 0)
2094     ));
2095     RETURN;
2096 }
2097
2098 PP(pp_ge)
2099 {
2100     dSP;
2101     SV *left, *right;
2102
2103     tryAMAGICbin_MG(ge_amg, AMGf_set|AMGf_numeric);
2104     right = POPs;
2105     left  = TOPs;
2106     SETs(boolSV(
2107         (SvIOK_notUV(left) && SvIOK_notUV(right))
2108         ? (SvIVX(left) >= SvIVX(right))
2109         : ( (do_ncmp(left, right) & 2) == 0)
2110     ));
2111     RETURN;
2112 }
2113
2114 PP(pp_ne)
2115 {
2116     dSP;
2117     SV *left, *right;
2118
2119     tryAMAGICbin_MG(ne_amg, AMGf_set|AMGf_numeric);
2120     right = POPs;
2121     left  = TOPs;
2122     SETs(boolSV(
2123         (SvIOK_notUV(left) && SvIOK_notUV(right))
2124         ? (SvIVX(left) != SvIVX(right))
2125         : (do_ncmp(left, right) != 0)
2126     ));
2127     RETURN;
2128 }
2129
2130 /* compare left and right SVs. Returns:
2131  * -1: <
2132  *  0: ==
2133  *  1: >
2134  *  2: left or right was a NaN
2135  */
2136 I32
2137 Perl_do_ncmp(pTHX_ SV* const left, SV * const right)
2138 {
2139     PERL_ARGS_ASSERT_DO_NCMP;
2140 #ifdef PERL_PRESERVE_IVUV
2141     /* Fortunately it seems NaN isn't IOK */
2142     if (SvIV_please_nomg(right) && SvIV_please_nomg(left)) {
2143             if (!SvUOK(left)) {
2144                 const IV leftiv = SvIVX(left);
2145                 if (!SvUOK(right)) {
2146                     /* ## IV <=> IV ## */
2147                     const IV rightiv = SvIVX(right);
2148                     return (leftiv > rightiv) - (leftiv < rightiv);
2149                 }
2150                 /* ## IV <=> UV ## */
2151                 if (leftiv < 0)
2152                     /* As (b) is a UV, it's >=0, so it must be < */
2153                     return -1;
2154                 {
2155                     const UV rightuv = SvUVX(right);
2156                     return ((UV)leftiv > rightuv) - ((UV)leftiv < rightuv);
2157                 }
2158             }
2159
2160             if (SvUOK(right)) {
2161                 /* ## UV <=> UV ## */
2162                 const UV leftuv = SvUVX(left);
2163                 const UV rightuv = SvUVX(right);
2164                 return (leftuv > rightuv) - (leftuv < rightuv);
2165             }
2166             /* ## UV <=> IV ## */
2167             {
2168                 const IV rightiv = SvIVX(right);
2169                 if (rightiv < 0)
2170                     /* As (a) is a UV, it's >=0, so it cannot be < */
2171                     return 1;
2172                 {
2173                     const UV leftuv = SvUVX(left);
2174                     return (leftuv > (UV)rightiv) - (leftuv < (UV)rightiv);
2175                 }
2176             }
2177             NOT_REACHED; /* NOTREACHED */
2178     }
2179 #endif
2180     {
2181       NV const rnv = SvNV_nomg(right);
2182       NV const lnv = SvNV_nomg(left);
2183
2184 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2185       if (Perl_isnan(lnv) || Perl_isnan(rnv)) {
2186           return 2;
2187        }
2188       return (lnv > rnv) - (lnv < rnv);
2189 #else
2190       if (lnv < rnv)
2191         return -1;
2192       if (lnv > rnv)
2193         return 1;
2194       if (lnv == rnv)
2195         return 0;
2196       return 2;
2197 #endif
2198     }
2199 }
2200
2201
2202 PP(pp_ncmp)
2203 {
2204     dSP;
2205     SV *left, *right;
2206     I32 value;
2207     tryAMAGICbin_MG(ncmp_amg, AMGf_numeric);
2208     right = POPs;
2209     left  = TOPs;
2210     value = do_ncmp(left, right);
2211     if (value == 2) {
2212         SETs(&PL_sv_undef);
2213     }
2214     else {
2215         dTARGET;
2216         SETi(value);
2217     }
2218     RETURN;
2219 }
2220
2221
2222 /* also used for: pp_sge() pp_sgt() pp_slt() */
2223
2224 PP(pp_sle)
2225 {
2226     dSP;
2227
2228     int amg_type = sle_amg;
2229     int multiplier = 1;
2230     int rhs = 1;
2231
2232     switch (PL_op->op_type) {
2233     case OP_SLT:
2234         amg_type = slt_amg;
2235         /* cmp < 0 */
2236         rhs = 0;
2237         break;
2238     case OP_SGT:
2239         amg_type = sgt_amg;
2240         /* cmp > 0 */
2241         multiplier = -1;
2242         rhs = 0;
2243         break;
2244     case OP_SGE:
2245         amg_type = sge_amg;
2246         /* cmp >= 0 */
2247         multiplier = -1;
2248         break;
2249     }
2250
2251     tryAMAGICbin_MG(amg_type, AMGf_set);
2252     {
2253       dPOPTOPssrl;
2254       const int cmp =
2255 #ifdef USE_LOCALE_COLLATE
2256                       (IN_LC_RUNTIME(LC_COLLATE))
2257                       ? sv_cmp_locale_flags(left, right, 0)
2258                       :
2259 #endif
2260                         sv_cmp_flags(left, right, 0);
2261       SETs(boolSV(cmp * multiplier < rhs));
2262       RETURN;
2263     }
2264 }
2265
2266 PP(pp_seq)
2267 {
2268     dSP;
2269     tryAMAGICbin_MG(seq_amg, AMGf_set);
2270     {
2271       dPOPTOPssrl;
2272       SETs(boolSV(sv_eq_flags(left, right, 0)));
2273       RETURN;
2274     }
2275 }
2276
2277 PP(pp_sne)
2278 {
2279     dSP;
2280     tryAMAGICbin_MG(sne_amg, AMGf_set);
2281     {
2282       dPOPTOPssrl;
2283       SETs(boolSV(!sv_eq_flags(left, right, 0)));
2284       RETURN;
2285     }
2286 }
2287
2288 PP(pp_scmp)
2289 {
2290     dSP; dTARGET;
2291     tryAMAGICbin_MG(scmp_amg, 0);
2292     {
2293       dPOPTOPssrl;
2294       const int cmp =
2295 #ifdef USE_LOCALE_COLLATE
2296                       (IN_LC_RUNTIME(LC_COLLATE))
2297                       ? sv_cmp_locale_flags(left, right, 0)
2298                       :
2299 #endif
2300                         sv_cmp_flags(left, right, 0);
2301       SETi( cmp );
2302       RETURN;
2303     }
2304 }
2305
2306 PP(pp_bit_and)
2307 {
2308     dSP; dATARGET;
2309     tryAMAGICbin_MG(band_amg, AMGf_assign);
2310     {
2311       dPOPTOPssrl;
2312       if (SvNIOKp(left) || SvNIOKp(right)) {
2313         const bool left_ro_nonnum  = !SvNIOKp(left) && SvREADONLY(left);
2314         const bool right_ro_nonnum = !SvNIOKp(right) && SvREADONLY(right);
2315         if (PL_op->op_private & HINT_INTEGER) {
2316           const IV i = SvIV_nomg(left) & SvIV_nomg(right);
2317           SETi(i);
2318         }
2319         else {
2320           const UV u = SvUV_nomg(left) & SvUV_nomg(right);
2321           SETu(u);
2322         }
2323         if (left_ro_nonnum && left != TARG) SvNIOK_off(left);
2324         if (right_ro_nonnum) SvNIOK_off(right);
2325       }
2326       else {
2327         do_vop(PL_op->op_type, TARG, left, right);
2328         SETTARG;
2329       }
2330       RETURN;
2331     }
2332 }
2333
2334 PP(pp_nbit_and)
2335 {
2336     dSP;
2337     tryAMAGICbin_MG(band_amg, AMGf_assign|AMGf_numarg);
2338     {
2339         dATARGET; dPOPTOPssrl;
2340         if (PL_op->op_private & HINT_INTEGER) {
2341           const IV i = SvIV_nomg(left) & SvIV_nomg(right);
2342           SETi(i);
2343         }
2344         else {
2345           const UV u = SvUV_nomg(left) & SvUV_nomg(right);
2346           SETu(u);
2347         }
2348     }
2349     RETURN;
2350 }
2351
2352 PP(pp_sbit_and)
2353 {
2354     dSP;
2355     tryAMAGICbin_MG(sband_amg, AMGf_assign);
2356     {
2357         dATARGET; dPOPTOPssrl;
2358         do_vop(OP_BIT_AND, TARG, left, right);
2359         RETSETTARG;
2360     }
2361 }
2362
2363 /* also used for: pp_bit_xor() */
2364
2365 PP(pp_bit_or)
2366 {
2367     dSP; dATARGET;
2368     const int op_type = PL_op->op_type;
2369
2370     tryAMAGICbin_MG((op_type == OP_BIT_OR ? bor_amg : bxor_amg), AMGf_assign);
2371     {
2372       dPOPTOPssrl;
2373       if (SvNIOKp(left) || SvNIOKp(right)) {
2374         const bool left_ro_nonnum  = !SvNIOKp(left) && SvREADONLY(left);
2375         const bool right_ro_nonnum = !SvNIOKp(right) && SvREADONLY(right);
2376         if (PL_op->op_private & HINT_INTEGER) {
2377           const IV l = (USE_LEFT(left) ? SvIV_nomg(left) : 0);
2378           const IV r = SvIV_nomg(right);
2379           const IV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2380           SETi(result);
2381         }
2382         else {
2383           const UV l = (USE_LEFT(left) ? SvUV_nomg(left) : 0);
2384           const UV r = SvUV_nomg(right);
2385           const UV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2386           SETu(result);
2387         }
2388         if (left_ro_nonnum && left != TARG) SvNIOK_off(left);
2389         if (right_ro_nonnum) SvNIOK_off(right);
2390       }
2391       else {
2392         do_vop(op_type, TARG, left, right);
2393         SETTARG;
2394       }
2395       RETURN;
2396     }
2397 }
2398
2399 /* also used for: pp_nbit_xor() */
2400
2401 PP(pp_nbit_or)
2402 {
2403     dSP;
2404     const int op_type = PL_op->op_type;
2405
2406     tryAMAGICbin_MG((op_type == OP_NBIT_OR ? bor_amg : bxor_amg),
2407                     AMGf_assign|AMGf_numarg);
2408     {
2409         dATARGET; dPOPTOPssrl;
2410         if (PL_op->op_private & HINT_INTEGER) {
2411           const IV l = (USE_LEFT(left) ? SvIV_nomg(left) : 0);
2412           const IV r = SvIV_nomg(right);
2413           const IV result = op_type == OP_NBIT_OR ? (l | r) : (l ^ r);
2414           SETi(result);
2415         }
2416         else {
2417           const UV l = (USE_LEFT(left) ? SvUV_nomg(left) : 0);
2418           const UV r = SvUV_nomg(right);
2419           const UV result = op_type == OP_NBIT_OR ? (l | r) : (l ^ r);
2420           SETu(result);
2421         }
2422     }
2423     RETURN;
2424 }
2425
2426 /* also used for: pp_sbit_xor() */
2427
2428 PP(pp_sbit_or)
2429 {
2430     dSP;
2431     const int op_type = PL_op->op_type;
2432
2433     tryAMAGICbin_MG((op_type == OP_SBIT_OR ? sbor_amg : sbxor_amg),
2434                     AMGf_assign);
2435     {
2436         dATARGET; dPOPTOPssrl;
2437         do_vop(op_type == OP_SBIT_OR ? OP_BIT_OR : OP_BIT_XOR, TARG, left,
2438                right);
2439         RETSETTARG;
2440     }
2441 }
2442
2443 PERL_STATIC_INLINE bool
2444 S_negate_string(pTHX)
2445 {
2446     dTARGET; dSP;
2447     STRLEN len;
2448     const char *s;
2449     SV * const sv = TOPs;
2450     if (!SvPOKp(sv) || SvNIOK(sv) || (!SvPOK(sv) && SvNIOKp(sv)))
2451         return FALSE;
2452     s = SvPV_nomg_const(sv, len);
2453     if (isIDFIRST(*s)) {
2454         sv_setpvs(TARG, "-");
2455         sv_catsv(TARG, sv);
2456     }
2457     else if (*s == '+' || (*s == '-' && !looks_like_number(sv))) {
2458         sv_setsv_nomg(TARG, sv);
2459         *SvPV_force_nomg(TARG, len) = *s == '-' ? '+' : '-';
2460     }
2461     else return FALSE;
2462     SETTARG;
2463     return TRUE;
2464 }
2465
2466 PP(pp_negate)
2467 {
2468     dSP; dTARGET;
2469     tryAMAGICun_MG(neg_amg, AMGf_numeric);
2470     if (S_negate_string(aTHX)) return NORMAL;
2471     {
2472         SV * const sv = TOPs;
2473
2474         if (SvIOK(sv)) {
2475             /* It's publicly an integer */
2476         oops_its_an_int:
2477             if (SvIsUV(sv)) {
2478                 if (SvIVX(sv) == IV_MIN) {
2479                     /* 2s complement assumption. */
2480                     SETi(SvIVX(sv));    /* special case: -((UV)IV_MAX+1) ==
2481                                            IV_MIN */
2482                     return NORMAL;
2483                 }
2484                 else if (SvUVX(sv) <= IV_MAX) {
2485                     SETi(-SvIVX(sv));
2486                     return NORMAL;
2487                 }
2488             }
2489             else if (SvIVX(sv) != IV_MIN) {
2490                 SETi(-SvIVX(sv));
2491                 return NORMAL;
2492             }
2493 #ifdef PERL_PRESERVE_IVUV
2494             else {
2495                 SETu((UV)IV_MIN);
2496                 return NORMAL;
2497             }
2498 #endif
2499         }
2500         if (SvNIOKp(sv) && (SvNIOK(sv) || !SvPOK(sv)))
2501             SETn(-SvNV_nomg(sv));
2502         else if (SvPOKp(sv) && SvIV_please_nomg(sv))
2503                   goto oops_its_an_int;
2504         else
2505             SETn(-SvNV_nomg(sv));
2506     }
2507     return NORMAL;
2508 }
2509
2510 PP(pp_not)
2511 {
2512     dSP;
2513     SV *sv;
2514
2515     tryAMAGICun_MG(not_amg, AMGf_set);
2516     sv = *PL_stack_sp;
2517     *PL_stack_sp = boolSV(!SvTRUE_nomg_NN(sv));
2518     return NORMAL;
2519 }
2520
2521 static void
2522 S_scomplement(pTHX_ SV *targ, SV *sv)
2523 {
2524         U8 *tmps;
2525         I32 anum;
2526         STRLEN len;
2527
2528         sv_copypv_nomg(TARG, sv);
2529         tmps = (U8*)SvPV_nomg(TARG, len);
2530
2531         if (SvUTF8(TARG)) {
2532             if (len && ! utf8_to_bytes(tmps, &len)) {
2533                 Perl_croak(aTHX_ FATAL_ABOVE_FF_MSG, PL_op_desc[PL_op->op_type]);
2534             }
2535             SvCUR(TARG) = len;
2536             SvUTF8_off(TARG);
2537         }
2538
2539         anum = len;
2540
2541 #ifdef LIBERAL
2542         {
2543             long *tmpl;
2544             for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2545                 *tmps = ~*tmps;
2546             tmpl = (long*)tmps;
2547             for ( ; anum >= (I32)sizeof(long); anum -= (I32)sizeof(long), tmpl++)
2548                 *tmpl = ~*tmpl;
2549             tmps = (U8*)tmpl;
2550         }
2551 #endif
2552         for ( ; anum > 0; anum--, tmps++)
2553             *tmps = ~*tmps;
2554 }
2555
2556 PP(pp_complement)
2557 {
2558     dSP; dTARGET;
2559     tryAMAGICun_MG(compl_amg, AMGf_numeric);
2560     {
2561       dTOPss;
2562       if (SvNIOKp(sv)) {
2563         if (PL_op->op_private & HINT_INTEGER) {
2564           const IV i = ~SvIV_nomg(sv);
2565           SETi(i);
2566         }
2567         else {
2568           const UV u = ~SvUV_nomg(sv);
2569           SETu(u);
2570         }
2571       }
2572       else {
2573         S_scomplement(aTHX_ TARG, sv);
2574         SETTARG;
2575       }
2576       return NORMAL;
2577     }
2578 }
2579
2580 PP(pp_ncomplement)
2581 {
2582     dSP;
2583     tryAMAGICun_MG(compl_amg, AMGf_numeric|AMGf_numarg);
2584     {
2585         dTARGET; dTOPss;
2586         if (PL_op->op_private & HINT_INTEGER) {
2587           const IV i = ~SvIV_nomg(sv);
2588           SETi(i);
2589         }
2590         else {
2591           const UV u = ~SvUV_nomg(sv);
2592           SETu(u);
2593         }
2594     }
2595     return NORMAL;
2596 }
2597
2598 PP(pp_scomplement)
2599 {
2600     dSP;
2601     tryAMAGICun_MG(scompl_amg, AMGf_numeric);
2602     {
2603         dTARGET; dTOPss;
2604         S_scomplement(aTHX_ TARG, sv);
2605         SETTARG;
2606         return NORMAL;
2607     }
2608 }
2609
2610 /* integer versions of some of the above */
2611
2612 PP(pp_i_multiply)
2613 {
2614     dSP; dATARGET;
2615     tryAMAGICbin_MG(mult_amg, AMGf_assign);
2616     {
2617       dPOPTOPiirl_nomg;
2618       SETi( left * right );
2619       RETURN;
2620     }
2621 }
2622
2623 PP(pp_i_divide)
2624 {
2625     IV num;
2626     dSP; dATARGET;
2627     tryAMAGICbin_MG(div_amg, AMGf_assign);
2628     {
2629       dPOPTOPssrl;
2630       IV value = SvIV_nomg(right);
2631       if (value == 0)
2632           DIE(aTHX_ "Illegal division by zero");
2633       num = SvIV_nomg(left);
2634
2635       /* avoid FPE_INTOVF on some platforms when num is IV_MIN */
2636       if (value == -1)
2637           value = - num;
2638       else
2639           value = num / value;
2640       SETi(value);
2641       RETURN;
2642     }
2643 }
2644
2645 PP(pp_i_modulo)
2646 {
2647      /* This is the vanilla old i_modulo. */
2648      dSP; dATARGET;
2649      tryAMAGICbin_MG(modulo_amg, AMGf_assign);
2650      {
2651           dPOPTOPiirl_nomg;
2652           if (!right)
2653                DIE(aTHX_ "Illegal modulus zero");
2654           /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2655           if (right == -1)
2656               SETi( 0 );
2657           else
2658               SETi( left % right );
2659           RETURN;
2660      }
2661 }
2662
2663 #if defined(__GLIBC__) && IVSIZE == 8 \
2664     && ( __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 8))
2665
2666 PP(pp_i_modulo_glibc_bugfix)
2667 {
2668      /* This is the i_modulo with the workaround for the _moddi3 bug
2669       * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
2670       * See below for pp_i_modulo. */
2671      dSP; dATARGET;
2672      tryAMAGICbin_MG(modulo_amg, AMGf_assign);
2673      {
2674           dPOPTOPiirl_nomg;
2675           if (!right)
2676                DIE(aTHX_ "Illegal modulus zero");
2677           /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2678           if (right == -1)
2679               SETi( 0 );
2680           else
2681               SETi( left % PERL_ABS(right) );
2682           RETURN;
2683      }
2684 }
2685 #endif
2686
2687 PP(pp_i_add)
2688 {
2689     dSP; dATARGET;
2690     tryAMAGICbin_MG(add_amg, AMGf_assign);
2691     {
2692       dPOPTOPiirl_ul_nomg;
2693       SETi( left + right );
2694       RETURN;
2695     }
2696 }
2697
2698 PP(pp_i_subtract)
2699 {
2700     dSP; dATARGET;
2701     tryAMAGICbin_MG(subtr_amg, AMGf_assign);
2702     {
2703       dPOPTOPiirl_ul_nomg;
2704       SETi( left - right );
2705       RETURN;
2706     }
2707 }
2708
2709 PP(pp_i_lt)
2710 {
2711     dSP;
2712     tryAMAGICbin_MG(lt_amg, AMGf_set);
2713     {
2714       dPOPTOPiirl_nomg;
2715       SETs(boolSV(left < right));
2716       RETURN;
2717     }
2718 }
2719
2720 PP(pp_i_gt)
2721 {
2722     dSP;
2723     tryAMAGICbin_MG(gt_amg, AMGf_set);
2724     {
2725       dPOPTOPiirl_nomg;
2726       SETs(boolSV(left > right));
2727       RETURN;
2728     }
2729 }
2730
2731 PP(pp_i_le)
2732 {
2733     dSP;
2734     tryAMAGICbin_MG(le_amg, AMGf_set);
2735     {
2736       dPOPTOPiirl_nomg;
2737       SETs(boolSV(left <= right));
2738       RETURN;
2739     }
2740 }
2741
2742 PP(pp_i_ge)
2743 {
2744     dSP;
2745     tryAMAGICbin_MG(ge_amg, AMGf_set);
2746     {
2747       dPOPTOPiirl_nomg;
2748       SETs(boolSV(left >= right));
2749       RETURN;
2750     }
2751 }
2752
2753 PP(pp_i_eq)
2754 {
2755     dSP;
2756     tryAMAGICbin_MG(eq_amg, AMGf_set);
2757     {
2758       dPOPTOPiirl_nomg;
2759       SETs(boolSV(left == right));
2760       RETURN;
2761     }
2762 }
2763
2764 PP(pp_i_ne)
2765 {
2766     dSP;
2767     tryAMAGICbin_MG(ne_amg, AMGf_set);
2768     {
2769       dPOPTOPiirl_nomg;
2770       SETs(boolSV(left != right));
2771       RETURN;
2772     }
2773 }
2774
2775 PP(pp_i_ncmp)
2776 {
2777     dSP; dTARGET;
2778     tryAMAGICbin_MG(ncmp_amg, 0);
2779     {
2780       dPOPTOPiirl_nomg;
2781       I32 value;
2782
2783       if (left > right)
2784         value = 1;
2785       else if (left < right)
2786         value = -1;
2787       else
2788         value = 0;
2789       SETi(value);
2790       RETURN;
2791     }
2792 }
2793
2794 PP(pp_i_negate)
2795 {
2796     dSP; dTARGET;
2797     tryAMAGICun_MG(neg_amg, 0);
2798     if (S_negate_string(aTHX)) return NORMAL;
2799     {
2800         SV * const sv = TOPs;
2801         IV const i = SvIV_nomg(sv);
2802         SETi(-i);
2803         return NORMAL;
2804     }
2805 }
2806
2807 /* High falutin' math. */
2808
2809 PP(pp_atan2)
2810 {
2811     dSP; dTARGET;
2812     tryAMAGICbin_MG(atan2_amg, 0);
2813     {
2814       dPOPTOPnnrl_nomg;
2815       SETn(Perl_atan2(left, right));
2816       RETURN;
2817     }
2818 }
2819
2820
2821 /* also used for: pp_cos() pp_exp() pp_log() pp_sqrt() */
2822
2823 PP(pp_sin)
2824 {
2825     dSP; dTARGET;
2826     int amg_type = fallback_amg;
2827     const char *neg_report = NULL;
2828     const int op_type = PL_op->op_type;
2829
2830     switch (op_type) {
2831     case OP_SIN:  amg_type = sin_amg; break;
2832     case OP_COS:  amg_type = cos_amg; break;
2833     case OP_EXP:  amg_type = exp_amg; break;
2834     case OP_LOG:  amg_type = log_amg;  neg_report = "log";  break;
2835     case OP_SQRT: amg_type = sqrt_amg; neg_report = "sqrt"; break;
2836     }
2837
2838     assert(amg_type != fallback_amg);
2839
2840     tryAMAGICun_MG(amg_type, 0);
2841     {
2842       SV * const arg = TOPs;
2843       const NV value = SvNV_nomg(arg);
2844 #ifdef NV_NAN
2845       NV result = NV_NAN;
2846 #else
2847       NV result = 0.0;
2848 #endif
2849       if (neg_report) { /* log or sqrt */
2850           if (
2851 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2852               ! Perl_isnan(value) &&
2853 #endif
2854               (op_type == OP_LOG ? (value <= 0.0) : (value < 0.0))) {
2855               SET_NUMERIC_STANDARD();
2856               /* diag_listed_as: Can't take log of %g */
2857               DIE(aTHX_ "Can't take %s of %" NVgf, neg_report, value);
2858           }
2859       }
2860       switch (op_type) {
2861       default:
2862       case OP_SIN:  result = Perl_sin(value);  break;
2863       case OP_COS:  result = Perl_cos(value);  break;
2864       case OP_EXP:  result = Perl_exp(value);  break;
2865       case OP_LOG:  result = Perl_log(value);  break;
2866       case OP_SQRT: result = Perl_sqrt(value); break;
2867       }
2868       SETn(result);
2869       return NORMAL;
2870     }
2871 }
2872
2873 /* Support Configure command-line overrides for rand() functions.
2874    After 5.005, perhaps we should replace this by Configure support
2875    for drand48(), random(), or rand().  For 5.005, though, maintain
2876    compatibility by calling rand() but allow the user to override it.
2877    See INSTALL for details.  --Andy Dougherty  15 July 1998
2878 */
2879 /* Now it's after 5.005, and Configure supports drand48() and random(),
2880    in addition to rand().  So the overrides should not be needed any more.
2881    --Jarkko Hietaniemi  27 September 1998
2882  */
2883
2884 PP(pp_rand)
2885 {
2886     if (!PL_srand_called) {
2887         (void)seedDrand01((Rand_seed_t)seed());
2888         PL_srand_called = TRUE;
2889     }
2890     {
2891         dSP;
2892         NV value;
2893     
2894         if (MAXARG < 1)
2895         {
2896             EXTEND(SP, 1);
2897             value = 1.0;
2898         }
2899         else {
2900             SV * const sv = POPs;
2901             if(!sv)
2902                 value = 1.0;
2903             else
2904                 value = SvNV(sv);
2905         }
2906     /* 1 of 2 things can be carried through SvNV, SP or TARG, SP was carried */
2907 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2908         if (! Perl_isnan(value) && value == 0.0)
2909 #else
2910         if (value == 0.0)
2911 #endif
2912             value = 1.0;
2913         {
2914             dTARGET;
2915             PUSHs(TARG);
2916             PUTBACK;
2917             value *= Drand01();
2918             sv_setnv_mg(TARG, value);
2919         }
2920     }
2921     return NORMAL;
2922 }
2923
2924 PP(pp_srand)
2925 {
2926     dSP; dTARGET;
2927     UV anum;
2928
2929     if (MAXARG >= 1 && (TOPs || POPs)) {
2930         SV *top;
2931         char *pv;
2932         STRLEN len;
2933         int flags;
2934
2935         top = POPs;
2936         pv = SvPV(top, len);
2937         flags = grok_number(pv, len, &anum);
2938
2939         if (!(flags & IS_NUMBER_IN_UV)) {
2940             Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
2941                              "Integer overflow in srand");
2942             anum = UV_MAX;
2943         }
2944     }
2945     else {
2946         anum = seed();
2947     }
2948
2949     (void)seedDrand01((Rand_seed_t)anum);
2950     PL_srand_called = TRUE;
2951     if (anum)
2952         XPUSHu(anum);
2953     else {
2954         /* Historically srand always returned true. We can avoid breaking
2955            that like this:  */
2956         sv_setpvs(TARG, "0 but true");
2957         XPUSHTARG;
2958     }
2959     RETURN;
2960 }
2961
2962 PP(pp_int)
2963 {
2964     dSP; dTARGET;
2965     tryAMAGICun_MG(int_amg, AMGf_numeric);
2966     {
2967       SV * const sv = TOPs;
2968       const IV iv = SvIV_nomg(sv);
2969       /* XXX it's arguable that compiler casting to IV might be subtly
2970          different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2971          else preferring IV has introduced a subtle behaviour change bug. OTOH
2972          relying on floating point to be accurate is a bug.  */
2973
2974       if (!SvOK(sv)) {
2975         SETu(0);
2976       }
2977       else if (SvIOK(sv)) {
2978         if (SvIsUV(sv))
2979             SETu(SvUV_nomg(sv));
2980         else
2981             SETi(iv);
2982       }
2983       else {
2984           const NV value = SvNV_nomg(sv);
2985           if (UNLIKELY(Perl_isinfnan(value)))
2986               SETn(value);
2987           else if (value >= 0.0) {
2988               if (value < (NV)UV_MAX + 0.5) {
2989                   SETu(U_V(value));
2990               } else {
2991                   SETn(Perl_floor(value));
2992               }
2993           }
2994           else {
2995               if (value > (NV)IV_MIN - 0.5) {
2996                   SETi(I_V(value));
2997               } else {
2998                   SETn(Perl_ceil(value));
2999               }
3000           }
3001       }
3002     }
3003     return NORMAL;
3004 }
3005
3006 PP(pp_abs)
3007 {
3008     dSP; dTARGET;
3009     tryAMAGICun_MG(abs_amg, AMGf_numeric);
3010     {
3011       SV * const sv = TOPs;
3012       /* This will cache the NV value if string isn't actually integer  */
3013       const IV iv = SvIV_nomg(sv);
3014
3015       if (!SvOK(sv)) {
3016         SETu(0);
3017       }
3018       else if (SvIOK(sv)) {
3019         /* IVX is precise  */
3020         if (SvIsUV(sv)) {
3021           SETu(SvUV_nomg(sv));  /* force it to be numeric only */
3022         } else {
3023           if (iv >= 0) {
3024             SETi(iv);
3025           } else {
3026             if (iv != IV_MIN) {
3027               SETi(-iv);
3028             } else {
3029               /* 2s complement assumption. Also, not really needed as
3030                  IV_MIN and -IV_MIN should both be %100...00 and NV-able  */
3031               SETu((UV)IV_MIN);
3032             }
3033           }
3034         }
3035       } else{
3036         const NV value = SvNV_nomg(sv);
3037         if (value < 0.0)
3038           SETn(-value);
3039         else
3040           SETn(value);
3041       }
3042     }
3043     return NORMAL;
3044 }
3045
3046
3047 /* also used for: pp_hex() */
3048
3049 PP(pp_oct)
3050 {
3051     dSP; dTARGET;
3052     const char *tmps;
3053     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
3054     STRLEN len;
3055     NV result_nv;
3056     UV result_uv;
3057     SV* const sv = TOPs;
3058
3059     tmps = (SvPV_const(sv, len));
3060     if (DO_UTF8(sv)) {
3061          /* If Unicode, try to downgrade
3062           * If not possible, croak. */
3063          SV* const tsv = sv_2mortal(newSVsv(sv));
3064         
3065          SvUTF8_on(tsv);
3066          sv_utf8_downgrade(tsv, FALSE);
3067          tmps = SvPV_const(tsv, len);
3068     }
3069     if (PL_op->op_type == OP_HEX)
3070         goto hex;
3071
3072     while (*tmps && len && isSPACE(*tmps))
3073         tmps++, len--;
3074     if (*tmps == '0')
3075         tmps++, len--;
3076     if (isALPHA_FOLD_EQ(*tmps, 'x')) {
3077     hex:
3078         result_uv = grok_hex (tmps, &len, &flags, &result_nv);
3079     }
3080     else if (isALPHA_FOLD_EQ(*tmps, 'b'))
3081         result_uv = grok_bin (tmps, &len, &flags, &result_nv);
3082     else
3083         result_uv = grok_oct (tmps, &len, &flags, &result_nv);
3084
3085     if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
3086         SETn(result_nv);
3087     }
3088     else {
3089         SETu(result_uv);
3090     }
3091     return NORMAL;
3092 }
3093
3094 /* String stuff. */
3095
3096
3097 PP(pp_length)
3098 {
3099     dSP; dTARGET;
3100     SV * const sv = TOPs;
3101
3102     U32 in_bytes = IN_BYTES;
3103     /* Simplest case shortcut:
3104      * set svflags to just the SVf_POK|SVs_GMG|SVf_UTF8 from the SV,
3105      * with the SVf_UTF8 flag inverted if under 'use bytes' (HINT_BYTES
3106      * set)
3107      */
3108     U32 svflags = (SvFLAGS(sv) ^ (in_bytes << 26)) & (SVf_POK|SVs_GMG|SVf_UTF8);
3109
3110     STATIC_ASSERT_STMT(SVf_UTF8 == (HINT_BYTES << 26));
3111     SETs(TARG);
3112
3113     if (LIKELY(svflags == SVf_POK))
3114         goto simple_pv;
3115
3116     if (svflags & SVs_GMG)
3117         mg_get(sv);
3118
3119     if (SvOK(sv)) {
3120         STRLEN len;
3121         if (!IN_BYTES) { /* reread to avoid using an C auto/register */
3122             if ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == SVf_POK)
3123                 goto simple_pv;
3124             if ( SvPOK(sv) && (PL_op->op_private & OPpTRUEBOOL)) {
3125                 /* no need to convert from bytes to chars */
3126                 len = SvCUR(sv);
3127                 goto return_bool;
3128             }
3129             len = sv_len_utf8_nomg(sv);
3130         }
3131         else {
3132             /* unrolled SvPV_nomg_const(sv,len) */
3133             if (SvPOK_nog(sv)) {
3134               simple_pv:
3135                 len = SvCUR(sv);
3136                 if (PL_op->op_private & OPpTRUEBOOL) {
3137                   return_bool:
3138                     SETs(len ? &PL_sv_yes : &PL_sv_zero);
3139                     return NORMAL;
3140                 }
3141             }
3142             else {
3143                 (void)sv_2pv_flags(sv, &len, 0|SV_CONST_RETURN);
3144             }
3145         }
3146         TARGi((IV)(len), 1);
3147     }
3148     else {
3149         if (!SvPADTMP(TARG)) {
3150             /* OPpTARGET_MY: targ is var in '$lex = length()' */
3151             sv_set_undef(TARG);
3152             SvSETMAGIC(TARG);
3153         }
3154         else
3155             /* TARG is on stack at this point and is overwriten by SETs.
3156              * This branch is the odd one out, so put TARG by default on
3157              * stack earlier to let local SP go out of liveness sooner */
3158             SETs(&PL_sv_undef);
3159     }
3160     return NORMAL; /* no putback, SP didn't move in this opcode */
3161 }
3162
3163
3164 /* Returns false if substring is completely outside original string.
3165    No length is indicated by len_iv = 0 and len_is_uv = 0.  len_is_uv must
3166    always be true for an explicit 0.
3167 */
3168 bool
3169 Perl_translate_substr_offsets( STRLEN curlen, IV pos1_iv,
3170                                 bool pos1_is_uv, IV len_iv,
3171                                 bool len_is_uv, STRLEN *posp,
3172                                 STRLEN *lenp)
3173 {
3174     IV pos2_iv;
3175     int    pos2_is_uv;
3176
3177     PERL_ARGS_ASSERT_TRANSLATE_SUBSTR_OFFSETS;
3178
3179     if (!pos1_is_uv && pos1_iv < 0 && curlen) {
3180         pos1_is_uv = curlen-1 > ~(UV)pos1_iv;
3181         pos1_iv += curlen;
3182     }
3183     if ((pos1_is_uv || pos1_iv > 0) && (UV)pos1_iv > curlen)
3184         return FALSE;
3185
3186     if (len_iv || len_is_uv) {
3187         if (!len_is_uv && len_iv < 0) {
3188             pos2_iv = curlen + len_iv;
3189             if (curlen)
3190                 pos2_is_uv = curlen-1 > ~(UV)len_iv;
3191             else
3192                 pos2_is_uv = 0;
3193         } else {  /* len_iv >= 0 */
3194             if (!pos1_is_uv && pos1_iv < 0) {
3195                 pos2_iv = pos1_iv + len_iv;
3196                 pos2_is_uv = (UV)len_iv > (UV)IV_MAX;
3197             } else {
3198                 if ((UV)len_iv > curlen-(UV)pos1_iv)
3199                     pos2_iv = curlen;
3200                 else
3201                     pos2_iv = pos1_iv+len_iv;
3202                 pos2_is_uv = 1;
3203             }
3204         }
3205     }
3206     else {
3207         pos2_iv = curlen;
3208         pos2_is_uv = 1;
3209     }
3210
3211     if (!pos2_is_uv && pos2_iv < 0) {
3212         if (!pos1_is_uv && pos1_iv < 0)
3213             return FALSE;
3214         pos2_iv = 0;
3215     }
3216     else if (!pos1_is_uv && pos1_iv < 0)
3217         pos1_iv = 0;
3218
3219     if ((UV)pos2_iv < (UV)pos1_iv)
3220         pos2_iv = pos1_iv;
3221     if ((UV)pos2_iv > curlen)
3222         pos2_iv = curlen;
3223
3224     /* pos1_iv and pos2_iv both in 0..curlen, so the cast is safe */
3225     *posp = (STRLEN)( (UV)pos1_iv );
3226     *lenp = (STRLEN)( (UV)pos2_iv - (UV)pos1_iv );
3227
3228     return TRUE;
3229 }
3230
3231 PP(pp_substr)
3232 {
3233     dSP; dTARGET;
3234     SV *sv;
3235     STRLEN curlen;
3236     STRLEN utf8_curlen;
3237     SV *   pos_sv;
3238     IV     pos1_iv;
3239     int    pos1_is_uv;
3240     SV *   len_sv;
3241     IV     len_iv = 0;
3242     int    len_is_uv = 0;
3243     I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3244     const bool rvalue = (GIMME_V != G_VOID);
3245     const char *tmps;
3246     SV *repl_sv = NULL;
3247     const char *repl = NULL;
3248     STRLEN repl_len;
3249     int num_args = PL_op->op_private & 7;
3250     bool repl_need_utf8_upgrade = FALSE;
3251
3252     if (num_args > 2) {
3253         if (num_args > 3) {
3254           if(!(repl_sv = POPs)) num_args--;
3255         }
3256         if ((len_sv = POPs)) {
3257             len_iv    = SvIV(len_sv);
3258             len_is_uv = len_iv ? SvIOK_UV(len_sv) : 1;
3259         }
3260         else num_args--;
3261     }
3262     pos_sv     = POPs;
3263     pos1_iv    = SvIV(pos_sv);
3264     pos1_is_uv = SvIOK_UV(pos_sv);
3265     sv = POPs;
3266     if (PL_op->op_private & OPpSUBSTR_REPL_FIRST) {
3267         assert(!repl_sv);
3268         repl_sv = POPs;
3269     }
3270     if (lvalue && !repl_sv) {
3271         SV * ret;
3272         ret = sv_2mortal(newSV_type(SVt_PVLV));  /* Not TARG RT#67838 */
3273         sv_magic(ret, NULL, PERL_MAGIC_substr, NULL, 0);
3274         LvTYPE(ret) = 'x';
3275         LvTARG(ret) = SvREFCNT_inc_simple(sv);
3276         LvTARGOFF(ret) =
3277             pos1_is_uv || pos1_iv >= 0
3278                 ? (STRLEN)(UV)pos1_iv
3279                 : (LvFLAGS(ret) |= LVf_NEG_OFF, (STRLEN)(UV)-pos1_iv);
3280         LvTARGLEN(ret) =
3281             len_is_uv || len_iv > 0
3282                 ? (STRLEN)(UV)len_iv
3283                 : (LvFLAGS(ret) |= LVf_NEG_LEN, (STRLEN)(UV)-len_iv);
3284
3285         PUSHs(ret);    /* avoid SvSETMAGIC here */
3286         RETURN;
3287     }
3288     if (repl_sv) {
3289         repl = SvPV_const(repl_sv, repl_len);
3290         SvGETMAGIC(sv);
3291         if (SvROK(sv))
3292             Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR),
3293                             "Attempt to use reference as lvalue in substr"
3294             );
3295         tmps = SvPV_force_nomg(sv, curlen);
3296         if (DO_UTF8(repl_sv) && repl_len) {
3297             if (!DO_UTF8(sv)) {
3298                 /* Upgrade the dest, and recalculate tmps in case the buffer
3299                  * got reallocated; curlen may also have been changed */
3300                 sv_utf8_upgrade_nomg(sv);
3301                 tmps = SvPV_nomg(sv, curlen);
3302             }
3303         }
3304         else if (DO_UTF8(sv))
3305             repl_need_utf8_upgrade = TRUE;
3306     }
3307     else tmps = SvPV_const(sv, curlen);
3308     if (DO_UTF8(sv)) {
3309         utf8_curlen = sv_or_pv_len_utf8(sv, tmps, curlen);
3310         if (utf8_curlen == curlen)
3311             utf8_curlen = 0;
3312         else
3313             curlen = utf8_curlen;
3314     }
3315     else
3316         utf8_curlen = 0;
3317
3318     {
3319         STRLEN pos, len, byte_len, byte_pos;
3320
3321         if (!translate_substr_offsets(
3322                 curlen, pos1_iv, pos1_is_uv, len_iv, len_is_uv, &pos, &len
3323         )) goto bound_fail;
3324
3325         byte_len = len;
3326         byte_pos = utf8_curlen
3327             ? sv_or_pv_pos_u2b(sv, tmps, pos, &byte_len) : pos;
3328
3329         tmps += byte_pos;
3330
3331         if (rvalue) {
3332             SvTAINTED_off(TARG);                        /* decontaminate */
3333             SvUTF8_off(TARG);                   /* decontaminate */
3334             sv_setpvn(TARG, tmps, byte_len);
3335 #ifdef USE_LOCALE_COLLATE
3336             sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3337 #endif
3338             if (utf8_curlen)
3339                 SvUTF8_on(TARG);
3340         }
3341
3342         if (repl) {
3343             SV* repl_sv_copy = NULL;
3344
3345             if (repl_need_utf8_upgrade) {
3346                 repl_sv_copy = newSVsv(repl_sv);
3347                 sv_utf8_upgrade(repl_sv_copy);
3348                 repl = SvPV_const(repl_sv_copy, repl_len);
3349             }
3350             if (!SvOK(sv))
3351                 SvPVCLEAR(sv);
3352             sv_insert_flags(sv, byte_pos, byte_len, repl, repl_len, 0);
3353             SvREFCNT_dec(repl_sv_copy);
3354         }
3355     }
3356     if (PL_op->op_private & OPpSUBSTR_REPL_FIRST)
3357         SP++;
3358     else if (rvalue) {
3359         SvSETMAGIC(TARG);
3360         PUSHs(TARG);
3361     }
3362     RETURN;
3363
3364   bound_fail:
3365     if (repl)
3366         Perl_croak(aTHX_ "substr outside of string");
3367     Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3368     RETPUSHUNDEF;
3369 }
3370
3371 PP(pp_vec)
3372 {
3373     dSP;
3374     const IV size   = POPi;
3375     SV* offsetsv   = POPs;
3376     SV * const src = POPs;
3377     const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3378     SV * ret;
3379     UV   retuv;
3380     STRLEN offset = 0;
3381     char errflags = 0;
3382
3383     /* extract a STRLEN-ranged integer value from offsetsv into offset,
3384      * or flag that its out of range */
3385     {
3386         IV iv = SvIV(offsetsv);
3387
3388         /* avoid a large UV being wrapped to a negative value */
3389         if (SvIOK_UV(offsetsv) && SvUVX(offsetsv) > (UV)IV_MAX)
3390             errflags = LVf_OUT_OF_RANGE;
3391         else if (iv < 0)
3392             errflags = (LVf_NEG_OFF|LVf_OUT_OF_RANGE);
3393 #if PTRSIZE < IVSIZE
3394         else if (iv > Size_t_MAX)
3395             errflags = LVf_OUT_OF_RANGE;
3396 #endif
3397         else
3398             offset = (STRLEN)iv;
3399     }
3400
3401     retuv = errflags ? 0 : do_vecget(src, offset, size);
3402
3403     if (lvalue) {                       /* it's an lvalue! */
3404         ret = sv_2mortal(newSV_type(SVt_PVLV));  /* Not TARG RT#67838 */
3405         sv_magic(ret, NULL, PERL_MAGIC_vec, NULL, 0);
3406         LvTYPE(ret) = 'v';
3407         LvTARG(ret) = SvREFCNT_inc_simple(src);
3408         LvTARGOFF(ret) = offset;
3409         LvTARGLEN(ret) = size;
3410         LvFLAGS(ret)   = errflags;
3411     }
3412     else {
3413         dTARGET;
3414         SvTAINTED_off(TARG);            /* decontaminate */
3415         ret = TARG;
3416     }
3417
3418     sv_setuv(ret, retuv);
3419     if (!lvalue)
3420         SvSETMAGIC(ret);
3421     PUSHs(ret);
3422     RETURN;
3423 }
3424
3425
3426 /* also used for: pp_rindex() */
3427
3428 PP(pp_index)
3429 {
3430     dSP; dTARGET;
3431     SV *big;
3432     SV *little;
3433     SV *temp = NULL;
3434     STRLEN biglen;
3435     STRLEN llen = 0;
3436     SSize_t offset = 0;
3437     SSize_t retval;
3438     const char *big_p;
3439     const char *little_p;
3440     bool big_utf8;
3441     bool little_utf8;
3442     const bool is_index = PL_op->op_type == OP_INDEX;
3443     const bool threeargs = MAXARG >= 3 && (TOPs || ((void)POPs,0));
3444
3445     if (threeargs)
3446         offset = POPi;
3447     little = POPs;
3448     big = POPs;
3449     big_p = SvPV_const(big, biglen);
3450     little_p = SvPV_const(little, llen);
3451
3452     big_utf8 = DO_UTF8(big);
3453     little_utf8 = DO_UTF8(little);
3454     if (big_utf8 ^ little_utf8) {
3455         /* One needs to be upgraded.  */
3456         if (little_utf8) {
3457             /* Well, maybe instead we might be able to downgrade the small
3458                string?  */
3459             char * const pv = (char*)bytes_from_utf8((U8 *)little_p, &llen,
3460                                                      &little_utf8);
3461             if (little_utf8) {
3462                 /* If the large string is ISO-8859-1, and it's not possible to
3463                    convert the small string to ISO-8859-1, then there is no
3464                    way that it could be found anywhere by index.  */
3465                 retval = -1;
3466                 goto push_result;
3467             }
3468
3469             /* At this point, pv is a malloc()ed string. So donate it to temp
3470                to ensure it will get free()d  */
3471             little = temp = newSV(0);
3472             sv_usepvn(temp, pv, llen);
3473             little_p = SvPVX(little);
3474         } else {
3475             temp = newSVpvn(little_p, llen);
3476
3477             sv_utf8_upgrade(temp);
3478             little = temp;
3479             little_p = SvPV_const(little, llen);
3480         }
3481     }
3482     if (SvGAMAGIC(big)) {
3483         /* Life just becomes a lot easier if I use a temporary here.
3484            Otherwise I need to avoid calls to sv_pos_u2b(), which (dangerously)
3485            will trigger magic and overloading again, as will fbm_instr()
3486         */
3487         big = newSVpvn_flags(big_p, biglen,
3488                              SVs_TEMP | (big_utf8 ? SVf_UTF8 : 0));
3489         big_p = SvPVX(big);
3490     }
3491     if (SvGAMAGIC(little) || (is_index && !SvOK(little))) {
3492         /* index && SvOK() is a hack. fbm_instr() calls SvPV_const, which will
3493            warn on undef, and we've already triggered a warning with the
3494            SvPV_const some lines above. We can't remove that, as we need to
3495            call some SvPV to trigger overloading early and find out if the
3496            string is UTF-8.
3497            This is all getting too messy. The API isn't quite clean enough,
3498            because data access has side effects.
3499         */
3500         little = newSVpvn_flags(little_p, llen,
3501                                 SVs_TEMP | (little_utf8 ? SVf_UTF8 : 0));
3502         little_p = SvPVX(little);
3503     }
3504
3505     if (!threeargs)
3506         offset = is_index ? 0 : biglen;
3507     else {
3508         if (big_utf8 && offset > 0)
3509             offset = sv_pos_u2b_flags(big, offset, 0, SV_CONST_RETURN);
3510         if (!is_index)
3511             offset += llen;
3512     }
3513     if (offset < 0)
3514         offset = 0;
3515     else if (offset > (SSize_t)biglen)
3516         offset = biglen;
3517     if (!(little_p = is_index
3518           ? fbm_instr((unsigned char*)big_p + offset,
3519                       (unsigned char*)big_p + biglen, little, 0)
3520           : rninstr(big_p,  big_p  + offset,
3521                     little_p, little_p + llen)))
3522         retval = -1;
3523     else {
3524         retval = little_p - big_p;
3525         if (retval > 1 && big_utf8)
3526             retval = sv_pos_b2u_flags(big, retval, SV_CONST_RETURN);
3527     }
3528     SvREFCNT_dec(temp);
3529
3530   push_result:
3531     /* OPpTRUEBOOL indicates an '== -1' has been optimised away */
3532     if (PL_op->op_private & OPpTRUEBOOL) {
3533         PUSHs( ((retval != -1) ^ cBOOL(PL_op->op_private & OPpINDEX_BOOLNEG))
3534                     ? &PL_sv_yes : &PL_sv_no);
3535         if (PL_op->op_private & OPpTARGET_MY)
3536             /* $lex = (index() == -1) */
3537             sv_setsv(TARG, TOPs);
3538     }
3539     else 
3540         PUSHi(retval);
3541     RETURN;
3542 }
3543
3544 PP(pp_sprintf)
3545 {
3546     dSP; dMARK; dORIGMARK; dTARGET;
3547     SvTAINTED_off(TARG);
3548     do_sprintf(TARG, SP-MARK, MARK+1);
3549     TAINT_IF(SvTAINTED(TARG));
3550     SP = ORIGMARK;
3551     PUSHTARG;
3552     RETURN;
3553 }
3554
3555 PP(pp_ord)
3556 {
3557     dSP; dTARGET;
3558
3559     SV *argsv = TOPs;
3560     STRLEN len;
3561     const U8 *s = (U8*)SvPV_const(argsv, len);
3562
3563     SETu(DO_UTF8(argsv)
3564            ? (len ? utf8n_to_uvchr(s, len, 0, UTF8_ALLOW_ANYUV) : 0)
3565            : (UV)(*s));
3566
3567     return NORMAL;
3568 }
3569
3570 PP(pp_chr)
3571 {
3572     dSP; dTARGET;
3573     char *tmps;
3574     UV value;
3575     SV *top = TOPs;
3576
3577     SvGETMAGIC(top);
3578     if (UNLIKELY(SvAMAGIC(top)))
3579         top = sv_2num(top);
3580     if (UNLIKELY(isinfnansv(top)))
3581         Perl_croak(aTHX_ "Cannot chr %" NVgf, SvNV(top));
3582     else {
3583         if (!IN_BYTES /* under bytes, chr(-1) eq chr(0xff), etc. */
3584             && ((SvIOKp(top) && !SvIsUV(top) && SvIV_nomg(top) < 0)
3585                 ||
3586                 ((SvNOKp(top) || (SvOK(top) && !SvIsUV(top)))
3587                  && SvNV_nomg(top) < 0.0)))
3588         {
3589             if (ckWARN(WARN_UTF8)) {
3590                 if (SvGMAGICAL(top)) {
3591                     SV *top2 = sv_newmortal();
3592                     sv_setsv_nomg(top2, top);
3593                     top = top2;
3594                 }
3595                 Perl_warner(aTHX_ packWARN(WARN_UTF8),
3596                             "Invalid negative number (%" SVf ") in chr", SVfARG(top));
3597             }
3598             value = UNICODE_REPLACEMENT;
3599         } else {
3600             value = SvUV_nomg(top);
3601         }
3602     }
3603
3604     SvUPGRADE(TARG,SVt_PV);
3605
3606     if (value > 255 && !IN_BYTES) {
3607         SvGROW(TARG, (STRLEN)UVCHR_SKIP(value)+1);
3608         tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3609         SvCUR_set(TARG, tmps - SvPVX_const(TARG));
3610         *tmps = '\0';
3611         (void)SvPOK_only(TARG);
3612         SvUTF8_on(TARG);
3613         SETTARG;
3614         return NORMAL;
3615     }
3616
3617     SvGROW(TARG,2);
3618     SvCUR_set(TARG, 1);
3619     tmps = SvPVX(TARG);
3620     *tmps++ = (char)value;
3621     *tmps = '\0';
3622     (void)SvPOK_only(TARG);
3623
3624     SETTARG;
3625     return NORMAL;
3626 }
3627
3628 PP(pp_crypt)
3629 {
3630 #ifdef HAS_CRYPT
3631     dSP; dTARGET;
3632     dPOPTOPssrl;
3633     STRLEN len;
3634     const char *tmps = SvPV_const(left, len);
3635
3636     if (DO_UTF8(left)) {
3637          /* If Unicode, try to downgrade.
3638           * If not possible, croak.
3639           * Yes, we made this up.  */
3640          SV* const tsv = newSVpvn_flags(tmps, len, SVf_UTF8|SVs_TEMP);
3641
3642          sv_utf8_downgrade(tsv, FALSE);
3643          tmps = SvPV_const(tsv, len);
3644     }
3645 #   ifdef USE_ITHREADS
3646 #     ifdef HAS_CRYPT_R
3647     if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3648       /* This should be threadsafe because in ithreads there is only
3649        * one thread per interpreter.  If this would not be true,
3650        * we would need a mutex to protect this malloc. */
3651         PL_reentrant_buffer->_crypt_struct_buffer =
3652           (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3653 #if defined(__GLIBC__) || defined(__EMX__)
3654         if (PL_reentrant_buffer->_crypt_struct_buffer) {
3655             PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3656 #if (defined(__GLIBC__) && __GLIBC__ == 2) && \
3657     (defined(__GLIBC_MINOR__) && __GLIBC_MINOR__ >= 2 && __GLIBC_MINOR__ < 4)
3658             /* work around glibc-2.2.5 bug, has been fixed at some
3659              * time in glibc-2.3.X */
3660             PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3661 #endif
3662         }
3663 #endif
3664     }
3665 #     endif /* HAS_CRYPT_R */
3666 #   endif /* USE_ITHREADS */
3667 #   ifdef FCRYPT
3668     sv_setpv(TARG, fcrypt(tmps, SvPV_nolen_const(right)));
3669 #   else
3670     sv_setpv(TARG, PerlProc_crypt(tmps, SvPV_nolen_const(right)));
3671 #   endif
3672     SvUTF8_off(TARG);
3673     SETTARG;
3674     RETURN;
3675 #else
3676     DIE(aTHX_
3677       "The crypt() function is unimplemented due to excessive paranoia.");
3678 #endif
3679 }
3680
3681 /* Generally UTF-8 and UTF-EBCDIC are indistinguishable at this level.  So 
3682  * most comments below say UTF-8, when in fact they mean UTF-EBCDIC as well */
3683
3684
3685 /* also used for: pp_lcfirst() */
3686
3687 PP(pp_ucfirst)
3688 {
3689     /* Actually is both lcfirst() and ucfirst().  Only the first character
3690      * changes.  This means that possibly we can change in-place, ie., just
3691      * take the source and change that one character and store it back, but not
3692      * if read-only etc, or if the length changes */
3693
3694     dSP;
3695     SV *source = TOPs;
3696     STRLEN slen; /* slen is the byte length of the whole SV. */
3697     STRLEN need;
3698     SV *dest;
3699     bool inplace;   /* ? Convert first char only, in-place */
3700     bool doing_utf8 = FALSE;               /* ? using utf8 */
3701     bool convert_source_to_utf8 = FALSE;   /* ? need to convert */
3702     const int op_type = PL_op->op_type;
3703     const U8 *s;
3704     U8 *d;
3705     U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3706     STRLEN ulen;    /* ulen is the byte length of the original Unicode character
3707                      * stored as UTF-8 at s. */
3708     STRLEN tculen;  /* tculen is the byte length of the freshly titlecased (or
3709                      * lowercased) character stored in tmpbuf.  May be either
3710                      * UTF-8 or not, but in either case is the number of bytes */
3711
3712     s = (const U8*)SvPV_const(source, slen);
3713
3714     /* We may be able to get away with changing only the first character, in
3715      * place, but not if read-only, etc.  Later we may discover more reasons to
3716      * not convert in-place. */
3717     inplace = !SvREADONLY(source) && SvPADTMP(source);
3718
3719 #ifdef USE_LOCALE_CTYPE
3720
3721     if (IN_LC_RUNTIME(LC_CTYPE)) {
3722         _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
3723     }
3724
3725 #endif
3726
3727     /* First calculate what the changed first character should be.  This affects
3728      * whether we can just swap it out, leaving the rest of the string unchanged,
3729      * or even if have to convert the dest to UTF-8 when the source isn't */
3730
3731     if (! slen) {   /* If empty */
3732         need = 1; /* still need a trailing NUL */
3733         ulen = 0;
3734         *tmpbuf = '\0';
3735     }
3736     else if (DO_UTF8(source)) { /* Is the source utf8? */
3737         doing_utf8 = TRUE;
3738         ulen = UTF8SKIP(s);
3739         if (op_type == OP_UCFIRST) {
3740 #ifdef USE_LOCALE_CTYPE
3741             _toTITLE_utf8_flags(s, s +slen, tmpbuf, &tculen, IN_LC_RUNTIME(LC_CTYPE));
3742 #else
3743             _toTITLE_utf8_flags(s, s +slen, tmpbuf, &tculen, 0);
3744 #endif
3745         }
3746         else {
3747 #ifdef USE_LOCALE_CTYPE
3748             _toLOWER_utf8_flags(s, s + slen, tmpbuf, &tculen, IN_LC_RUNTIME(LC_CTYPE));
3749 #else
3750             _toLOWER_utf8_flags(s, s + slen, tmpbuf, &tculen, 0);
3751 #endif
3752         }
3753
3754         /* we can't do in-place if the length changes.  */
3755         if (ulen != tculen) inplace = FALSE;
3756         need = slen + 1 - ulen + tculen;
3757     }
3758     else { /* Non-zero length, non-UTF-8,  Need to consider locale and if
3759             * latin1 is treated as caseless.  Note that a locale takes
3760             * precedence */ 
3761         ulen = 1;       /* Original character is 1 byte */
3762         tculen = 1;     /* Most characters will require one byte, but this will
3763                          * need to be overridden for the tricky ones */
3764         need = slen + 1;
3765
3766         if (op_type == OP_LCFIRST) {
3767
3768             /* lower case the first letter: no trickiness for any character */
3769 #ifdef USE_LOCALE_CTYPE
3770             if (IN_LC_RUNTIME(LC_CTYPE)) {
3771                 *tmpbuf = toLOWER_LC(*s);
3772             }
3773             else
3774 #endif
3775             {
3776                 *tmpbuf = (IN_UNI_8_BIT)
3777                           ? toLOWER_LATIN1(*s)
3778                           : toLOWER(*s);
3779             }
3780         }
3781 #ifdef USE_LOCALE_CTYPE
3782         /* is ucfirst() */
3783         else if (IN_LC_RUNTIME(LC_CTYPE)) {
3784             if (IN_UTF8_CTYPE_LOCALE) {
3785                 goto do_uni_rules;
3786             }
3787
3788             *tmpbuf = (U8) toUPPER_LC(*s); /* This would be a bug if any
3789                                               locales have upper and title case
3790                                               different */
3791         }
3792 #endif
3793         else if (! IN_UNI_8_BIT) {
3794             *tmpbuf = toUPPER(*s);      /* Returns caseless for non-ascii, or
3795                                          * on EBCDIC machines whatever the
3796                                          * native function does */
3797         }
3798         else {
3799             /* Here, is ucfirst non-UTF-8, not in locale (unless that locale is
3800              * UTF-8, which we treat as not in locale), and cased latin1 */
3801             UV title_ord;
3802 #ifdef USE_LOCALE_CTYPE
3803       do_uni_rules:
3804 #endif
3805
3806             title_ord = _to_upper_title_latin1(*s, tmpbuf, &tculen, 's');
3807             if (tculen > 1) {
3808                 assert(tculen == 2);
3809
3810                 /* If the result is an upper Latin1-range character, it can
3811                  * still be represented in one byte, which is its ordinal */
3812                 if (UTF8_IS_DOWNGRADEABLE_START(*tmpbuf)) {
3813                     *tmpbuf = (U8) title_ord;
3814                     tculen = 1;
3815                 }
3816                 else {
3817                     /* Otherwise it became more than one ASCII character (in
3818                      * the case of LATIN_SMALL_LETTER_SHARP_S) or changed to
3819                      * beyond Latin1, so the number of bytes changed, so can't
3820                      * replace just the first character in place. */
3821                     inplace = FALSE;
3822
3823                     /* If the result won't fit in a byte, the entire result
3824                      * will have to be in UTF-8.  Assume worst case sizing in
3825                      * conversion. (all latin1 characters occupy at most two
3826                      * bytes in utf8) */
3827                     if (title_ord > 255) {
3828                         doing_utf8 = TRUE;
3829                         convert_source_to_utf8 = TRUE;
3830                         need = slen * 2 + 1;
3831
3832                         /* The (converted) UTF-8 and UTF-EBCDIC lengths of all
3833                          * (both) characters whose title case is above 255 is
3834                          * 2. */
3835                         ulen = 2;
3836                     }
3837                     else { /* LATIN_SMALL_LETTER_SHARP_S expands by 1 byte */
3838                         need = slen + 1 + 1;
3839                     }
3840                 }
3841             }
3842         } /* End of use Unicode (Latin1) semantics */
3843     } /* End of changing the case of the first character */
3844
3845     /* Here, have the first character's changed case stored in tmpbuf.  Ready to
3846      * generate the result */
3847     if (inplace) {
3848
3849         /* We can convert in place.  This means we change just the first
3850          * character without disturbing the rest; no need to grow */
3851         dest = source;
3852         s = d = (U8*)SvPV_force_nomg(source, slen);
3853     } else {
3854         dTARGET;
3855
3856         dest = TARG;
3857
3858         /* Here, we can't convert in place; we earlier calculated how much
3859          * space we will need, so grow to accommodate that */
3860         SvUPGRADE(dest, SVt_PV);
3861         d = (U8*)SvGROW(dest, need);
3862         (void)SvPOK_only(dest);
3863
3864         SETs(dest);
3865     }
3866
3867     if (doing_utf8) {
3868         if (! inplace) {
3869             if (! convert_source_to_utf8) {
3870
3871                 /* Here  both source and dest are in UTF-8, but have to create
3872                  * the entire output.  We initialize the result to be the
3873                  * title/lower cased first character, and then append the rest
3874                  * of the string. */
3875                 sv_setpvn(dest, (char*)tmpbuf, tculen);
3876                 if (slen > ulen) {
3877                     sv_catpvn(dest, (char*)(s + ulen), slen - ulen);
3878                 }
3879             }
3880             else {
3881                 const U8 *const send = s + slen;
3882
3883                 /* Here the dest needs to be in UTF-8, but the source isn't,
3884                  * except we earlier UTF-8'd the first character of the source
3885                  * into tmpbuf.  First put that into dest, and then append the
3886                  * rest of the source, converting it to UTF-8 as we go. */
3887
3888                 /* Assert tculen is 2 here because the only two characters that
3889                  * get to this part of the code have 2-byte UTF-8 equivalents */
3890                 *d++ = *tmpbuf;
3891                 *d++ = *(tmpbuf + 1);
3892                 s++;    /* We have just processed the 1st char */
3893
3894                 for (; s < send; s++) {
3895                     d = uvchr_to_utf8(d, *s);
3896                 }
3897                 *d = '\0';
3898                 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3899             }
3900             SvUTF8_on(dest);
3901         }
3902         else {   /* in-place UTF-8.  Just overwrite the first character */
3903             Copy(tmpbuf, d, tculen, U8);
3904             SvCUR_set(dest, need - 1);
3905         }
3906
3907     }
3908     else {  /* Neither source nor dest are in or need to be UTF-8 */
3909         if (slen) {
3910             if (inplace) {  /* in-place, only need to change the 1st char */
3911                 *d = *tmpbuf;
3912             }
3913             else {      /* Not in-place */
3914
3915                 /* Copy the case-changed character(s) from tmpbuf */
3916                 Copy(tmpbuf, d, tculen, U8);
3917                 d += tculen - 1; /* Code below expects d to point to final
3918                                   * character stored */
3919             }
3920         }
3921         else {  /* empty source */
3922             /* See bug #39028: Don't taint if empty  */
3923             *d = *s;
3924         }
3925
3926         /* In a "use bytes" we don't treat the source as UTF-8, but, still want
3927          * the destination to retain that flag */
3928         if (SvUTF8(source) && ! IN_BYTES)
3929             SvUTF8_on(dest);
3930
3931         if (!inplace) { /* Finish the rest of the string, unchanged */
3932             /* This will copy the trailing NUL  */
3933             Copy(s + 1, d + 1, slen, U8);
3934             SvCUR_set(dest, need - 1);
3935         }
3936     }
3937 #ifdef USE_LOCALE_CTYPE
3938     if (IN_LC_RUNTIME(LC_CTYPE)) {
3939         TAINT;
3940         SvTAINTED_on(dest);
3941     }
3942 #endif
3943     if (dest != source && SvTAINTED(source))
3944         SvTAINT(dest);
3945     SvSETMAGIC(dest);
3946     return NORMAL;
3947 }
3948
3949 /* There's so much setup/teardown code common between uc and lc, I wonder if
3950    it would be worth merging the two, and just having a switch outside each
3951    of the three tight loops.  There is less and less commonality though */
3952 PP(pp_uc)
3953 {
3954     dSP;
3955     SV *source = TOPs;
3956     STRLEN len;
3957     STRLEN min;
3958     SV *dest;
3959     const U8 *s;
3960     U8 *d;
3961
3962     SvGETMAGIC(source);
3963
3964     if (   SvPADTMP(source)
3965         && !SvREADONLY(source) && SvPOK(source)
3966         && !DO_UTF8(source)
3967         && (
3968 #ifdef USE_LOCALE_CTYPE
3969             (IN_LC_RUNTIME(LC_CTYPE))
3970             ? ! IN_UTF8_CTYPE_LOCALE
3971             :
3972 #endif
3973               ! IN_UNI_8_BIT))
3974     {
3975
3976         /* We can convert in place.  The reason we can't if in UNI_8_BIT is to
3977          * make the loop tight, so we overwrite the source with the dest before
3978          * looking at it, and we need to look at the original source
3979          * afterwards.  There would also need to be code added to handle
3980          * switching to not in-place in midstream if we run into characters
3981          * that change the length.  Since being in locale overrides UNI_8_BIT,
3982          * that latter becomes irrelevant in the above test; instead for
3983          * locale, the size can't normally change, except if the locale is a
3984          * UTF-8 one */
3985         dest = source;
3986         s = d = (U8*)SvPV_force_nomg(source, len);
3987         min = len + 1;
3988     } else {
3989         dTARGET;
3990
3991         dest = TARG;
3992
3993         s = (const U8*)SvPV_nomg_const(source, len);
3994         min = len + 1;
3995
3996         SvUPGRADE(dest, SVt_PV);
3997         d = (U8*)SvGROW(dest, min);
3998         (void)SvPOK_only(dest);
3999
4000         SETs(dest);
4001     }
4002
4003 #ifdef USE_LOCALE_CTYPE
4004
4005     if (IN_LC_RUNTIME(LC_CTYPE)) {
4006         _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
4007     }
4008
4009 #endif
4010
4011     /* Overloaded values may have toggled the UTF-8 flag on source, so we need
4012        to check DO_UTF8 again here.  */
4013
4014     if (DO_UTF8(source)) {
4015         const U8 *const send = s + len;
4016         U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
4017
4018         /* All occurrences of these are to be moved to follow any other marks.
4019          * This is context-dependent.  We may not be passed enough context to
4020          * move the iota subscript beyond all of them, but we do the best we can
4021          * with what we're given.  The result is always better than if we
4022          * hadn't done this.  And, the problem would only arise if we are
4023          * passed a character without all its combining marks, which would be
4024          * the caller's mistake.  The information this is based on comes from a
4025          * comment in Unicode SpecialCasing.txt, (and the Standard's text
4026          * itself) and so can't be checked properly to see if it ever gets
4027          * revised.  But the likelihood of it changing is remote */
4028         bool in_iota_subscript = FALSE;
4029
4030         while (s < send) {
4031             STRLEN u;
4032             STRLEN ulen;
4033             UV uv;
4034             if (in_iota_subscript && ! _is_utf8_mark(s)) {
4035
4036                 /* A non-mark.  Time to output the iota subscript */
4037                 Copy(GREEK_CAPITAL_LETTER_IOTA_UTF8, d, capital_iota_len, U8);
4038                 d += capital_iota_len;
4039                 in_iota_subscript = FALSE;
4040             }
4041
4042             /* Then handle the current character.  Get the changed case value
4043              * and copy it to the output buffer */
4044
4045             u = UTF8SKIP(s);
4046 #ifdef USE_LOCALE_CTYPE
4047             uv = _toUPPER_utf8_flags(s, send, tmpbuf, &ulen, IN_LC_RUNTIME(LC_CTYPE));
4048 #else
4049             uv = _toUPPER_utf8_flags(s, send, tmpbuf, &ulen, 0);
4050 #endif
4051 #define GREEK_CAPITAL_LETTER_IOTA 0x0399
4052 #define COMBINING_GREEK_YPOGEGRAMMENI 0x0345
4053             if (uv == GREEK_CAPITAL_LETTER_IOTA
4054                 && utf8_to_uvchr_buf(s, send, 0) == COMBINING_GREEK_YPOGEGRAMMENI)
4055             {
4056                 in_iota_subscript = TRUE;
4057             }
4058             else {
4059                 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4060                     /* If the eventually required minimum size outgrows the
4061                      * available space, we need to grow. */
4062                     const UV o = d - (U8*)SvPVX_const(dest);
4063
4064                     /* If someone uppercases one million U+03B0s we SvGROW()
4065                      * one million times.  Or we could try guessing how much to
4066                      * allocate without allocating too much.  Such is life.
4067                      * See corresponding comment in lc code for another option
4068                      * */
4069                     d = o + (U8*) SvGROW(dest, min);
4070                 }
4071                 Copy(tmpbuf, d, ulen, U8);
4072                 d += ulen;
4073             }
4074             s += u;
4075         }
4076         if (in_iota_subscript) {
4077             Copy(GREEK_CAPITAL_LETTER_IOTA_UTF8, d, capital_iota_len, U8);
4078             d += capital_iota_len;
4079         }
4080         SvUTF8_on(dest);
4081         *d = '\0';
4082
4083         SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4084     }
4085     else {      /* Not UTF-8 */
4086         if (len) {
4087             const U8 *const send = s + len;
4088
4089             /* Use locale casing if in locale; regular style if not treating
4090              * latin1 as having case; otherwise the latin1 casing.  Do the
4091              * whole thing in a tight loop, for speed, */
4092 #ifdef USE_LOCALE_CTYPE
4093             if (IN_LC_RUNTIME(LC_CTYPE)) {
4094                 if (IN_UTF8_CTYPE_LOCALE) {
4095                     goto do_uni_rules;
4096                 }
4097                 for (; s < send; d++, s++)
4098                     *d = (U8) toUPPER_LC(*s);
4099             }
4100             else
4101 #endif
4102                  if (! IN_UNI_8_BIT) {
4103                 for (; s < send; d++, s++) {
4104                     *d = toUPPER(*s);
4105                 }
4106             }
4107             else {
4108 #ifdef USE_LOCALE_CTYPE
4109           do_uni_rules:
4110 #endif
4111                 for (; s < send; d++, s++) {
4112                     *d = toUPPER_LATIN1_MOD(*s);
4113                     if (LIKELY(*d != LATIN_SMALL_LETTER_Y_WITH_DIAERESIS)) {
4114                         continue;
4115                     }
4116
4117                     /* The mainstream case is the tight loop above.  To avoid
4118                      * extra tests in that, all three characters that require
4119                      * special handling are mapped by the MOD to the one tested
4120                      * just above.  
4121                      * Use the source to distinguish between the three cases */
4122
4123 #if    UNICODE_MAJOR_VERSION > 2                                        \
4124    || (UNICODE_MAJOR_VERSION == 2 && UNICODE_DOT_VERSION >= 1           \
4125                                   && UNICODE_DOT_DOT_VERSION >= 8)
4126                     if (*s == LATIN_SMALL_LETTER_SHARP_S) {
4127
4128                         /* uc() of this requires 2 characters, but they are
4129                          * ASCII.  If not enough room, grow the string */
4130                         if (SvLEN(dest) < ++min) {      
4131                             const UV o = d - (U8*)SvPVX_const(dest);
4132                             d = o + (U8*) SvGROW(dest, min);
4133                         }
4134                         *d++ = 'S'; *d = 'S'; /* upper case is 'SS' */
4135                         continue;   /* Back to the tight loop; still in ASCII */
4136                     }
4137 #endif
4138
4139                     /* The other two special handling characters have their
4140                      * upper cases outside the latin1 range, hence need to be
4141                      * in UTF-8, so the whole result needs to be in UTF-8.  So,
4142                      * here we are somewhere in the middle of processing a
4143                      * non-UTF-8 string, and realize that we will have to convert
4144                      * the whole thing to UTF-8.  What to do?  There are
4145                      * several possibilities.  The simplest to code is to
4146                      * convert what we have so far, set a flag, and continue on
4147                      * in the loop.  The flag would be tested each time through
4148                      * the loop, and if set, the next character would be
4149                      * converted to UTF-8 and stored.  But, I (khw) didn't want
4150                      * to slow down the mainstream case at all for this fairly
4151                      * rare case, so I didn't want to add a test that didn't
4152                      * absolutely have to be there in the loop, besides the
4153                      * possibility that it would get too complicated for
4154                      * optimizers to deal with.  Another possibility is to just
4155                      * give up, convert the source to UTF-8, and restart the
4156                      * function that way.  Another possibility is to convert
4157                      * both what has already been processed and what is yet to
4158                      * come separately to UTF-8, then jump into the loop that
4159                      * handles UTF-8.  But the most efficient time-wise of the
4160                      * ones I could think of is what follows, and turned out to
4161                      * not require much extra code.  */
4162
4163                     /* Convert what we have so far into UTF-8, telling the
4164                      * function that we know it should be converted, and to
4165                      * allow extra space for what we haven't processed yet.
4166                      * Assume the worst case space requirements for converting
4167                      * what we haven't processed so far: that it will require
4168                      * two bytes for each remaining source character, plus the
4169                      * NUL at the end.  This may cause the string pointer to
4170                      * move, so re-find it. */
4171
4172                     len = d - (U8*)SvPVX_const(dest);
4173                     SvCUR_set(dest, len);
4174                     len = sv_utf8_upgrade_flags_grow(dest,
4175                                                 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
4176                                                 (send -s) * 2 + 1);
4177                     d = (U8*)SvPVX(dest) + len;
4178
4179                     /* Now process the remainder of the source, converting to
4180                      * upper and UTF-8.  If a resulting byte is invariant in
4181                      * UTF-8, output it as-is, otherwise convert to UTF-8 and
4182                      * append it to the output. */
4183                     for (; s < send; s++) {
4184                         (void) _to_upper_title_latin1(*s, d, &len, 'S');
4185                         d += len;
4186                     }
4187
4188                     /* Here have processed the whole source; no need to continue
4189                      * with the outer loop.  Each character has been converted
4190                      * to upper case and converted to UTF-8 */
4191
4192                     break;
4193                 } /* End of processing all latin1-style chars */
4194             } /* End of processing all chars */
4195         } /* End of source is not empty */
4196
4197         if (source != dest) {
4198             *d = '\0';  /* Here d points to 1 after last char, add NUL */
4199             SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4200         }
4201     } /* End of isn't utf8 */
4202 #ifdef USE_LOCALE_CTYPE
4203     if (IN_LC_RUNTIME(LC_CTYPE)) {
4204         TAINT;
4205         SvTAINTED_on(dest);
4206     }
4207 #endif
4208     if (dest != source && SvTAINTED(source))
4209         SvTAINT(dest);
4210     SvSETMAGIC(dest);
4211     return NORMAL;
4212 }
4213
4214 PP(pp_lc)
4215 {
4216     dSP;
4217     SV *source = TOPs;
4218     STRLEN len;
4219     STRLEN min;
4220     SV *dest;
4221     const U8 *s;
4222     U8 *d;
4223
4224     SvGETMAGIC(source);
4225
4226     if (   SvPADTMP(source)
4227         && !SvREADONLY(source) && SvPOK(source)
4228         && !DO_UTF8(source)) {
4229
4230         /* We can convert in place, as lowercasing anything in the latin1 range
4231          * (or else DO_UTF8 would have been on) doesn't lengthen it */
4232         dest = source;
4233         s = d = (U8*)SvPV_force_nomg(source, len);
4234         min = len + 1;
4235     } else {
4236         dTARGET;
4237
4238         dest = TARG;
4239
4240         s = (const U8*)SvPV_nomg_const(source, len);
4241         min = len + 1;
4242
4243         SvUPGRADE(dest, SVt_PV);
4244         d = (U8*)SvGROW(dest, min);
4245         (void)SvPOK_only(dest);
4246
4247         SETs(dest);
4248     }
4249
4250 #ifdef USE_LOCALE_CTYPE
4251
4252     if (IN_LC_RUNTIME(LC_CTYPE)) {
4253         _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
4254     }
4255
4256 #endif
4257
4258     /* Overloaded values may have toggled the UTF-8 flag on source, so we need
4259        to check DO_UTF8 again here.  */
4260
4261     if (DO_UTF8(source)) {
4262         const U8 *const send = s + len;
4263         U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
4264
4265         while (s < send) {
4266             const STRLEN u = UTF8SKIP(s);
4267             STRLEN ulen;
4268
4269 #ifdef USE_LOCALE_CTYPE
4270             _toLOWER_utf8_flags(s, send, tmpbuf, &ulen, IN_LC_RUNTIME(LC_CTYPE));
4271 #else
4272             _toLOWER_utf8_flags(s, send, tmpbuf, &ulen, 0);
4273 #endif
4274
4275             /* Here is where we would do context-sensitive actions.  See the
4276              * commit message for 86510fb15 for why there isn't any */
4277
4278             if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4279
4280                 /* If the eventually required minimum size outgrows the
4281                  * available space, we need to grow. */
4282                 const UV o = d - (U8*)SvPVX_const(dest);
4283
4284                 /* If someone lowercases one million U+0130s we SvGROW() one
4285                  * million times.  Or we could try guessing how much to
4286                  * allocate without allocating too much.  Such is life.
4287                  * Another option would be to grow an extra byte or two more
4288                  * each time we need to grow, which would cut down the million
4289                  * to 500K, with little waste */
4290                 d = o + (U8*) SvGROW(dest, min);
4291             }
4292
4293             /* Copy the newly lowercased letter to the output buffer we're
4294              * building */
4295             Copy(tmpbuf, d, ulen, U8);
4296             d += ulen;
4297             s += u;
4298         }   /* End of looping through the source string */
4299         SvUTF8_on(dest);
4300         *d = '\0';
4301         SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4302     } else {    /* Not utf8 */
4303         if (len) {
4304             const U8 *const send = s + len;
4305
4306             /* Use locale casing if in locale; regular style if not treating
4307              * latin1 as having case; otherwise the latin1 casing.  Do the
4308              * whole thing in a tight loop, for speed, */
4309 #ifdef USE_LOCALE_CTYPE
4310             if (IN_LC_RUNTIME(LC_CTYPE)) {
4311                 for (; s < send; d++, s++)
4312                     *d = toLOWER_LC(*s);
4313             }
4314             else
4315 #endif
4316             if (! IN_UNI_8_BIT) {
4317                 for (; s < send; d++, s++) {
4318                     *d = toLOWER(*s);
4319                 }
4320             }
4321             else {
4322                 for (; s < send; d++, s++) {
4323                     *d = toLOWER_LATIN1(*s);
4324                 }
4325             }
4326         }
4327         if (source != dest) {
4328             *d = '\0';
4329             SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4330         }
4331     }
4332 #ifdef USE_LOCALE_CTYPE
4333     if (IN_LC_RUNTIME(LC_CTYPE)) {
4334         TAINT;
4335         SvTAINTED_on(dest);
4336     }
4337 #endif
4338     if (dest != source && SvTAINTED(source))
4339         SvTAINT(dest);
4340     SvSETMAGIC(dest);
4341     return NORMAL;
4342 }
4343
4344 PP(pp_quotemeta)
4345 {
4346     dSP; dTARGET;
4347     SV * const sv = TOPs;
4348     STRLEN len;
4349     const char *s = SvPV_const(sv,len);
4350
4351     SvUTF8_off(TARG);                           /* decontaminate */
4352     if (len) {
4353         char *d;
4354         SvUPGRADE(TARG, SVt_PV);
4355         SvGROW(TARG, (len * 2) + 1);
4356         d = SvPVX(TARG);
4357         if (DO_UTF8(sv)) {
4358             while (len) {
4359                 STRLEN ulen = UTF8SKIP(s);
4360                 bool to_quote = FALSE;
4361
4362                 if (UTF8_IS_INVARIANT(*s)) {
4363                     if (_isQUOTEMETA(*s)) {
4364                         to_quote = TRUE;
4365                     }
4366                 }
4367                 else if (UTF8_IS_NEXT_CHAR_DOWNGRADEABLE(s, s + len)) {
4368                     if (
4369 #ifdef USE_LOCALE_CTYPE
4370                     /* In locale, we quote all non-ASCII Latin1 chars.
4371                      * Otherwise use the quoting rules */
4372                     
4373                     IN_LC_RUNTIME(LC_CTYPE)
4374                         ||
4375 #endif
4376                         _isQUOTEMETA(EIGHT_BIT_UTF8_TO_NATIVE(*s, *(s + 1))))
4377                     {
4378                         to_quote = TRUE;
4379                     }
4380                 }
4381                 else if (is_QUOTEMETA_high(s)) {
4382                     to_quote = TRUE;
4383                 }
4384
4385                 if (to_quote) {
4386                     *d++ = '\\';
4387                 }
4388                 if (ulen > len)
4389                     ulen = len;
4390                 len -= ulen;
4391                 while (ulen--)
4392                     *d++ = *s++;
4393             }
4394             SvUTF8_on(TARG);
4395         }
4396         else if (IN_UNI_8_BIT) {
4397             while (len--) {
4398                 if (_isQUOTEMETA(*s))
4399                     *d++ = '\\';
4400                 *d++ = *s++;
4401             }
4402         }
4403         else {
4404             /* For non UNI_8_BIT (and hence in locale) just quote all \W
4405              * including everything above ASCII */
4406             while (len--) {
4407                 if (!isWORDCHAR_A(*s))
4408                     *d++ = '\\';
4409                 *d++ = *s++;
4410             }
4411         }
4412         *d = '\0';
4413         SvCUR_set(TARG, d - SvPVX_const(TARG));
4414         (void)SvPOK_only_UTF8(TARG);
4415     }
4416     else
4417         sv_setpvn(TARG, s, len);
4418     SETTARG;
4419     return NORMAL;
4420 }
4421
4422 PP(pp_fc)
4423 {
4424     dTARGET;
4425     dSP;
4426     SV *source = TOPs;
4427     STRLEN len;
4428     STRLEN min;
4429     SV *dest;
4430     const U8 *s;
4431     const U8 *send;
4432     U8 *d;
4433     U8 tmpbuf[UTF8_MAXBYTES_CASE + 1];
4434 #if    UNICODE_MAJOR_VERSION > 3 /* no multifolds in early Unicode */   \
4435    || (UNICODE_MAJOR_VERSION == 3 && (   UNICODE_DOT_VERSION > 0)       \
4436                                       || UNICODE_DOT_DOT_VERSION > 0)
4437     const bool full_folding = TRUE; /* This variable is here so we can easily
4438                                        move to more generality later */
4439 #else
4440     const bool full_folding = FALSE;
4441 #endif
4442     const U8 flags = ( full_folding      ? FOLD_FLAGS_FULL   : 0 )
4443 #ifdef USE_LOCALE_CTYPE
4444                    | ( IN_LC_RUNTIME(LC_CTYPE) ? FOLD_FLAGS_LOCALE : 0 )
4445 #endif
4446     ;
4447
4448     /* This is a facsimile of pp_lc, but with a thousand bugs thanks to me.
4449      * You are welcome(?) -Hugmeir
4450      */
4451
4452     SvGETMAGIC(source);
4453
4454     dest = TARG;
4455
4456     if (SvOK(source)) {
4457         s = (const U8*)SvPV_nomg_const(source, len);
4458     } else {
4459         if (ckWARN(WARN_UNINITIALIZED))
4460             report_uninit(source);
4461         s = (const U8*)"";
4462         len = 0;
4463     }
4464
4465     min = len + 1;
4466
4467     SvUPGRADE(dest, SVt_PV);
4468     d = (U8*)SvGROW(dest, min);
4469     (void)SvPOK_only(dest);
4470
4471     SETs(dest);
4472
4473     send = s + len;
4474
4475 #ifdef USE_LOCALE_CTYPE
4476
4477     if ( IN_LC_RUNTIME(LC_CTYPE) ) { /* Under locale */
4478         _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
4479     }
4480
4481 #endif
4482
4483     if (DO_UTF8(source)) { /* UTF-8 flagged string. */
4484         while (s < send) {
4485             const STRLEN u = UTF8SKIP(s);
4486             STRLEN ulen;
4487
4488             _toFOLD_utf8_flags(s, send, tmpbuf, &ulen, flags);
4489
4490             if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4491                 const UV o = d - (U8*)SvPVX_const(dest);
4492                 d = o + (U8*) SvGROW(dest, min);
4493             }
4494
4495             Copy(tmpbuf, d, ulen, U8);
4496             d += ulen;
4497             s += u;
4498         }
4499         SvUTF8_on(dest);
4500     } /* Unflagged string */
4501     else if (len) {
4502 #ifdef USE_LOCALE_CTYPE
4503         if ( IN_LC_RUNTIME(LC_CTYPE) ) { /* Under locale */
4504             if (IN_UTF8_CTYPE_LOCALE) {
4505                 goto do_uni_folding;
4506             }
4507             for (; s < send; d++, s++)
4508                 *d = (U8) toFOLD_LC(*s);
4509         }
4510         else
4511 #endif
4512         if ( !IN_UNI_8_BIT ) { /* Under nothing, or bytes */
4513             for (; s < send; d++, s++)
4514                 *d = toFOLD(*s);
4515         }
4516         else {
4517 #ifdef USE_LOCALE_CTYPE
4518       do_uni_folding:
4519 #endif
4520             /* For ASCII and the Latin-1 range, there's only two troublesome
4521              * folds, \x{DF} (\N{LATIN SMALL LETTER SHARP S}), which under full
4522              * casefolding becomes 'ss'; and \x{B5} (\N{MICRO SIGN}), which
4523              * under any fold becomes \x{3BC} (\N{GREEK SMALL LETTER MU}) --
4524              * For the rest, the casefold is their lowercase.  */
4525             for (; s < send; d++, s++) {
4526                 if (*s == MICRO_SIGN) {
4527                     /* \N{MICRO SIGN}'s casefold is \N{GREEK SMALL LETTER MU},
4528                      * which is outside of the latin-1 range. There's a couple
4529                      * of ways to deal with this -- khw discusses them in
4530                      * pp_lc/uc, so go there :) What we do here is upgrade what
4531                      * we had already casefolded, then enter an inner loop that
4532                      * appends the rest of the characters as UTF-8. */
4533                     len = d - (U8*)SvPVX_const(dest);
4534                     SvCUR_set(dest, len);
4535                     len = sv_utf8_upgrade_flags_grow(dest,
4536                                                 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
4537                                                 /* The max expansion for latin1
4538                                                  * chars is 1 byte becomes 2 */
4539                                                 (send -s) * 2 + 1);
4540                     d = (U8*)SvPVX(dest) + len;
4541
4542                     Copy(GREEK_SMALL_LETTER_MU_UTF8, d, small_mu_len, U8);
4543                     d += small_mu_len;
4544                     s++;
4545                     for (; s < send; s++) {
4546                         STRLEN ulen;
4547                         UV fc = _to_uni_fold_flags(*s, tmpbuf, &ulen, flags);
4548                         if UVCHR_IS_INVARIANT(fc) {
4549                             if (full_folding
4550                                 && *s == LATIN_SMALL_LETTER_SHARP_S)
4551                             {
4552                                 *d++ = 's';
4553                                 *d++ = 's';
4554                             }
4555                             else
4556                                 *d++ = (U8)fc;
4557                         }
4558                         else {
4559                             Copy(tmpbuf, d, ulen, U8);
4560                             d += ulen;
4561                         }
4562                     }
4563                     break;
4564                 }
4565                 else if (full_folding && *s == LATIN_SMALL_LETTER_SHARP_S) {
4566                     /* Under full casefolding, LATIN SMALL LETTER SHARP S
4567                      * becomes "ss", which may require growing the SV. */
4568                     if (SvLEN(dest) < ++min) {
4569                         const UV o = d - (U8*)SvPVX_const(dest);
4570                         d = o + (U8*) SvGROW(dest, min);
4571                      }
4572                     *(d)++ = 's';
4573                     *d = 's';
4574                 }
4575                 else { /* If it's not one of those two, the fold is their lower
4576                           case */
4577                     *d = toLOWER_LATIN1(*s);
4578                 }
4579              }
4580         }
4581     }
4582     *d = '\0';
4583     SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4584
4585 #ifdef USE_LOCALE_CTYPE
4586     if (IN_LC_RUNTIME(LC_CTYPE)) {
4587         TAINT;
4588         SvTAINTED_on(dest);
4589     }
4590 #endif
4591     if (SvTAINTED(source))
4592         SvTAINT(dest);
4593     SvSETMAGIC(dest);
4594     RETURN;
4595 }
4596
4597 /* Arrays. */
4598
4599 PP(pp_aslice)
4600 {
4601     dSP; dMARK; dORIGMARK;
4602     AV *const av = MUTABLE_AV(POPs);
4603     const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
4604
4605     if (SvTYPE(av) == SVt_PVAV) {
4606         const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
4607         bool can_preserve = FALSE;
4608
4609         if (localizing) {
4610             MAGIC *mg;
4611             HV *stash;
4612
4613             can_preserve = SvCANEXISTDELETE(av);
4614         }
4615
4616         if (lval && localizing) {
4617             SV **svp;
4618             SSize_t max = -1;
4619             for (svp = MARK + 1; svp <= SP; svp++) {
4620                 const SSize_t elem = SvIV(*svp);
4621                 if (elem > max)
4622                     max = elem;
4623             }
4624             if (max > AvMAX(av))
4625                 av_extend(av, max);
4626         }
4627
4628         while (++MARK <= SP) {
4629             SV **svp;
4630             SSize_t elem = SvIV(*MARK);
4631             bool preeminent = TRUE;
4632
4633             if (localizing && can_preserve) {
4634                 /* If we can determine whether the element exist,
4635                  * Try to preserve the existenceness of a tied array
4636                  * element by using EXISTS and DELETE if possible.
4637                  * Fallback to FETCH and STORE otherwise. */
4638                 preeminent = av_exists(av, elem);
4639             }
4640
4641             svp = av_fetch(av, elem, lval);
4642             if (lval) {
4643                 if (!svp || !*svp)
4644                     DIE(aTHX_ PL_no_aelem, elem);
4645                 if (localizing) {
4646                     if (preeminent)
4647                         save_aelem(av, elem, svp);
4648                     else
4649                         SAVEADELETE(av, elem);
4650                 }
4651             }
4652             *MARK = svp ? *svp : &PL_sv_undef;
4653         }
4654     }
4655     if (GIMME_V != G_ARRAY) {
4656         MARK = ORIGMARK;
4657         *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
4658         SP = MARK;
4659     }
4660     RETURN;
4661 }
4662
4663 PP(pp_kvaslice)
4664 {
4665     dSP; dMARK;
4666     AV *const av = MUTABLE_AV(POPs);
4667     I32 lval = (PL_op->op_flags & OPf_MOD);
4668     SSize_t items = SP - MARK;
4669
4670     if (PL_op->op_private & OPpMAYBE_LVSUB) {
4671        const I32 flags = is_lvalue_sub();
4672        if (flags) {
4673            if (!(flags & OPpENTERSUB_INARGS))
4674                /* diag_listed_as: Can't modify %s in %s */
4675                Perl_croak(aTHX_ "Can't modify index/value array slice in list assignment");
4676            lval = flags;
4677        }
4678     }
4679
4680     MEXTEND(SP,items);
4681     while (items > 1) {
4682         *(MARK+items*2-1) = *(MARK+items);
4683         items--;
4684     }
4685     items = SP-MARK;
4686     SP += items;
4687
4688     while (++MARK <= SP) {
4689         SV **svp;
4690
4691         svp = av_fetch(av, SvIV(*MARK), lval);
4692         if (lval) {
4693             if (!svp || !*svp || *svp == &PL_sv_undef) {
4694                 DIE(aTHX_ PL_no_aelem, SvIV(*MARK));
4695             }
4696             *MARK = sv_mortalcopy(*MARK);
4697         }
4698         *++MARK = svp ? *svp : &PL_sv_undef;
4699     }
4700     if (GIMME_V != G_ARRAY) {
4701         MARK = SP - items*2;
4702         *++MARK = items > 0 ? *SP : &PL_sv_undef;
4703         SP = MARK;
4704     }
4705     RETURN;
4706 }
4707
4708
4709 PP(pp_aeach)
4710 {
4711     dSP;
4712     AV *array = MUTABLE_AV(POPs);
4713     const U8 gimme = GIMME_V;
4714     IV *iterp = Perl_av_iter_p(aTHX_ array);
4715     const IV current = (*iterp)++;
4716
4717     if (current > av_tindex(array)) {
4718         *iterp = 0;
4719         if (gimme == G_SCALAR)
4720             RETPUSHUNDEF;
4721         else
4722             RETURN;
4723     }
4724
4725     EXTEND(SP, 2);
4726     mPUSHi(current);
4727     if (gimme == G_ARRAY) {
4728         SV **const element = av_fetch(array, current, 0);
4729         PUSHs(element ? *element : &PL_sv_undef);
4730     }
4731     RETURN;
4732 }
4733
4734 /* also used for: pp_avalues()*/
4735 PP(pp_akeys)
4736 {
4737     dSP;
4738     AV *array = MUTABLE_AV(POPs);
4739     const U8 gimme = GIMME_V;
4740
4741     *Perl_av_iter_p(aTHX_ array) = 0;
4742
4743     if (gimme == G_SCALAR) {
4744         dTARGET;
4745         PUSHi(av_tindex(array) + 1);
4746     }
4747     else if (gimme == G_ARRAY) {
4748       if (UNLIKELY(PL_op->op_private & OPpMAYBE_LVSUB)) {
4749         const I32 flags = is_lvalue_sub();
4750         if (flags && !(flags & OPpENTERSUB_INARGS))
4751             /* diag_listed_as: Can't modify %s in %s */
4752             Perl_croak(aTHX_
4753                       "Can't modify keys on array in list assignment");
4754       }
4755       {
4756         IV n = Perl_av_len(aTHX_ array);
4757         IV i;
4758
4759         EXTEND(SP, n + 1);
4760
4761         if (  PL_op->op_type == OP_AKEYS
4762            || (  PL_op->op_type == OP_AVHVSWITCH
4763               && (PL_op->op_private & 3) + OP_AEACH == OP_AKEYS  ))
4764         {
4765             for (i = 0;  i <= n;  i++) {
4766                 mPUSHi(i);
4767             }
4768         }
4769         else {
4770             for (i = 0;  i <= n;  i++) {
4771                 SV *const *const elem = Perl_av_fetch(aTHX_ array, i, 0);
4772                 PUSHs(elem ? *elem : &PL_sv_undef);
4773             }
4774         }
4775       }
4776     }
4777     RETURN;
4778 }
4779
4780 /* Associative arrays. */
4781
4782 PP(pp_each)
4783 {
4784     dSP;
4785     HV * hash = MUTABLE_HV(POPs);
4786     HE *entry;
4787     const U8 gimme = GIMME_V;
4788
4789     entry = hv_iternext(hash);
4790
4791     EXTEND(SP, 2);
4792     if (entry) {
4793         SV* const sv = hv_iterkeysv(entry);
4794         PUSHs(sv);
4795         if (gimme == G_ARRAY) {
4796             SV *val;
4797             val = hv_iterval(hash, entry);
4798             PUSHs(val);
4799         }
4800     }
4801     else if (gimme == G_SCALAR)
4802         RETPUSHUNDEF;
4803
4804     RETURN;
4805 }
4806
4807 STATIC OP *
4808 S_do_delete_local(pTHX)
4809 {
4810     dSP;
4811     const U8 gimme = GIMME_V;
4812     const MAGIC *mg;
4813     HV *stash;
4814     const bool sliced = !!(PL_op->op_private & OPpSLICE);
4815     SV **unsliced_keysv = sliced ? NULL : sp--;
4816     SV * const osv = POPs;
4817     SV **mark = sliced ? PL_stack_base + POPMARK : unsliced_keysv-1;
4818     dORIGMARK;
4819     const bool tied = SvRMAGICAL(osv)
4820                             && mg_find((const SV *)osv, PERL_MAGIC_tied);
4821     const bool can_preserve = SvCANEXISTDELETE(osv);
4822     const U32 type = SvTYPE(osv);
4823     SV ** const end = sliced ? SP : unsliced_keysv;
4824
4825     if (type == SVt_PVHV) {                     /* hash element */
4826             HV * const hv = MUTABLE_HV(osv);
4827             while (++MARK <= end) {
4828                 SV * const keysv = *MARK;
4829                 SV *sv = NULL;
4830                 bool preeminent = TRUE;
4831                 if (can_preserve)
4832                     preeminent = hv_exists_ent(hv, keysv, 0);
4833                 if (tied) {
4834                     HE *he = hv_fetch_ent(hv, keysv, 1, 0);
4835                     if (he)
4836                         sv = HeVAL(he);
4837                     else
4838                         preeminent = FALSE;
4839                 }
4840                 else {
4841                     sv = hv_delete_ent(hv, keysv, 0, 0);
4842                     if (preeminent)
4843                         SvREFCNT_inc_simple_void(sv); /* De-mortalize */
4844                 }
4845                 if (preeminent) {
4846                     if (!sv) DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
4847                     save_helem_flags(hv, keysv, &sv, SAVEf_KEEPOLDELEM);
4848                     if (tied) {
4849                         *MARK = sv_mortalcopy(sv);
4850                         mg_clear(sv);
4851                     } else
4852                         *MARK = sv;
4853                 }
4854                 else {
4855                     SAVEHDELETE(hv, keysv);
4856                     *MARK = &PL_sv_undef;
4857                 }
4858             }
4859     }
4860     else if (type == SVt_PVAV) {                  /* array element */
4861             if (PL_op->op_flags & OPf_SPECIAL) {
4862                 AV * const av = MUTABLE_AV(osv);
4863                 while (++MARK <= end) {
4864                     SSize_t idx = SvIV(*MARK);
4865                     SV *sv = NULL;
4866                     bool preeminent = TRUE;
4867                     if (can_preserve)
4868                         preeminent = av_exists(av, idx);
4869                     if (tied) {
4870                         SV **svp = av_fetch(av, idx, 1);
4871                         if (svp)
4872                             sv = *svp;
4873                         else
4874                             preeminent = FALSE;
4875                     }
4876                     else {
4877                         sv = av_delete(av, idx, 0);
4878                         if (preeminent)
4879                            SvREFCNT_inc_simple_void(sv); /* De-mortalize */
4880                     }
4881                     if (preeminent) {
4882                         save_aelem_flags(av, idx, &sv, SAVEf_KEEPOLDELEM);
4883                         if (tied) {
4884                             *MARK = sv_mortalcopy(sv);
4885                             mg_clear(sv);
4886                         } else
4887                             *MARK = sv;
4888                     }
4889                     else {
4890                         SAVEADELETE(av, idx);
4891                         *MARK = &PL_sv_undef;
4892                     }
4893                 }
4894             }
4895             else
4896                 DIE(aTHX_ "panic: avhv_delete no longer supported");
4897     }
4898     else
4899             DIE(aTHX_ "Not a HASH reference");
4900     if (sliced) {
4901         if (gimme == G_VOID)
4902             SP = ORIGMARK;
4903         else if (gimme == G_SCALAR) {
4904             MARK = ORIGMARK;
4905             if (SP > MARK)
4906                 *++MARK = *SP;
4907             else
4908                 *++MARK = &PL_sv_undef;
4909             SP = MARK;
4910         }
4911     }
4912     else if (gimme != G_VOID)
4913         PUSHs(*unsliced_keysv);
4914
4915     RETURN;
4916 }
4917
4918 PP(pp_delete)
4919 {
4920     dSP;
4921     U8 gimme;
4922     I32 discard;
4923
4924     if (PL_op->op_private & OPpLVAL_INTRO)
4925         return do_delete_local();
4926
4927     gimme = GIMME_V;
4928     discard = (gimme == G_VOID) ? G_DISCARD : 0;
4929
4930     if (PL_op->op_private & (OPpSLICE|OPpKVSLICE)) {
4931         dMARK; dORIGMARK;
4932         HV * const hv = MUTABLE_HV(POPs);
4933         const U32 hvtype = SvTYPE(hv);
4934         int skip = 0;
4935         if (PL_op->op_private & OPpKVSLICE) {
4936             SSize_t items = SP - MARK;
4937
4938             MEXTEND(SP,items);
4939             while (items > 1) {
4940                 *(MARK+items*2-1) = *(MARK+items);
4941                 items--;
4942             }
4943             items = SP - MARK;
4944             SP += items;
4945             skip = 1;
4946         }
4947         if (hvtype == SVt_PVHV) {                       /* hash element */
4948             while ((MARK += (1+skip)) <= SP) {
4949                 SV * const sv = hv_delete_ent(hv, *(MARK-skip), discard, 0);
4950                 *MARK = sv ? sv : &PL_sv_undef;
4951             }
4952         }
4953         else if (hvtype == SVt_PVAV) {                  /* array element */
4954             if (PL_op->op_flags & OPf_SPECIAL) {
4955                 while ((MARK += (1+skip)) <= SP) {
4956                     SV * const sv = av_delete(MUTABLE_AV(hv), SvIV(*(MARK-skip)), discard);
4957                     *MARK = sv ? sv : &PL_sv_undef;
4958                 }
4959             }
4960         }
4961         else
4962             DIE(aTHX_ "Not a HASH reference");
4963         if (discard)
4964             SP = ORIGMARK;
4965         else if (gimme == G_SCALAR) {
4966             MARK = ORIGMARK;
4967             if (SP > MARK)
4968                 *++MARK = *SP;
4969             else
4970                 *++MARK = &PL_sv_undef;
4971             SP = MARK;
4972         }
4973     }
4974     else {
4975         SV *keysv = POPs;
4976         HV * const hv = MUTABLE_HV(POPs);
4977         SV *sv = NULL;
4978         if (SvTYPE(hv) == SVt_PVHV)
4979             sv = hv_delete_ent(hv, keysv, discard, 0);
4980         else if (SvTYPE(hv) == SVt_PVAV) {
4981             if (PL_op->op_flags & OPf_SPECIAL)
4982                 sv = av_delete(MUTABLE_AV(hv), SvIV(keysv), discard);
4983             else
4984                 DIE(aTHX_ "panic: avhv_delete no longer supported");
4985         }
4986         else
4987             DIE(aTHX_ "Not a HASH reference");
4988         if (!sv)
4989             sv = &PL_sv_undef;
4990         if (!discard)
4991             PUSHs(sv);
4992     }
4993     RETURN;
4994 }
4995
4996 PP(pp_exists)
4997 {
4998     dSP;
4999     SV *tmpsv;
5000     HV *hv;
5001
5002     if (UNLIKELY( PL_op->op_private & OPpEXISTS_SUB )) {
5003         GV *gv;
5004         SV * const sv = POPs;
5005         CV * const cv = sv_2cv(sv, &hv, &gv, 0);
5006         if (cv)
5007             RETPUSHYES;
5008         if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
5009             RETPUSHYES;
5010         RETPUSHNO;
5011     }
5012     tmpsv = POPs;
5013     hv = MUTABLE_HV(POPs);
5014     if (LIKELY( SvTYPE(hv) == SVt_PVHV )) {
5015         if (hv_exists_ent(hv, tmpsv, 0))
5016             RETPUSHYES;
5017     }
5018     else if (SvTYPE(hv) == SVt_PVAV) {
5019         if (PL_op->op_flags & OPf_SPECIAL) {            /* array element */
5020             if (av_exists(MUTABLE_AV(hv), SvIV(tmpsv)))
5021                 RETPUSHYES;
5022         }
5023     }
5024     else {
5025         DIE(aTHX_ "Not a HASH reference");
5026     }
5027     RETPUSHNO;
5028 }
5029
5030 PP(pp_hslice)
5031 {
5032     dSP; dMARK; dORIGMARK;
5033     HV * const hv = MUTABLE_HV(POPs);
5034     const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
5035     const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
5036     bool can_preserve = FALSE;
5037
5038     if (localizing) {
5039         MAGIC *mg;
5040         HV *stash;
5041
5042         if (SvCANEXISTDELETE(hv))
5043             can_preserve = TRUE;
5044     }
5045
5046     while (++MARK <= SP) {
5047         SV * const keysv = *MARK;
5048         SV **svp;
5049         HE *he;
5050         bool preeminent = TRUE;
5051
5052         if (localizing && can_preserve) {
5053             /* If we can determine whether the element exist,
5054              * try to preserve the existenceness of a tied hash
5055              * element by using EXISTS and DELETE if possible.
5056              * Fallback to FETCH and STORE otherwise. */
5057             preeminent = hv_exists_ent(hv, keysv, 0);
5058         }
5059
5060         he = hv_fetch_ent(hv, keysv, lval, 0);
5061         svp = he ? &HeVAL(he) : NULL;
5062
5063         if (lval) {
5064             if (!svp || !*svp || *svp == &PL_sv_undef) {
5065                 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
5066             }
5067             if (localizing) {
5068                 if (HvNAME_get(hv) && isGV_or_RVCV(*svp))
5069                     save_gp(MUTABLE_GV(*svp), !(PL_op->op_flags & OPf_SPECIAL));
5070                 else if (preeminent)
5071                     save_helem_flags(hv, keysv, svp,
5072                          (PL_op->op_flags & OPf_SPECIAL) ? 0 : SAVEf_SETMAGIC);
5073                 else
5074                     SAVEHDELETE(hv, keysv);
5075             }
5076         }
5077         *MARK = svp && *svp ? *svp : &PL_sv_undef;
5078     }
5079     if (GIMME_V != G_ARRAY) {
5080         MARK = ORIGMARK;
5081         *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
5082         SP = MARK;
5083     }
5084     RETURN;
5085 }
5086
5087 PP(pp_kvhslice)
5088 {
5089     dSP; dMARK;
5090     HV * const hv = MUTABLE_HV(POPs);
5091     I32 lval = (PL_op->op_flags & OPf_MOD);
5092     SSize_t items = SP - MARK;
5093
5094     if (PL_op->op_private & OPpMAYBE_LVSUB) {
5095        const I32 flags = is_lvalue_sub();
5096        if (flags) {
5097            if (!(flags & OPpENTERSUB_INARGS))
5098                /* diag_listed_as: Can't modify %s in %s */
5099                Perl_croak(aTHX_ "Can't modify key/value hash slice in %s assignment",
5100                                  GIMME_V == G_ARRAY ? "list" : "scalar");
5101            lval = flags;
5102        }
5103     }
5104
5105     MEXTEND(SP,items);
5106     while (items > 1) {
5107         *(MARK+items*2-1) = *(MARK+items);
5108         items--;
5109     }
5110     items = SP-MARK;
5111     SP += items;
5112
5113     while (++MARK <= SP) {
5114         SV * const keysv = *MARK;
5115         SV **svp;
5116         HE *he;
5117
5118         he = hv_fetch_ent(hv, keysv, lval, 0);
5119         svp = he ? &HeVAL(he) : NULL;
5120
5121         if (lval) {
5122             if (!svp || !*svp || *svp == &PL_sv_undef) {
5123                 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
5124             }
5125             *MARK = sv_mortalcopy(*MARK);
5126         }
5127         *++MARK = svp && *svp ? *svp : &PL_sv_undef;
5128     }
5129     if (GIMME_V != G_ARRAY) {
5130         MARK = SP - items*2;
5131         *++MARK = items > 0 ? *SP : &PL_sv_undef;
5132         SP = MARK;
5133     }
5134     RETURN;
5135 }
5136
5137 /* List operators. */
5138
5139 PP(pp_list)
5140 {
5141     I32 markidx = POPMARK;
5142     if (GIMME_V != G_ARRAY) {
5143         /* don't initialize mark here, EXTEND() may move the stack */
5144         SV **mark;
5145         dSP;
5146         EXTEND(SP, 1);          /* in case no arguments, as in @empty */
5147         mark = PL_stack_base + markidx;
5148         if (++MARK <= SP)
5149             *MARK = *SP;                /* unwanted list, return last item */
5150         else
5151             *MARK = &PL_sv_undef;
5152         SP = MARK;
5153         PUTBACK;
5154     }
5155     return NORMAL;
5156 }
5157
5158 PP(pp_lslice)
5159 {
5160     dSP;
5161     SV ** const lastrelem = PL_stack_sp;
5162     SV ** const lastlelem = PL_stack_base + POPMARK;
5163     SV ** const firstlelem = PL_stack_base + POPMARK + 1;
5164     SV ** const firstrelem = lastlelem + 1;
5165     const U8 mod = PL_op->op_flags & OPf_MOD;
5166
5167     const I32 max = lastrelem - lastlelem;
5168     SV **lelem;
5169
5170     if (GIMME_V != G_ARRAY) {
5171         if (lastlelem < firstlelem) {
5172             EXTEND(SP, 1);
5173             *firstlelem = &PL_sv_undef;
5174         }
5175         else {
5176             I32 ix = SvIV(*lastlelem);
5177             if (ix < 0)
5178                 ix += max;
5179             if (ix < 0 || ix >= max)
5180                 *firstlelem = &PL_sv_undef;
5181             else
5182                 *firstlelem = firstrelem[ix];
5183         }
5184         SP = firstlelem;
5185         RETURN;
5186     }
5187
5188     if (max == 0) {
5189         SP = firstlelem - 1;
5190         RETURN;
5191     }
5192
5193     for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
5194         I32 ix = SvIV(*lelem);
5195         if (ix < 0)
5196             ix += max;
5197         if (ix < 0 || ix >= max)
5198             *lelem = &PL_sv_undef;
5199         else {
5200             if (!(*lelem = firstrelem[ix]))
5201                 *lelem = &PL_sv_undef;
5202             else if (mod && SvPADTMP(*lelem)) {
5203                 *lelem = firstrelem[ix] = sv_mortalcopy(*lelem);
5204             }
5205         }
5206     }
5207     SP = lastlelem;
5208     RETURN;
5209 }
5210
5211 PP(pp_anonlist)
5212 {
5213     dSP; dMARK;
5214     const I32 items = SP - MARK;
5215     SV * const av = MUTABLE_SV(av_make(items, MARK+1));
5216     SP = MARK;
5217     mXPUSHs((PL_op->op_flags & OPf_SPECIAL)
5218             ? newRV_noinc(av) : av);
5219     RETURN;
5220 }
5221
5222 PP(pp_anonhash)
5223 {
5224     dSP; dMARK; dORIGMARK;
5225     HV* const hv = newHV();
5226     SV* const retval = sv_2mortal( PL_op->op_flags & OPf_SPECIAL
5227                                     ? newRV_noinc(MUTABLE_SV(hv))
5228                                     : MUTABLE_SV(hv) );
5229
5230     while (MARK < SP) {
5231         SV * const key =
5232             (MARK++, SvGMAGICAL(*MARK) ? sv_mortalcopy(*MARK) : *MARK);
5233         SV *val;
5234         if (MARK < SP)
5235         {
5236             MARK++;
5237             SvGETMAGIC(*MARK);
5238             val = newSV(0);
5239             sv_setsv_nomg(val, *MARK);
5240         }
5241         else
5242         {
5243             Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
5244             val = newSV(0);
5245         }
5246         (void)hv_store_ent(hv,key,val,0);
5247     }
5248     SP = ORIGMARK;
5249     XPUSHs(retval);
5250     RETURN;
5251 }
5252
5253 PP(pp_splice)
5254 {
5255     dSP; dMARK; dORIGMARK;
5256     int num_args = (SP - MARK);
5257     AV *ary = MUTABLE_AV(*++MARK);
5258     SV **src;
5259     SV **dst;
5260     SSize_t i;
5261     SSize_t offset;
5262     SSize_t length;
5263     SSize_t newlen;
5264     SSize_t after;
5265     SSize_t diff;
5266     const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
5267
5268     if (mg) {
5269         return Perl_tied_method(aTHX_ SV_CONST(SPLICE), mark - 1, MUTABLE_SV(ary), mg,
5270                                     GIMME_V | TIED_METHOD_ARGUMENTS_ON_STACK,
5271                                     sp - mark);
5272     }
5273
5274     if (SvREADONLY(ary))
5275         Perl_croak_no_modify();
5276
5277     SP++;
5278
5279     if (++MARK < SP) {
5280         offset = i = SvIV(*MARK);
5281         if (offset < 0)
5282             offset += AvFILLp(ary) + 1;
5283         if (offset < 0)
5284             DIE(aTHX_ PL_no_aelem, i);
5285         if (++MARK < SP) {
5286             length = SvIVx(*MARK++);
5287             if (length < 0) {
5288                 length += AvFILLp(ary) - offset + 1;
5289                 if (length < 0)
5290                     length = 0;
5291             }
5292         }
5293         else
5294             length = AvMAX(ary) + 1;            /* close enough to infinity */
5295     }
5296     else {
5297         offset = 0;
5298         length = AvMAX(ary) + 1;
5299     }
5300     if (offset > AvFILLp(ary) + 1) {
5301         if (num_args > 2)
5302             Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
5303         offset = AvFILLp(ary) + 1;
5304     }
5305     after = AvFILLp(ary) + 1 - (offset + length);
5306     if (after < 0) {                            /* not that much array */
5307         length += after;                        /* offset+length now in array */
5308         after = 0;
5309         if (!AvALLOC(ary))
5310             av_extend(ary, 0);
5311     }
5312
5313     /* At this point, MARK .. SP-1 is our new LIST */
5314
5315     newlen = SP - MARK;
5316     diff = newlen - length;
5317     if (newlen && !AvREAL(ary) && AvREIFY(ary))
5318         av_reify(ary);
5319
5320     /* make new elements SVs now: avoid problems if they're from the array */
5321     for (dst = MARK, i = newlen; i; i--) {
5322         SV * const h = *dst;
5323         *dst++ = newSVsv(h);
5324     }
5325
5326     if (diff < 0) {                             /* shrinking the area */
5327         SV **tmparyval = NULL;
5328         if (newlen) {
5329             Newx(tmparyval, newlen, SV*);       /* so remember insertion */
5330             Copy(MARK, tmparyval, newlen, SV*);
5331         }
5332
5333         MARK = ORIGMARK + 1;
5334         if (GIMME_V == G_ARRAY) {               /* copy return vals to stack */
5335             const bool real = cBOOL(AvREAL(ary));
5336             MEXTEND(MARK, length);
5337             if (real)
5338                 EXTEND_MORTAL(length);
5339             for (i = 0, dst = MARK; i < length; i++) {
5340                 if ((*dst = AvARRAY(ary)[i+offset])) {
5341                   if (real)
5342                     sv_2mortal(*dst);   /* free them eventually */
5343                 }
5344                 else
5345                     *dst = &PL_sv_undef;
5346                 dst++;
5347             }
5348             MARK += length - 1;
5349         }
5350         else {
5351             *MARK = AvARRAY(ary)[offset+length-1];
5352             if (AvREAL(ary)) {
5353                 sv_2mortal(*MARK);
5354                 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
5355                     SvREFCNT_dec(*dst++);       /* free them now */
5356             }
5357             if (!*MARK)
5358                 *MARK = &PL_sv_undef;
5359         }
5360         AvFILLp(ary) += diff;
5361
5362         /* pull up or down? */
5363
5364         if (offset < after) {                   /* easier to pull up */
5365             if (offset) {                       /* esp. if nothing to pull */
5366                 src = &AvARRAY(ary)[offset-1];
5367                 dst = src - diff;               /* diff is negative */
5368                 for (i = offset; i > 0; i--)    /* can't trust Copy */
5369                     *dst-- = *src--;
5370             }
5371             dst = AvARRAY(ary);
5372             AvARRAY(ary) = AvARRAY(ary) - diff; /* diff is negative */
5373             AvMAX(ary) += diff;
5374         }
5375         else {
5376             if (after) {                        /* anything to pull down? */
5377                 src = AvARRAY(ary) + offset + length;
5378                 dst = src + diff;               /* diff is negative */
5379                 Move(src, dst, after, SV*);
5380             }
5381             dst = &AvARRAY(ary)[AvFILLp(ary)+1];
5382                                                 /* avoid later double free */
5383         }
5384         i = -diff;
5385         while (i)
5386             dst[--i] = NULL;
5387         
5388         if (newlen) {
5389             Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
5390             Safefree(tmparyval);
5391         }
5392     }
5393     else {                                      /* no, expanding (or same) */
5394         SV** tmparyval = NULL;
5395         if (length) {
5396             Newx(tmparyval, length, SV*);       /* so remember deletion */
5397             Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
5398         }
5399
5400         if (diff > 0) {                         /* expanding */
5401             /* push up or down? */
5402             if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
5403                 if (offset) {
5404                     src = AvARRAY(ary);
5405                     dst = src - diff;
5406                     Move(src, dst, offset, SV*);
5407                 }
5408                 AvARRAY(ary) = AvARRAY(ary) - diff;/* diff is positive */
5409                 AvMAX(ary) += diff;
5410                 AvFILLp(ary) += diff;
5411             }
5412             else {
5413                 if (AvFILLp(ary) + diff >= AvMAX(ary))  /* oh, well */
5414                     av_extend(ary, AvFILLp(ary) + diff);
5415                 AvFILLp(ary) += diff;
5416
5417                 if (after) {
5418                     dst = AvARRAY(ary) + AvFILLp(ary);
5419                     src = dst - diff;
5420                     for (i = after; i; i--) {
5421                         *dst-- = *src--;
5422                     }
5423                 }
5424             }
5425         }
5426
5427         if (newlen) {
5428             Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
5429         }
5430
5431         MARK = ORIGMARK + 1;
5432         if (GIMME_V == G_ARRAY) {               /* copy return vals to stack */
5433             if (length) {
5434                 const bool real = cBOOL(AvREAL(ary));
5435                 if (real)
5436                     EXTEND_MORTAL(length);
5437                 for (i = 0, dst = MARK; i < length; i++) {
5438                     if ((*dst = tmparyval[i])) {
5439                       if (real)
5440                         sv_2mortal(*dst);       /* free them eventually */
5441                     }
5442                     else *dst = &PL_sv_undef;
5443                     dst++;
5444                 }
5445             }
5446             MARK += length - 1;
5447         }
5448         else if (length--) {
5449             *MARK = tmparyval[length];
5450             if (AvREAL(ary)) {
5451                 sv_2mortal(*MARK);
5452                 while (length-- > 0)
5453                     SvREFCNT_dec(tmparyval[length]);
5454             }
5455             if (!*MARK)
5456                 *MARK = &PL_sv_undef;
5457         }
5458         else
5459             *MARK = &PL_sv_undef;
5460         Safefree(tmparyval);
5461     }
5462
5463     if (SvMAGICAL(ary))
5464         mg_set(MUTABLE_SV(ary));
5465
5466     SP = MARK;
5467     RETURN;
5468 }
5469
5470 PP(pp_push)
5471 {
5472     dSP; dMARK; dORIGMARK; dTARGET;
5473     AV * const ary = MUTABLE_AV(*++MARK);
5474     const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
5475
5476     if (mg) {
5477         *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
5478         PUSHMARK(MARK);
5479         PUTBACK;
5480         ENTER_with_name("call_PUSH");
5481         call_sv(SV_CONST(PUSH),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
5482         LEAVE_with_name("call_PUSH");
5483         /* SPAGAIN; not needed: SP is assigned to immediately below */
5484     }
5485     else {
5486         /* PL_delaymagic is restored by JUMPENV_POP on dieing, so we
5487          * only need to save locally, not on the save stack */
5488         U16 old_delaymagic = PL_delaymagic;
5489
5490         if (SvREADONLY(ary) && MARK < SP) Perl_croak_no_modify();
5491         PL_delaymagic = DM_DELAY;
5492         for (++MARK; MARK <= SP; MARK++) {
5493             SV *sv;
5494             if (*MARK) SvGETMAGIC(*MARK);
5495             sv = newSV(0);
5496             if (*MARK)
5497                 sv_setsv_nomg(sv, *MARK);
5498             av_store(ary, AvFILLp(ary)+1, sv);
5499         }
5500         if (PL_delaymagic & DM_ARRAY_ISA)
5501             mg_set(MUTABLE_SV(ary));
5502         PL_delaymagic = old_delaymagic;
5503     }
5504     SP = ORIGMARK;
5505     if (OP_GIMME(PL_op, 0) != G_VOID) {
5506         PUSHi( AvFILL(ary) + 1 );
5507     }
5508     RETURN;
5509 }
5510
5511 /* also used for: pp_pop()*/
5512 PP(pp_shift)
5513 {
5514     dSP;
5515     AV * const av = PL_op->op_flags & OPf_SPECIAL
5516         ? MUTABLE_AV(GvAVn(PL_defgv)) : MUTABLE_AV(POPs);
5517     SV * const sv = PL_op->op_type == OP_SHIFT ? av_shift(av) : av_pop(av);
5518     EXTEND(SP, 1);
5519     assert (sv);
5520     if (AvREAL(av))
5521         (void)sv_2mortal(sv);
5522     PUSHs(sv);
5523     RETURN;
5524 }
5525
5526 PP(pp_unshift)
5527 {
5528     dSP; dMARK; dORIGMARK; dTARGET;
5529     AV *ary = MUTABLE_AV(*++MARK);
5530     const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
5531
5532     if (mg) {
5533         *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
5534         PUSHMARK(MARK);
5535         PUTBACK;
5536         ENTER_with_name("call_UNSHIFT");
5537         call_sv(SV_CONST(UNSHIFT),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
5538         LEAVE_with_name("call_UNSHIFT");
5539         /* SPAGAIN; not needed: SP is assigned to immediately below */
5540     }
5541     else {
5542         /* PL_delaymagic is restored by JUMPENV_POP on dieing, so we
5543          * only need to save locally, not on the save stack */
5544         U16 old_delaymagic = PL_delaymagic;
5545         SSize_t i = 0;
5546
5547         av_unshift(ary, SP - MARK);
5548         PL_delaymagic = DM_DELAY;
5549         while (MARK < SP) {
5550             SV * const sv = newSVsv(*++MARK);
5551             (void)av_store(ary, i++, sv);
5552         }
5553         if (PL_delaymagic & DM_ARRAY_ISA)
5554             mg_set(MUTABLE_SV(ary));
5555         PL_delaymagic = old_delaymagic;
5556     }
5557     SP = ORIGMARK;
5558     if (OP_GIMME(PL_op, 0) != G_VOID) {
5559         PUSHi( AvFILL(ary) + 1 );
5560     }
5561     RETURN;
5562 }
5563
5564 PP(pp_reverse)
5565 {
5566     dSP; dMARK;
5567
5568     if (GIMME_V == G_ARRAY) {
5569         if (PL_op->op_private & OPpREVERSE_INPLACE) {
5570             AV *av;
5571
5572             /* See pp_sort() */
5573             assert( MARK+1 == SP && *SP && SvTYPE(*SP) == SVt_PVAV);
5574             (void)POPMARK; /* remove mark associated with ex-OP_AASSIGN */
5575             av = MUTABLE_AV((*SP));
5576             /* In-place reversing only happens in void context for the array
5577              * assignment. We don't need to push anything on the stack. */
5578             SP = MARK;
5579
5580             if (SvMAGICAL(av)) {
5581                 SSize_t i, j;
5582                 SV *tmp = sv_newmortal();
5583                 /* For SvCANEXISTDELETE */
5584                 HV *stash;
5585                 const MAGIC *mg;
5586                 bool can_preserve = SvCANEXISTDELETE(av);
5587
5588                 for (i = 0, j = av_tindex(av); i < j; ++i, --j) {
5589                     SV *begin, *end;
5590
5591                     if (can_preserve) {
5592                         if (!av_exists(av, i)) {
5593                             if (av_exists(av, j)) {
5594                                 SV *sv = av_delete(av, j, 0);
5595                                 begin = *av_fetch(av, i, TRUE);
5596                                 sv_setsv_mg(begin, sv);
5597                             }
5598                             continue;
5599                         }
5600                         else if (!av_exists(av, j)) {
5601                             SV *sv = av_delete(av, i, 0);
5602                             end = *av_fetch(av, j, TRUE);
5603                             sv_setsv_mg(end, sv);
5604                             continue;
5605                         }
5606                     }
5607
5608                     begin = *av_fetch(av, i, TRUE);
5609                     end   = *av_fetch(av, j, TRUE);
5610                     sv_setsv(tmp,      begin);
5611                     sv_setsv_mg(begin, end);
5612                     sv_setsv_mg(end,   tmp);
5613                 }
5614             }
5615             else {
5616                 SV **begin = AvARRAY(av);
5617
5618                 if (begin) {
5619                     SV **end   = begin + AvFILLp(av);
5620
5621                     while (begin < end) {
5622                         SV * const tmp = *begin;
5623                         *begin++ = *end;
5624                         *end--   = tmp;
5625                     }
5626                 }
5627             }
5628         }
5629         else {
5630             SV **oldsp = SP;
5631             MARK++;
5632             while (MARK < SP) {
5633                 SV * const tmp = *MARK;
5634                 *MARK++ = *SP;
5635                 *SP--   = tmp;
5636             }
5637             /* safe as long as stack cannot get extended in the above */
5638             SP = oldsp;
5639         }
5640     }
5641     else {
5642         char *up;
5643         dTARGET;
5644         STRLEN len;
5645
5646         SvUTF8_off(TARG);                               /* decontaminate */
5647         if (SP - MARK > 1) {
5648             do_join(TARG, &PL_sv_no, MARK, SP);
5649             SP = MARK + 1;
5650             SETs(TARG);
5651         } else if (SP > MARK) {
5652             sv_setsv(TARG, *SP);
5653             SETs(TARG);
5654         } else {
5655             sv_setsv(TARG, DEFSV);
5656             XPUSHs(TARG);
5657         }
5658
5659         up = SvPV_force(TARG, len);
5660         if (len > 1) {
5661             char *down;
5662             if (DO_UTF8(TARG)) {        /* first reverse each character */
5663                 U8* s = (U8*)SvPVX(TARG);
5664                 const U8* send = (U8*)(s + len);
5665                 while (s < send) {
5666                     if (UTF8_IS_INVARIANT(*s)) {
5667                         s++;
5668                         continue;
5669                     }
5670                     else {
5671                         if (!utf8_to_uvchr_buf(s, send, 0))
5672                             break;
5673                         up = (char*)s;
5674                         s += UTF8SKIP(s);
5675                         down = (char*)(s - 1);
5676                         /* reverse this character */
5677                         while (down > up) {
5678                             const char tmp = *up;
5679                             *up++ = *down;
5680                             *down-- = tmp;
5681                         }
5682                     }
5683                 }
5684                 up = SvPVX(TARG);
5685             }
5686             down = SvPVX(TARG) + len - 1;
5687             while (down > up) {
5688                 const char tmp = *up;
5689                 *up++ = *down;
5690                 *down-- = tmp;
5691             }
5692             (void)SvPOK_only_UTF8(TARG);
5693         }
5694     }
5695     RETURN;
5696 }
5697
5698 PP(pp_split)
5699 {
5700     dSP; dTARG;
5701     AV *ary = (   (PL_op->op_private & OPpSPLIT_ASSIGN) /* @a = split */
5702                && (PL_op->op_flags & OPf_STACKED))      /* @{expr} = split */
5703                ? (AV *)POPs : NULL;
5704     IV limit = POPi;                    /* note, negative is forever */
5705     SV * const sv = POPs;
5706     STRLEN len;
5707     const char *s = SvPV_const(sv, len);
5708     const bool do_utf8 = DO_UTF8(sv);
5709     const bool in_uni_8_bit = IN_UNI_8_BIT;
5710     const char *strend = s + len;
5711     PMOP *pm = cPMOPx(PL_op);
5712     REGEXP *rx;
5713     SV *dstr;
5714     const char *m;
5715     SSize_t iters = 0;
5716     const STRLEN slen = do_utf8
5717                         ? utf8_length((U8*)s, (U8*)strend)
5718                         : (STRLEN)(strend - s);
5719     SSize_t maxiters = slen + 10;
5720     I32 trailing_empty = 0;
5721     const char *orig;
5722     const IV origlimit = limit;
5723     I32 realarray = 0;
5724     I32 base;
5725     const U8 gimme = GIMME_V;
5726     bool gimme_scalar;
5727     I32 oldsave = PL_savestack_ix;
5728     U32 make_mortal = SVs_TEMP;
5729     bool multiline = 0;
5730     MAGIC *mg = NULL;
5731
5732     rx = PM_GETRE(pm);
5733
5734     TAINT_IF(get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET &&
5735              (RX_EXTFLAGS(rx) & (RXf_WHITE | RXf_SKIPWHITE)));
5736
5737     /* handle @ary = split(...) optimisation */
5738     if (PL_op->op_private & OPpSPLIT_ASSIGN) {
5739         if (!(PL_op->op_flags & OPf_STACKED)) {
5740             if (PL_op->op_private & OPpSPLIT_LEX) {
5741                 if (PL_op->op_private & OPpLVAL_INTRO)
5742                     SAVECLEARSV(PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff));
5743                 ary = (AV *)PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff);
5744             }
5745             else {
5746                 GV *gv =
5747 #ifdef USE_ITHREADS
5748                         MUTABLE_GV(PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff));
5749 #else
5750                         pm->op_pmreplrootu.op_pmtargetgv;
5751 #endif
5752                 if (PL_op->op_private & OPpLVAL_INTRO)
5753                     ary = save_ary(gv);
5754                 else
5755                     ary = GvAVn(gv);
5756             }
5757             /* skip anything pushed by OPpLVAL_INTRO above */
5758             oldsave = PL_savestack_ix;
5759         }
5760
5761         realarray = 1;
5762         PUTBACK;
5763         av_extend(ary,0);
5764         (void)sv_2mortal(SvREFCNT_inc_simple_NN(sv));
5765         av_clear(ary);
5766         SPAGAIN;
5767         if ((mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied))) {
5768             PUSHMARK(SP);
5769             XPUSHs(SvTIED_obj(MUTABLE_SV(ary), mg));
5770         }
5771         else {
5772             if (!AvREAL(ary)) {
5773                 I32 i;
5774                 AvREAL_on(ary);
5775                 AvREIFY_off(ary);
5776                 for (i = AvFILLp(ary); i >= 0; i--)
5777                     AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
5778             }
5779             /* temporarily switch stacks */
5780             SAVESWITCHSTACK(PL_curstack, ary);
5781             make_mortal = 0;
5782         }
5783     }
5784
5785     base = SP - PL_stack_base;
5786     orig = s;
5787     if (RX_EXTFLAGS(rx) & RXf_SKIPWHITE) {
5788         if (do_utf8) {
5789             while (s < strend && isSPACE_utf8_safe(s, strend))
5790                 s += UTF8SKIP(s);
5791         }
5792         else if (get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET) {
5793             while (s < strend && isSPACE_LC(*s))
5794                 s++;
5795         }
5796         else if (in_uni_8_bit) {
5797             while (s < strend && isSPACE_L1(*s))
5798                 s++;
5799         }
5800         else {
5801             while (s < strend && isSPACE(*s))
5802                 s++;
5803         }
5804     }
5805     if (RX_EXTFLAGS(rx) & RXf_PMf_MULTILINE) {
5806         multiline = 1;
5807     }
5808
5809     gimme_scalar = gimme == G_SCALAR && !ary;
5810
5811     if (!limit)
5812         limit = maxiters + 2;
5813     if (RX_EXTFLAGS(rx) & RXf_WHITE) {
5814         while (--limit) {
5815             m = s;
5816             /* this one uses 'm' and is a negative test */
5817             if (do_utf8) {
5818                 while (m < strend && ! isSPACE_utf8_safe(m, strend) ) {
5819                     const int t = UTF8SKIP(m);
5820                     /* isSPACE_utf8_safe returns FALSE for malform utf8 */
5821                     if (strend - m < t)
5822                         m = strend;
5823                     else
5824                         m += t;
5825                 }
5826             }
5827             else if (get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET)
5828             {
5829                 while (m < strend && !isSPACE_LC(*m))
5830                     ++m;
5831             }
5832             else if (in_uni_8_bit) {
5833                 while (m < strend && !isSPACE_L1(*m))
5834                     ++m;
5835             } else {
5836                 while (m < strend && !isSPACE(*m))
5837                     ++m;
5838             }  
5839             if (m >= strend)
5840                 break;
5841
5842             if (gimme_scalar) {
5843                 iters++;
5844                 if (m-s == 0)
5845                     trailing_empty++;
5846                 else
5847                     trailing_empty = 0;
5848             } else {
5849                 dstr = newSVpvn_flags(s, m-s,
5850                                       (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
5851                 XPUSHs(dstr);
5852             }
5853
5854             /* skip the whitespace found last */
5855             if (do_utf8)
5856                 s = m + UTF8SKIP(m);
5857             else
5858                 s = m + 1;
5859
5860             /* this one uses 's' and is a positive test */
5861             if (do_utf8) {
5862                 while (s < strend && isSPACE_utf8_safe(s, strend) )
5863                     s +=  UTF8SKIP(s);
5864             }
5865             else if (get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET)
5866             {
5867                 while (s < strend && isSPACE_LC(*s))
5868                     ++s;
5869             }
5870             else if (in_uni_8_bit) {
5871                 while (s < strend && isSPACE_L1(*s))
5872                     ++s;
5873             } else {
5874                 while (s < strend && isSPACE(*s))
5875                     ++s;
5876             }       
5877         }
5878     }
5879     else if (RX_EXTFLAGS(rx) & RXf_START_ONLY) {
5880         while (--limit) {
5881             for (m = s; m < strend && *m != '\n'; m++)
5882                 ;
5883             m++;
5884             if (m >= strend)
5885                 break;
5886
5887             if (gimme_scalar) {
5888                 iters++;
5889                 if (m-s == 0)
5890                     trailing_empty++;
5891                 else
5892                     trailing_empty = 0;
5893             } else {
5894                 dstr = newSVpvn_flags(s, m-s,
5895                                       (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
5896                 XPUSHs(dstr);
5897             }
5898             s = m;
5899         }
5900     }
5901     else if (RX_EXTFLAGS(rx) & RXf_NULL && !(s >= strend)) {
5902         /*
5903           Pre-extend the stack, either the number of bytes or
5904           characters in the string or a limited amount, triggered by:
5905
5906           my ($x, $y) = split //, $str;
5907             or
5908           split //, $str, $i;
5909         */
5910         if (!gimme_scalar) {
5911             const IV items = limit - 1;
5912             /* setting it to -1 will trigger a panic in EXTEND() */
5913             const SSize_t sslen = slen > SSize_t_MAX ?  -1 : (SSize_t)slen;
5914             if (items >=0 && items < sslen)
5915                 EXTEND(SP, items);
5916             else
5917                 EXTEND(SP, sslen);
5918         }
5919
5920         if (do_utf8) {
5921             while (--limit) {
5922                 /* keep track of how many bytes we skip over */
5923                 m = s;
5924                 s += UTF8SKIP(s);
5925                 if (gimme_scalar) {
5926                     iters++;
5927                     if (s-m == 0)
5928                         trailing_empty++;
5929                     else
5930                         trailing_empty = 0;
5931                 } else {
5932                     dstr = newSVpvn_flags(m, s-m, SVf_UTF8 | make_mortal);
5933
5934                     PUSHs(dstr);
5935                 }
5936
5937                 if (s >= strend)
5938                     break;
5939             }
5940         } else {
5941             while (--limit) {
5942                 if (gimme_scalar) {
5943                     iters++;
5944                 } else {
5945                     dstr = newSVpvn(s, 1);
5946
5947
5948                     if (make_mortal)
5949                         sv_2mortal(dstr);
5950
5951                     PUSHs(dstr);
5952                 }
5953
5954                 s++;
5955
5956                 if (s >= strend)
5957                     break;
5958             }
5959         }
5960     }
5961     else if (do_utf8 == (RX_UTF8(rx) != 0) &&
5962              (RX_EXTFLAGS(rx) & RXf_USE_INTUIT) && !RX_NPARENS(rx)
5963              && (RX_EXTFLAGS(rx) & RXf_CHECK_ALL)
5964              && !(RX_EXTFLAGS(rx) & RXf_IS_ANCHORED)) {
5965         const int tail = (RX_EXTFLAGS(rx) & RXf_INTUIT_TAIL);
5966         SV * const csv = CALLREG_INTUIT_STRING(rx);
5967
5968         len = RX_MINLENRET(rx);
5969         if (len == 1 && !RX_UTF8(rx) && !tail) {
5970             const char c = *SvPV_nolen_const(csv);
5971             while (--limit) {
5972                 for (m = s; m < strend && *m != c; m++)
5973                     ;
5974                 if (m >= strend)
5975                     break;
5976                 if (gimme_scalar) {
5977                     iters++;
5978                     if (m-s == 0)
5979                         trailing_empty++;
5980                     else
5981                         trailing_empty = 0;
5982                 } else {
5983                     dstr = newSVpvn_flags(s, m-s,
5984                                          (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
5985                     XPUSHs(dstr);
5986                 }
5987                 /* The rx->minlen is in characters but we want to step
5988                  * s ahead by bytes. */
5989                 if (do_utf8)
5990                     s = (char*)utf8_hop((U8*)m, len);
5991                 else
5992                     s = m + len; /* Fake \n at the end */
5993             }
5994         }
5995         else {
5996             while (s < strend && --limit &&
5997               (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
5998                              csv, multiline ? FBMrf_MULTILINE : 0)) )
5999             {
6000                 if (gimme_scalar) {
6001                     iters++;
6002                     if (m-s == 0)
6003                         trailing_empty++;
6004                     else
6005                         trailing_empty = 0;
6006                 } else {
6007                     dstr = newSVpvn_flags(s, m-s,
6008                                          (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
6009                     XPUSHs(dstr);
6010                 }
6011                 /* The rx->minlen is in characters but we want to step
6012                  * s ahead by bytes. */
6013                 if (do_utf8)
6014                     s = (char*)utf8_hop((U8*)m, len);
6015                 else
6016                     s = m + len; /* Fake \n at the end */
6017             }
6018         }
6019     }
6020     else {
6021         maxiters += slen * RX_NPARENS(rx);
6022         while (s < strend && --limit)
6023         {
6024             I32 rex_return;
6025             PUTBACK;
6026             rex_return = CALLREGEXEC(rx, (char*)s, (char*)strend, (char*)orig, 1,
6027                                      sv, NULL, 0);
6028             SPAGAIN;
6029             if (rex_return == 0)
6030                 break;
6031             TAINT_IF(RX_MATCH_TAINTED(rx));
6032             /* we never pass the REXEC_COPY_STR flag, so it should
6033              * never get copied */
6034             assert(!RX_MATCH_COPIED(rx));
6035             m = RX_OFFS(rx)[0].start + orig;
6036
6037             if (gimme_scalar) {
6038                 iters++;
6039                 if (m-s == 0)
6040                     trailing_empty++;
6041                 else
6042                     trailing_empty = 0;
6043             } else {
6044                 dstr = newSVpvn_flags(s, m-s,
6045                                       (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
6046                 XPUSHs(dstr);
6047             }
6048             if (RX_NPARENS(rx)) {
6049                 I32 i;
6050                 for (i = 1; i <= (I32)RX_NPARENS(rx); i++) {
6051                     s = RX_OFFS(rx)[i].start + orig;
6052                     m = RX_OFFS(rx)[i].end + orig;
6053
6054                     /* japhy (07/27/01) -- the (m && s) test doesn't catch
6055                        parens that didn't match -- they should be set to
6056                        undef, not the empty string */
6057                     if (gimme_scalar) {
6058                         iters++;
6059                         if (m-s == 0)
6060                             trailing_empty++;
6061                         else
6062                             trailing_empty = 0;
6063                     } else {
6064                         if (m >= orig && s >= orig) {
6065                             dstr = newSVpvn_flags(s, m-s,
6066                                                  (do_utf8 ? SVf_UTF8 : 0)
6067                                                   | make_mortal);
6068                         }
6069                         else
6070                             dstr = &PL_sv_undef;  /* undef, not "" */
6071                         XPUSHs(dstr);
6072                     }
6073
6074                 }
6075             }
6076             s = RX_OFFS(rx)[0].end + orig;
6077         }
6078     }
6079
6080     if (!gimme_scalar) {
6081         iters = (SP - PL_stack_base) - base;
6082     }
6083     if (iters > maxiters)
6084         DIE(aTHX_ "Split loop");
6085
6086     /* keep field after final delim? */
6087     if (s < strend || (iters && origlimit)) {
6088         if (!gimme_scalar) {
6089             const STRLEN l = strend - s;
6090             dstr = newSVpvn_flags(s, l, (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
6091             XPUSHs(dstr);
6092         }
6093         iters++;
6094     }
6095     else if (!origlimit) {
6096         if (gimme_scalar) {
6097             iters -= trailing_empty;
6098         } else {
6099             while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
6100                 if (TOPs && !make_mortal)
6101                     sv_2mortal(TOPs);
6102                 *SP-- = NULL;
6103                 iters--;
6104             }
6105         }
6106     }
6107
6108     PUTBACK;
6109     LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */
6110     SPAGAIN;
6111     if (realarray) {
6112         if (!mg) {
6113             if (SvSMAGICAL(ary)) {
6114                 PUTBACK;
6115                 mg_set(MUTABLE_SV(ary));
6116                 SPAGAIN;
6117             }
6118             if (gimme == G_ARRAY) {
6119                 EXTEND(SP, iters);
6120                 Copy(AvARRAY(ary), SP + 1, iters, SV*);
6121                 SP += iters;
6122                 RETURN;
6123             }
6124         }
6125         else {
6126             PUTBACK;
6127             ENTER_with_name("call_PUSH");
6128             call_sv(SV_CONST(PUSH),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
6129             LEAVE_with_name("call_PUSH");
6130             SPAGAIN;
6131             if (gimme == G_ARRAY) {
6132                 SSize_t i;
6133                 /* EXTEND should not be needed - we just popped them */
6134                 EXTEND(SP, iters);
6135                 for (i=0; i < iters; i++) {
6136                     SV **svp = av_fetch(ary, i, FALSE);
6137                     PUSHs((svp) ? *svp : &PL_sv_undef);
6138                 }
6139                 RETURN;
6140             }
6141         }
6142     }
6143     else {
6144         if (gimme == G_ARRAY)
6145             RETURN;
6146     }
6147
6148     GETTARGET;
6149     XPUSHi(iters);
6150     RETURN;
6151 }
6152
6153 PP(pp_once)
6154 {
6155     dSP;
6156     SV *const sv = PAD_SVl(PL_op->op_targ);
6157
6158     if (SvPADSTALE(sv)) {
6159         /* First time. */
6160         SvPADSTALE_off(sv);
6161         RETURNOP(cLOGOP->op_other);
6162     }
6163     RETURNOP(cLOGOP->op_next);
6164 }
6165
6166 PP(pp_lock)
6167 {
6168     dSP;
6169     dTOPss;
6170     SV *retsv = sv;
6171     SvLOCK(sv);
6172     if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
6173      || SvTYPE(retsv) == SVt_PVCV) {
6174         retsv = refto(retsv);
6175     }
6176     SETs(retsv);
6177     RETURN;
6178 }
6179
6180
6181 /* used for: pp_padany(), pp_custom(); plus any system ops
6182  * that aren't implemented on a particular platform */
6183
6184 PP(unimplemented_op)
6185 {
6186     const Optype op_type = PL_op->op_type;
6187     /* Using OP_NAME() isn't going to be helpful here. Firstly, it doesn't cope
6188        with out of range op numbers - it only "special" cases op_custom.
6189        Secondly, as the three ops we "panic" on are padmy, mapstart and custom,
6190        if we get here for a custom op then that means that the custom op didn't
6191        have an implementation. Given that OP_NAME() looks up the custom op
6192        by its pp_addr, likely it will return NULL, unless someone (unhelpfully)
6193        registers &PL_unimplemented_op as the address of their custom op.
6194        NULL doesn't generate a useful error message. "custom" does. */
6195     const char *const name = op_type >= OP_max
6196         ? "[out of range]" : PL_op_name[PL_op->op_type];
6197     if(OP_IS_SOCKET(op_type))
6198         DIE(aTHX_ PL_no_sock_func, name);
6199     DIE(aTHX_ "panic: unimplemented op %s (#%d) called", name,  op_type);
6200 }
6201
6202 static void
6203 S_maybe_unwind_defav(pTHX)
6204 {
6205     if (CX_CUR()->cx_type & CXp_HASARGS) {
6206         PERL_CONTEXT *cx = CX_CUR();
6207
6208         assert(CxHASARGS(cx));
6209         cx_popsub_args(cx);
6210         cx->cx_type &= ~CXp_HASARGS;
6211     }
6212 }
6213
6214 /* For sorting out arguments passed to a &CORE:: subroutine */
6215 PP(pp_coreargs)
6216 {
6217     dSP;
6218     int opnum = SvIOK(cSVOP_sv) ? (int)SvUV(cSVOP_sv) : 0;
6219     int defgv = PL_opargs[opnum] & OA_DEFGV ||opnum==OP_GLOB, whicharg = 0;
6220     AV * const at_ = GvAV(PL_defgv);
6221     SV **svp = at_ ? AvARRAY(at_) : NULL;
6222     I32 minargs = 0, maxargs = 0, numargs = at_ ? AvFILLp(at_)+1 : 0;
6223     I32 oa = opnum ? PL_opargs[opnum] >> OASHIFT : 0;
6224     bool seen_question = 0;
6225     const char *err = NULL;
6226     const bool pushmark = PL_op->op_private & OPpCOREARGS_PUSHMARK;
6227
6228     /* Count how many args there are first, to get some idea how far to
6229        extend the stack. */
6230     while (oa) {
6231         if ((oa & 7) == OA_LIST) { maxargs = I32_MAX; break; }
6232         maxargs++;
6233         if (oa & OA_OPTIONAL) seen_question = 1;
6234         if (!seen_question) minargs++;
6235         oa >>= 4;
6236     }
6237
6238     if(numargs < minargs) err = "Not enough";
6239     else if(numargs > maxargs) err = "Too many";
6240     if (err)
6241         /* diag_listed_as: Too many arguments for %s */
6242         Perl_croak(aTHX_
6243           "%s arguments for %s", err,
6244            opnum ? PL_op_desc[opnum] : SvPV_nolen_const(cSVOP_sv)
6245         );
6246
6247     /* Reset the stack pointer.  Without this, we end up returning our own
6248        arguments in list context, in addition to the values we are supposed
6249        to return.  nextstate usually does this on sub entry, but we need
6250        to run the next op with the caller's hints, so we cannot have a
6251        nextstate. */
6252     SP = PL_stack_base + CX_CUR()->blk_oldsp;
6253
6254     if(!maxargs) RETURN;
6255
6256     /* We do this here, rather than with a separate pushmark op, as it has
6257        to come in between two things this function does (stack reset and
6258        arg pushing).  This seems the easiest way to do it. */
6259     if (pushmark) {
6260         PUTBACK;
6261         (void)Perl_pp_pushmark(aTHX);
6262     }
6263
6264     EXTEND(SP, maxargs == I32_MAX ? numargs : maxargs);
6265     PUTBACK; /* The code below can die in various places. */
6266
6267     oa = PL_opargs[opnum] >> OASHIFT;
6268     for (; oa&&(numargs||!pushmark); (void)(numargs&&(++svp,--numargs))) {
6269         whicharg++;
6270         switch (oa & 7) {
6271         case OA_SCALAR:
6272           try_defsv:
6273             if (!numargs && defgv && whicharg == minargs + 1) {
6274                 PUSHs(DEFSV);
6275             }
6276             else PUSHs(numargs ? svp && *svp ? *svp : &PL_sv_undef : NULL);
6277             break;
6278         case OA_LIST:
6279             while (numargs--) {
6280                 PUSHs(svp && *svp ? *svp : &PL_sv_undef);
6281                 svp++;
6282             }
6283             RETURN;
6284         case OA_AVREF:
6285             if (!numargs) {
6286                 GV *gv;
6287                 if (CvUNIQUE(find_runcv_where(FIND_RUNCV_level_eq,1,NULL)))
6288                     gv = PL_argvgv;
6289                 else {
6290                     S_maybe_unwind_defav(aTHX);
6291                     gv = PL_defgv;
6292                 }
6293                 PUSHs((SV *)GvAVn(gv));
6294                 break;
6295             }
6296             if (!svp || !*svp || !SvROK(*svp)
6297              || SvTYPE(SvRV(*svp)) != SVt_PVAV)
6298                 DIE(aTHX_
6299                 /* diag_listed_as: Type of arg %d to &CORE::%s must be %s*/
6300                  "Type of arg %d to &CORE::%s must be array reference",
6301                   whicharg, PL_op_desc[opnum]
6302                 );
6303             PUSHs(SvRV(*svp));
6304             break;
6305         case OA_HVREF:
6306             if (!svp || !*svp || !SvROK(*svp)
6307              || (  SvTYPE(SvRV(*svp)) != SVt_PVHV
6308                 && (  opnum == OP_DBMCLOSE || opnum == OP_DBMOPEN
6309                    || SvTYPE(SvRV(*svp)) != SVt_PVAV  )))
6310                 DIE(aTHX_
6311                 /* diag_listed_as: Type of arg %d to &CORE::%s must be %s*/
6312                  "Type of arg %d to &CORE::%s must be hash%s reference",
6313                   whicharg, PL_op_desc[opnum],
6314                   opnum == OP_DBMCLOSE || opnum == OP_DBMOPEN
6315                      ? ""
6316                      : " or array"
6317                 );
6318             PUSHs(SvRV(*svp));
6319             break;
6320         case OA_FILEREF:
6321             if (!numargs) PUSHs(NULL);
6322             else if(svp && *svp && SvROK(*svp) && isGV_with_GP(SvRV(*svp)))
6323                 /* no magic here, as the prototype will have added an extra
6324                    refgen and we just want what was there before that */
6325                 PUSHs(SvRV(*svp));
6326             else {
6327                 const bool constr = PL_op->op_private & whicharg;
6328                 PUSHs(S_rv2gv(aTHX_
6329                     svp && *svp ? *svp : &PL_sv_undef,
6330                     constr, cBOOL(CopHINTS_get(PL_curcop) & HINT_STRICT_REFS),
6331                     !constr
6332                 ));
6333             }
6334             break;
6335         case OA_SCALARREF:
6336           if (!numargs) goto try_defsv;
6337           else {
6338             const bool wantscalar =
6339                 PL_op->op_private & OPpCOREARGS_SCALARMOD;
6340             if (!svp || !*svp || !SvROK(*svp)
6341                 /* We have to permit globrefs even for the \$ proto, as
6342                    *foo is indistinguishable from ${\*foo}, and the proto-
6343                    type permits the latter. */
6344              || SvTYPE(SvRV(*svp)) > (
6345                      wantscalar       ? SVt_PVLV
6346                    : opnum == OP_LOCK || opnum == OP_UNDEF
6347                                       ? SVt_PVCV
6348                    :                    SVt_PVHV
6349                 )
6350                )
6351                 DIE(aTHX_
6352                  "Type of arg %d to &CORE::%s must be %s",
6353                   whicharg, PL_op_name[opnum],
6354                   wantscalar
6355                     ? "scalar reference"
6356                     : opnum == OP_LOCK || opnum == OP_UNDEF
6357                        ? "reference to one of [$@%&*]"
6358                        : "reference to one of [$@%*]"
6359                 );
6360             PUSHs(SvRV(*svp));
6361             if (opnum == OP_UNDEF && SvRV(*svp) == (SV *)PL_defgv) {
6362                 /* Undo @_ localisation, so that sub exit does not undo
6363                    part of our undeffing. */
6364                 S_maybe_unwind_defav(aTHX);
6365             }
6366           }
6367           break;
6368         default:
6369             DIE(aTHX_ "panic: unknown OA_*: %x", (unsigned)(oa&7));
6370         }
6371         oa = oa >> 4;
6372     }
6373
6374     RETURN;
6375 }
6376
6377 /* Implement CORE::keys(),values(),each().
6378  *
6379  * We won't know until run-time whether the arg is an array or hash,
6380  * so this op calls
6381  *
6382  *    pp_keys/pp_values/pp_each
6383  * or
6384  *    pp_akeys/pp_avalues/pp_aeach
6385  *
6386  * as appropriate (or whatever pp function actually implements the OP_FOO
6387  * functionality for each FOO).
6388  */
6389
6390 PP(pp_avhvswitch)
6391 {
6392     dVAR; dSP;
6393     return PL_ppaddr[
6394                 (SvTYPE(TOPs) == SVt_PVAV ? OP_AEACH : OP_EACH)
6395                     + (PL_op->op_private & OPpAVHVSWITCH_MASK)
6396            ](aTHX);
6397 }
6398
6399 PP(pp_runcv)
6400 {
6401     dSP;
6402     CV *cv;
6403     if (PL_op->op_private & OPpOFFBYONE) {
6404         cv = find_runcv_where(FIND_RUNCV_level_eq, 1, NULL);
6405     }
6406     else cv = find_runcv(NULL);
6407     XPUSHs(CvEVAL(cv) ? &PL_sv_undef : sv_2mortal(newRV((SV *)cv)));
6408     RETURN;
6409 }
6410
6411 static void
6412 S_localise_aelem_lval(pTHX_ AV * const av, SV * const keysv,
6413                             const bool can_preserve)
6414 {
6415     const SSize_t ix = SvIV(keysv);
6416     if (can_preserve ? av_exists(av, ix) : TRUE) {
6417         SV ** const svp = av_fetch(av, ix, 1);
6418         if (!svp || !*svp)
6419             Perl_croak(aTHX_ PL_no_aelem, ix);
6420         save_aelem(av, ix, svp);
6421     }
6422     else
6423         SAVEADELETE(av, ix);
6424 }
6425
6426 static void
6427 S_localise_helem_lval(pTHX_ HV * const hv, SV * const keysv,
6428                             const bool can_preserve)
6429 {
6430     if (can_preserve ? hv_exists_ent(hv, keysv, 0) : TRUE) {
6431         HE * const he = hv_fetch_ent(hv, keysv, 1, 0);
6432         SV ** const svp = he ? &HeVAL(he) : NULL;
6433         if (!svp || !*svp)
6434             Perl_croak(aTHX_ PL_no_helem_sv, SVfARG(keysv));
6435         save_helem_flags(hv, keysv, svp, 0);
6436     }
6437     else
6438         SAVEHDELETE(hv, keysv);
6439 }
6440
6441 static void
6442 S_localise_gv_slot(pTHX_ GV *gv, U8 type)
6443 {
6444     if (type == OPpLVREF_SV) {
6445         save_pushptrptr(gv, SvREFCNT_inc_simple(GvSV(gv)), SAVEt_GVSV);
6446         GvSV(gv) = 0;
6447     }
6448     else if (type == OPpLVREF_AV)
6449         /* XXX Inefficient, as it creates a new AV, which we are
6450                about to clobber.  */
6451         save_ary(gv);
6452     else {
6453         assert(type == OPpLVREF_HV);
6454         /* XXX Likewise inefficient.  */
6455         save_hash(gv);
6456     }
6457 }
6458
6459
6460 PP(pp_refassign)
6461 {
6462     dSP;
6463     SV * const key = PL_op->op_private & OPpLVREF_ELEM ? POPs : NULL;
6464     SV * const left = PL_op->op_flags & OPf_STACKED ? POPs : NULL;
6465     dTOPss;
6466     const char *bad = NULL;
6467     const U8 type = PL_op->op_private & OPpLVREF_TYPE;
6468     if (!SvROK(sv)) DIE(aTHX_ "Assigned value is not a reference");
6469     switch (type) {
6470     case OPpLVREF_SV:
6471         if (SvTYPE(SvRV(sv)) > SVt_PVLV)
6472             bad = " SCALAR";
6473         break;
6474     case OPpLVREF_AV:
6475         if (SvTYPE(SvRV(sv)) != SVt_PVAV)
6476             bad = "n ARRAY";
6477         break;
6478     case OPpLVREF_HV:
6479         if (SvTYPE(SvRV(sv)) != SVt_PVHV)
6480             bad = " HASH";
6481         break;
6482     case OPpLVREF_CV:
6483         if (SvTYPE(SvRV(sv)) != SVt_PVCV)
6484             bad = " CODE";
6485     }
6486     if (bad)
6487         /* diag_listed_as: Assigned value is not %s reference */
6488         DIE(aTHX_ "Assigned value is not a%s reference", bad);
6489     {
6490     MAGIC *mg;
6491     HV *stash;
6492     switch (left ? SvTYPE(left) : 0) {
6493     case 0:
6494     {
6495         SV * const old = PAD_SV(ARGTARG);
6496         PAD_SETSV(ARGTARG, SvREFCNT_inc_NN(SvRV(sv)));
6497         SvREFCNT_dec(old);
6498         if ((PL_op->op_private & (OPpLVAL_INTRO|OPpPAD_STATE))
6499                 == OPpLVAL_INTRO)
6500             SAVECLEARSV(PAD_SVl(ARGTARG));
6501         break;
6502     }
6503     case SVt_PVGV:
6504         if (PL_op->op_private & OPpLVAL_INTRO) {
6505             S_localise_gv_slot(aTHX_ (GV *)left, type);
6506         }
6507         gv_setref(left, sv);
6508         SvSETMAGIC(left);
6509         break;
6510     case SVt_PVAV:
6511         assert(key);
6512         if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO)) {
6513             S_localise_aelem_lval(aTHX_ (AV *)left, key,
6514                                         SvCANEXISTDELETE(left));
6515         }
6516         av_store((AV *)left, SvIV(key), SvREFCNT_inc_simple_NN(SvRV(sv)));
6517         break;
6518     case SVt_PVHV:
6519         if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO)) {
6520             assert(key);
6521             S_localise_helem_lval(aTHX_ (HV *)left, key,
6522                                         SvCANEXISTDELETE(left));
6523         }
6524         (void)hv_store_ent((HV *)left, key, SvREFCNT_inc_simple_NN(SvRV(sv)), 0);
6525     }
6526     if (PL_op->op_flags & OPf_MOD)
6527         SETs(sv_2mortal(newSVsv(sv)));
6528     /* XXX else can weak references go stale before they are read, e.g.,
6529        in leavesub?  */
6530     RETURN;
6531     }
6532 }
6533
6534 PP(pp_lvref)
6535 {
6536     dSP;
6537     SV * const ret = sv_2mortal(newSV_type(SVt_PVMG));
6538     SV * const elem = PL_op->op_private & OPpLVREF_ELEM ? POPs : NULL;
6539     SV * const arg = PL_op->op_flags & OPf_STACKED ? POPs : NULL;
6540     MAGIC * const mg = sv_magicext(ret, arg, PERL_MAGIC_lvref,
6541                                    &PL_vtbl_lvref, (char *)elem,
6542                                    elem ? HEf_SVKEY : (I32)ARGTARG);
6543     mg->mg_private = PL_op->op_private;
6544     if (PL_op->op_private & OPpLVREF_ITER)
6545         mg->mg_flags |= MGf_PERSIST;
6546     if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO)) {
6547       if (elem) {
6548         MAGIC *mg;
6549         HV *stash;
6550         assert(arg);
6551         {
6552             const bool can_preserve = SvCANEXISTDELETE(arg);
6553             if (SvTYPE(arg) == SVt_PVAV)
6554               S_localise_aelem_lval(aTHX_ (AV *)arg, elem, can_preserve);
6555             else
6556               S_localise_helem_lval(aTHX_ (HV *)arg, elem, can_preserve);
6557         }
6558       }
6559       else if (arg) {
6560         S_localise_gv_slot(aTHX_ (GV *)arg, 
6561                                  PL_op->op_private & OPpLVREF_TYPE);
6562       }
6563       else if (!(PL_op->op_private & OPpPAD_STATE))
6564         SAVECLEARSV(PAD_SVl(ARGTARG));
6565     }
6566     XPUSHs(ret);
6567     RETURN;
6568 }
6569
6570 PP(pp_lvrefslice)
6571 {
6572     dSP; dMARK;
6573     AV * const av = (AV *)POPs;
6574     const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
6575     bool can_preserve = FALSE;
6576
6577     if (UNLIKELY(localizing)) {
6578         MAGIC *mg;
6579         HV *stash;
6580         SV **svp;
6581
6582         can_preserve = SvCANEXISTDELETE(av);
6583
6584         if (SvTYPE(av) == SVt_PVAV) {
6585             SSize_t max = -1;
6586
6587             for (svp = MARK + 1; svp <= SP; svp++) {
6588                 const SSize_t elem = SvIV(*svp);
6589                 if (elem > max)
6590                     max = elem;
6591             }
6592             if (max > AvMAX(av))
6593                 av_extend(av, max);
6594         }
6595     }
6596
6597     while (++MARK <= SP) {
6598         SV * const elemsv = *MARK;
6599         if (SvTYPE(av) == SVt_PVAV)
6600             S_localise_aelem_lval(aTHX_ av, elemsv, can_preserve);
6601         else
6602             S_localise_helem_lval(aTHX_ (HV *)av, elemsv, can_preserve);
6603         *MARK = sv_2mortal(newSV_type(SVt_PVMG));
6604         sv_magic(*MARK,(SV *)av,PERL_MAGIC_lvref,(char *)elemsv,HEf_SVKEY);
6605     }
6606     RETURN;
6607 }
6608
6609 PP(pp_lvavref)
6610 {
6611     if (PL_op->op_flags & OPf_STACKED)
6612         Perl_pp_rv2av(aTHX);
6613     else
6614         Perl_pp_padav(aTHX);
6615     {
6616         dSP;
6617         dTOPss;
6618         SETs(0); /* special alias marker that aassign recognises */
6619         XPUSHs(sv);
6620         RETURN;
6621     }
6622 }
6623
6624 PP(pp_anonconst)
6625 {
6626     dSP;
6627     dTOPss;
6628     SETs(sv_2mortal((SV *)newCONSTSUB(SvTYPE(CopSTASH(PL_curcop))==SVt_PVHV
6629                                         ? CopSTASH(PL_curcop)
6630                                         : NULL,
6631                                       NULL, SvREFCNT_inc_simple_NN(sv))));
6632     RETURN;
6633 }
6634
6635
6636 /* process one subroutine argument - typically when the sub has a signature:
6637  * introduce PL_curpad[op_targ] and assign to it the value
6638  *  for $:   (OPf_STACKED ? *sp : $_[N])
6639  *  for @/%: @_[N..$#_]
6640  *
6641  * It's equivalent to 
6642  *    my $foo = $_[N];
6643  * or
6644  *    my $foo = (value-on-stack)
6645  * or
6646  *    my @foo = @_[N..$#_]
6647  * etc
6648  */
6649
6650 PP(pp_argelem)
6651 {
6652     dTARG;
6653     SV *val;
6654     SV ** padentry;
6655     OP *o = PL_op;
6656     AV *defav = GvAV(PL_defgv); /* @_ */
6657     IV ix = PTR2IV(cUNOP_AUXo->op_aux);
6658     IV argc;
6659
6660     /* do 'my $var, @var or %var' action */
6661     padentry = &(PAD_SVl(o->op_targ));
6662     save_clearsv(padentry);
6663     targ = *padentry;
6664
6665     if ((o->op_private & OPpARGELEM_MASK) == OPpARGELEM_SV) {
6666         if (o->op_flags & OPf_STACKED) {
6667             dSP;
6668             val = POPs;
6669             PUTBACK;
6670         }
6671         else {
6672             SV **svp;
6673             /* should already have been checked */
6674             assert(ix >= 0);
6675 #if IVSIZE > PTRSIZE
6676             assert(ix <= SSize_t_MAX);
6677 #endif
6678
6679             svp = av_fetch(defav, ix, FALSE);
6680             val = svp ? *svp : &PL_sv_undef;
6681         }
6682
6683         /* $var = $val */
6684
6685         /* cargo-culted from pp_sassign */
6686         assert(TAINTING_get || !TAINT_get);
6687         if (UNLIKELY(TAINT_get) && !SvTAINTED(val))
6688             TAINT_NOT;
6689
6690         SvSetMagicSV(targ, val);
6691         return o->op_next;
6692     }
6693
6694     /* must be AV or HV */
6695
6696     assert(!(o->op_flags & OPf_STACKED));
6697     argc = ((IV)AvFILL(defav) + 1) - ix;
6698
6699     /* This is a copy of the relevant parts of pp_aassign().
6700      */
6701     if ((o->op_private & OPpARGELEM_MASK) == OPpARGELEM_AV) {
6702         IV i;
6703
6704         if (AvFILL((AV*)targ) > -1) {
6705             /* target should usually be empty. If we get get
6706              * here, someone's been doing some weird closure tricks.
6707              * Make a copy of all args before clearing the array,
6708              * to avoid the equivalent of @a = ($a[0]) prematurely freeing
6709              * elements. See similar code in pp_aassign.
6710              */
6711             for (i = 0; i < argc; i++) {
6712                 SV **svp = av_fetch(defav, ix + i, FALSE);
6713                 SV *newsv = newSV(0);
6714                 sv_setsv_flags(newsv,
6715                                 svp ? *svp : &PL_sv_undef,
6716                                 (SV_DO_COW_SVSETSV|SV_NOSTEAL));
6717                 if (!av_store(defav, ix + i, newsv))
6718                     SvREFCNT_dec_NN(newsv);
6719             }
6720             av_clear((AV*)targ);
6721         }
6722
6723         if (argc <= 0)
6724             return o->op_next;
6725
6726         av_extend((AV*)targ, argc);
6727
6728         i = 0;
6729         while (argc--) {
6730             SV *tmpsv;
6731             SV **svp = av_fetch(defav, ix + i, FALSE);
6732             SV *val = svp ? *svp : &PL_sv_undef;
6733             tmpsv = newSV(0);
6734             sv_setsv(tmpsv, val);
6735             av_store((AV*)targ, i++, tmpsv);
6736             TAINT_NOT;
6737         }
6738
6739     }
6740     else {
6741         IV i;
6742
6743         assert((o->op_private & OPpARGELEM_MASK) == OPpARGELEM_HV);
6744
6745         if (SvRMAGICAL(targ) || HvUSEDKEYS((HV*)targ)) {
6746             /* see "target should usually be empty" comment above */
6747             for (i = 0; i < argc; i++) {
6748                 SV **svp = av_fetch(defav, ix + i, FALSE);
6749                 SV *newsv = newSV(0);
6750                 sv_setsv_flags(newsv,
6751                                 svp ? *svp : &PL_sv_undef,
6752                                 (SV_DO_COW_SVSETSV|SV_NOSTEAL));
6753                 if (!av_store(defav, ix + i, newsv))
6754                     SvREFCNT_dec_NN(newsv);
6755             }
6756             hv_clear((HV*)targ);
6757         }
6758
6759         if (argc <= 0)
6760             return o->op_next;
6761         assert(argc % 2 == 0);
6762
6763         i = 0;
6764         while (argc) {
6765             SV *tmpsv;
6766             SV **svp;
6767             SV *key;
6768             SV *val;
6769
6770             svp = av_fetch(defav, ix + i++, FALSE);
6771             key = svp ? *svp : &PL_sv_undef;
6772             svp = av_fetch(defav, ix + i++, FALSE);
6773             val = svp ? *svp : &PL_sv_undef;
6774
6775             argc -= 2;
6776             if (UNLIKELY(SvGMAGICAL(key)))
6777                 key = sv_mortalcopy(key);
6778             tmpsv = newSV(0);
6779             sv_setsv(tmpsv, val);
6780             hv_store_ent((HV*)targ, key, tmpsv, 0);
6781             TAINT_NOT;
6782         }
6783     }
6784
6785     return o->op_next;
6786 }
6787
6788 /* Handle a default value for one subroutine argument (typically as part
6789  * of a subroutine signature).
6790  * It's equivalent to
6791  *    @_ > op_targ ? $_[op_targ] : result_of(op_other)
6792  *
6793  * Intended to be used where op_next is an OP_ARGELEM
6794  *
6795  * We abuse the op_targ field slightly: it's an index into @_ rather than
6796  * into PL_curpad.
6797  */
6798
6799 PP(pp_argdefelem)
6800 {
6801     OP * const o = PL_op;
6802     AV *defav = GvAV(PL_defgv); /* @_ */
6803     IV ix = (IV)o->op_targ;
6804
6805     assert(ix >= 0);
6806 #if IVSIZE > PTRSIZE
6807     assert(ix <= SSize_t_MAX);
6808 #endif
6809
6810     if (AvFILL(defav) >= ix) {
6811         dSP;
6812         SV **svp = av_fetch(defav, ix, FALSE);
6813         SV  *val = svp ? *svp : &PL_sv_undef;
6814         XPUSHs(val);
6815         RETURN;
6816     }
6817     return cLOGOPo->op_other;
6818 }
6819
6820
6821 static SV *
6822 S_find_runcv_name(void)
6823 {
6824     dTHX;
6825     CV *cv;
6826     GV *gv;
6827     SV *sv;
6828
6829     cv = find_runcv(0);
6830     if (!cv)
6831         return &PL_sv_no;
6832
6833     gv = CvGV(cv);
6834     if (!gv)
6835         return &PL_sv_no;
6836
6837     sv = sv_2mortal(newSV(0));
6838     gv_fullname4(sv, gv, NULL, TRUE);
6839     return sv;
6840 }
6841
6842 /* Check a  a subs arguments - i.e. that it has the correct number of args
6843  * (and anything else we might think of in future). Typically used with
6844  * signatured subs.
6845  */
6846
6847 PP(pp_argcheck)
6848 {
6849     OP * const o       = PL_op;
6850     UNOP_AUX_item *aux = cUNOP_AUXo->op_aux;
6851     IV   params        = aux[0].iv;
6852     IV   opt_params    = aux[1].iv;
6853     char slurpy        = (char)(aux[2].iv);
6854     AV  *defav         = GvAV(PL_defgv); /* @_ */
6855     IV   argc;
6856     bool too_few;
6857
6858     assert(!SvMAGICAL(defav));
6859     argc = (AvFILLp(defav) + 1);
6860     too_few = (argc < (params - opt_params));
6861
6862     if (UNLIKELY(too_few || (!slurpy && argc > params)))
6863         /* diag_listed_as: Too few arguments for subroutine '%s' */
6864         /* diag_listed_as: Too many arguments for subroutine '%s' */
6865         Perl_croak_caller("Too %s arguments for subroutine '%" SVf "'",
6866                           too_few ? "few" : "many", S_find_runcv_name());
6867
6868     if (UNLIKELY(slurpy == '%' && argc > params && (argc - params) % 2))
6869         /* diag_listed_as: Odd name/value argument for subroutine '%s' */
6870         Perl_croak_caller("Odd name/value argument for subroutine '%" SVf "'",
6871                           S_find_runcv_name());
6872
6873     return NORMAL;
6874 }
6875
6876 /*
6877  * ex: set ts=8 sts=4 sw=4 et:
6878  */