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