This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Bump feature.pm for 5.27.0
[perl5.git] / pp.c
1 /*    pp.c
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4  *    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
9  */
10
11 /*
12  * 'It's a big house this, and very peculiar.  Always a bit more
13  *  to discover, and no knowing what you'll find round a corner.
14  *  And Elves, sir!'                            --Samwise Gamgee
15  *
16  *     [p.225 of _The Lord of the Rings_, II/i: "Many Meetings"]
17  */
18
19 /* This file contains general pp ("push/pop") functions that execute the
20  * opcodes that make up a perl program. A typical pp function expects to
21  * find its arguments on the stack, and usually pushes its results onto
22  * the stack, hence the 'pp' terminology. Each OP structure contains
23  * a pointer to the relevant pp_foo() function.
24  */
25
26 #include "EXTERN.h"
27 #define PERL_IN_PP_C
28 #include "perl.h"
29 #include "keywords.h"
30
31 #include "reentr.h"
32 #include "regcharclass.h"
33
34 /* 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 : &PL_sv_no);
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                 /* Upgrade the dest, and recalculate tmps in case the buffer
3400                  * got reallocated; curlen may also have been changed */
3401                 sv_utf8_upgrade_nomg(sv);
3402                 tmps = SvPV_nomg(sv, curlen);
3403             }
3404         }
3405         else if (DO_UTF8(sv))
3406             repl_need_utf8_upgrade = TRUE;
3407     }
3408     else tmps = SvPV_const(sv, curlen);
3409     if (DO_UTF8(sv)) {
3410         utf8_curlen = sv_or_pv_len_utf8(sv, tmps, curlen);
3411         if (utf8_curlen == curlen)
3412             utf8_curlen = 0;
3413         else
3414             curlen = utf8_curlen;
3415     }
3416     else
3417         utf8_curlen = 0;
3418
3419     {
3420         STRLEN pos, len, byte_len, byte_pos;
3421
3422         if (!translate_substr_offsets(
3423                 curlen, pos1_iv, pos1_is_uv, len_iv, len_is_uv, &pos, &len
3424         )) goto bound_fail;
3425
3426         byte_len = len;
3427         byte_pos = utf8_curlen
3428             ? sv_or_pv_pos_u2b(sv, tmps, pos, &byte_len) : pos;
3429
3430         tmps += byte_pos;
3431
3432         if (rvalue) {
3433             SvTAINTED_off(TARG);                        /* decontaminate */
3434             SvUTF8_off(TARG);                   /* decontaminate */
3435             sv_setpvn(TARG, tmps, byte_len);
3436 #ifdef USE_LOCALE_COLLATE
3437             sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3438 #endif
3439             if (utf8_curlen)
3440                 SvUTF8_on(TARG);
3441         }
3442
3443         if (repl) {
3444             SV* repl_sv_copy = NULL;
3445
3446             if (repl_need_utf8_upgrade) {
3447                 repl_sv_copy = newSVsv(repl_sv);
3448                 sv_utf8_upgrade(repl_sv_copy);
3449                 repl = SvPV_const(repl_sv_copy, repl_len);
3450             }
3451             if (!SvOK(sv))
3452                 SvPVCLEAR(sv);
3453             sv_insert_flags(sv, byte_pos, byte_len, repl, repl_len, 0);
3454             SvREFCNT_dec(repl_sv_copy);
3455         }
3456     }
3457     if (PL_op->op_private & OPpSUBSTR_REPL_FIRST)
3458         SP++;
3459     else if (rvalue) {
3460         SvSETMAGIC(TARG);
3461         PUSHs(TARG);
3462     }
3463     RETURN;
3464
3465   bound_fail:
3466     if (repl)
3467         Perl_croak(aTHX_ "substr outside of string");
3468     Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3469     RETPUSHUNDEF;
3470 }
3471
3472 PP(pp_vec)
3473 {
3474     dSP;
3475     const IV size   = POPi;
3476     SV* offsetsv   = POPs;
3477     SV * const src = POPs;
3478     const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3479     SV * ret;
3480     UV   retuv;
3481     STRLEN offset = 0;
3482     char errflags = 0;
3483
3484     /* extract a STRLEN-ranged integer value from offsetsv into offset,
3485      * or flag that its out of range */
3486     {
3487         IV iv = SvIV(offsetsv);
3488
3489         /* avoid a large UV being wrapped to a negative value */
3490         if (SvIOK_UV(offsetsv) && SvUVX(offsetsv) > (UV)IV_MAX)
3491             errflags = 4; /* out of range */
3492         else if (iv < 0)
3493             errflags = (1|4); /* negative offset, out of range */
3494 #if PTRSIZE < IVSIZE
3495         else if (iv > Size_t_MAX)
3496             errflags = 4; /* out of range */
3497 #endif
3498         else
3499             offset = (STRLEN)iv;
3500     }
3501
3502     retuv = errflags ? 0 : do_vecget(src, offset, size);
3503
3504     if (lvalue) {                       /* it's an lvalue! */
3505         ret = sv_2mortal(newSV_type(SVt_PVLV));  /* Not TARG RT#67838 */
3506         sv_magic(ret, NULL, PERL_MAGIC_vec, NULL, 0);
3507         LvTYPE(ret) = 'v';
3508         LvTARG(ret) = SvREFCNT_inc_simple(src);
3509         LvTARGOFF(ret) = offset;
3510         LvTARGLEN(ret) = size;
3511         LvFLAGS(ret)   = errflags;
3512     }
3513     else {
3514         dTARGET;
3515         SvTAINTED_off(TARG);            /* decontaminate */
3516         ret = TARG;
3517     }
3518
3519     sv_setuv(ret, retuv);
3520     if (!lvalue)
3521         SvSETMAGIC(ret);
3522     PUSHs(ret);
3523     RETURN;
3524 }
3525
3526
3527 /* also used for: pp_rindex() */
3528
3529 PP(pp_index)
3530 {
3531     dSP; dTARGET;
3532     SV *big;
3533     SV *little;
3534     SV *temp = NULL;
3535     STRLEN biglen;
3536     STRLEN llen = 0;
3537     SSize_t offset = 0;
3538     SSize_t retval;
3539     const char *big_p;
3540     const char *little_p;
3541     bool big_utf8;
3542     bool little_utf8;
3543     const bool is_index = PL_op->op_type == OP_INDEX;
3544     const bool threeargs = MAXARG >= 3 && (TOPs || ((void)POPs,0));
3545
3546     if (threeargs)
3547         offset = POPi;
3548     little = POPs;
3549     big = POPs;
3550     big_p = SvPV_const(big, biglen);
3551     little_p = SvPV_const(little, llen);
3552
3553     big_utf8 = DO_UTF8(big);
3554     little_utf8 = DO_UTF8(little);
3555     if (big_utf8 ^ little_utf8) {
3556         /* One needs to be upgraded.  */
3557         if (little_utf8) {
3558             /* Well, maybe instead we might be able to downgrade the small
3559                string?  */
3560             char * const pv = (char*)bytes_from_utf8((U8 *)little_p, &llen,
3561                                                      &little_utf8);
3562             if (little_utf8) {
3563                 /* If the large string is ISO-8859-1, and it's not possible to
3564                    convert the small string to ISO-8859-1, then there is no
3565                    way that it could be found anywhere by index.  */
3566                 retval = -1;
3567                 goto fail;
3568             }
3569
3570             /* At this point, pv is a malloc()ed string. So donate it to temp
3571                to ensure it will get free()d  */
3572             little = temp = newSV(0);
3573             sv_usepvn(temp, pv, llen);
3574             little_p = SvPVX(little);
3575         } else {
3576             temp = newSVpvn(little_p, llen);
3577
3578             sv_utf8_upgrade(temp);
3579             little = temp;
3580             little_p = SvPV_const(little, llen);
3581         }
3582     }
3583     if (SvGAMAGIC(big)) {
3584         /* Life just becomes a lot easier if I use a temporary here.
3585            Otherwise I need to avoid calls to sv_pos_u2b(), which (dangerously)
3586            will trigger magic and overloading again, as will fbm_instr()
3587         */
3588         big = newSVpvn_flags(big_p, biglen,
3589                              SVs_TEMP | (big_utf8 ? SVf_UTF8 : 0));
3590         big_p = SvPVX(big);
3591     }
3592     if (SvGAMAGIC(little) || (is_index && !SvOK(little))) {
3593         /* index && SvOK() is a hack. fbm_instr() calls SvPV_const, which will
3594            warn on undef, and we've already triggered a warning with the
3595            SvPV_const some lines above. We can't remove that, as we need to
3596            call some SvPV to trigger overloading early and find out if the
3597            string is UTF-8.
3598            This is all getting too messy. The API isn't quite clean enough,
3599            because data access has side effects.
3600         */
3601         little = newSVpvn_flags(little_p, llen,
3602                                 SVs_TEMP | (little_utf8 ? SVf_UTF8 : 0));
3603         little_p = SvPVX(little);
3604     }
3605
3606     if (!threeargs)
3607         offset = is_index ? 0 : biglen;
3608     else {
3609         if (big_utf8 && offset > 0)
3610             offset = sv_pos_u2b_flags(big, offset, 0, SV_CONST_RETURN);
3611         if (!is_index)
3612             offset += llen;
3613     }
3614     if (offset < 0)
3615         offset = 0;
3616     else if (offset > (SSize_t)biglen)
3617         offset = biglen;
3618     if (!(little_p = is_index
3619           ? fbm_instr((unsigned char*)big_p + offset,
3620                       (unsigned char*)big_p + biglen, little, 0)
3621           : rninstr(big_p,  big_p  + offset,
3622                     little_p, little_p + llen)))
3623         retval = -1;
3624     else {
3625         retval = little_p - big_p;
3626         if (retval > 1 && big_utf8)
3627             retval = sv_pos_b2u_flags(big, retval, SV_CONST_RETURN);
3628     }
3629     SvREFCNT_dec(temp);
3630  fail:
3631     PUSHi(retval);
3632     RETURN;
3633 }
3634
3635 PP(pp_sprintf)
3636 {
3637     dSP; dMARK; dORIGMARK; dTARGET;
3638     SvTAINTED_off(TARG);
3639     do_sprintf(TARG, SP-MARK, MARK+1);
3640     TAINT_IF(SvTAINTED(TARG));
3641     SP = ORIGMARK;
3642     PUSHTARG;
3643     RETURN;
3644 }
3645
3646 PP(pp_ord)
3647 {
3648     dSP; dTARGET;
3649
3650     SV *argsv = TOPs;
3651     STRLEN len;
3652     const U8 *s = (U8*)SvPV_const(argsv, len);
3653
3654     SETu(DO_UTF8(argsv)
3655            ? (len ? utf8n_to_uvchr(s, len, 0, UTF8_ALLOW_ANYUV) : 0)
3656            : (UV)(*s));
3657
3658     return NORMAL;
3659 }
3660
3661 PP(pp_chr)
3662 {
3663     dSP; dTARGET;
3664     char *tmps;
3665     UV value;
3666     SV *top = TOPs;
3667
3668     SvGETMAGIC(top);
3669     if (UNLIKELY(SvAMAGIC(top)))
3670         top = sv_2num(top);
3671     if (UNLIKELY(isinfnansv(top)))
3672         Perl_croak(aTHX_ "Cannot chr %" NVgf, SvNV(top));
3673     else {
3674         if (!IN_BYTES /* under bytes, chr(-1) eq chr(0xff), etc. */
3675             && ((SvIOKp(top) && !SvIsUV(top) && SvIV_nomg(top) < 0)
3676                 ||
3677                 ((SvNOKp(top) || (SvOK(top) && !SvIsUV(top)))
3678                  && SvNV_nomg(top) < 0.0)))
3679         {
3680             if (ckWARN(WARN_UTF8)) {
3681                 if (SvGMAGICAL(top)) {
3682                     SV *top2 = sv_newmortal();
3683                     sv_setsv_nomg(top2, top);
3684                     top = top2;
3685                 }
3686                 Perl_warner(aTHX_ packWARN(WARN_UTF8),
3687                             "Invalid negative number (%" SVf ") in chr", SVfARG(top));
3688             }
3689             value = UNICODE_REPLACEMENT;
3690         } else {
3691             value = SvUV_nomg(top);
3692         }
3693     }
3694
3695     SvUPGRADE(TARG,SVt_PV);
3696
3697     if (value > 255 && !IN_BYTES) {
3698         SvGROW(TARG, (STRLEN)UVCHR_SKIP(value)+1);
3699         tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3700         SvCUR_set(TARG, tmps - SvPVX_const(TARG));
3701         *tmps = '\0';
3702         (void)SvPOK_only(TARG);
3703         SvUTF8_on(TARG);
3704         SETTARG;
3705         return NORMAL;
3706     }
3707
3708     SvGROW(TARG,2);
3709     SvCUR_set(TARG, 1);
3710     tmps = SvPVX(TARG);
3711     *tmps++ = (char)value;
3712     *tmps = '\0';
3713     (void)SvPOK_only(TARG);
3714
3715     SETTARG;
3716     return NORMAL;
3717 }
3718
3719 PP(pp_crypt)
3720 {
3721 #ifdef HAS_CRYPT
3722     dSP; dTARGET;
3723     dPOPTOPssrl;
3724     STRLEN len;
3725     const char *tmps = SvPV_const(left, len);
3726
3727     if (DO_UTF8(left)) {
3728          /* If Unicode, try to downgrade.
3729           * If not possible, croak.
3730           * Yes, we made this up.  */
3731          SV* const tsv = newSVpvn_flags(tmps, len, SVf_UTF8|SVs_TEMP);
3732
3733          sv_utf8_downgrade(tsv, FALSE);
3734          tmps = SvPV_const(tsv, len);
3735     }
3736 #   ifdef USE_ITHREADS
3737 #     ifdef HAS_CRYPT_R
3738     if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3739       /* This should be threadsafe because in ithreads there is only
3740        * one thread per interpreter.  If this would not be true,
3741        * we would need a mutex to protect this malloc. */
3742         PL_reentrant_buffer->_crypt_struct_buffer =
3743           (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3744 #if defined(__GLIBC__) || defined(__EMX__)
3745         if (PL_reentrant_buffer->_crypt_struct_buffer) {
3746             PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3747             /* work around glibc-2.2.5 bug */
3748             PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3749         }
3750 #endif
3751     }
3752 #     endif /* HAS_CRYPT_R */
3753 #   endif /* USE_ITHREADS */
3754 #   ifdef FCRYPT
3755     sv_setpv(TARG, fcrypt(tmps, SvPV_nolen_const(right)));
3756 #   else
3757     sv_setpv(TARG, PerlProc_crypt(tmps, SvPV_nolen_const(right)));
3758 #   endif
3759     SvUTF8_off(TARG);
3760     SETTARG;
3761     RETURN;
3762 #else
3763     DIE(aTHX_
3764       "The crypt() function is unimplemented due to excessive paranoia.");
3765 #endif
3766 }
3767
3768 /* Generally UTF-8 and UTF-EBCDIC are indistinguishable at this level.  So 
3769  * most comments below say UTF-8, when in fact they mean UTF-EBCDIC as well */
3770
3771
3772 /* also used for: pp_lcfirst() */
3773
3774 PP(pp_ucfirst)
3775 {
3776     /* Actually is both lcfirst() and ucfirst().  Only the first character
3777      * changes.  This means that possibly we can change in-place, ie., just
3778      * take the source and change that one character and store it back, but not
3779      * if read-only etc, or if the length changes */
3780
3781     dSP;
3782     SV *source = TOPs;
3783     STRLEN slen; /* slen is the byte length of the whole SV. */
3784     STRLEN need;
3785     SV *dest;
3786     bool inplace;   /* ? Convert first char only, in-place */
3787     bool doing_utf8 = FALSE;               /* ? using utf8 */
3788     bool convert_source_to_utf8 = FALSE;   /* ? need to convert */
3789     const int op_type = PL_op->op_type;
3790     const U8 *s;
3791     U8 *d;
3792     U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3793     STRLEN ulen;    /* ulen is the byte length of the original Unicode character
3794                      * stored as UTF-8 at s. */
3795     STRLEN tculen;  /* tculen is the byte length of the freshly titlecased (or
3796                      * lowercased) character stored in tmpbuf.  May be either
3797                      * UTF-8 or not, but in either case is the number of bytes */
3798
3799     s = (const U8*)SvPV_const(source, slen);
3800
3801     /* We may be able to get away with changing only the first character, in
3802      * place, but not if read-only, etc.  Later we may discover more reasons to
3803      * not convert in-place. */
3804     inplace = !SvREADONLY(source) && SvPADTMP(source);
3805
3806     /* First calculate what the changed first character should be.  This affects
3807      * whether we can just swap it out, leaving the rest of the string unchanged,
3808      * or even if have to convert the dest to UTF-8 when the source isn't */
3809
3810     if (! slen) {   /* If empty */
3811         need = 1; /* still need a trailing NUL */
3812         ulen = 0;
3813     }
3814     else if (DO_UTF8(source)) { /* Is the source utf8? */
3815         doing_utf8 = TRUE;
3816         ulen = UTF8SKIP(s);
3817         if (op_type == OP_UCFIRST) {
3818 #ifdef USE_LOCALE_CTYPE
3819             _toTITLE_utf8_flags(s, s +slen, tmpbuf, &tculen, IN_LC_RUNTIME(LC_CTYPE));
3820 #else
3821             _toTITLE_utf8_flags(s, s +slen, tmpbuf, &tculen, 0);
3822 #endif
3823         }
3824         else {
3825 #ifdef USE_LOCALE_CTYPE
3826             _toLOWER_utf8_flags(s, s + slen, tmpbuf, &tculen, IN_LC_RUNTIME(LC_CTYPE));
3827 #else
3828             _toLOWER_utf8_flags(s, s + slen, tmpbuf, &tculen, 0);
3829 #endif
3830         }
3831
3832         /* we can't do in-place if the length changes.  */
3833         if (ulen != tculen) inplace = FALSE;
3834         need = slen + 1 - ulen + tculen;
3835     }
3836     else { /* Non-zero length, non-UTF-8,  Need to consider locale and if
3837             * latin1 is treated as caseless.  Note that a locale takes
3838             * precedence */ 
3839         ulen = 1;       /* Original character is 1 byte */
3840         tculen = 1;     /* Most characters will require one byte, but this will
3841                          * need to be overridden for the tricky ones */
3842         need = slen + 1;
3843
3844         if (op_type == OP_LCFIRST) {
3845
3846             /* lower case the first letter: no trickiness for any character */
3847 #ifdef USE_LOCALE_CTYPE
3848             if (IN_LC_RUNTIME(LC_CTYPE)) {
3849                 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
3850                 *tmpbuf = toLOWER_LC(*s);
3851             }
3852             else
3853 #endif
3854             {
3855                 *tmpbuf = (IN_UNI_8_BIT)
3856                           ? toLOWER_LATIN1(*s)
3857                           : toLOWER(*s);
3858             }
3859         }
3860 #ifdef USE_LOCALE_CTYPE
3861         /* is ucfirst() */
3862         else if (IN_LC_RUNTIME(LC_CTYPE)) {
3863             if (IN_UTF8_CTYPE_LOCALE) {
3864                 goto do_uni_rules;
3865             }
3866
3867             _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
3868             *tmpbuf = (U8) toUPPER_LC(*s); /* This would be a bug if any
3869                                               locales have upper and title case
3870                                               different */
3871         }
3872 #endif
3873         else if (! IN_UNI_8_BIT) {
3874             *tmpbuf = toUPPER(*s);      /* Returns caseless for non-ascii, or
3875                                          * on EBCDIC machines whatever the
3876                                          * native function does */
3877         }
3878         else {
3879             /* Here, is ucfirst non-UTF-8, not in locale (unless that locale is
3880              * UTF-8, which we treat as not in locale), and cased latin1 */
3881             UV title_ord;
3882 #ifdef USE_LOCALE_CTYPE
3883       do_uni_rules:
3884 #endif
3885
3886             title_ord = _to_upper_title_latin1(*s, tmpbuf, &tculen, 's');
3887             if (tculen > 1) {
3888                 assert(tculen == 2);
3889
3890                 /* If the result is an upper Latin1-range character, it can
3891                  * still be represented in one byte, which is its ordinal */
3892                 if (UTF8_IS_DOWNGRADEABLE_START(*tmpbuf)) {
3893                     *tmpbuf = (U8) title_ord;
3894                     tculen = 1;
3895                 }
3896                 else {
3897                     /* Otherwise it became more than one ASCII character (in
3898                      * the case of LATIN_SMALL_LETTER_SHARP_S) or changed to
3899                      * beyond Latin1, so the number of bytes changed, so can't
3900                      * replace just the first character in place. */
3901                     inplace = FALSE;
3902
3903                     /* If the result won't fit in a byte, the entire result
3904                      * will have to be in UTF-8.  Assume worst case sizing in
3905                      * conversion. (all latin1 characters occupy at most two
3906                      * bytes in utf8) */
3907                     if (title_ord > 255) {
3908                         doing_utf8 = TRUE;
3909                         convert_source_to_utf8 = TRUE;
3910                         need = slen * 2 + 1;
3911
3912                         /* The (converted) UTF-8 and UTF-EBCDIC lengths of all
3913                          * (both) characters whose title case is above 255 is
3914                          * 2. */
3915                         ulen = 2;
3916                     }
3917                     else { /* LATIN_SMALL_LETTER_SHARP_S expands by 1 byte */
3918                         need = slen + 1 + 1;
3919                     }
3920                 }
3921             }
3922         } /* End of use Unicode (Latin1) semantics */
3923     } /* End of changing the case of the first character */
3924
3925     /* Here, have the first character's changed case stored in tmpbuf.  Ready to
3926      * generate the result */
3927     if (inplace) {
3928
3929         /* We can convert in place.  This means we change just the first
3930          * character without disturbing the rest; no need to grow */
3931         dest = source;
3932         s = d = (U8*)SvPV_force_nomg(source, slen);
3933     } else {
3934         dTARGET;
3935
3936         dest = TARG;
3937
3938         /* Here, we can't convert in place; we earlier calculated how much
3939          * space we will need, so grow to accommodate that */
3940         SvUPGRADE(dest, SVt_PV);
3941         d = (U8*)SvGROW(dest, need);
3942         (void)SvPOK_only(dest);
3943
3944         SETs(dest);
3945     }
3946
3947     if (doing_utf8) {
3948         if (! inplace) {
3949             if (! convert_source_to_utf8) {
3950
3951                 /* Here  both source and dest are in UTF-8, but have to create
3952                  * the entire output.  We initialize the result to be the
3953                  * title/lower cased first character, and then append the rest
3954                  * of the string. */
3955                 sv_setpvn(dest, (char*)tmpbuf, tculen);
3956                 if (slen > ulen) {
3957                     sv_catpvn(dest, (char*)(s + ulen), slen - ulen);
3958                 }
3959             }
3960             else {
3961                 const U8 *const send = s + slen;
3962
3963                 /* Here the dest needs to be in UTF-8, but the source isn't,
3964                  * except we earlier UTF-8'd the first character of the source
3965                  * into tmpbuf.  First put that into dest, and then append the
3966                  * rest of the source, converting it to UTF-8 as we go. */
3967
3968                 /* Assert tculen is 2 here because the only two characters that
3969                  * get to this part of the code have 2-byte UTF-8 equivalents */
3970                 *d++ = *tmpbuf;
3971                 *d++ = *(tmpbuf + 1);
3972                 s++;    /* We have just processed the 1st char */
3973
3974                 for (; s < send; s++) {
3975                     d = uvchr_to_utf8(d, *s);
3976                 }
3977                 *d = '\0';
3978                 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3979             }
3980             SvUTF8_on(dest);
3981         }
3982         else {   /* in-place UTF-8.  Just overwrite the first character */
3983             Copy(tmpbuf, d, tculen, U8);
3984             SvCUR_set(dest, need - 1);
3985         }
3986
3987     }
3988     else {  /* Neither source nor dest are in or need to be UTF-8 */
3989         if (slen) {
3990             if (inplace) {  /* in-place, only need to change the 1st char */
3991                 *d = *tmpbuf;
3992             }
3993             else {      /* Not in-place */
3994
3995                 /* Copy the case-changed character(s) from tmpbuf */
3996                 Copy(tmpbuf, d, tculen, U8);
3997                 d += tculen - 1; /* Code below expects d to point to final
3998                                   * character stored */
3999             }
4000         }
4001         else {  /* empty source */
4002             /* See bug #39028: Don't taint if empty  */
4003             *d = *s;
4004         }
4005
4006         /* In a "use bytes" we don't treat the source as UTF-8, but, still want
4007          * the destination to retain that flag */
4008         if (SvUTF8(source) && ! IN_BYTES)
4009             SvUTF8_on(dest);
4010
4011         if (!inplace) { /* Finish the rest of the string, unchanged */
4012             /* This will copy the trailing NUL  */
4013             Copy(s + 1, d + 1, slen, U8);
4014             SvCUR_set(dest, need - 1);
4015         }
4016     }
4017 #ifdef USE_LOCALE_CTYPE
4018     if (IN_LC_RUNTIME(LC_CTYPE)) {
4019         TAINT;
4020         SvTAINTED_on(dest);
4021     }
4022 #endif
4023     if (dest != source && SvTAINTED(source))
4024         SvTAINT(dest);
4025     SvSETMAGIC(dest);
4026     return NORMAL;
4027 }
4028
4029 /* There's so much setup/teardown code common between uc and lc, I wonder if
4030    it would be worth merging the two, and just having a switch outside each
4031    of the three tight loops.  There is less and less commonality though */
4032 PP(pp_uc)
4033 {
4034     dSP;
4035     SV *source = TOPs;
4036     STRLEN len;
4037     STRLEN min;
4038     SV *dest;
4039     const U8 *s;
4040     U8 *d;
4041
4042     SvGETMAGIC(source);
4043
4044     if (   SvPADTMP(source)
4045         && !SvREADONLY(source) && SvPOK(source)
4046         && !DO_UTF8(source)
4047         && (
4048 #ifdef USE_LOCALE_CTYPE
4049             (IN_LC_RUNTIME(LC_CTYPE))
4050             ? ! IN_UTF8_CTYPE_LOCALE
4051             :
4052 #endif
4053               ! IN_UNI_8_BIT))
4054     {
4055
4056         /* We can convert in place.  The reason we can't if in UNI_8_BIT is to
4057          * make the loop tight, so we overwrite the source with the dest before
4058          * looking at it, and we need to look at the original source
4059          * afterwards.  There would also need to be code added to handle
4060          * switching to not in-place in midstream if we run into characters
4061          * that change the length.  Since being in locale overrides UNI_8_BIT,
4062          * that latter becomes irrelevant in the above test; instead for
4063          * locale, the size can't normally change, except if the locale is a
4064          * UTF-8 one */
4065         dest = source;
4066         s = d = (U8*)SvPV_force_nomg(source, len);
4067         min = len + 1;
4068     } else {
4069         dTARGET;
4070
4071         dest = TARG;
4072
4073         s = (const U8*)SvPV_nomg_const(source, len);
4074         min = len + 1;
4075
4076         SvUPGRADE(dest, SVt_PV);
4077         d = (U8*)SvGROW(dest, min);
4078         (void)SvPOK_only(dest);
4079
4080         SETs(dest);
4081     }
4082
4083     /* Overloaded values may have toggled the UTF-8 flag on source, so we need
4084        to check DO_UTF8 again here.  */
4085
4086     if (DO_UTF8(source)) {
4087         const U8 *const send = s + len;
4088         U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
4089
4090         /* All occurrences of these are to be moved to follow any other marks.
4091          * This is context-dependent.  We may not be passed enough context to
4092          * move the iota subscript beyond all of them, but we do the best we can
4093          * with what we're given.  The result is always better than if we
4094          * hadn't done this.  And, the problem would only arise if we are
4095          * passed a character without all its combining marks, which would be
4096          * the caller's mistake.  The information this is based on comes from a
4097          * comment in Unicode SpecialCasing.txt, (and the Standard's text
4098          * itself) and so can't be checked properly to see if it ever gets
4099          * revised.  But the likelihood of it changing is remote */
4100         bool in_iota_subscript = FALSE;
4101
4102         while (s < send) {
4103             STRLEN u;
4104             STRLEN ulen;
4105             UV uv;
4106             if (in_iota_subscript && ! _is_utf8_mark(s)) {
4107
4108                 /* A non-mark.  Time to output the iota subscript */
4109                 Copy(GREEK_CAPITAL_LETTER_IOTA_UTF8, d, capital_iota_len, U8);
4110                 d += capital_iota_len;
4111                 in_iota_subscript = FALSE;
4112             }
4113
4114             /* Then handle the current character.  Get the changed case value
4115              * and copy it to the output buffer */
4116
4117             u = UTF8SKIP(s);
4118 #ifdef USE_LOCALE_CTYPE
4119             uv = _toUPPER_utf8_flags(s, send, tmpbuf, &ulen, IN_LC_RUNTIME(LC_CTYPE));
4120 #else
4121             uv = _toUPPER_utf8_flags(s, send, tmpbuf, &ulen, 0);
4122 #endif
4123 #define GREEK_CAPITAL_LETTER_IOTA 0x0399
4124 #define COMBINING_GREEK_YPOGEGRAMMENI 0x0345
4125             if (uv == GREEK_CAPITAL_LETTER_IOTA
4126                 && utf8_to_uvchr_buf(s, send, 0) == COMBINING_GREEK_YPOGEGRAMMENI)
4127             {
4128                 in_iota_subscript = TRUE;
4129             }
4130             else {
4131                 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4132                     /* If the eventually required minimum size outgrows the
4133                      * available space, we need to grow. */
4134                     const UV o = d - (U8*)SvPVX_const(dest);
4135
4136                     /* If someone uppercases one million U+03B0s we SvGROW()
4137                      * one million times.  Or we could try guessing how much to
4138                      * allocate without allocating too much.  Such is life.
4139                      * See corresponding comment in lc code for another option
4140                      * */
4141                     d = o + (U8*) SvGROW(dest, min);
4142                 }
4143                 Copy(tmpbuf, d, ulen, U8);
4144                 d += ulen;
4145             }
4146             s += u;
4147         }
4148         if (in_iota_subscript) {
4149             Copy(GREEK_CAPITAL_LETTER_IOTA_UTF8, d, capital_iota_len, U8);
4150             d += capital_iota_len;
4151         }
4152         SvUTF8_on(dest);
4153         *d = '\0';
4154
4155         SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4156     }
4157     else {      /* Not UTF-8 */
4158         if (len) {
4159             const U8 *const send = s + len;
4160
4161             /* Use locale casing if in locale; regular style if not treating
4162              * latin1 as having case; otherwise the latin1 casing.  Do the
4163              * whole thing in a tight loop, for speed, */
4164 #ifdef USE_LOCALE_CTYPE
4165             if (IN_LC_RUNTIME(LC_CTYPE)) {
4166                 if (IN_UTF8_CTYPE_LOCALE) {
4167                     goto do_uni_rules;
4168                 }
4169                 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
4170                 for (; s < send; d++, s++)
4171                     *d = (U8) toUPPER_LC(*s);
4172             }
4173             else
4174 #endif
4175                  if (! IN_UNI_8_BIT) {
4176                 for (; s < send; d++, s++) {
4177                     *d = toUPPER(*s);
4178                 }
4179             }
4180             else {
4181 #ifdef USE_LOCALE_CTYPE
4182           do_uni_rules:
4183 #endif
4184                 for (; s < send; d++, s++) {
4185                     *d = toUPPER_LATIN1_MOD(*s);
4186                     if (LIKELY(*d != LATIN_SMALL_LETTER_Y_WITH_DIAERESIS)) {
4187                         continue;
4188                     }
4189
4190                     /* The mainstream case is the tight loop above.  To avoid
4191                      * extra tests in that, all three characters that require
4192                      * special handling are mapped by the MOD to the one tested
4193                      * just above.  
4194                      * Use the source to distinguish between the three cases */
4195
4196 #if    UNICODE_MAJOR_VERSION > 2                                        \
4197    || (UNICODE_MAJOR_VERSION == 2 && UNICODE_DOT_VERSION >= 1           \
4198                                   && UNICODE_DOT_DOT_VERSION >= 8)
4199                     if (*s == LATIN_SMALL_LETTER_SHARP_S) {
4200
4201                         /* uc() of this requires 2 characters, but they are
4202                          * ASCII.  If not enough room, grow the string */
4203                         if (SvLEN(dest) < ++min) {      
4204                             const UV o = d - (U8*)SvPVX_const(dest);
4205                             d = o + (U8*) SvGROW(dest, min);
4206                         }
4207                         *d++ = 'S'; *d = 'S'; /* upper case is 'SS' */
4208                         continue;   /* Back to the tight loop; still in ASCII */
4209                     }
4210 #endif
4211
4212                     /* The other two special handling characters have their
4213                      * upper cases outside the latin1 range, hence need to be
4214                      * in UTF-8, so the whole result needs to be in UTF-8.  So,
4215                      * here we are somewhere in the middle of processing a
4216                      * non-UTF-8 string, and realize that we will have to convert
4217                      * the whole thing to UTF-8.  What to do?  There are
4218                      * several possibilities.  The simplest to code is to
4219                      * convert what we have so far, set a flag, and continue on
4220                      * in the loop.  The flag would be tested each time through
4221                      * the loop, and if set, the next character would be
4222                      * converted to UTF-8 and stored.  But, I (khw) didn't want
4223                      * to slow down the mainstream case at all for this fairly
4224                      * rare case, so I didn't want to add a test that didn't
4225                      * absolutely have to be there in the loop, besides the
4226                      * possibility that it would get too complicated for
4227                      * optimizers to deal with.  Another possibility is to just
4228                      * give up, convert the source to UTF-8, and restart the
4229                      * function that way.  Another possibility is to convert
4230                      * both what has already been processed and what is yet to
4231                      * come separately to UTF-8, then jump into the loop that
4232                      * handles UTF-8.  But the most efficient time-wise of the
4233                      * ones I could think of is what follows, and turned out to
4234                      * not require much extra code.  */
4235
4236                     /* Convert what we have so far into UTF-8, telling the
4237                      * function that we know it should be converted, and to
4238                      * allow extra space for what we haven't processed yet.
4239                      * Assume the worst case space requirements for converting
4240                      * what we haven't processed so far: that it will require
4241                      * two bytes for each remaining source character, plus the
4242                      * NUL at the end.  This may cause the string pointer to
4243                      * move, so re-find it. */
4244
4245                     len = d - (U8*)SvPVX_const(dest);
4246                     SvCUR_set(dest, len);
4247                     len = sv_utf8_upgrade_flags_grow(dest,
4248                                                 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
4249                                                 (send -s) * 2 + 1);
4250                     d = (U8*)SvPVX(dest) + len;
4251
4252                     /* Now process the remainder of the source, converting to
4253                      * upper and UTF-8.  If a resulting byte is invariant in
4254                      * UTF-8, output it as-is, otherwise convert to UTF-8 and
4255                      * append it to the output. */
4256                     for (; s < send; s++) {
4257                         (void) _to_upper_title_latin1(*s, d, &len, 'S');
4258                         d += len;
4259                     }
4260
4261                     /* Here have processed the whole source; no need to continue
4262                      * with the outer loop.  Each character has been converted
4263                      * to upper case and converted to UTF-8 */
4264
4265                     break;
4266                 } /* End of processing all latin1-style chars */
4267             } /* End of processing all chars */
4268         } /* End of source is not empty */
4269
4270         if (source != dest) {
4271             *d = '\0';  /* Here d points to 1 after last char, add NUL */
4272             SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4273         }
4274     } /* End of isn't utf8 */
4275 #ifdef USE_LOCALE_CTYPE
4276     if (IN_LC_RUNTIME(LC_CTYPE)) {
4277         TAINT;
4278         SvTAINTED_on(dest);
4279     }
4280 #endif
4281     if (dest != source && SvTAINTED(source))
4282         SvTAINT(dest);
4283     SvSETMAGIC(dest);
4284     return NORMAL;
4285 }
4286
4287 PP(pp_lc)
4288 {
4289     dSP;
4290     SV *source = TOPs;
4291     STRLEN len;
4292     STRLEN min;
4293     SV *dest;
4294     const U8 *s;
4295     U8 *d;
4296
4297     SvGETMAGIC(source);
4298
4299     if (   SvPADTMP(source)
4300         && !SvREADONLY(source) && SvPOK(source)
4301         && !DO_UTF8(source)) {
4302
4303         /* We can convert in place, as lowercasing anything in the latin1 range
4304          * (or else DO_UTF8 would have been on) doesn't lengthen it */
4305         dest = source;
4306         s = d = (U8*)SvPV_force_nomg(source, len);
4307         min = len + 1;
4308     } else {
4309         dTARGET;
4310
4311         dest = TARG;
4312
4313         s = (const U8*)SvPV_nomg_const(source, len);
4314         min = len + 1;
4315
4316         SvUPGRADE(dest, SVt_PV);
4317         d = (U8*)SvGROW(dest, min);
4318         (void)SvPOK_only(dest);
4319
4320         SETs(dest);
4321     }
4322
4323     /* Overloaded values may have toggled the UTF-8 flag on source, so we need
4324        to check DO_UTF8 again here.  */
4325
4326     if (DO_UTF8(source)) {
4327         const U8 *const send = s + len;
4328         U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
4329
4330         while (s < send) {
4331             const STRLEN u = UTF8SKIP(s);
4332             STRLEN ulen;
4333
4334 #ifdef USE_LOCALE_CTYPE
4335             _toLOWER_utf8_flags(s, send, tmpbuf, &ulen, IN_LC_RUNTIME(LC_CTYPE));
4336 #else
4337             _toLOWER_utf8_flags(s, send, tmpbuf, &ulen, 0);
4338 #endif
4339
4340             /* Here is where we would do context-sensitive actions.  See the
4341              * commit message for 86510fb15 for why there isn't any */
4342
4343             if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4344
4345                 /* If the eventually required minimum size outgrows the
4346                  * available space, we need to grow. */
4347                 const UV o = d - (U8*)SvPVX_const(dest);
4348
4349                 /* If someone lowercases one million U+0130s we SvGROW() one
4350                  * million times.  Or we could try guessing how much to
4351                  * allocate without allocating too much.  Such is life.
4352                  * Another option would be to grow an extra byte or two more
4353                  * each time we need to grow, which would cut down the million
4354                  * to 500K, with little waste */
4355                 d = o + (U8*) SvGROW(dest, min);
4356             }
4357
4358             /* Copy the newly lowercased letter to the output buffer we're
4359              * building */
4360             Copy(tmpbuf, d, ulen, U8);
4361             d += ulen;
4362             s += u;
4363         }   /* End of looping through the source string */
4364         SvUTF8_on(dest);
4365         *d = '\0';
4366         SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4367     } else {    /* Not utf8 */
4368         if (len) {
4369             const U8 *const send = s + len;
4370
4371             /* Use locale casing if in locale; regular style if not treating
4372              * latin1 as having case; otherwise the latin1 casing.  Do the
4373              * whole thing in a tight loop, for speed, */
4374 #ifdef USE_LOCALE_CTYPE
4375             if (IN_LC_RUNTIME(LC_CTYPE)) {
4376                 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
4377                 for (; s < send; d++, s++)
4378                     *d = toLOWER_LC(*s);
4379             }
4380             else
4381 #endif
4382             if (! IN_UNI_8_BIT) {
4383                 for (; s < send; d++, s++) {
4384                     *d = toLOWER(*s);
4385                 }
4386             }
4387             else {
4388                 for (; s < send; d++, s++) {
4389                     *d = toLOWER_LATIN1(*s);
4390                 }
4391             }
4392         }
4393         if (source != dest) {
4394             *d = '\0';
4395             SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4396         }
4397     }
4398 #ifdef USE_LOCALE_CTYPE
4399     if (IN_LC_RUNTIME(LC_CTYPE)) {
4400         TAINT;
4401         SvTAINTED_on(dest);
4402     }
4403 #endif
4404     if (dest != source && SvTAINTED(source))
4405         SvTAINT(dest);
4406     SvSETMAGIC(dest);
4407     return NORMAL;
4408 }
4409
4410 PP(pp_quotemeta)
4411 {
4412     dSP; dTARGET;
4413     SV * const sv = TOPs;
4414     STRLEN len;
4415     const char *s = SvPV_const(sv,len);
4416
4417     SvUTF8_off(TARG);                           /* decontaminate */
4418     if (len) {
4419         char *d;
4420         SvUPGRADE(TARG, SVt_PV);
4421         SvGROW(TARG, (len * 2) + 1);
4422         d = SvPVX(TARG);
4423         if (DO_UTF8(sv)) {
4424             while (len) {
4425                 STRLEN ulen = UTF8SKIP(s);
4426                 bool to_quote = FALSE;
4427
4428                 if (UTF8_IS_INVARIANT(*s)) {
4429                     if (_isQUOTEMETA(*s)) {
4430                         to_quote = TRUE;
4431                     }
4432                 }
4433                 else if (UTF8_IS_NEXT_CHAR_DOWNGRADEABLE(s, s + len)) {
4434                     if (
4435 #ifdef USE_LOCALE_CTYPE
4436                     /* In locale, we quote all non-ASCII Latin1 chars.
4437                      * Otherwise use the quoting rules */
4438                     
4439                     IN_LC_RUNTIME(LC_CTYPE)
4440                         ||
4441 #endif
4442                         _isQUOTEMETA(EIGHT_BIT_UTF8_TO_NATIVE(*s, *(s + 1))))
4443                     {
4444                         to_quote = TRUE;
4445                     }
4446                 }
4447                 else if (is_QUOTEMETA_high(s)) {
4448                     to_quote = TRUE;
4449                 }
4450
4451                 if (to_quote) {
4452                     *d++ = '\\';
4453                 }
4454                 if (ulen > len)
4455                     ulen = len;
4456                 len -= ulen;
4457                 while (ulen--)
4458                     *d++ = *s++;
4459             }
4460             SvUTF8_on(TARG);
4461         }
4462         else if (IN_UNI_8_BIT) {
4463             while (len--) {
4464                 if (_isQUOTEMETA(*s))
4465                     *d++ = '\\';
4466                 *d++ = *s++;
4467             }
4468         }
4469         else {
4470             /* For non UNI_8_BIT (and hence in locale) just quote all \W
4471              * including everything above ASCII */
4472             while (len--) {
4473                 if (!isWORDCHAR_A(*s))
4474                     *d++ = '\\';
4475                 *d++ = *s++;
4476             }
4477         }
4478         *d = '\0';
4479         SvCUR_set(TARG, d - SvPVX_const(TARG));
4480         (void)SvPOK_only_UTF8(TARG);
4481     }
4482     else
4483         sv_setpvn(TARG, s, len);
4484     SETTARG;
4485     return NORMAL;
4486 }
4487
4488 PP(pp_fc)
4489 {
4490     dTARGET;
4491     dSP;
4492     SV *source = TOPs;
4493     STRLEN len;
4494     STRLEN min;
4495     SV *dest;
4496     const U8 *s;
4497     const U8 *send;
4498     U8 *d;
4499     U8 tmpbuf[UTF8_MAXBYTES_CASE + 1];
4500 #if    UNICODE_MAJOR_VERSION > 3 /* no multifolds in early Unicode */   \
4501    || (UNICODE_MAJOR_VERSION == 3 && (   UNICODE_DOT_VERSION > 0)       \
4502                                       || UNICODE_DOT_DOT_VERSION > 0)
4503     const bool full_folding = TRUE; /* This variable is here so we can easily
4504                                        move to more generality later */
4505 #else
4506     const bool full_folding = FALSE;
4507 #endif
4508     const U8 flags = ( full_folding      ? FOLD_FLAGS_FULL   : 0 )
4509 #ifdef USE_LOCALE_CTYPE
4510                    | ( IN_LC_RUNTIME(LC_CTYPE) ? FOLD_FLAGS_LOCALE : 0 )
4511 #endif
4512     ;
4513
4514     /* This is a facsimile of pp_lc, but with a thousand bugs thanks to me.
4515      * You are welcome(?) -Hugmeir
4516      */
4517
4518     SvGETMAGIC(source);
4519
4520     dest = TARG;
4521
4522     if (SvOK(source)) {
4523         s = (const U8*)SvPV_nomg_const(source, len);
4524     } else {
4525         if (ckWARN(WARN_UNINITIALIZED))
4526             report_uninit(source);
4527         s = (const U8*)"";
4528         len = 0;
4529     }
4530
4531     min = len + 1;
4532
4533     SvUPGRADE(dest, SVt_PV);
4534     d = (U8*)SvGROW(dest, min);
4535     (void)SvPOK_only(dest);
4536
4537     SETs(dest);
4538
4539     send = s + len;
4540     if (DO_UTF8(source)) { /* UTF-8 flagged string. */
4541         while (s < send) {
4542             const STRLEN u = UTF8SKIP(s);
4543             STRLEN ulen;
4544
4545             _toFOLD_utf8_flags(s, send, tmpbuf, &ulen, flags);
4546
4547             if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4548                 const UV o = d - (U8*)SvPVX_const(dest);
4549                 d = o + (U8*) SvGROW(dest, min);
4550             }
4551
4552             Copy(tmpbuf, d, ulen, U8);
4553             d += ulen;
4554             s += u;
4555         }
4556         SvUTF8_on(dest);
4557     } /* Unflagged string */
4558     else if (len) {
4559 #ifdef USE_LOCALE_CTYPE
4560         if ( IN_LC_RUNTIME(LC_CTYPE) ) { /* Under locale */
4561             if (IN_UTF8_CTYPE_LOCALE) {
4562                 goto do_uni_folding;
4563             }
4564             _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
4565             for (; s < send; d++, s++)
4566                 *d = (U8) toFOLD_LC(*s);
4567         }
4568         else
4569 #endif
4570         if ( !IN_UNI_8_BIT ) { /* Under nothing, or bytes */
4571             for (; s < send; d++, s++)
4572                 *d = toFOLD(*s);
4573         }
4574         else {
4575 #ifdef USE_LOCALE_CTYPE
4576       do_uni_folding:
4577 #endif
4578             /* For ASCII and the Latin-1 range, there's only two troublesome
4579              * folds, \x{DF} (\N{LATIN SMALL LETTER SHARP S}), which under full
4580              * casefolding becomes 'ss'; and \x{B5} (\N{MICRO SIGN}), which
4581              * under any fold becomes \x{3BC} (\N{GREEK SMALL LETTER MU}) --
4582              * For the rest, the casefold is their lowercase.  */
4583             for (; s < send; d++, s++) {
4584                 if (*s == MICRO_SIGN) {
4585                     /* \N{MICRO SIGN}'s casefold is \N{GREEK SMALL LETTER MU},
4586                      * which is outside of the latin-1 range. There's a couple
4587                      * of ways to deal with this -- khw discusses them in
4588                      * pp_lc/uc, so go there :) What we do here is upgrade what
4589                      * we had already casefolded, then enter an inner loop that
4590                      * appends the rest of the characters as UTF-8. */
4591                     len = d - (U8*)SvPVX_const(dest);
4592                     SvCUR_set(dest, len);
4593                     len = sv_utf8_upgrade_flags_grow(dest,
4594                                                 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
4595                                                 /* The max expansion for latin1
4596                                                  * chars is 1 byte becomes 2 */
4597                                                 (send -s) * 2 + 1);
4598                     d = (U8*)SvPVX(dest) + len;
4599
4600                     Copy(GREEK_SMALL_LETTER_MU_UTF8, d, small_mu_len, U8);
4601                     d += small_mu_len;
4602                     s++;
4603                     for (; s < send; s++) {
4604                         STRLEN ulen;
4605                         UV fc = _to_uni_fold_flags(*s, tmpbuf, &ulen, flags);
4606                         if UVCHR_IS_INVARIANT(fc) {
4607                             if (full_folding
4608                                 && *s == LATIN_SMALL_LETTER_SHARP_S)
4609                             {
4610                                 *d++ = 's';
4611                                 *d++ = 's';
4612                             }
4613                             else
4614                                 *d++ = (U8)fc;
4615                         }
4616                         else {
4617                             Copy(tmpbuf, d, ulen, U8);
4618                             d += ulen;
4619                         }
4620                     }
4621                     break;
4622                 }
4623                 else if (full_folding && *s == LATIN_SMALL_LETTER_SHARP_S) {
4624                     /* Under full casefolding, LATIN SMALL LETTER SHARP S
4625                      * becomes "ss", which may require growing the SV. */
4626                     if (SvLEN(dest) < ++min) {
4627                         const UV o = d - (U8*)SvPVX_const(dest);
4628                         d = o + (U8*) SvGROW(dest, min);
4629                      }
4630                     *(d)++ = 's';
4631                     *d = 's';
4632                 }
4633                 else { /* If it's not one of those two, the fold is their lower
4634                           case */
4635                     *d = toLOWER_LATIN1(*s);
4636                 }
4637              }
4638         }
4639     }
4640     *d = '\0';
4641     SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4642
4643 #ifdef USE_LOCALE_CTYPE
4644     if (IN_LC_RUNTIME(LC_CTYPE)) {
4645         TAINT;
4646         SvTAINTED_on(dest);
4647     }
4648 #endif
4649     if (SvTAINTED(source))
4650         SvTAINT(dest);
4651     SvSETMAGIC(dest);
4652     RETURN;
4653 }
4654
4655 /* Arrays. */
4656
4657 PP(pp_aslice)
4658 {
4659     dSP; dMARK; dORIGMARK;
4660     AV *const av = MUTABLE_AV(POPs);
4661     const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
4662
4663     if (SvTYPE(av) == SVt_PVAV) {
4664         const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
4665         bool can_preserve = FALSE;
4666
4667         if (localizing) {
4668             MAGIC *mg;
4669             HV *stash;
4670
4671             can_preserve = SvCANEXISTDELETE(av);
4672         }
4673
4674         if (lval && localizing) {
4675             SV **svp;
4676             SSize_t max = -1;
4677             for (svp = MARK + 1; svp <= SP; svp++) {
4678                 const SSize_t elem = SvIV(*svp);
4679                 if (elem > max)
4680                     max = elem;
4681             }
4682             if (max > AvMAX(av))
4683                 av_extend(av, max);
4684         }
4685
4686         while (++MARK <= SP) {
4687             SV **svp;
4688             SSize_t elem = SvIV(*MARK);
4689             bool preeminent = TRUE;
4690
4691             if (localizing && can_preserve) {
4692                 /* If we can determine whether the element exist,
4693                  * Try to preserve the existenceness of a tied array
4694                  * element by using EXISTS and DELETE if possible.
4695                  * Fallback to FETCH and STORE otherwise. */
4696                 preeminent = av_exists(av, elem);
4697             }
4698
4699             svp = av_fetch(av, elem, lval);
4700             if (lval) {
4701                 if (!svp || !*svp)
4702                     DIE(aTHX_ PL_no_aelem, elem);
4703                 if (localizing) {
4704                     if (preeminent)
4705                         save_aelem(av, elem, svp);
4706                     else
4707                         SAVEADELETE(av, elem);
4708                 }
4709             }
4710             *MARK = svp ? *svp : &PL_sv_undef;
4711         }
4712     }
4713     if (GIMME_V != G_ARRAY) {
4714         MARK = ORIGMARK;
4715         *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
4716         SP = MARK;
4717     }
4718     RETURN;
4719 }
4720
4721 PP(pp_kvaslice)
4722 {
4723     dSP; dMARK;
4724     AV *const av = MUTABLE_AV(POPs);
4725     I32 lval = (PL_op->op_flags & OPf_MOD);
4726     SSize_t items = SP - MARK;
4727
4728     if (PL_op->op_private & OPpMAYBE_LVSUB) {
4729        const I32 flags = is_lvalue_sub();
4730        if (flags) {
4731            if (!(flags & OPpENTERSUB_INARGS))
4732                /* diag_listed_as: Can't modify %s in %s */
4733                Perl_croak(aTHX_ "Can't modify index/value array slice in list assignment");
4734            lval = flags;
4735        }
4736     }
4737
4738     MEXTEND(SP,items);
4739     while (items > 1) {
4740         *(MARK+items*2-1) = *(MARK+items);
4741         items--;
4742     }
4743     items = SP-MARK;
4744     SP += items;
4745
4746     while (++MARK <= SP) {
4747         SV **svp;
4748
4749         svp = av_fetch(av, SvIV(*MARK), lval);
4750         if (lval) {
4751             if (!svp || !*svp || *svp == &PL_sv_undef) {
4752                 DIE(aTHX_ PL_no_aelem, SvIV(*MARK));
4753             }
4754             *MARK = sv_mortalcopy(*MARK);
4755         }
4756         *++MARK = svp ? *svp : &PL_sv_undef;
4757     }
4758     if (GIMME_V != G_ARRAY) {
4759         MARK = SP - items*2;
4760         *++MARK = items > 0 ? *SP : &PL_sv_undef;
4761         SP = MARK;
4762     }
4763     RETURN;
4764 }
4765
4766
4767 PP(pp_aeach)
4768 {
4769     dSP;
4770     AV *array = MUTABLE_AV(POPs);
4771     const U8 gimme = GIMME_V;
4772     IV *iterp = Perl_av_iter_p(aTHX_ array);
4773     const IV current = (*iterp)++;
4774
4775     if (current > av_tindex(array)) {
4776         *iterp = 0;
4777         if (gimme == G_SCALAR)
4778             RETPUSHUNDEF;
4779         else
4780             RETURN;
4781     }
4782
4783     EXTEND(SP, 2);
4784     mPUSHi(current);
4785     if (gimme == G_ARRAY) {
4786         SV **const element = av_fetch(array, current, 0);
4787         PUSHs(element ? *element : &PL_sv_undef);
4788     }
4789     RETURN;
4790 }
4791
4792 /* also used for: pp_avalues()*/
4793 PP(pp_akeys)
4794 {
4795     dSP;
4796     AV *array = MUTABLE_AV(POPs);
4797     const U8 gimme = GIMME_V;
4798
4799     *Perl_av_iter_p(aTHX_ array) = 0;
4800
4801     if (gimme == G_SCALAR) {
4802         dTARGET;
4803         PUSHi(av_tindex(array) + 1);
4804     }
4805     else if (gimme == G_ARRAY) {
4806       if (UNLIKELY(PL_op->op_private & OPpMAYBE_LVSUB)) {
4807         const I32 flags = is_lvalue_sub();
4808         if (flags && !(flags & OPpENTERSUB_INARGS))
4809             /* diag_listed_as: Can't modify %s in %s */
4810             Perl_croak(aTHX_
4811                       "Can't modify keys on array in list assignment");
4812       }
4813       {
4814         IV n = Perl_av_len(aTHX_ array);
4815         IV i;
4816
4817         EXTEND(SP, n + 1);
4818
4819         if (  PL_op->op_type == OP_AKEYS
4820            || (  PL_op->op_type == OP_AVHVSWITCH
4821               && (PL_op->op_private & 3) + OP_AEACH == OP_AKEYS  ))
4822         {
4823             for (i = 0;  i <= n;  i++) {
4824                 mPUSHi(i);
4825             }
4826         }
4827         else {
4828             for (i = 0;  i <= n;  i++) {
4829                 SV *const *const elem = Perl_av_fetch(aTHX_ array, i, 0);
4830                 PUSHs(elem ? *elem : &PL_sv_undef);
4831             }
4832         }
4833       }
4834     }
4835     RETURN;
4836 }
4837
4838 /* Associative arrays. */
4839
4840 PP(pp_each)
4841 {
4842     dSP;
4843     HV * hash = MUTABLE_HV(POPs);
4844     HE *entry;
4845     const U8 gimme = GIMME_V;
4846
4847     entry = hv_iternext(hash);
4848
4849     EXTEND(SP, 2);
4850     if (entry) {
4851         SV* const sv = hv_iterkeysv(entry);
4852         PUSHs(sv);
4853         if (gimme == G_ARRAY) {
4854             SV *val;
4855             val = hv_iterval(hash, entry);
4856             PUSHs(val);
4857         }
4858     }
4859     else if (gimme == G_SCALAR)
4860         RETPUSHUNDEF;
4861
4862     RETURN;
4863 }
4864
4865 STATIC OP *
4866 S_do_delete_local(pTHX)
4867 {
4868     dSP;
4869     const U8 gimme = GIMME_V;
4870     const MAGIC *mg;
4871     HV *stash;
4872     const bool sliced = !!(PL_op->op_private & OPpSLICE);
4873     SV **unsliced_keysv = sliced ? NULL : sp--;
4874     SV * const osv = POPs;
4875     SV **mark = sliced ? PL_stack_base + POPMARK : unsliced_keysv-1;
4876     dORIGMARK;
4877     const bool tied = SvRMAGICAL(osv)
4878                             && mg_find((const SV *)osv, PERL_MAGIC_tied);
4879     const bool can_preserve = SvCANEXISTDELETE(osv);
4880     const U32 type = SvTYPE(osv);
4881     SV ** const end = sliced ? SP : unsliced_keysv;
4882
4883     if (type == SVt_PVHV) {                     /* hash element */
4884             HV * const hv = MUTABLE_HV(osv);
4885             while (++MARK <= end) {
4886                 SV * const keysv = *MARK;
4887                 SV *sv = NULL;
4888                 bool preeminent = TRUE;
4889                 if (can_preserve)
4890                     preeminent = hv_exists_ent(hv, keysv, 0);
4891                 if (tied) {
4892                     HE *he = hv_fetch_ent(hv, keysv, 1, 0);
4893                     if (he)
4894                         sv = HeVAL(he);
4895                     else
4896                         preeminent = FALSE;
4897                 }
4898                 else {
4899                     sv = hv_delete_ent(hv, keysv, 0, 0);
4900                     if (preeminent)
4901                         SvREFCNT_inc_simple_void(sv); /* De-mortalize */
4902                 }
4903                 if (preeminent) {
4904                     if (!sv) DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
4905                     save_helem_flags(hv, keysv, &sv, SAVEf_KEEPOLDELEM);
4906                     if (tied) {
4907                         *MARK = sv_mortalcopy(sv);
4908                         mg_clear(sv);
4909                     } else
4910                         *MARK = sv;
4911                 }
4912                 else {
4913                     SAVEHDELETE(hv, keysv);
4914                     *MARK = &PL_sv_undef;
4915                 }
4916             }
4917     }
4918     else if (type == SVt_PVAV) {                  /* array element */
4919             if (PL_op->op_flags & OPf_SPECIAL) {
4920                 AV * const av = MUTABLE_AV(osv);
4921                 while (++MARK <= end) {
4922                     SSize_t idx = SvIV(*MARK);
4923                     SV *sv = NULL;
4924                     bool preeminent = TRUE;
4925                     if (can_preserve)
4926                         preeminent = av_exists(av, idx);
4927                     if (tied) {
4928                         SV **svp = av_fetch(av, idx, 1);
4929                         if (svp)
4930                             sv = *svp;
4931                         else
4932                             preeminent = FALSE;
4933                     }
4934                     else {
4935                         sv = av_delete(av, idx, 0);
4936                         if (preeminent)
4937                            SvREFCNT_inc_simple_void(sv); /* De-mortalize */
4938                     }
4939                     if (preeminent) {
4940                         save_aelem_flags(av, idx, &sv, SAVEf_KEEPOLDELEM);
4941                         if (tied) {
4942                             *MARK = sv_mortalcopy(sv);
4943                             mg_clear(sv);
4944                         } else
4945                             *MARK = sv;
4946                     }
4947                     else {
4948                         SAVEADELETE(av, idx);
4949                         *MARK = &PL_sv_undef;
4950                     }
4951                 }
4952             }
4953             else
4954                 DIE(aTHX_ "panic: avhv_delete no longer supported");
4955     }
4956     else
4957             DIE(aTHX_ "Not a HASH reference");
4958     if (sliced) {
4959         if (gimme == G_VOID)
4960             SP = ORIGMARK;
4961         else if (gimme == G_SCALAR) {
4962             MARK = ORIGMARK;
4963             if (SP > MARK)
4964                 *++MARK = *SP;
4965             else
4966                 *++MARK = &PL_sv_undef;
4967             SP = MARK;
4968         }
4969     }
4970     else if (gimme != G_VOID)
4971         PUSHs(*unsliced_keysv);
4972
4973     RETURN;
4974 }
4975
4976 PP(pp_delete)
4977 {
4978     dSP;
4979     U8 gimme;
4980     I32 discard;
4981
4982     if (PL_op->op_private & OPpLVAL_INTRO)
4983         return do_delete_local();
4984
4985     gimme = GIMME_V;
4986     discard = (gimme == G_VOID) ? G_DISCARD : 0;
4987
4988     if (PL_op->op_private & OPpSLICE) {
4989         dMARK; dORIGMARK;
4990         HV * const hv = MUTABLE_HV(POPs);
4991         const U32 hvtype = SvTYPE(hv);
4992         if (hvtype == SVt_PVHV) {                       /* hash element */
4993             while (++MARK <= SP) {
4994                 SV * const sv = hv_delete_ent(hv, *MARK, discard, 0);
4995                 *MARK = sv ? sv : &PL_sv_undef;
4996             }
4997         }
4998         else if (hvtype == SVt_PVAV) {                  /* array element */
4999             if (PL_op->op_flags & OPf_SPECIAL) {
5000                 while (++MARK <= SP) {
5001                     SV * const sv = av_delete(MUTABLE_AV(hv), SvIV(*MARK), discard);
5002                     *MARK = sv ? sv : &PL_sv_undef;
5003                 }
5004             }
5005         }
5006         else
5007             DIE(aTHX_ "Not a HASH reference");
5008         if (discard)
5009             SP = ORIGMARK;
5010         else if (gimme == G_SCALAR) {
5011             MARK = ORIGMARK;
5012             if (SP > MARK)
5013                 *++MARK = *SP;
5014             else
5015                 *++MARK = &PL_sv_undef;
5016             SP = MARK;
5017         }
5018     }
5019     else {
5020         SV *keysv = POPs;
5021         HV * const hv = MUTABLE_HV(POPs);
5022         SV *sv = NULL;
5023         if (SvTYPE(hv) == SVt_PVHV)
5024             sv = hv_delete_ent(hv, keysv, discard, 0);
5025         else if (SvTYPE(hv) == SVt_PVAV) {
5026             if (PL_op->op_flags & OPf_SPECIAL)
5027                 sv = av_delete(MUTABLE_AV(hv), SvIV(keysv), discard);
5028             else
5029                 DIE(aTHX_ "panic: avhv_delete no longer supported");
5030         }
5031         else
5032             DIE(aTHX_ "Not a HASH reference");
5033         if (!sv)
5034             sv = &PL_sv_undef;
5035         if (!discard)
5036             PUSHs(sv);
5037     }
5038     RETURN;
5039 }
5040
5041 PP(pp_exists)
5042 {
5043     dSP;
5044     SV *tmpsv;
5045     HV *hv;
5046
5047     if (UNLIKELY( PL_op->op_private & OPpEXISTS_SUB )) {
5048         GV *gv;
5049         SV * const sv = POPs;
5050         CV * const cv = sv_2cv(sv, &hv, &gv, 0);
5051         if (cv)
5052             RETPUSHYES;
5053         if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
5054             RETPUSHYES;
5055         RETPUSHNO;
5056     }
5057     tmpsv = POPs;
5058     hv = MUTABLE_HV(POPs);
5059     if (LIKELY( SvTYPE(hv) == SVt_PVHV )) {
5060         if (hv_exists_ent(hv, tmpsv, 0))
5061             RETPUSHYES;
5062     }
5063     else if (SvTYPE(hv) == SVt_PVAV) {
5064         if (PL_op->op_flags & OPf_SPECIAL) {            /* array element */
5065             if (av_exists(MUTABLE_AV(hv), SvIV(tmpsv)))
5066                 RETPUSHYES;
5067         }
5068     }
5069     else {
5070         DIE(aTHX_ "Not a HASH reference");
5071     }
5072     RETPUSHNO;
5073 }
5074
5075 PP(pp_hslice)
5076 {
5077     dSP; dMARK; dORIGMARK;
5078     HV * const hv = MUTABLE_HV(POPs);
5079     const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
5080     const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
5081     bool can_preserve = FALSE;
5082
5083     if (localizing) {
5084         MAGIC *mg;
5085         HV *stash;
5086
5087         if (SvCANEXISTDELETE(hv))
5088             can_preserve = TRUE;
5089     }
5090
5091     while (++MARK <= SP) {
5092         SV * const keysv = *MARK;
5093         SV **svp;
5094         HE *he;
5095         bool preeminent = TRUE;
5096
5097         if (localizing && can_preserve) {
5098             /* If we can determine whether the element exist,
5099              * try to preserve the existenceness of a tied hash
5100              * element by using EXISTS and DELETE if possible.
5101              * Fallback to FETCH and STORE otherwise. */
5102             preeminent = hv_exists_ent(hv, keysv, 0);
5103         }
5104
5105         he = hv_fetch_ent(hv, keysv, lval, 0);
5106         svp = he ? &HeVAL(he) : NULL;
5107
5108         if (lval) {
5109             if (!svp || !*svp || *svp == &PL_sv_undef) {
5110                 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
5111             }
5112             if (localizing) {
5113                 if (HvNAME_get(hv) && isGV(*svp))
5114                     save_gp(MUTABLE_GV(*svp), !(PL_op->op_flags & OPf_SPECIAL));
5115                 else if (preeminent)
5116                     save_helem_flags(hv, keysv, svp,
5117                          (PL_op->op_flags & OPf_SPECIAL) ? 0 : SAVEf_SETMAGIC);
5118                 else
5119                     SAVEHDELETE(hv, keysv);
5120             }
5121         }
5122         *MARK = svp && *svp ? *svp : &PL_sv_undef;
5123     }
5124     if (GIMME_V != G_ARRAY) {
5125         MARK = ORIGMARK;
5126         *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
5127         SP = MARK;
5128     }
5129     RETURN;
5130 }
5131
5132 PP(pp_kvhslice)
5133 {
5134     dSP; dMARK;
5135     HV * const hv = MUTABLE_HV(POPs);
5136     I32 lval = (PL_op->op_flags & OPf_MOD);
5137     SSize_t items = SP - MARK;
5138
5139     if (PL_op->op_private & OPpMAYBE_LVSUB) {
5140        const I32 flags = is_lvalue_sub();
5141        if (flags) {
5142            if (!(flags & OPpENTERSUB_INARGS))
5143                /* diag_listed_as: Can't modify %s in %s */
5144                Perl_croak(aTHX_ "Can't modify key/value hash slice in %s assignment",
5145                                  GIMME_V == G_ARRAY ? "list" : "scalar");
5146            lval = flags;
5147        }
5148     }
5149
5150     MEXTEND(SP,items);
5151     while (items > 1) {
5152         *(MARK+items*2-1) = *(MARK+items);
5153         items--;
5154     }
5155     items = SP-MARK;
5156     SP += items;
5157
5158     while (++MARK <= SP) {
5159         SV * const keysv = *MARK;
5160         SV **svp;
5161         HE *he;
5162
5163         he = hv_fetch_ent(hv, keysv, lval, 0);
5164         svp = he ? &HeVAL(he) : NULL;
5165
5166         if (lval) {
5167             if (!svp || !*svp || *svp == &PL_sv_undef) {
5168                 DIE(aTHX_ PL_no_helem_sv, SVfARG(keysv));
5169             }
5170             *MARK = sv_mortalcopy(*MARK);
5171         }
5172         *++MARK = svp && *svp ? *svp : &PL_sv_undef;
5173     }
5174     if (GIMME_V != G_ARRAY) {
5175         MARK = SP - items*2;
5176         *++MARK = items > 0 ? *SP : &PL_sv_undef;
5177         SP = MARK;
5178     }
5179     RETURN;
5180 }
5181
5182 /* List operators. */
5183
5184 PP(pp_list)
5185 {
5186     I32 markidx = POPMARK;
5187     if (GIMME_V != G_ARRAY) {
5188         SV **mark = PL_stack_base + markidx;
5189         dSP;
5190         if (++MARK <= SP)
5191             *MARK = *SP;                /* unwanted list, return last item */
5192         else
5193             *MARK = &PL_sv_undef;
5194         SP = MARK;
5195         PUTBACK;
5196     }
5197     return NORMAL;
5198 }
5199
5200 PP(pp_lslice)
5201 {
5202     dSP;
5203     SV ** const lastrelem = PL_stack_sp;
5204     SV ** const lastlelem = PL_stack_base + POPMARK;
5205     SV ** const firstlelem = PL_stack_base + POPMARK + 1;
5206     SV ** const firstrelem = lastlelem + 1;
5207     const U8 mod = PL_op->op_flags & OPf_MOD;
5208
5209     const I32 max = lastrelem - lastlelem;
5210     SV **lelem;
5211
5212     if (GIMME_V != G_ARRAY) {
5213         if (lastlelem < firstlelem) {
5214             *firstlelem = &PL_sv_undef;
5215         }
5216         else {
5217             I32 ix = SvIV(*lastlelem);
5218             if (ix < 0)
5219                 ix += max;
5220             if (ix < 0 || ix >= max)
5221                 *firstlelem = &PL_sv_undef;
5222             else
5223                 *firstlelem = firstrelem[ix];
5224         }
5225         SP = firstlelem;
5226         RETURN;
5227     }
5228
5229     if (max == 0) {
5230         SP = firstlelem - 1;
5231         RETURN;
5232     }
5233
5234     for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
5235         I32 ix = SvIV(*lelem);
5236         if (ix < 0)
5237             ix += max;
5238         if (ix < 0 || ix >= max)
5239             *lelem = &PL_sv_undef;
5240         else {
5241             if (!(*lelem = firstrelem[ix]))
5242                 *lelem = &PL_sv_undef;
5243             else if (mod && SvPADTMP(*lelem)) {
5244                 *lelem = firstrelem[ix] = sv_mortalcopy(*lelem);
5245             }
5246         }
5247     }
5248     SP = lastlelem;
5249     RETURN;
5250 }
5251
5252 PP(pp_anonlist)
5253 {
5254     dSP; dMARK;
5255     const I32 items = SP - MARK;
5256     SV * const av = MUTABLE_SV(av_make(items, MARK+1));
5257     SP = MARK;
5258     mXPUSHs((PL_op->op_flags & OPf_SPECIAL)
5259             ? newRV_noinc(av) : av);
5260     RETURN;
5261 }
5262
5263 PP(pp_anonhash)
5264 {
5265     dSP; dMARK; dORIGMARK;
5266     HV* const hv = newHV();
5267     SV* const retval = sv_2mortal( PL_op->op_flags & OPf_SPECIAL
5268                                     ? newRV_noinc(MUTABLE_SV(hv))
5269                                     : MUTABLE_SV(hv) );
5270
5271     while (MARK < SP) {
5272         SV * const key =
5273             (MARK++, SvGMAGICAL(*MARK) ? sv_mortalcopy(*MARK) : *MARK);
5274         SV *val;
5275         if (MARK < SP)
5276         {
5277             MARK++;
5278             SvGETMAGIC(*MARK);
5279             val = newSV(0);
5280             sv_setsv_nomg(val, *MARK);
5281         }
5282         else
5283         {
5284             Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
5285             val = newSV(0);
5286         }
5287         (void)hv_store_ent(hv,key,val,0);
5288     }
5289     SP = ORIGMARK;
5290     XPUSHs(retval);
5291     RETURN;
5292 }
5293
5294 PP(pp_splice)
5295 {
5296     dSP; dMARK; dORIGMARK;
5297     int num_args = (SP - MARK);
5298     AV *ary = MUTABLE_AV(*++MARK);
5299     SV **src;
5300     SV **dst;
5301     SSize_t i;
5302     SSize_t offset;
5303     SSize_t length;
5304     SSize_t newlen;
5305     SSize_t after;
5306     SSize_t diff;
5307     const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
5308
5309     if (mg) {
5310         return Perl_tied_method(aTHX_ SV_CONST(SPLICE), mark - 1, MUTABLE_SV(ary), mg,
5311                                     GIMME_V | TIED_METHOD_ARGUMENTS_ON_STACK,
5312                                     sp - mark);
5313     }
5314
5315     SP++;
5316
5317     if (++MARK < SP) {
5318         offset = i = SvIV(*MARK);
5319         if (offset < 0)
5320             offset += AvFILLp(ary) + 1;
5321         if (offset < 0)
5322             DIE(aTHX_ PL_no_aelem, i);
5323         if (++MARK < SP) {
5324             length = SvIVx(*MARK++);
5325             if (length < 0) {
5326                 length += AvFILLp(ary) - offset + 1;
5327                 if (length < 0)
5328                     length = 0;
5329             }
5330         }
5331         else
5332             length = AvMAX(ary) + 1;            /* close enough to infinity */
5333     }
5334     else {
5335         offset = 0;
5336         length = AvMAX(ary) + 1;
5337     }
5338     if (offset > AvFILLp(ary) + 1) {
5339         if (num_args > 2)
5340             Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
5341         offset = AvFILLp(ary) + 1;
5342     }
5343     after = AvFILLp(ary) + 1 - (offset + length);
5344     if (after < 0) {                            /* not that much array */
5345         length += after;                        /* offset+length now in array */
5346         after = 0;
5347         if (!AvALLOC(ary))
5348             av_extend(ary, 0);
5349     }
5350
5351     /* At this point, MARK .. SP-1 is our new LIST */
5352
5353     newlen = SP - MARK;
5354     diff = newlen - length;
5355     if (newlen && !AvREAL(ary) && AvREIFY(ary))
5356         av_reify(ary);
5357
5358     /* make new elements SVs now: avoid problems if they're from the array */
5359     for (dst = MARK, i = newlen; i; i--) {
5360         SV * const h = *dst;
5361         *dst++ = newSVsv(h);
5362     }
5363
5364     if (diff < 0) {                             /* shrinking the area */
5365         SV **tmparyval = NULL;
5366         if (newlen) {
5367             Newx(tmparyval, newlen, SV*);       /* so remember insertion */
5368             Copy(MARK, tmparyval, newlen, SV*);
5369         }
5370
5371         MARK = ORIGMARK + 1;
5372         if (GIMME_V == G_ARRAY) {               /* copy return vals to stack */
5373             const bool real = cBOOL(AvREAL(ary));
5374             MEXTEND(MARK, length);
5375             if (real)
5376                 EXTEND_MORTAL(length);
5377             for (i = 0, dst = MARK; i < length; i++) {
5378                 if ((*dst = AvARRAY(ary)[i+offset])) {
5379                   if (real)
5380                     sv_2mortal(*dst);   /* free them eventually */
5381                 }
5382                 else
5383                     *dst = &PL_sv_undef;
5384                 dst++;
5385             }
5386             MARK += length - 1;
5387         }
5388         else {
5389             *MARK = AvARRAY(ary)[offset+length-1];
5390             if (AvREAL(ary)) {
5391                 sv_2mortal(*MARK);
5392                 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
5393                     SvREFCNT_dec(*dst++);       /* free them now */
5394             }
5395             if (!*MARK)
5396                 *MARK = &PL_sv_undef;
5397         }
5398         AvFILLp(ary) += diff;
5399
5400         /* pull up or down? */
5401
5402         if (offset < after) {                   /* easier to pull up */
5403             if (offset) {                       /* esp. if nothing to pull */
5404                 src = &AvARRAY(ary)[offset-1];
5405                 dst = src - diff;               /* diff is negative */
5406                 for (i = offset; i > 0; i--)    /* can't trust Copy */
5407                     *dst-- = *src--;
5408             }
5409             dst = AvARRAY(ary);
5410             AvARRAY(ary) = AvARRAY(ary) - diff; /* diff is negative */
5411             AvMAX(ary) += diff;
5412         }
5413         else {
5414             if (after) {                        /* anything to pull down? */
5415                 src = AvARRAY(ary) + offset + length;
5416                 dst = src + diff;               /* diff is negative */
5417                 Move(src, dst, after, SV*);
5418             }
5419             dst = &AvARRAY(ary)[AvFILLp(ary)+1];
5420                                                 /* avoid later double free */
5421         }
5422         i = -diff;
5423         while (i)
5424             dst[--i] = NULL;
5425         
5426         if (newlen) {
5427             Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
5428             Safefree(tmparyval);
5429         }
5430     }
5431     else {                                      /* no, expanding (or same) */
5432         SV** tmparyval = NULL;
5433         if (length) {
5434             Newx(tmparyval, length, SV*);       /* so remember deletion */
5435             Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
5436         }
5437
5438         if (diff > 0) {                         /* expanding */
5439             /* push up or down? */
5440             if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
5441                 if (offset) {
5442                     src = AvARRAY(ary);
5443                     dst = src - diff;
5444                     Move(src, dst, offset, SV*);
5445                 }
5446                 AvARRAY(ary) = AvARRAY(ary) - diff;/* diff is positive */
5447                 AvMAX(ary) += diff;
5448                 AvFILLp(ary) += diff;
5449             }
5450             else {
5451                 if (AvFILLp(ary) + diff >= AvMAX(ary))  /* oh, well */
5452                     av_extend(ary, AvFILLp(ary) + diff);
5453                 AvFILLp(ary) += diff;
5454
5455                 if (after) {
5456                     dst = AvARRAY(ary) + AvFILLp(ary);
5457                     src = dst - diff;
5458                     for (i = after; i; i--) {
5459                         *dst-- = *src--;
5460                     }
5461                 }
5462             }
5463         }
5464
5465         if (newlen) {
5466             Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
5467         }
5468
5469         MARK = ORIGMARK + 1;
5470         if (GIMME_V == G_ARRAY) {               /* copy return vals to stack */
5471             if (length) {
5472                 const bool real = cBOOL(AvREAL(ary));
5473                 if (real)
5474                     EXTEND_MORTAL(length);
5475                 for (i = 0, dst = MARK; i < length; i++) {
5476                     if ((*dst = tmparyval[i])) {
5477                       if (real)
5478                         sv_2mortal(*dst);       /* free them eventually */
5479                     }
5480                     else *dst = &PL_sv_undef;
5481                     dst++;
5482                 }
5483             }
5484             MARK += length - 1;
5485         }
5486         else if (length--) {
5487             *MARK = tmparyval[length];
5488             if (AvREAL(ary)) {
5489                 sv_2mortal(*MARK);
5490                 while (length-- > 0)
5491                     SvREFCNT_dec(tmparyval[length]);
5492             }
5493             if (!*MARK)
5494                 *MARK = &PL_sv_undef;
5495         }
5496         else
5497             *MARK = &PL_sv_undef;
5498         Safefree(tmparyval);
5499     }
5500
5501     if (SvMAGICAL(ary))
5502         mg_set(MUTABLE_SV(ary));
5503
5504     SP = MARK;
5505     RETURN;
5506 }
5507
5508 PP(pp_push)
5509 {
5510     dSP; dMARK; dORIGMARK; dTARGET;
5511     AV * const ary = MUTABLE_AV(*++MARK);
5512     const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
5513
5514     if (mg) {
5515         *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
5516         PUSHMARK(MARK);
5517         PUTBACK;
5518         ENTER_with_name("call_PUSH");
5519         call_sv(SV_CONST(PUSH),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
5520         LEAVE_with_name("call_PUSH");
5521         /* SPAGAIN; not needed: SP is assigned to immediately below */
5522     }
5523     else {
5524         /* PL_delaymagic is restored by JUMPENV_POP on dieing, so we
5525          * only need to save locally, not on the save stack */
5526         U16 old_delaymagic = PL_delaymagic;
5527
5528         if (SvREADONLY(ary) && MARK < SP) Perl_croak_no_modify();
5529         PL_delaymagic = DM_DELAY;
5530         for (++MARK; MARK <= SP; MARK++) {
5531             SV *sv;
5532             if (*MARK) SvGETMAGIC(*MARK);
5533             sv = newSV(0);
5534             if (*MARK)
5535                 sv_setsv_nomg(sv, *MARK);
5536             av_store(ary, AvFILLp(ary)+1, sv);
5537         }
5538         if (PL_delaymagic & DM_ARRAY_ISA)
5539             mg_set(MUTABLE_SV(ary));
5540         PL_delaymagic = old_delaymagic;
5541     }
5542     SP = ORIGMARK;
5543     if (OP_GIMME(PL_op, 0) != G_VOID) {
5544         PUSHi( AvFILL(ary) + 1 );
5545     }
5546     RETURN;
5547 }
5548
5549 /* also used for: pp_pop()*/
5550 PP(pp_shift)
5551 {
5552     dSP;
5553     AV * const av = PL_op->op_flags & OPf_SPECIAL
5554         ? MUTABLE_AV(GvAVn(PL_defgv)) : MUTABLE_AV(POPs);
5555     SV * const sv = PL_op->op_type == OP_SHIFT ? av_shift(av) : av_pop(av);
5556     EXTEND(SP, 1);
5557     assert (sv);
5558     if (AvREAL(av))
5559         (void)sv_2mortal(sv);
5560     PUSHs(sv);
5561     RETURN;
5562 }
5563
5564 PP(pp_unshift)
5565 {
5566     dSP; dMARK; dORIGMARK; dTARGET;
5567     AV *ary = MUTABLE_AV(*++MARK);
5568     const MAGIC * const mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied);
5569
5570     if (mg) {
5571         *MARK-- = SvTIED_obj(MUTABLE_SV(ary), mg);
5572         PUSHMARK(MARK);
5573         PUTBACK;
5574         ENTER_with_name("call_UNSHIFT");
5575         call_sv(SV_CONST(UNSHIFT),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
5576         LEAVE_with_name("call_UNSHIFT");
5577         /* SPAGAIN; not needed: SP is assigned to immediately below */
5578     }
5579     else {
5580         /* PL_delaymagic is restored by JUMPENV_POP on dieing, so we
5581          * only need to save locally, not on the save stack */
5582         U16 old_delaymagic = PL_delaymagic;
5583         SSize_t i = 0;
5584
5585         av_unshift(ary, SP - MARK);
5586         PL_delaymagic = DM_DELAY;
5587         while (MARK < SP) {
5588             SV * const sv = newSVsv(*++MARK);
5589             (void)av_store(ary, i++, sv);
5590         }
5591         if (PL_delaymagic & DM_ARRAY_ISA)
5592             mg_set(MUTABLE_SV(ary));
5593         PL_delaymagic = old_delaymagic;
5594     }
5595     SP = ORIGMARK;
5596     if (OP_GIMME(PL_op, 0) != G_VOID) {
5597         PUSHi( AvFILL(ary) + 1 );
5598     }
5599     RETURN;
5600 }
5601
5602 PP(pp_reverse)
5603 {
5604     dSP; dMARK;
5605
5606     if (GIMME_V == G_ARRAY) {
5607         if (PL_op->op_private & OPpREVERSE_INPLACE) {
5608             AV *av;
5609
5610             /* See pp_sort() */
5611             assert( MARK+1 == SP && *SP && SvTYPE(*SP) == SVt_PVAV);
5612             (void)POPMARK; /* remove mark associated with ex-OP_AASSIGN */
5613             av = MUTABLE_AV((*SP));
5614             /* In-place reversing only happens in void context for the array
5615              * assignment. We don't need to push anything on the stack. */
5616             SP = MARK;
5617
5618             if (SvMAGICAL(av)) {
5619                 SSize_t i, j;
5620                 SV *tmp = sv_newmortal();
5621                 /* For SvCANEXISTDELETE */
5622                 HV *stash;
5623                 const MAGIC *mg;
5624                 bool can_preserve = SvCANEXISTDELETE(av);
5625
5626                 for (i = 0, j = av_tindex(av); i < j; ++i, --j) {
5627                     SV *begin, *end;
5628
5629                     if (can_preserve) {
5630                         if (!av_exists(av, i)) {
5631                             if (av_exists(av, j)) {
5632                                 SV *sv = av_delete(av, j, 0);
5633                                 begin = *av_fetch(av, i, TRUE);
5634                                 sv_setsv_mg(begin, sv);
5635                             }
5636                             continue;
5637                         }
5638                         else if (!av_exists(av, j)) {
5639                             SV *sv = av_delete(av, i, 0);
5640                             end = *av_fetch(av, j, TRUE);
5641                             sv_setsv_mg(end, sv);
5642                             continue;
5643                         }
5644                     }
5645
5646                     begin = *av_fetch(av, i, TRUE);
5647                     end   = *av_fetch(av, j, TRUE);
5648                     sv_setsv(tmp,      begin);
5649                     sv_setsv_mg(begin, end);
5650                     sv_setsv_mg(end,   tmp);
5651                 }
5652             }
5653             else {
5654                 SV **begin = AvARRAY(av);
5655
5656                 if (begin) {
5657                     SV **end   = begin + AvFILLp(av);
5658
5659                     while (begin < end) {
5660                         SV * const tmp = *begin;
5661                         *begin++ = *end;
5662                         *end--   = tmp;
5663                     }
5664                 }
5665             }
5666         }
5667         else {
5668             SV **oldsp = SP;
5669             MARK++;
5670             while (MARK < SP) {
5671                 SV * const tmp = *MARK;
5672                 *MARK++ = *SP;
5673                 *SP--   = tmp;
5674             }
5675             /* safe as long as stack cannot get extended in the above */
5676             SP = oldsp;
5677         }
5678     }
5679     else {
5680         char *up;
5681         dTARGET;
5682         STRLEN len;
5683
5684         SvUTF8_off(TARG);                               /* decontaminate */
5685         if (SP - MARK > 1)
5686             do_join(TARG, &PL_sv_no, MARK, SP);
5687         else {
5688             sv_setsv(TARG, SP > MARK ? *SP : DEFSV);
5689         }
5690
5691         up = SvPV_force(TARG, len);
5692         if (len > 1) {
5693             char *down;
5694             if (DO_UTF8(TARG)) {        /* first reverse each character */
5695                 U8* s = (U8*)SvPVX(TARG);
5696                 const U8* send = (U8*)(s + len);
5697                 while (s < send) {
5698                     if (UTF8_IS_INVARIANT(*s)) {
5699                         s++;
5700                         continue;
5701                     }
5702                     else {
5703                         if (!utf8_to_uvchr_buf(s, send, 0))
5704                             break;
5705                         up = (char*)s;
5706                         s += UTF8SKIP(s);
5707                         down = (char*)(s - 1);
5708                         /* reverse this character */
5709                         while (down > up) {
5710                             const char tmp = *up;
5711                             *up++ = *down;
5712                             *down-- = tmp;
5713                         }
5714                     }
5715                 }
5716                 up = SvPVX(TARG);
5717             }
5718             down = SvPVX(TARG) + len - 1;
5719             while (down > up) {
5720                 const char tmp = *up;
5721                 *up++ = *down;
5722                 *down-- = tmp;
5723             }
5724             (void)SvPOK_only_UTF8(TARG);
5725         }
5726         SP = MARK + 1;
5727         SETTARG;
5728     }
5729     RETURN;
5730 }
5731
5732 PP(pp_split)
5733 {
5734     dSP; dTARG;
5735     AV *ary = (   (PL_op->op_private & OPpSPLIT_ASSIGN) /* @a = split */
5736                && (PL_op->op_flags & OPf_STACKED))      /* @{expr} = split */
5737                ? (AV *)POPs : NULL;
5738     IV limit = POPi;                    /* note, negative is forever */
5739     SV * const sv = POPs;
5740     STRLEN len;
5741     const char *s = SvPV_const(sv, len);
5742     const bool do_utf8 = DO_UTF8(sv);
5743     const char *strend = s + len;
5744     PMOP *pm = cPMOPx(PL_op);
5745     REGEXP *rx;
5746     SV *dstr;
5747     const char *m;
5748     SSize_t iters = 0;
5749     const STRLEN slen = do_utf8
5750                         ? utf8_length((U8*)s, (U8*)strend)
5751                         : (STRLEN)(strend - s);
5752     SSize_t maxiters = slen + 10;
5753     I32 trailing_empty = 0;
5754     const char *orig;
5755     const IV origlimit = limit;
5756     I32 realarray = 0;
5757     I32 base;
5758     const U8 gimme = GIMME_V;
5759     bool gimme_scalar;
5760     I32 oldsave = PL_savestack_ix;
5761     U32 make_mortal = SVs_TEMP;
5762     bool multiline = 0;
5763     MAGIC *mg = NULL;
5764
5765     rx = PM_GETRE(pm);
5766
5767     TAINT_IF(get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET &&
5768              (RX_EXTFLAGS(rx) & (RXf_WHITE | RXf_SKIPWHITE)));
5769
5770     /* handle @ary = split(...) optimisation */
5771     if (PL_op->op_private & OPpSPLIT_ASSIGN) {
5772         if (!(PL_op->op_flags & OPf_STACKED)) {
5773             if (PL_op->op_private & OPpSPLIT_LEX) {
5774                 if (PL_op->op_private & OPpLVAL_INTRO)
5775                     SAVECLEARSV(PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff));
5776                 ary = (AV *)PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff);
5777             }
5778             else {
5779                 GV *gv =
5780 #ifdef USE_ITHREADS
5781                         MUTABLE_GV(PAD_SVl(pm->op_pmreplrootu.op_pmtargetoff));
5782 #else
5783                         pm->op_pmreplrootu.op_pmtargetgv;
5784 #endif
5785                 if (PL_op->op_private & OPpLVAL_INTRO)
5786                     ary = save_ary(gv);
5787                 else
5788                     ary = GvAVn(gv);
5789             }
5790             /* skip anything pushed by OPpLVAL_INTRO above */
5791             oldsave = PL_savestack_ix;
5792         }
5793
5794         realarray = 1;
5795         PUTBACK;
5796         av_extend(ary,0);
5797         (void)sv_2mortal(SvREFCNT_inc_simple_NN(sv));
5798         av_clear(ary);
5799         SPAGAIN;
5800         if ((mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied))) {
5801             PUSHMARK(SP);
5802             XPUSHs(SvTIED_obj(MUTABLE_SV(ary), mg));
5803         }
5804         else {
5805             if (!AvREAL(ary)) {
5806                 I32 i;
5807                 AvREAL_on(ary);
5808                 AvREIFY_off(ary);
5809                 for (i = AvFILLp(ary); i >= 0; i--)
5810                     AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
5811             }
5812             /* temporarily switch stacks */
5813             SAVESWITCHSTACK(PL_curstack, ary);
5814             make_mortal = 0;
5815         }
5816     }
5817
5818     base = SP - PL_stack_base;
5819     orig = s;
5820     if (RX_EXTFLAGS(rx) & RXf_SKIPWHITE) {
5821         if (do_utf8) {
5822             while (s < strend && isSPACE_utf8_safe(s, strend))
5823                 s += UTF8SKIP(s);
5824         }
5825         else if (get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET) {
5826             while (s < strend && isSPACE_LC(*s))
5827                 s++;
5828         }
5829         else {
5830             while (s < strend && isSPACE(*s))
5831                 s++;
5832         }
5833     }
5834     if (RX_EXTFLAGS(rx) & RXf_PMf_MULTILINE) {
5835         multiline = 1;
5836     }
5837
5838     gimme_scalar = gimme == G_SCALAR && !ary;
5839
5840     if (!limit)
5841         limit = maxiters + 2;
5842     if (RX_EXTFLAGS(rx) & RXf_WHITE) {
5843         while (--limit) {
5844             m = s;
5845             /* this one uses 'm' and is a negative test */
5846             if (do_utf8) {
5847                 while (m < strend && ! isSPACE_utf8_safe(m, strend) ) {
5848                     const int t = UTF8SKIP(m);
5849                     /* isSPACE_utf8_safe returns FALSE for malform utf8 */
5850                     if (strend - m < t)
5851                         m = strend;
5852                     else
5853                         m += t;
5854                 }
5855             }
5856             else if (get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET)
5857             {
5858                 while (m < strend && !isSPACE_LC(*m))
5859                     ++m;
5860             } else {
5861                 while (m < strend && !isSPACE(*m))
5862                     ++m;
5863             }  
5864             if (m >= strend)
5865                 break;
5866
5867             if (gimme_scalar) {
5868                 iters++;
5869                 if (m-s == 0)
5870                     trailing_empty++;
5871                 else
5872                     trailing_empty = 0;
5873             } else {
5874                 dstr = newSVpvn_flags(s, m-s,
5875                                       (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
5876                 XPUSHs(dstr);
5877             }
5878
5879             /* skip the whitespace found last */
5880             if (do_utf8)
5881                 s = m + UTF8SKIP(m);
5882             else
5883                 s = m + 1;
5884
5885             /* this one uses 's' and is a positive test */
5886             if (do_utf8) {
5887                 while (s < strend && isSPACE_utf8_safe(s, strend) )
5888                     s +=  UTF8SKIP(s);
5889             }
5890             else if (get_regex_charset(RX_EXTFLAGS(rx)) == REGEX_LOCALE_CHARSET)
5891             {
5892                 while (s < strend && isSPACE_LC(*s))
5893                     ++s;
5894             } else {
5895                 while (s < strend && isSPACE(*s))
5896                     ++s;
5897             }       
5898         }
5899     }
5900     else if (RX_EXTFLAGS(rx) & RXf_START_ONLY) {
5901         while (--limit) {
5902             for (m = s; m < strend && *m != '\n'; m++)
5903                 ;
5904             m++;
5905             if (m >= strend)
5906                 break;
5907
5908             if (gimme_scalar) {
5909                 iters++;
5910                 if (m-s == 0)
5911                     trailing_empty++;
5912                 else
5913                     trailing_empty = 0;
5914             } else {
5915                 dstr = newSVpvn_flags(s, m-s,
5916                                       (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
5917                 XPUSHs(dstr);
5918             }
5919             s = m;
5920         }
5921     }
5922     else if (RX_EXTFLAGS(rx) & RXf_NULL && !(s >= strend)) {
5923         /*
5924           Pre-extend the stack, either the number of bytes or
5925           characters in the string or a limited amount, triggered by:
5926
5927           my ($x, $y) = split //, $str;
5928             or
5929           split //, $str, $i;
5930         */
5931         if (!gimme_scalar) {
5932             const IV items = limit - 1;
5933             /* setting it to -1 will trigger a panic in EXTEND() */
5934             const SSize_t sslen = slen > SSize_t_MAX ?  -1 : (SSize_t)slen;
5935             if (items >=0 && items < sslen)
5936                 EXTEND(SP, items);
5937             else
5938                 EXTEND(SP, sslen);
5939         }
5940
5941         if (do_utf8) {
5942             while (--limit) {
5943                 /* keep track of how many bytes we skip over */
5944                 m = s;
5945                 s += UTF8SKIP(s);
5946                 if (gimme_scalar) {
5947                     iters++;
5948                     if (s-m == 0)
5949                         trailing_empty++;
5950                     else
5951                         trailing_empty = 0;
5952                 } else {
5953                     dstr = newSVpvn_flags(m, s-m, SVf_UTF8 | make_mortal);
5954
5955                     PUSHs(dstr);
5956                 }
5957
5958                 if (s >= strend)
5959                     break;
5960             }
5961         } else {
5962             while (--limit) {
5963                 if (gimme_scalar) {
5964                     iters++;
5965                 } else {
5966                     dstr = newSVpvn(s, 1);
5967
5968
5969                     if (make_mortal)
5970                         sv_2mortal(dstr);
5971
5972                     PUSHs(dstr);
5973                 }
5974
5975                 s++;
5976
5977                 if (s >= strend)
5978                     break;
5979             }
5980         }
5981     }
5982     else if (do_utf8 == (RX_UTF8(rx) != 0) &&
5983              (RX_EXTFLAGS(rx) & RXf_USE_INTUIT) && !RX_NPARENS(rx)
5984              && (RX_EXTFLAGS(rx) & RXf_CHECK_ALL)
5985              && !(RX_EXTFLAGS(rx) & RXf_IS_ANCHORED)) {
5986         const int tail = (RX_EXTFLAGS(rx) & RXf_INTUIT_TAIL);
5987         SV * const csv = CALLREG_INTUIT_STRING(rx);
5988
5989         len = RX_MINLENRET(rx);
5990         if (len == 1 && !RX_UTF8(rx) && !tail) {
5991             const char c = *SvPV_nolen_const(csv);
5992             while (--limit) {
5993                 for (m = s; m < strend && *m != c; m++)
5994                     ;
5995                 if (m >= strend)
5996                     break;
5997                 if (gimme_scalar) {
5998                     iters++;
5999                     if (m-s == 0)
6000                         trailing_empty++;
6001                     else
6002                         trailing_empty = 0;
6003                 } else {
6004                     dstr = newSVpvn_flags(s, m-s,
6005                                          (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
6006                     XPUSHs(dstr);
6007                 }
6008                 /* The rx->minlen is in characters but we want to step
6009                  * s ahead by bytes. */
6010                 if (do_utf8)
6011                     s = (char*)utf8_hop((U8*)m, len);
6012                 else
6013                     s = m + len; /* Fake \n at the end */
6014             }
6015         }
6016         else {
6017             while (s < strend && --limit &&
6018               (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
6019                              csv, multiline ? FBMrf_MULTILINE : 0)) )
6020             {
6021                 if (gimme_scalar) {
6022                     iters++;
6023                     if (m-s == 0)
6024                         trailing_empty++;
6025                     else
6026                         trailing_empty = 0;
6027                 } else {
6028                     dstr = newSVpvn_flags(s, m-s,
6029                                          (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
6030                     XPUSHs(dstr);
6031                 }
6032                 /* The rx->minlen is in characters but we want to step
6033                  * s ahead by bytes. */
6034                 if (do_utf8)
6035                     s = (char*)utf8_hop((U8*)m, len);
6036                 else
6037                     s = m + len; /* Fake \n at the end */
6038             }
6039         }
6040     }
6041     else {
6042         maxiters += slen * RX_NPARENS(rx);
6043         while (s < strend && --limit)
6044         {
6045             I32 rex_return;
6046             PUTBACK;
6047             rex_return = CALLREGEXEC(rx, (char*)s, (char*)strend, (char*)orig, 1,
6048                                      sv, NULL, 0);
6049             SPAGAIN;
6050             if (rex_return == 0)
6051                 break;
6052             TAINT_IF(RX_MATCH_TAINTED(rx));
6053             /* we never pass the REXEC_COPY_STR flag, so it should
6054              * never get copied */
6055             assert(!RX_MATCH_COPIED(rx));
6056             m = RX_OFFS(rx)[0].start + orig;
6057
6058             if (gimme_scalar) {
6059                 iters++;
6060                 if (m-s == 0)
6061                     trailing_empty++;
6062                 else
6063                     trailing_empty = 0;
6064             } else {
6065                 dstr = newSVpvn_flags(s, m-s,
6066                                       (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
6067                 XPUSHs(dstr);
6068             }
6069             if (RX_NPARENS(rx)) {
6070                 I32 i;
6071                 for (i = 1; i <= (I32)RX_NPARENS(rx); i++) {
6072                     s = RX_OFFS(rx)[i].start + orig;
6073                     m = RX_OFFS(rx)[i].end + orig;
6074
6075                     /* japhy (07/27/01) -- the (m && s) test doesn't catch
6076                        parens that didn't match -- they should be set to
6077                        undef, not the empty string */
6078                     if (gimme_scalar) {
6079                         iters++;
6080                         if (m-s == 0)
6081                             trailing_empty++;
6082                         else
6083                             trailing_empty = 0;
6084                     } else {
6085                         if (m >= orig && s >= orig) {
6086                             dstr = newSVpvn_flags(s, m-s,
6087                                                  (do_utf8 ? SVf_UTF8 : 0)
6088                                                   | make_mortal);
6089                         }
6090                         else
6091                             dstr = &PL_sv_undef;  /* undef, not "" */
6092                         XPUSHs(dstr);
6093                     }
6094
6095                 }
6096             }
6097             s = RX_OFFS(rx)[0].end + orig;
6098         }
6099     }
6100
6101     if (!gimme_scalar) {
6102         iters = (SP - PL_stack_base) - base;
6103     }
6104     if (iters > maxiters)
6105         DIE(aTHX_ "Split loop");
6106
6107     /* keep field after final delim? */
6108     if (s < strend || (iters && origlimit)) {
6109         if (!gimme_scalar) {
6110             const STRLEN l = strend - s;
6111             dstr = newSVpvn_flags(s, l, (do_utf8 ? SVf_UTF8 : 0) | make_mortal);
6112             XPUSHs(dstr);
6113         }
6114         iters++;
6115     }
6116     else if (!origlimit) {
6117         if (gimme_scalar) {
6118             iters -= trailing_empty;
6119         } else {
6120             while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
6121                 if (TOPs && !make_mortal)
6122                     sv_2mortal(TOPs);
6123                 *SP-- = NULL;
6124                 iters--;
6125             }
6126         }
6127     }
6128
6129     PUTBACK;
6130     LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */
6131     SPAGAIN;
6132     if (realarray) {
6133         if (!mg) {
6134             if (SvSMAGICAL(ary)) {
6135                 PUTBACK;
6136                 mg_set(MUTABLE_SV(ary));
6137                 SPAGAIN;
6138             }
6139             if (gimme == G_ARRAY) {
6140                 EXTEND(SP, iters);
6141                 Copy(AvARRAY(ary), SP + 1, iters, SV*);
6142                 SP += iters;
6143                 RETURN;
6144             }
6145         }
6146         else {
6147             PUTBACK;
6148             ENTER_with_name("call_PUSH");
6149             call_sv(SV_CONST(PUSH),G_SCALAR|G_DISCARD|G_METHOD_NAMED);
6150             LEAVE_with_name("call_PUSH");
6151             SPAGAIN;
6152             if (gimme == G_ARRAY) {
6153                 SSize_t i;
6154                 /* EXTEND should not be needed - we just popped them */
6155                 EXTEND(SP, iters);
6156                 for (i=0; i < iters; i++) {
6157                     SV **svp = av_fetch(ary, i, FALSE);
6158                     PUSHs((svp) ? *svp : &PL_sv_undef);
6159                 }
6160                 RETURN;
6161             }
6162         }
6163     }
6164     else {
6165         if (gimme == G_ARRAY)
6166             RETURN;
6167     }
6168
6169     GETTARGET;
6170     XPUSHi(iters);
6171     RETURN;
6172 }
6173
6174 PP(pp_once)
6175 {
6176     dSP;
6177     SV *const sv = PAD_SVl(PL_op->op_targ);
6178
6179     if (SvPADSTALE(sv)) {
6180         /* First time. */
6181         SvPADSTALE_off(sv);
6182         RETURNOP(cLOGOP->op_other);
6183     }
6184     RETURNOP(cLOGOP->op_next);
6185 }
6186
6187 PP(pp_lock)
6188 {
6189     dSP;
6190     dTOPss;
6191     SV *retsv = sv;
6192     SvLOCK(sv);
6193     if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
6194      || SvTYPE(retsv) == SVt_PVCV) {
6195         retsv = refto(retsv);
6196     }
6197     SETs(retsv);
6198     RETURN;
6199 }
6200
6201
6202 /* used for: pp_padany(), pp_custom(); plus any system ops
6203  * that aren't implemented on a particular platform */
6204
6205 PP(unimplemented_op)
6206 {
6207     const Optype op_type = PL_op->op_type;
6208     /* Using OP_NAME() isn't going to be helpful here. Firstly, it doesn't cope
6209        with out of range op numbers - it only "special" cases op_custom.
6210        Secondly, as the three ops we "panic" on are padmy, mapstart and custom,
6211        if we get here for a custom op then that means that the custom op didn't
6212        have an implementation. Given that OP_NAME() looks up the custom op
6213        by its pp_addr, likely it will return NULL, unless someone (unhelpfully)
6214        registers &PL_unimplemented_op as the address of their custom op.
6215        NULL doesn't generate a useful error message. "custom" does. */
6216     const char *const name = op_type >= OP_max
6217         ? "[out of range]" : PL_op_name[PL_op->op_type];
6218     if(OP_IS_SOCKET(op_type))
6219         DIE(aTHX_ PL_no_sock_func, name);
6220     DIE(aTHX_ "panic: unimplemented op %s (#%d) called", name,  op_type);
6221 }
6222
6223 static void
6224 S_maybe_unwind_defav(pTHX)
6225 {
6226     if (CX_CUR()->cx_type & CXp_HASARGS) {
6227         PERL_CONTEXT *cx = CX_CUR();
6228
6229         assert(CxHASARGS(cx));
6230         cx_popsub_args(cx);
6231         cx->cx_type &= ~CXp_HASARGS;
6232     }
6233 }
6234
6235 /* For sorting out arguments passed to a &CORE:: subroutine */
6236 PP(pp_coreargs)
6237 {
6238     dSP;
6239     int opnum = SvIOK(cSVOP_sv) ? (int)SvUV(cSVOP_sv) : 0;
6240     int defgv = PL_opargs[opnum] & OA_DEFGV ||opnum==OP_GLOB, whicharg = 0;
6241     AV * const at_ = GvAV(PL_defgv);
6242     SV **svp = at_ ? AvARRAY(at_) : NULL;
6243     I32 minargs = 0, maxargs = 0, numargs = at_ ? AvFILLp(at_)+1 : 0;
6244     I32 oa = opnum ? PL_opargs[opnum] >> OASHIFT : 0;
6245     bool seen_question = 0;
6246     const char *err = NULL;
6247     const bool pushmark = PL_op->op_private & OPpCOREARGS_PUSHMARK;
6248
6249     /* Count how many args there are first, to get some idea how far to
6250        extend the stack. */
6251     while (oa) {
6252         if ((oa & 7) == OA_LIST) { maxargs = I32_MAX; break; }
6253         maxargs++;
6254         if (oa & OA_OPTIONAL) seen_question = 1;
6255         if (!seen_question) minargs++;
6256         oa >>= 4;
6257     }
6258
6259     if(numargs < minargs) err = "Not enough";
6260     else if(numargs > maxargs) err = "Too many";
6261     if (err)
6262         /* diag_listed_as: Too many arguments for %s */
6263         Perl_croak(aTHX_
6264           "%s arguments for %s", err,
6265            opnum ? PL_op_desc[opnum] : SvPV_nolen_const(cSVOP_sv)
6266         );
6267
6268     /* Reset the stack pointer.  Without this, we end up returning our own
6269        arguments in list context, in addition to the values we are supposed
6270        to return.  nextstate usually does this on sub entry, but we need
6271        to run the next op with the caller's hints, so we cannot have a
6272        nextstate. */
6273     SP = PL_stack_base + CX_CUR()->blk_oldsp;
6274
6275     if(!maxargs) RETURN;
6276
6277     /* We do this here, rather than with a separate pushmark op, as it has
6278        to come in between two things this function does (stack reset and
6279        arg pushing).  This seems the easiest way to do it. */
6280     if (pushmark) {
6281         PUTBACK;
6282         (void)Perl_pp_pushmark(aTHX);
6283     }
6284
6285     EXTEND(SP, maxargs == I32_MAX ? numargs : maxargs);
6286     PUTBACK; /* The code below can die in various places. */
6287
6288     oa = PL_opargs[opnum] >> OASHIFT;
6289     for (; oa&&(numargs||!pushmark); (void)(numargs&&(++svp,--numargs))) {
6290         whicharg++;
6291         switch (oa & 7) {
6292         case OA_SCALAR:
6293           try_defsv:
6294             if (!numargs && defgv && whicharg == minargs + 1) {
6295                 PUSHs(DEFSV);
6296             }
6297             else PUSHs(numargs ? svp && *svp ? *svp : &PL_sv_undef : NULL);
6298             break;
6299         case OA_LIST:
6300             while (numargs--) {
6301                 PUSHs(svp && *svp ? *svp : &PL_sv_undef);
6302                 svp++;
6303             }
6304             RETURN;
6305         case OA_AVREF:
6306             if (!numargs) {
6307                 GV *gv;
6308                 if (CvUNIQUE(find_runcv_where(FIND_RUNCV_level_eq,1,NULL)))
6309                     gv = PL_argvgv;
6310                 else {
6311                     S_maybe_unwind_defav(aTHX);
6312                     gv = PL_defgv;
6313                 }
6314                 PUSHs((SV *)GvAVn(gv));
6315                 break;
6316             }
6317             if (!svp || !*svp || !SvROK(*svp)
6318              || SvTYPE(SvRV(*svp)) != SVt_PVAV)
6319                 DIE(aTHX_
6320                 /* diag_listed_as: Type of arg %d to &CORE::%s must be %s*/
6321                  "Type of arg %d to &CORE::%s must be array reference",
6322                   whicharg, PL_op_desc[opnum]
6323                 );
6324             PUSHs(SvRV(*svp));
6325             break;
6326         case OA_HVREF:
6327             if (!svp || !*svp || !SvROK(*svp)
6328              || (  SvTYPE(SvRV(*svp)) != SVt_PVHV
6329                 && (  opnum == OP_DBMCLOSE || opnum == OP_DBMOPEN
6330                    || SvTYPE(SvRV(*svp)) != SVt_PVAV  )))
6331                 DIE(aTHX_
6332                 /* diag_listed_as: Type of arg %d to &CORE::%s must be %s*/
6333                  "Type of arg %d to &CORE::%s must be hash%s reference",
6334                   whicharg, PL_op_desc[opnum],
6335                   opnum == OP_DBMCLOSE || opnum == OP_DBMOPEN
6336                      ? ""
6337                      : " or array"
6338                 );
6339             PUSHs(SvRV(*svp));
6340             break;
6341         case OA_FILEREF:
6342             if (!numargs) PUSHs(NULL);
6343             else if(svp && *svp && SvROK(*svp) && isGV_with_GP(SvRV(*svp)))
6344                 /* no magic here, as the prototype will have added an extra
6345                    refgen and we just want what was there before that */
6346                 PUSHs(SvRV(*svp));
6347             else {
6348                 const bool constr = PL_op->op_private & whicharg;
6349                 PUSHs(S_rv2gv(aTHX_
6350                     svp && *svp ? *svp : &PL_sv_undef,
6351                     constr, cBOOL(CopHINTS_get(PL_curcop) & HINT_STRICT_REFS),
6352                     !constr
6353                 ));
6354             }
6355             break;
6356         case OA_SCALARREF:
6357           if (!numargs) goto try_defsv;
6358           else {
6359             const bool wantscalar =
6360                 PL_op->op_private & OPpCOREARGS_SCALARMOD;
6361             if (!svp || !*svp || !SvROK(*svp)
6362                 /* We have to permit globrefs even for the \$ proto, as
6363                    *foo is indistinguishable from ${\*foo}, and the proto-
6364                    type permits the latter. */
6365              || SvTYPE(SvRV(*svp)) > (
6366                      wantscalar       ? SVt_PVLV
6367                    : opnum == OP_LOCK || opnum == OP_UNDEF
6368                                       ? SVt_PVCV
6369                    :                    SVt_PVHV
6370                 )
6371                )
6372                 DIE(aTHX_
6373                  "Type of arg %d to &CORE::%s must be %s",
6374                   whicharg, PL_op_name[opnum],
6375                   wantscalar
6376                     ? "scalar reference"
6377                     : opnum == OP_LOCK || opnum == OP_UNDEF
6378                        ? "reference to one of [$@%&*]"
6379                        : "reference to one of [$@%*]"
6380                 );
6381             PUSHs(SvRV(*svp));
6382             if (opnum == OP_UNDEF && SvRV(*svp) == (SV *)PL_defgv) {
6383                 /* Undo @_ localisation, so that sub exit does not undo
6384                    part of our undeffing. */
6385                 S_maybe_unwind_defav(aTHX);
6386             }
6387           }
6388           break;
6389         default:
6390             DIE(aTHX_ "panic: unknown OA_*: %x", (unsigned)(oa&7));
6391         }
6392         oa = oa >> 4;
6393     }
6394
6395     RETURN;
6396 }
6397
6398 PP(pp_avhvswitch)
6399 {
6400     dVAR; dSP;
6401     return PL_ppaddr[
6402                 (SvTYPE(TOPs) == SVt_PVAV ? OP_AEACH : OP_EACH)
6403                     + (PL_op->op_private & OPpAVHVSWITCH_MASK)
6404            ](aTHX);
6405 }
6406
6407 PP(pp_runcv)
6408 {
6409     dSP;
6410     CV *cv;
6411     if (PL_op->op_private & OPpOFFBYONE) {
6412         cv = find_runcv_where(FIND_RUNCV_level_eq, 1, NULL);
6413     }
6414     else cv = find_runcv(NULL);
6415     XPUSHs(CvEVAL(cv) ? &PL_sv_undef : sv_2mortal(newRV((SV *)cv)));
6416     RETURN;
6417 }
6418
6419 static void
6420 S_localise_aelem_lval(pTHX_ AV * const av, SV * const keysv,
6421                             const bool can_preserve)
6422 {
6423     const SSize_t ix = SvIV(keysv);
6424     if (can_preserve ? av_exists(av, ix) : TRUE) {
6425         SV ** const svp = av_fetch(av, ix, 1);
6426         if (!svp || !*svp)
6427             Perl_croak(aTHX_ PL_no_aelem, ix);
6428         save_aelem(av, ix, svp);
6429     }
6430     else
6431         SAVEADELETE(av, ix);
6432 }
6433
6434 static void
6435 S_localise_helem_lval(pTHX_ HV * const hv, SV * const keysv,
6436                             const bool can_preserve)
6437 {
6438     if (can_preserve ? hv_exists_ent(hv, keysv, 0) : TRUE) {
6439         HE * const he = hv_fetch_ent(hv, keysv, 1, 0);
6440         SV ** const svp = he ? &HeVAL(he) : NULL;
6441         if (!svp || !*svp)
6442             Perl_croak(aTHX_ PL_no_helem_sv, SVfARG(keysv));
6443         save_helem_flags(hv, keysv, svp, 0);
6444     }
6445     else
6446         SAVEHDELETE(hv, keysv);
6447 }
6448
6449 static void
6450 S_localise_gv_slot(pTHX_ GV *gv, U8 type)
6451 {
6452     if (type == OPpLVREF_SV) {
6453         save_pushptrptr(gv, SvREFCNT_inc_simple(GvSV(gv)), SAVEt_GVSV);
6454         GvSV(gv) = 0;
6455     }
6456     else if (type == OPpLVREF_AV)
6457         /* XXX Inefficient, as it creates a new AV, which we are
6458                about to clobber.  */
6459         save_ary(gv);
6460     else {
6461         assert(type == OPpLVREF_HV);
6462         /* XXX Likewise inefficient.  */
6463         save_hash(gv);
6464     }
6465 }
6466
6467
6468 PP(pp_refassign)
6469 {
6470     dSP;
6471     SV * const key = PL_op->op_private & OPpLVREF_ELEM ? POPs : NULL;
6472     SV * const left = PL_op->op_flags & OPf_STACKED ? POPs : NULL;
6473     dTOPss;
6474     const char *bad = NULL;
6475     const U8 type = PL_op->op_private & OPpLVREF_TYPE;
6476     if (!SvROK(sv)) DIE(aTHX_ "Assigned value is not a reference");
6477     switch (type) {
6478     case OPpLVREF_SV:
6479         if (SvTYPE(SvRV(sv)) > SVt_PVLV)
6480             bad = " SCALAR";
6481         break;
6482     case OPpLVREF_AV:
6483         if (SvTYPE(SvRV(sv)) != SVt_PVAV)
6484             bad = "n ARRAY";
6485         break;
6486     case OPpLVREF_HV:
6487         if (SvTYPE(SvRV(sv)) != SVt_PVHV)
6488             bad = " HASH";
6489         break;
6490     case OPpLVREF_CV:
6491         if (SvTYPE(SvRV(sv)) != SVt_PVCV)
6492             bad = " CODE";
6493     }
6494     if (bad)
6495         /* diag_listed_as: Assigned value is not %s reference */
6496         DIE(aTHX_ "Assigned value is not a%s reference", bad);
6497     {
6498     MAGIC *mg;
6499     HV *stash;
6500     switch (left ? SvTYPE(left) : 0) {
6501     case 0:
6502     {
6503         SV * const old = PAD_SV(ARGTARG);
6504         PAD_SETSV(ARGTARG, SvREFCNT_inc_NN(SvRV(sv)));
6505         SvREFCNT_dec(old);
6506         if ((PL_op->op_private & (OPpLVAL_INTRO|OPpPAD_STATE))
6507                 == OPpLVAL_INTRO)
6508             SAVECLEARSV(PAD_SVl(ARGTARG));
6509         break;
6510     }
6511     case SVt_PVGV:
6512         if (PL_op->op_private & OPpLVAL_INTRO) {
6513             S_localise_gv_slot(aTHX_ (GV *)left, type);
6514         }
6515         gv_setref(left, sv);
6516         SvSETMAGIC(left);
6517         break;
6518     case SVt_PVAV:
6519         assert(key);
6520         if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO)) {
6521             S_localise_aelem_lval(aTHX_ (AV *)left, key,
6522                                         SvCANEXISTDELETE(left));
6523         }
6524         av_store((AV *)left, SvIV(key), SvREFCNT_inc_simple_NN(SvRV(sv)));
6525         break;
6526     case SVt_PVHV:
6527         if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO)) {
6528             assert(key);
6529             S_localise_helem_lval(aTHX_ (HV *)left, key,
6530                                         SvCANEXISTDELETE(left));
6531         }
6532         (void)hv_store_ent((HV *)left, key, SvREFCNT_inc_simple_NN(SvRV(sv)), 0);
6533     }
6534     if (PL_op->op_flags & OPf_MOD)
6535         SETs(sv_2mortal(newSVsv(sv)));
6536     /* XXX else can weak references go stale before they are read, e.g.,
6537        in leavesub?  */
6538     RETURN;
6539     }
6540 }
6541
6542 PP(pp_lvref)
6543 {
6544     dSP;
6545     SV * const ret = sv_2mortal(newSV_type(SVt_PVMG));
6546     SV * const elem = PL_op->op_private & OPpLVREF_ELEM ? POPs : NULL;
6547     SV * const arg = PL_op->op_flags & OPf_STACKED ? POPs : NULL;
6548     MAGIC * const mg = sv_magicext(ret, arg, PERL_MAGIC_lvref,
6549                                    &PL_vtbl_lvref, (char *)elem,
6550                                    elem ? HEf_SVKEY : (I32)ARGTARG);
6551     mg->mg_private = PL_op->op_private;
6552     if (PL_op->op_private & OPpLVREF_ITER)
6553         mg->mg_flags |= MGf_PERSIST;
6554     if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO)) {
6555       if (elem) {
6556         MAGIC *mg;
6557         HV *stash;
6558         assert(arg);
6559         {
6560             const bool can_preserve = SvCANEXISTDELETE(arg);
6561             if (SvTYPE(arg) == SVt_PVAV)
6562               S_localise_aelem_lval(aTHX_ (AV *)arg, elem, can_preserve);
6563             else
6564               S_localise_helem_lval(aTHX_ (HV *)arg, elem, can_preserve);
6565         }
6566       }
6567       else if (arg) {
6568         S_localise_gv_slot(aTHX_ (GV *)arg, 
6569                                  PL_op->op_private & OPpLVREF_TYPE);
6570       }
6571       else if (!(PL_op->op_private & OPpPAD_STATE))
6572         SAVECLEARSV(PAD_SVl(ARGTARG));
6573     }
6574     XPUSHs(ret);
6575     RETURN;
6576 }
6577
6578 PP(pp_lvrefslice)
6579 {
6580     dSP; dMARK;
6581     AV * const av = (AV *)POPs;
6582     const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
6583     bool can_preserve = FALSE;
6584
6585     if (UNLIKELY(localizing)) {
6586         MAGIC *mg;
6587         HV *stash;
6588         SV **svp;
6589
6590         can_preserve = SvCANEXISTDELETE(av);
6591
6592         if (SvTYPE(av) == SVt_PVAV) {
6593             SSize_t max = -1;
6594
6595             for (svp = MARK + 1; svp <= SP; svp++) {
6596                 const SSize_t elem = SvIV(*svp);
6597                 if (elem > max)
6598                     max = elem;
6599             }
6600             if (max > AvMAX(av))
6601                 av_extend(av, max);
6602         }
6603     }
6604
6605     while (++MARK <= SP) {
6606         SV * const elemsv = *MARK;
6607         if (SvTYPE(av) == SVt_PVAV)
6608             S_localise_aelem_lval(aTHX_ av, elemsv, can_preserve);
6609         else
6610             S_localise_helem_lval(aTHX_ (HV *)av, elemsv, can_preserve);
6611         *MARK = sv_2mortal(newSV_type(SVt_PVMG));
6612         sv_magic(*MARK,(SV *)av,PERL_MAGIC_lvref,(char *)elemsv,HEf_SVKEY);
6613     }
6614     RETURN;
6615 }
6616
6617 PP(pp_lvavref)
6618 {
6619     if (PL_op->op_flags & OPf_STACKED)
6620         Perl_pp_rv2av(aTHX);
6621     else
6622         Perl_pp_padav(aTHX);
6623     {
6624         dSP;
6625         dTOPss;
6626         SETs(0); /* special alias marker that aassign recognises */
6627         XPUSHs(sv);
6628         RETURN;
6629     }
6630 }
6631
6632 PP(pp_anonconst)
6633 {
6634     dSP;
6635     dTOPss;
6636     SETs(sv_2mortal((SV *)newCONSTSUB(SvTYPE(CopSTASH(PL_curcop))==SVt_PVHV
6637                                         ? CopSTASH(PL_curcop)
6638                                         : NULL,
6639                                       NULL, SvREFCNT_inc_simple_NN(sv))));
6640     RETURN;
6641 }
6642
6643
6644 /* process one subroutine argument - typically when the sub has a signature:
6645  * introduce PL_curpad[op_targ] and assign to it the value
6646  *  for $:   (OPf_STACKED ? *sp : $_[N])
6647  *  for @/%: @_[N..$#_]
6648  *
6649  * It's equivalent to 
6650  *    my $foo = $_[N];
6651  * or
6652  *    my $foo = (value-on-stack)
6653  * or
6654  *    my @foo = @_[N..$#_]
6655  * etc
6656  */
6657
6658 PP(pp_argelem)
6659 {
6660     dTARG;
6661     SV *val;
6662     SV ** padentry;
6663     OP *o = PL_op;
6664     AV *defav = GvAV(PL_defgv); /* @_ */
6665     IV ix = PTR2IV(cUNOP_AUXo->op_aux);
6666     IV argc;
6667
6668     /* do 'my $var, @var or %var' action */
6669     padentry = &(PAD_SVl(o->op_targ));
6670     save_clearsv(padentry);
6671     targ = *padentry;
6672
6673     if ((o->op_private & OPpARGELEM_MASK) == OPpARGELEM_SV) {
6674         if (o->op_flags & OPf_STACKED) {
6675             dSP;
6676             val = POPs;
6677             PUTBACK;
6678         }
6679         else {
6680             SV **svp;
6681             /* should already have been checked */
6682             assert(ix >= 0);
6683 #if IVSIZE > PTRSIZE
6684             assert(ix <= SSize_t_MAX);
6685 #endif
6686
6687             svp = av_fetch(defav, ix, FALSE);
6688             val = svp ? *svp : &PL_sv_undef;
6689         }
6690
6691         /* $var = $val */
6692
6693         /* cargo-culted from pp_sassign */
6694         assert(TAINTING_get || !TAINT_get);
6695         if (UNLIKELY(TAINT_get) && !SvTAINTED(val))
6696             TAINT_NOT;
6697
6698         SvSetMagicSV(targ, val);
6699         return o->op_next;
6700     }
6701
6702     /* must be AV or HV */
6703
6704     assert(!(o->op_flags & OPf_STACKED));
6705     argc = ((IV)AvFILL(defav) + 1) - ix;
6706
6707     /* This is a copy of the relevant parts of pp_aassign().
6708      */
6709     if ((o->op_private & OPpARGELEM_MASK) == OPpARGELEM_AV) {
6710         IV i;
6711
6712         if (AvFILL((AV*)targ) > -1) {
6713             /* target should usually be empty. If we get get
6714              * here, someone's been doing some weird closure tricks.
6715              * Make a copy of all args before clearing the array,
6716              * to avoid the equivalent of @a = ($a[0]) prematurely freeing
6717              * elements. See similar code in pp_aassign.
6718              */
6719             for (i = 0; i < argc; i++) {
6720                 SV **svp = av_fetch(defav, ix + i, FALSE);
6721                 SV *newsv = newSV(0);
6722                 sv_setsv_flags(newsv,
6723                                 svp ? *svp : &PL_sv_undef,
6724                                 (SV_DO_COW_SVSETSV|SV_NOSTEAL));
6725                 if (!av_store(defav, ix + i, newsv))
6726                     SvREFCNT_dec_NN(newsv);
6727             }
6728             av_clear((AV*)targ);
6729         }
6730
6731         if (argc <= 0)
6732             return o->op_next;
6733
6734         av_extend((AV*)targ, argc);
6735
6736         i = 0;
6737         while (argc--) {
6738             SV *tmpsv;
6739             SV **svp = av_fetch(defav, ix + i, FALSE);
6740             SV *val = svp ? *svp : &PL_sv_undef;
6741             tmpsv = newSV(0);
6742             sv_setsv(tmpsv, val);
6743             av_store((AV*)targ, i++, tmpsv);
6744             TAINT_NOT;
6745         }
6746
6747     }
6748     else {
6749         IV i;
6750
6751         assert((o->op_private & OPpARGELEM_MASK) == OPpARGELEM_HV);
6752
6753         if (SvRMAGICAL(targ) || HvUSEDKEYS((HV*)targ)) {
6754             /* see "target should usually be empty" comment above */
6755             for (i = 0; i < argc; i++) {
6756                 SV **svp = av_fetch(defav, ix + i, FALSE);
6757                 SV *newsv = newSV(0);
6758                 sv_setsv_flags(newsv,
6759                                 svp ? *svp : &PL_sv_undef,
6760                                 (SV_DO_COW_SVSETSV|SV_NOSTEAL));
6761                 if (!av_store(defav, ix + i, newsv))
6762                     SvREFCNT_dec_NN(newsv);
6763             }
6764             hv_clear((HV*)targ);
6765         }
6766
6767         if (argc <= 0)
6768             return o->op_next;
6769         assert(argc % 2 == 0);
6770
6771         i = 0;
6772         while (argc) {
6773             SV *tmpsv;
6774             SV **svp;
6775             SV *key;
6776             SV *val;
6777
6778             svp = av_fetch(defav, ix + i++, FALSE);
6779             key = svp ? *svp : &PL_sv_undef;
6780             svp = av_fetch(defav, ix + i++, FALSE);
6781             val = svp ? *svp : &PL_sv_undef;
6782
6783             argc -= 2;
6784             if (UNLIKELY(SvGMAGICAL(key)))
6785                 key = sv_mortalcopy(key);
6786             tmpsv = newSV(0);
6787             sv_setsv(tmpsv, val);
6788             hv_store_ent((HV*)targ, key, tmpsv, 0);
6789             TAINT_NOT;
6790         }
6791     }
6792
6793     return o->op_next;
6794 }
6795
6796 /* Handle a default value for one subroutine argument (typically as part
6797  * of a subroutine signature).
6798  * It's equivalent to
6799  *    @_ > op_targ ? $_[op_targ] : result_of(op_other)
6800  *
6801  * Intended to be used where op_next is an OP_ARGELEM
6802  *
6803  * We abuse the op_targ field slightly: it's an index into @_ rather than
6804  * into PL_curpad.
6805  */
6806
6807 PP(pp_argdefelem)
6808 {
6809     OP * const o = PL_op;
6810     AV *defav = GvAV(PL_defgv); /* @_ */
6811     IV ix = (IV)o->op_targ;
6812
6813     assert(ix >= 0);
6814 #if IVSIZE > PTRSIZE
6815     assert(ix <= SSize_t_MAX);
6816 #endif
6817
6818     if (AvFILL(defav) >= ix) {
6819         dSP;
6820         SV **svp = av_fetch(defav, ix, FALSE);
6821         SV  *val = svp ? *svp : &PL_sv_undef;
6822         XPUSHs(val);
6823         RETURN;
6824     }
6825     return cLOGOPo->op_other;
6826 }
6827
6828
6829 static SV *
6830 S_find_runcv_name(void)
6831 {
6832     dTHX;
6833     CV *cv;
6834     GV *gv;
6835     SV *sv;
6836
6837     cv = find_runcv(0);
6838     if (!cv)
6839         return &PL_sv_no;
6840
6841     gv = CvGV(cv);
6842     if (!gv)
6843         return &PL_sv_no;
6844
6845     sv = sv_2mortal(newSV(0));
6846     gv_fullname4(sv, gv, NULL, TRUE);
6847     return sv;
6848 }
6849
6850 /* Check a  a subs arguments - i.e. that it has the correct number of args
6851  * (and anything else we might think of in future). Typically used with
6852  * signatured subs.
6853  */
6854
6855 PP(pp_argcheck)
6856 {
6857     OP * const o       = PL_op;
6858     UNOP_AUX_item *aux = cUNOP_AUXo->op_aux;
6859     IV   params        = aux[0].iv;
6860     IV   opt_params    = aux[1].iv;
6861     char slurpy        = (char)(aux[2].iv);
6862     AV  *defav         = GvAV(PL_defgv); /* @_ */
6863     IV   argc;
6864     bool too_few;
6865
6866     assert(!SvMAGICAL(defav));
6867     argc = (AvFILLp(defav) + 1);
6868     too_few = (argc < (params - opt_params));
6869
6870     if (UNLIKELY(too_few || (!slurpy && argc > params)))
6871         /* diag_listed_as: Too few arguments for subroutine '%s' */
6872         /* diag_listed_as: Too many arguments for subroutine '%s' */
6873         Perl_croak_caller("Too %s arguments for subroutine '%" SVf "'",
6874                           too_few ? "few" : "many", S_find_runcv_name());
6875
6876     if (UNLIKELY(slurpy == '%' && argc > params && (argc - params) % 2))
6877         /* diag_listed_as: Odd name/value argument for subroutine '%s' */
6878         Perl_croak_caller("Odd name/value argument for subroutine '%" SVf "'",
6879                           S_find_runcv_name());
6880
6881     return NORMAL;
6882 }
6883
6884 /*
6885  * ex: set ts=8 sts=4 sw=4 et:
6886  */