This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
RT#130624: heap-use-after-free in 4-arg substr
[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     const IV offset = POPi;
3477     SV * const src = POPs;
3478     const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3479     SV * ret;
3480
3481     if (lvalue) {                       /* it's an lvalue! */
3482         ret = sv_2mortal(newSV_type(SVt_PVLV));  /* Not TARG RT#67838 */
3483         sv_magic(ret, NULL, PERL_MAGIC_vec, NULL, 0);
3484         LvTYPE(ret) = 'v';
3485         LvTARG(ret) = SvREFCNT_inc_simple(src);
3486         LvTARGOFF(ret) = offset;
3487         LvTARGLEN(ret) = size;
3488     }
3489     else {
3490         dTARGET;
3491         SvTAINTED_off(TARG);            /* decontaminate */
3492         ret = TARG;
3493     }
3494
3495     sv_setuv(ret, do_vecget(src, offset, size));
3496     if (!lvalue)
3497         SvSETMAGIC(ret);
3498     PUSHs(ret);
3499     RETURN;
3500 }
3501
3502
3503 /* also used for: pp_rindex() */
3504
3505 PP(pp_index)
3506 {
3507     dSP; dTARGET;
3508     SV *big;
3509     SV *little;
3510     SV *temp = NULL;
3511     STRLEN biglen;
3512     STRLEN llen = 0;
3513     SSize_t offset = 0;
3514     SSize_t retval;
3515     const char *big_p;
3516     const char *little_p;
3517     bool big_utf8;
3518     bool little_utf8;
3519     const bool is_index = PL_op->op_type == OP_INDEX;
3520     const bool threeargs = MAXARG >= 3 && (TOPs || ((void)POPs,0));
3521
3522     if (threeargs)
3523         offset = POPi;
3524     little = POPs;
3525     big = POPs;
3526     big_p = SvPV_const(big, biglen);
3527     little_p = SvPV_const(little, llen);
3528
3529     big_utf8 = DO_UTF8(big);
3530     little_utf8 = DO_UTF8(little);
3531     if (big_utf8 ^ little_utf8) {
3532         /* One needs to be upgraded.  */
3533         if (little_utf8) {
3534             /* Well, maybe instead we might be able to downgrade the small
3535                string?  */
3536             char * const pv = (char*)bytes_from_utf8((U8 *)little_p, &llen,
3537                                                      &little_utf8);
3538             if (little_utf8) {
3539                 /* If the large string is ISO-8859-1, and it's not possible to
3540                    convert the small string to ISO-8859-1, then there is no
3541                    way that it could be found anywhere by index.  */
3542                 retval = -1;
3543                 goto fail;
3544             }
3545
3546             /* At this point, pv is a malloc()ed string. So donate it to temp
3547                to ensure it will get free()d  */
3548             little = temp = newSV(0);
3549             sv_usepvn(temp, pv, llen);
3550             little_p = SvPVX(little);
3551         } else {
3552             temp = newSVpvn(little_p, llen);
3553
3554             sv_utf8_upgrade(temp);
3555             little = temp;
3556             little_p = SvPV_const(little, llen);
3557         }
3558     }
3559     if (SvGAMAGIC(big)) {
3560         /* Life just becomes a lot easier if I use a temporary here.
3561            Otherwise I need to avoid calls to sv_pos_u2b(), which (dangerously)
3562            will trigger magic and overloading again, as will fbm_instr()
3563         */
3564         big = newSVpvn_flags(big_p, biglen,
3565                              SVs_TEMP | (big_utf8 ? SVf_UTF8 : 0));
3566         big_p = SvPVX(big);
3567     }
3568     if (SvGAMAGIC(little) || (is_index && !SvOK(little))) {
3569         /* index && SvOK() is a hack. fbm_instr() calls SvPV_const, which will
3570            warn on undef, and we've already triggered a warning with the
3571            SvPV_const some lines above. We can't remove that, as we need to
3572            call some SvPV to trigger overloading early and find out if the
3573            string is UTF-8.
3574            This is all getting too messy. The API isn't quite clean enough,
3575            because data access has side effects.
3576         */
3577         little = newSVpvn_flags(little_p, llen,
3578                                 SVs_TEMP | (little_utf8 ? SVf_UTF8 : 0));
3579         little_p = SvPVX(little);
3580     }
3581
3582     if (!threeargs)
3583         offset = is_index ? 0 : biglen;
3584     else {
3585         if (big_utf8 && offset > 0)
3586             offset = sv_pos_u2b_flags(big, offset, 0, SV_CONST_RETURN);
3587         if (!is_index)
3588             offset += llen;
3589     }
3590     if (offset < 0)
3591         offset = 0;
3592     else if (offset > (SSize_t)biglen)
3593         offset = biglen;
3594     if (!(little_p = is_index
3595           ? fbm_instr((unsigned char*)big_p + offset,
3596                       (unsigned char*)big_p + biglen, little, 0)
3597           : rninstr(big_p,  big_p  + offset,
3598                     little_p, little_p + llen)))
3599         retval = -1;
3600     else {
3601         retval = little_p - big_p;
3602         if (retval > 1 && big_utf8)
3603             retval = sv_pos_b2u_flags(big, retval, SV_CONST_RETURN);
3604     }
3605     SvREFCNT_dec(temp);
3606  fail:
3607     PUSHi(retval);
3608     RETURN;
3609 }
3610
3611 PP(pp_sprintf)
3612 {
3613     dSP; dMARK; dORIGMARK; dTARGET;
3614     SvTAINTED_off(TARG);
3615     do_sprintf(TARG, SP-MARK, MARK+1);
3616     TAINT_IF(SvTAINTED(TARG));
3617     SP = ORIGMARK;
3618     PUSHTARG;
3619     RETURN;
3620 }
3621
3622 PP(pp_ord)
3623 {
3624     dSP; dTARGET;
3625
3626     SV *argsv = TOPs;
3627     STRLEN len;
3628     const U8 *s = (U8*)SvPV_const(argsv, len);
3629
3630     SETu(DO_UTF8(argsv)
3631            ? (len ? utf8n_to_uvchr(s, len, 0, UTF8_ALLOW_ANYUV) : 0)
3632            : (UV)(*s));
3633
3634     return NORMAL;
3635 }
3636
3637 PP(pp_chr)
3638 {
3639     dSP; dTARGET;
3640     char *tmps;
3641     UV value;
3642     SV *top = TOPs;
3643
3644     SvGETMAGIC(top);
3645     if (UNLIKELY(SvAMAGIC(top)))
3646         top = sv_2num(top);
3647     if (UNLIKELY(isinfnansv(top)))
3648         Perl_croak(aTHX_ "Cannot chr %" NVgf, SvNV(top));
3649     else {
3650         if (!IN_BYTES /* under bytes, chr(-1) eq chr(0xff), etc. */
3651             && ((SvIOKp(top) && !SvIsUV(top) && SvIV_nomg(top) < 0)
3652                 ||
3653                 ((SvNOKp(top) || (SvOK(top) && !SvIsUV(top)))
3654                  && SvNV_nomg(top) < 0.0)))
3655         {
3656             if (ckWARN(WARN_UTF8)) {
3657                 if (SvGMAGICAL(top)) {
3658                     SV *top2 = sv_newmortal();
3659                     sv_setsv_nomg(top2, top);
3660                     top = top2;
3661                 }
3662                 Perl_warner(aTHX_ packWARN(WARN_UTF8),
3663                             "Invalid negative number (%" SVf ") in chr", SVfARG(top));
3664             }
3665             value = UNICODE_REPLACEMENT;
3666         } else {
3667             value = SvUV_nomg(top);
3668         }
3669     }
3670
3671     SvUPGRADE(TARG,SVt_PV);
3672
3673     if (value > 255 && !IN_BYTES) {
3674         SvGROW(TARG, (STRLEN)UVCHR_SKIP(value)+1);
3675         tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3676         SvCUR_set(TARG, tmps - SvPVX_const(TARG));
3677         *tmps = '\0';
3678         (void)SvPOK_only(TARG);
3679         SvUTF8_on(TARG);
3680         SETTARG;
3681         return NORMAL;
3682     }
3683
3684     SvGROW(TARG,2);
3685     SvCUR_set(TARG, 1);
3686     tmps = SvPVX(TARG);
3687     *tmps++ = (char)value;
3688     *tmps = '\0';
3689     (void)SvPOK_only(TARG);
3690
3691     SETTARG;
3692     return NORMAL;
3693 }
3694
3695 PP(pp_crypt)
3696 {
3697 #ifdef HAS_CRYPT
3698     dSP; dTARGET;
3699     dPOPTOPssrl;
3700     STRLEN len;
3701     const char *tmps = SvPV_const(left, len);
3702
3703     if (DO_UTF8(left)) {
3704          /* If Unicode, try to downgrade.
3705           * If not possible, croak.
3706           * Yes, we made this up.  */
3707          SV* const tsv = newSVpvn_flags(tmps, len, SVf_UTF8|SVs_TEMP);
3708
3709          sv_utf8_downgrade(tsv, FALSE);
3710          tmps = SvPV_const(tsv, len);
3711     }
3712 #   ifdef USE_ITHREADS
3713 #     ifdef HAS_CRYPT_R
3714     if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3715       /* This should be threadsafe because in ithreads there is only
3716        * one thread per interpreter.  If this would not be true,
3717        * we would need a mutex to protect this malloc. */
3718         PL_reentrant_buffer->_crypt_struct_buffer =
3719           (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3720 #if defined(__GLIBC__) || defined(__EMX__)
3721         if (PL_reentrant_buffer->_crypt_struct_buffer) {
3722             PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3723             /* work around glibc-2.2.5 bug */
3724             PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3725         }
3726 #endif
3727     }
3728 #     endif /* HAS_CRYPT_R */
3729 #   endif /* USE_ITHREADS */
3730 #   ifdef FCRYPT
3731     sv_setpv(TARG, fcrypt(tmps, SvPV_nolen_const(right)));
3732 #   else
3733     sv_setpv(TARG, PerlProc_crypt(tmps, SvPV_nolen_const(right)));
3734 #   endif
3735     SvUTF8_off(TARG);
3736     SETTARG;
3737     RETURN;
3738 #else
3739     DIE(aTHX_
3740       "The crypt() function is unimplemented due to excessive paranoia.");
3741 #endif
3742 }
3743
3744 /* Generally UTF-8 and UTF-EBCDIC are indistinguishable at this level.  So 
3745  * most comments below say UTF-8, when in fact they mean UTF-EBCDIC as well */
3746
3747
3748 /* also used for: pp_lcfirst() */
3749
3750 PP(pp_ucfirst)
3751 {
3752     /* Actually is both lcfirst() and ucfirst().  Only the first character
3753      * changes.  This means that possibly we can change in-place, ie., just
3754      * take the source and change that one character and store it back, but not
3755      * if read-only etc, or if the length changes */
3756
3757     dSP;
3758     SV *source = TOPs;
3759     STRLEN slen; /* slen is the byte length of the whole SV. */
3760     STRLEN need;
3761     SV *dest;
3762     bool inplace;   /* ? Convert first char only, in-place */
3763     bool doing_utf8 = FALSE;               /* ? using utf8 */
3764     bool convert_source_to_utf8 = FALSE;   /* ? need to convert */
3765     const int op_type = PL_op->op_type;
3766     const U8 *s;
3767     U8 *d;
3768     U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3769     STRLEN ulen;    /* ulen is the byte length of the original Unicode character
3770                      * stored as UTF-8 at s. */
3771     STRLEN tculen;  /* tculen is the byte length of the freshly titlecased (or
3772                      * lowercased) character stored in tmpbuf.  May be either
3773                      * UTF-8 or not, but in either case is the number of bytes */
3774
3775     s = (const U8*)SvPV_const(source, slen);
3776
3777     /* We may be able to get away with changing only the first character, in
3778      * place, but not if read-only, etc.  Later we may discover more reasons to
3779      * not convert in-place. */
3780     inplace = !SvREADONLY(source) && SvPADTMP(source);
3781
3782     /* First calculate what the changed first character should be.  This affects
3783      * whether we can just swap it out, leaving the rest of the string unchanged,
3784      * or even if have to convert the dest to UTF-8 when the source isn't */
3785
3786     if (! slen) {   /* If empty */
3787         need = 1; /* still need a trailing NUL */
3788         ulen = 0;
3789     }
3790     else if (DO_UTF8(source)) { /* Is the source utf8? */
3791         doing_utf8 = TRUE;
3792         ulen = UTF8SKIP(s);
3793         if (op_type == OP_UCFIRST) {
3794 #ifdef USE_LOCALE_CTYPE
3795             _toTITLE_utf8_flags(s, s +slen, tmpbuf, &tculen, IN_LC_RUNTIME(LC_CTYPE));
3796 #else
3797             _toTITLE_utf8_flags(s, s +slen, tmpbuf, &tculen, 0);
3798 #endif
3799         }
3800         else {
3801 #ifdef USE_LOCALE_CTYPE
3802             _toLOWER_utf8_flags(s, s + slen, tmpbuf, &tculen, IN_LC_RUNTIME(LC_CTYPE));
3803 #else
3804             _toLOWER_utf8_flags(s, s + slen, tmpbuf, &tculen, 0);
3805 #endif
3806         }
3807
3808         /* we can't do in-place if the length changes.  */
3809         if (ulen != tculen) inplace = FALSE;
3810         need = slen + 1 - ulen + tculen;
3811     }
3812     else { /* Non-zero length, non-UTF-8,  Need to consider locale and if
3813             * latin1 is treated as caseless.  Note that a locale takes
3814             * precedence */ 
3815         ulen = 1;       /* Original character is 1 byte */
3816         tculen = 1;     /* Most characters will require one byte, but this will
3817                          * need to be overridden for the tricky ones */
3818         need = slen + 1;
3819
3820         if (op_type == OP_LCFIRST) {
3821
3822             /* lower case the first letter: no trickiness for any character */
3823 #ifdef USE_LOCALE_CTYPE
3824             if (IN_LC_RUNTIME(LC_CTYPE)) {
3825                 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
3826                 *tmpbuf = toLOWER_LC(*s);
3827             }
3828             else
3829 #endif
3830             {
3831                 *tmpbuf = (IN_UNI_8_BIT)
3832                           ? toLOWER_LATIN1(*s)
3833                           : toLOWER(*s);
3834             }
3835         }
3836 #ifdef USE_LOCALE_CTYPE
3837         /* is ucfirst() */
3838         else if (IN_LC_RUNTIME(LC_CTYPE)) {
3839             if (IN_UTF8_CTYPE_LOCALE) {
3840                 goto do_uni_rules;
3841             }
3842
3843             _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
3844             *tmpbuf = (U8) toUPPER_LC(*s); /* This would be a bug if any
3845                                               locales have upper and title case
3846                                               different */
3847         }
3848 #endif
3849         else if (! IN_UNI_8_BIT) {
3850             *tmpbuf = toUPPER(*s);      /* Returns caseless for non-ascii, or
3851                                          * on EBCDIC machines whatever the
3852                                          * native function does */
3853         }
3854         else {
3855             /* Here, is ucfirst non-UTF-8, not in locale (unless that locale is
3856              * UTF-8, which we treat as not in locale), and cased latin1 */
3857             UV title_ord;
3858 #ifdef USE_LOCALE_CTYPE
3859       do_uni_rules:
3860 #endif
3861
3862             title_ord = _to_upper_title_latin1(*s, tmpbuf, &tculen, 's');
3863             if (tculen > 1) {
3864                 assert(tculen == 2);
3865
3866                 /* If the result is an upper Latin1-range character, it can
3867                  * still be represented in one byte, which is its ordinal */
3868                 if (UTF8_IS_DOWNGRADEABLE_START(*tmpbuf)) {
3869                     *tmpbuf = (U8) title_ord;
3870                     tculen = 1;
3871                 }
3872                 else {
3873                     /* Otherwise it became more than one ASCII character (in
3874                      * the case of LATIN_SMALL_LETTER_SHARP_S) or changed to
3875                      * beyond Latin1, so the number of bytes changed, so can't
3876                      * replace just the first character in place. */
3877                     inplace = FALSE;
3878
3879                     /* If the result won't fit in a byte, the entire result
3880                      * will have to be in UTF-8.  Assume worst case sizing in
3881                      * conversion. (all latin1 characters occupy at most two
3882                      * bytes in utf8) */
3883                     if (title_ord > 255) {
3884                         doing_utf8 = TRUE;
3885                         convert_source_to_utf8 = TRUE;
3886                         need = slen * 2 + 1;
3887
3888                         /* The (converted) UTF-8 and UTF-EBCDIC lengths of all
3889                          * (both) characters whose title case is above 255 is
3890                          * 2. */
3891                         ulen = 2;
3892                     }
3893                     else { /* LATIN_SMALL_LETTER_SHARP_S expands by 1 byte */
3894                         need = slen + 1 + 1;
3895                     }
3896                 }
3897             }
3898         } /* End of use Unicode (Latin1) semantics */
3899     } /* End of changing the case of the first character */
3900
3901     /* Here, have the first character's changed case stored in tmpbuf.  Ready to
3902      * generate the result */
3903     if (inplace) {
3904
3905         /* We can convert in place.  This means we change just the first
3906          * character without disturbing the rest; no need to grow */
3907         dest = source;
3908         s = d = (U8*)SvPV_force_nomg(source, slen);
3909     } else {
3910         dTARGET;
3911
3912         dest = TARG;
3913
3914         /* Here, we can't convert in place; we earlier calculated how much
3915          * space we will need, so grow to accommodate that */
3916         SvUPGRADE(dest, SVt_PV);
3917         d = (U8*)SvGROW(dest, need);
3918         (void)SvPOK_only(dest);
3919
3920         SETs(dest);
3921     }
3922
3923     if (doing_utf8) {
3924         if (! inplace) {
3925             if (! convert_source_to_utf8) {
3926
3927                 /* Here  both source and dest are in UTF-8, but have to create
3928                  * the entire output.  We initialize the result to be the
3929                  * title/lower cased first character, and then append the rest
3930                  * of the string. */
3931                 sv_setpvn(dest, (char*)tmpbuf, tculen);
3932                 if (slen > ulen) {
3933                     sv_catpvn(dest, (char*)(s + ulen), slen - ulen);
3934                 }
3935             }
3936             else {
3937                 const U8 *const send = s + slen;
3938
3939                 /* Here the dest needs to be in UTF-8, but the source isn't,
3940                  * except we earlier UTF-8'd the first character of the source
3941                  * into tmpbuf.  First put that into dest, and then append the
3942                  * rest of the source, converting it to UTF-8 as we go. */
3943
3944                 /* Assert tculen is 2 here because the only two characters that
3945                  * get to this part of the code have 2-byte UTF-8 equivalents */
3946                 *d++ = *tmpbuf;
3947                 *d++ = *(tmpbuf + 1);
3948                 s++;    /* We have just processed the 1st char */
3949
3950                 for (; s < send; s++) {
3951                     d = uvchr_to_utf8(d, *s);
3952                 }
3953                 *d = '\0';
3954                 SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
3955             }
3956             SvUTF8_on(dest);
3957         }
3958         else {   /* in-place UTF-8.  Just overwrite the first character */
3959             Copy(tmpbuf, d, tculen, U8);
3960             SvCUR_set(dest, need - 1);
3961         }
3962
3963     }
3964     else {  /* Neither source nor dest are in or need to be UTF-8 */
3965         if (slen) {
3966             if (inplace) {  /* in-place, only need to change the 1st char */
3967                 *d = *tmpbuf;
3968             }
3969             else {      /* Not in-place */
3970
3971                 /* Copy the case-changed character(s) from tmpbuf */
3972                 Copy(tmpbuf, d, tculen, U8);
3973                 d += tculen - 1; /* Code below expects d to point to final
3974                                   * character stored */
3975             }
3976         }
3977         else {  /* empty source */
3978             /* See bug #39028: Don't taint if empty  */
3979             *d = *s;
3980         }
3981
3982         /* In a "use bytes" we don't treat the source as UTF-8, but, still want
3983          * the destination to retain that flag */
3984         if (SvUTF8(source) && ! IN_BYTES)
3985             SvUTF8_on(dest);
3986
3987         if (!inplace) { /* Finish the rest of the string, unchanged */
3988             /* This will copy the trailing NUL  */
3989             Copy(s + 1, d + 1, slen, U8);
3990             SvCUR_set(dest, need - 1);
3991         }
3992     }
3993 #ifdef USE_LOCALE_CTYPE
3994     if (IN_LC_RUNTIME(LC_CTYPE)) {
3995         TAINT;
3996         SvTAINTED_on(dest);
3997     }
3998 #endif
3999     if (dest != source && SvTAINTED(source))
4000         SvTAINT(dest);
4001     SvSETMAGIC(dest);
4002     return NORMAL;
4003 }
4004
4005 /* There's so much setup/teardown code common between uc and lc, I wonder if
4006    it would be worth merging the two, and just having a switch outside each
4007    of the three tight loops.  There is less and less commonality though */
4008 PP(pp_uc)
4009 {
4010     dSP;
4011     SV *source = TOPs;
4012     STRLEN len;
4013     STRLEN min;
4014     SV *dest;
4015     const U8 *s;
4016     U8 *d;
4017
4018     SvGETMAGIC(source);
4019
4020     if (   SvPADTMP(source)
4021         && !SvREADONLY(source) && SvPOK(source)
4022         && !DO_UTF8(source)
4023         && (
4024 #ifdef USE_LOCALE_CTYPE
4025             (IN_LC_RUNTIME(LC_CTYPE))
4026             ? ! IN_UTF8_CTYPE_LOCALE
4027             :
4028 #endif
4029               ! IN_UNI_8_BIT))
4030     {
4031
4032         /* We can convert in place.  The reason we can't if in UNI_8_BIT is to
4033          * make the loop tight, so we overwrite the source with the dest before
4034          * looking at it, and we need to look at the original source
4035          * afterwards.  There would also need to be code added to handle
4036          * switching to not in-place in midstream if we run into characters
4037          * that change the length.  Since being in locale overrides UNI_8_BIT,
4038          * that latter becomes irrelevant in the above test; instead for
4039          * locale, the size can't normally change, except if the locale is a
4040          * UTF-8 one */
4041         dest = source;
4042         s = d = (U8*)SvPV_force_nomg(source, len);
4043         min = len + 1;
4044     } else {
4045         dTARGET;
4046
4047         dest = TARG;
4048
4049         s = (const U8*)SvPV_nomg_const(source, len);
4050         min = len + 1;
4051
4052         SvUPGRADE(dest, SVt_PV);
4053         d = (U8*)SvGROW(dest, min);
4054         (void)SvPOK_only(dest);
4055
4056         SETs(dest);
4057     }
4058
4059     /* Overloaded values may have toggled the UTF-8 flag on source, so we need
4060        to check DO_UTF8 again here.  */
4061
4062     if (DO_UTF8(source)) {
4063         const U8 *const send = s + len;
4064         U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
4065
4066         /* All occurrences of these are to be moved to follow any other marks.
4067          * This is context-dependent.  We may not be passed enough context to
4068          * move the iota subscript beyond all of them, but we do the best we can
4069          * with what we're given.  The result is always better than if we
4070          * hadn't done this.  And, the problem would only arise if we are
4071          * passed a character without all its combining marks, which would be
4072          * the caller's mistake.  The information this is based on comes from a
4073          * comment in Unicode SpecialCasing.txt, (and the Standard's text
4074          * itself) and so can't be checked properly to see if it ever gets
4075          * revised.  But the likelihood of it changing is remote */
4076         bool in_iota_subscript = FALSE;
4077
4078         while (s < send) {
4079             STRLEN u;
4080             STRLEN ulen;
4081             UV uv;
4082             if (in_iota_subscript && ! _is_utf8_mark(s)) {
4083
4084                 /* A non-mark.  Time to output the iota subscript */
4085                 Copy(GREEK_CAPITAL_LETTER_IOTA_UTF8, d, capital_iota_len, U8);
4086                 d += capital_iota_len;
4087                 in_iota_subscript = FALSE;
4088             }
4089
4090             /* Then handle the current character.  Get the changed case value
4091              * and copy it to the output buffer */
4092
4093             u = UTF8SKIP(s);
4094 #ifdef USE_LOCALE_CTYPE
4095             uv = _toUPPER_utf8_flags(s, send, tmpbuf, &ulen, IN_LC_RUNTIME(LC_CTYPE));
4096 #else
4097             uv = _toUPPER_utf8_flags(s, send, tmpbuf, &ulen, 0);
4098 #endif
4099 #define GREEK_CAPITAL_LETTER_IOTA 0x0399
4100 #define COMBINING_GREEK_YPOGEGRAMMENI 0x0345
4101             if (uv == GREEK_CAPITAL_LETTER_IOTA
4102                 && utf8_to_uvchr_buf(s, send, 0) == COMBINING_GREEK_YPOGEGRAMMENI)
4103             {
4104                 in_iota_subscript = TRUE;
4105             }
4106             else {
4107                 if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4108                     /* If the eventually required minimum size outgrows the
4109                      * available space, we need to grow. */
4110                     const UV o = d - (U8*)SvPVX_const(dest);
4111
4112                     /* If someone uppercases one million U+03B0s we SvGROW()
4113                      * one million times.  Or we could try guessing how much to
4114                      * allocate without allocating too much.  Such is life.
4115                      * See corresponding comment in lc code for another option
4116                      * */
4117                     d = o + (U8*) SvGROW(dest, min);
4118                 }
4119                 Copy(tmpbuf, d, ulen, U8);
4120                 d += ulen;
4121             }
4122             s += u;
4123         }
4124         if (in_iota_subscript) {
4125             Copy(GREEK_CAPITAL_LETTER_IOTA_UTF8, d, capital_iota_len, U8);
4126             d += capital_iota_len;
4127         }
4128         SvUTF8_on(dest);
4129         *d = '\0';
4130
4131         SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4132     }
4133     else {      /* Not UTF-8 */
4134         if (len) {
4135             const U8 *const send = s + len;
4136
4137             /* Use locale casing if in locale; regular style if not treating
4138              * latin1 as having case; otherwise the latin1 casing.  Do the
4139              * whole thing in a tight loop, for speed, */
4140 #ifdef USE_LOCALE_CTYPE
4141             if (IN_LC_RUNTIME(LC_CTYPE)) {
4142                 if (IN_UTF8_CTYPE_LOCALE) {
4143                     goto do_uni_rules;
4144                 }
4145                 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
4146                 for (; s < send; d++, s++)
4147                     *d = (U8) toUPPER_LC(*s);
4148             }
4149             else
4150 #endif
4151                  if (! IN_UNI_8_BIT) {
4152                 for (; s < send; d++, s++) {
4153                     *d = toUPPER(*s);
4154                 }
4155             }
4156             else {
4157 #ifdef USE_LOCALE_CTYPE
4158           do_uni_rules:
4159 #endif
4160                 for (; s < send; d++, s++) {
4161                     *d = toUPPER_LATIN1_MOD(*s);
4162                     if (LIKELY(*d != LATIN_SMALL_LETTER_Y_WITH_DIAERESIS)) {
4163                         continue;
4164                     }
4165
4166                     /* The mainstream case is the tight loop above.  To avoid
4167                      * extra tests in that, all three characters that require
4168                      * special handling are mapped by the MOD to the one tested
4169                      * just above.  
4170                      * Use the source to distinguish between the three cases */
4171
4172 #if    UNICODE_MAJOR_VERSION > 2                                        \
4173    || (UNICODE_MAJOR_VERSION == 2 && UNICODE_DOT_VERSION >= 1           \
4174                                   && UNICODE_DOT_DOT_VERSION >= 8)
4175                     if (*s == LATIN_SMALL_LETTER_SHARP_S) {
4176
4177                         /* uc() of this requires 2 characters, but they are
4178                          * ASCII.  If not enough room, grow the string */
4179                         if (SvLEN(dest) < ++min) {      
4180                             const UV o = d - (U8*)SvPVX_const(dest);
4181                             d = o + (U8*) SvGROW(dest, min);
4182                         }
4183                         *d++ = 'S'; *d = 'S'; /* upper case is 'SS' */
4184                         continue;   /* Back to the tight loop; still in ASCII */
4185                     }
4186 #endif
4187
4188                     /* The other two special handling characters have their
4189                      * upper cases outside the latin1 range, hence need to be
4190                      * in UTF-8, so the whole result needs to be in UTF-8.  So,
4191                      * here we are somewhere in the middle of processing a
4192                      * non-UTF-8 string, and realize that we will have to convert
4193                      * the whole thing to UTF-8.  What to do?  There are
4194                      * several possibilities.  The simplest to code is to
4195                      * convert what we have so far, set a flag, and continue on
4196                      * in the loop.  The flag would be tested each time through
4197                      * the loop, and if set, the next character would be
4198                      * converted to UTF-8 and stored.  But, I (khw) didn't want
4199                      * to slow down the mainstream case at all for this fairly
4200                      * rare case, so I didn't want to add a test that didn't
4201                      * absolutely have to be there in the loop, besides the
4202                      * possibility that it would get too complicated for
4203                      * optimizers to deal with.  Another possibility is to just
4204                      * give up, convert the source to UTF-8, and restart the
4205                      * function that way.  Another possibility is to convert
4206                      * both what has already been processed and what is yet to
4207                      * come separately to UTF-8, then jump into the loop that
4208                      * handles UTF-8.  But the most efficient time-wise of the
4209                      * ones I could think of is what follows, and turned out to
4210                      * not require much extra code.  */
4211
4212                     /* Convert what we have so far into UTF-8, telling the
4213                      * function that we know it should be converted, and to
4214                      * allow extra space for what we haven't processed yet.
4215                      * Assume the worst case space requirements for converting
4216                      * what we haven't processed so far: that it will require
4217                      * two bytes for each remaining source character, plus the
4218                      * NUL at the end.  This may cause the string pointer to
4219                      * move, so re-find it. */
4220
4221                     len = d - (U8*)SvPVX_const(dest);
4222                     SvCUR_set(dest, len);
4223                     len = sv_utf8_upgrade_flags_grow(dest,
4224                                                 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
4225                                                 (send -s) * 2 + 1);
4226                     d = (U8*)SvPVX(dest) + len;
4227
4228                     /* Now process the remainder of the source, converting to
4229                      * upper and UTF-8.  If a resulting byte is invariant in
4230                      * UTF-8, output it as-is, otherwise convert to UTF-8 and
4231                      * append it to the output. */
4232                     for (; s < send; s++) {
4233                         (void) _to_upper_title_latin1(*s, d, &len, 'S');
4234                         d += len;
4235                     }
4236
4237                     /* Here have processed the whole source; no need to continue
4238                      * with the outer loop.  Each character has been converted
4239                      * to upper case and converted to UTF-8 */
4240
4241                     break;
4242                 } /* End of processing all latin1-style chars */
4243             } /* End of processing all chars */
4244         } /* End of source is not empty */
4245
4246         if (source != dest) {
4247             *d = '\0';  /* Here d points to 1 after last char, add NUL */
4248             SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4249         }
4250     } /* End of isn't utf8 */
4251 #ifdef USE_LOCALE_CTYPE
4252     if (IN_LC_RUNTIME(LC_CTYPE)) {
4253         TAINT;
4254         SvTAINTED_on(dest);
4255     }
4256 #endif
4257     if (dest != source && SvTAINTED(source))
4258         SvTAINT(dest);
4259     SvSETMAGIC(dest);
4260     return NORMAL;
4261 }
4262
4263 PP(pp_lc)
4264 {
4265     dSP;
4266     SV *source = TOPs;
4267     STRLEN len;
4268     STRLEN min;
4269     SV *dest;
4270     const U8 *s;
4271     U8 *d;
4272
4273     SvGETMAGIC(source);
4274
4275     if (   SvPADTMP(source)
4276         && !SvREADONLY(source) && SvPOK(source)
4277         && !DO_UTF8(source)) {
4278
4279         /* We can convert in place, as lowercasing anything in the latin1 range
4280          * (or else DO_UTF8 would have been on) doesn't lengthen it */
4281         dest = source;
4282         s = d = (U8*)SvPV_force_nomg(source, len);
4283         min = len + 1;
4284     } else {
4285         dTARGET;
4286
4287         dest = TARG;
4288
4289         s = (const U8*)SvPV_nomg_const(source, len);
4290         min = len + 1;
4291
4292         SvUPGRADE(dest, SVt_PV);
4293         d = (U8*)SvGROW(dest, min);
4294         (void)SvPOK_only(dest);
4295
4296         SETs(dest);
4297     }
4298
4299     /* Overloaded values may have toggled the UTF-8 flag on source, so we need
4300        to check DO_UTF8 again here.  */
4301
4302     if (DO_UTF8(source)) {
4303         const U8 *const send = s + len;
4304         U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
4305
4306         while (s < send) {
4307             const STRLEN u = UTF8SKIP(s);
4308             STRLEN ulen;
4309
4310 #ifdef USE_LOCALE_CTYPE
4311             _toLOWER_utf8_flags(s, send, tmpbuf, &ulen, IN_LC_RUNTIME(LC_CTYPE));
4312 #else
4313             _toLOWER_utf8_flags(s, send, tmpbuf, &ulen, 0);
4314 #endif
4315
4316             /* Here is where we would do context-sensitive actions.  See the
4317              * commit message for 86510fb15 for why there isn't any */
4318
4319             if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4320
4321                 /* If the eventually required minimum size outgrows the
4322                  * available space, we need to grow. */
4323                 const UV o = d - (U8*)SvPVX_const(dest);
4324
4325                 /* If someone lowercases one million U+0130s we SvGROW() one
4326                  * million times.  Or we could try guessing how much to
4327                  * allocate without allocating too much.  Such is life.
4328                  * Another option would be to grow an extra byte or two more
4329                  * each time we need to grow, which would cut down the million
4330                  * to 500K, with little waste */
4331                 d = o + (U8*) SvGROW(dest, min);
4332             }
4333
4334             /* Copy the newly lowercased letter to the output buffer we're
4335              * building */
4336             Copy(tmpbuf, d, ulen, U8);
4337             d += ulen;
4338             s += u;
4339         }   /* End of looping through the source string */
4340         SvUTF8_on(dest);
4341         *d = '\0';
4342         SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4343     } else {    /* Not utf8 */
4344         if (len) {
4345             const U8 *const send = s + len;
4346
4347             /* Use locale casing if in locale; regular style if not treating
4348              * latin1 as having case; otherwise the latin1 casing.  Do the
4349              * whole thing in a tight loop, for speed, */
4350 #ifdef USE_LOCALE_CTYPE
4351             if (IN_LC_RUNTIME(LC_CTYPE)) {
4352                 _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
4353                 for (; s < send; d++, s++)
4354                     *d = toLOWER_LC(*s);
4355             }
4356             else
4357 #endif
4358             if (! IN_UNI_8_BIT) {
4359                 for (; s < send; d++, s++) {
4360                     *d = toLOWER(*s);
4361                 }
4362             }
4363             else {
4364                 for (; s < send; d++, s++) {
4365                     *d = toLOWER_LATIN1(*s);
4366                 }
4367             }
4368         }
4369         if (source != dest) {
4370             *d = '\0';
4371             SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4372         }
4373     }
4374 #ifdef USE_LOCALE_CTYPE
4375     if (IN_LC_RUNTIME(LC_CTYPE)) {
4376         TAINT;
4377         SvTAINTED_on(dest);
4378     }
4379 #endif
4380     if (dest != source && SvTAINTED(source))
4381         SvTAINT(dest);
4382     SvSETMAGIC(dest);
4383     return NORMAL;
4384 }
4385
4386 PP(pp_quotemeta)
4387 {
4388     dSP; dTARGET;
4389     SV * const sv = TOPs;
4390     STRLEN len;
4391     const char *s = SvPV_const(sv,len);
4392
4393     SvUTF8_off(TARG);                           /* decontaminate */
4394     if (len) {
4395         char *d;
4396         SvUPGRADE(TARG, SVt_PV);
4397         SvGROW(TARG, (len * 2) + 1);
4398         d = SvPVX(TARG);
4399         if (DO_UTF8(sv)) {
4400             while (len) {
4401                 STRLEN ulen = UTF8SKIP(s);
4402                 bool to_quote = FALSE;
4403
4404                 if (UTF8_IS_INVARIANT(*s)) {
4405                     if (_isQUOTEMETA(*s)) {
4406                         to_quote = TRUE;
4407                     }
4408                 }
4409                 else if (UTF8_IS_NEXT_CHAR_DOWNGRADEABLE(s, s + len)) {
4410                     if (
4411 #ifdef USE_LOCALE_CTYPE
4412                     /* In locale, we quote all non-ASCII Latin1 chars.
4413                      * Otherwise use the quoting rules */
4414                     
4415                     IN_LC_RUNTIME(LC_CTYPE)
4416                         ||
4417 #endif
4418                         _isQUOTEMETA(EIGHT_BIT_UTF8_TO_NATIVE(*s, *(s + 1))))
4419                     {
4420                         to_quote = TRUE;
4421                     }
4422                 }
4423                 else if (is_QUOTEMETA_high(s)) {
4424                     to_quote = TRUE;
4425                 }
4426
4427                 if (to_quote) {
4428                     *d++ = '\\';
4429                 }
4430                 if (ulen > len)
4431                     ulen = len;
4432                 len -= ulen;
4433                 while (ulen--)
4434                     *d++ = *s++;
4435             }
4436             SvUTF8_on(TARG);
4437         }
4438         else if (IN_UNI_8_BIT) {
4439             while (len--) {
4440                 if (_isQUOTEMETA(*s))
4441                     *d++ = '\\';
4442                 *d++ = *s++;
4443             }
4444         }
4445         else {
4446             /* For non UNI_8_BIT (and hence in locale) just quote all \W
4447              * including everything above ASCII */
4448             while (len--) {
4449                 if (!isWORDCHAR_A(*s))
4450                     *d++ = '\\';
4451                 *d++ = *s++;
4452             }
4453         }
4454         *d = '\0';
4455         SvCUR_set(TARG, d - SvPVX_const(TARG));
4456         (void)SvPOK_only_UTF8(TARG);
4457     }
4458     else
4459         sv_setpvn(TARG, s, len);
4460     SETTARG;
4461     return NORMAL;
4462 }
4463
4464 PP(pp_fc)
4465 {
4466     dTARGET;
4467     dSP;
4468     SV *source = TOPs;
4469     STRLEN len;
4470     STRLEN min;
4471     SV *dest;
4472     const U8 *s;
4473     const U8 *send;
4474     U8 *d;
4475     U8 tmpbuf[UTF8_MAXBYTES_CASE + 1];
4476 #if    UNICODE_MAJOR_VERSION > 3 /* no multifolds in early Unicode */   \
4477    || (UNICODE_MAJOR_VERSION == 3 && (   UNICODE_DOT_VERSION > 0)       \
4478                                       || UNICODE_DOT_DOT_VERSION > 0)
4479     const bool full_folding = TRUE; /* This variable is here so we can easily
4480                                        move to more generality later */
4481 #else
4482     const bool full_folding = FALSE;
4483 #endif
4484     const U8 flags = ( full_folding      ? FOLD_FLAGS_FULL   : 0 )
4485 #ifdef USE_LOCALE_CTYPE
4486                    | ( IN_LC_RUNTIME(LC_CTYPE) ? FOLD_FLAGS_LOCALE : 0 )
4487 #endif
4488     ;
4489
4490     /* This is a facsimile of pp_lc, but with a thousand bugs thanks to me.
4491      * You are welcome(?) -Hugmeir
4492      */
4493
4494     SvGETMAGIC(source);
4495
4496     dest = TARG;
4497
4498     if (SvOK(source)) {
4499         s = (const U8*)SvPV_nomg_const(source, len);
4500     } else {
4501         if (ckWARN(WARN_UNINITIALIZED))
4502             report_uninit(source);
4503         s = (const U8*)"";
4504         len = 0;
4505     }
4506
4507     min = len + 1;
4508
4509     SvUPGRADE(dest, SVt_PV);
4510     d = (U8*)SvGROW(dest, min);
4511     (void)SvPOK_only(dest);
4512
4513     SETs(dest);
4514
4515     send = s + len;
4516     if (DO_UTF8(source)) { /* UTF-8 flagged string. */
4517         while (s < send) {
4518             const STRLEN u = UTF8SKIP(s);
4519             STRLEN ulen;
4520
4521             _toFOLD_utf8_flags(s, send, tmpbuf, &ulen, flags);
4522
4523             if (ulen > u && (SvLEN(dest) < (min += ulen - u))) {
4524                 const UV o = d - (U8*)SvPVX_const(dest);
4525                 d = o + (U8*) SvGROW(dest, min);
4526             }
4527
4528             Copy(tmpbuf, d, ulen, U8);
4529             d += ulen;
4530             s += u;
4531         }
4532         SvUTF8_on(dest);
4533     } /* Unflagged string */
4534     else if (len) {
4535 #ifdef USE_LOCALE_CTYPE
4536         if ( IN_LC_RUNTIME(LC_CTYPE) ) { /* Under locale */
4537             if (IN_UTF8_CTYPE_LOCALE) {
4538                 goto do_uni_folding;
4539             }
4540             _CHECK_AND_WARN_PROBLEMATIC_LOCALE;
4541             for (; s < send; d++, s++)
4542                 *d = (U8) toFOLD_LC(*s);
4543         }
4544         else
4545 #endif
4546         if ( !IN_UNI_8_BIT ) { /* Under nothing, or bytes */
4547             for (; s < send; d++, s++)
4548                 *d = toFOLD(*s);
4549         }
4550         else {
4551 #ifdef USE_LOCALE_CTYPE
4552       do_uni_folding:
4553 #endif
4554             /* For ASCII and the Latin-1 range, there's only two troublesome
4555              * folds, \x{DF} (\N{LATIN SMALL LETTER SHARP S}), which under full
4556              * casefolding becomes 'ss'; and \x{B5} (\N{MICRO SIGN}), which
4557              * under any fold becomes \x{3BC} (\N{GREEK SMALL LETTER MU}) --
4558              * For the rest, the casefold is their lowercase.  */
4559             for (; s < send; d++, s++) {
4560                 if (*s == MICRO_SIGN) {
4561                     /* \N{MICRO SIGN}'s casefold is \N{GREEK SMALL LETTER MU},
4562                      * which is outside of the latin-1 range. There's a couple
4563                      * of ways to deal with this -- khw discusses them in
4564                      * pp_lc/uc, so go there :) What we do here is upgrade what
4565                      * we had already casefolded, then enter an inner loop that
4566                      * appends the rest of the characters as UTF-8. */
4567                     len = d - (U8*)SvPVX_const(dest);
4568                     SvCUR_set(dest, len);
4569                     len = sv_utf8_upgrade_flags_grow(dest,
4570                                                 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
4571                                                 /* The max expansion for latin1
4572                                                  * chars is 1 byte becomes 2 */
4573                                                 (send -s) * 2 + 1);
4574                     d = (U8*)SvPVX(dest) + len;
4575
4576                     Copy(GREEK_SMALL_LETTER_MU_UTF8, d, small_mu_len, U8);
4577                     d += small_mu_len;
4578                     s++;
4579                     for (; s < send; s++) {
4580                         STRLEN ulen;
4581                         UV fc = _to_uni_fold_flags(*s, tmpbuf, &ulen, flags);
4582                         if UVCHR_IS_INVARIANT(fc) {
4583                             if (full_folding
4584                                 && *s == LATIN_SMALL_LETTER_SHARP_S)
4585                             {
4586                                 *d++ = 's';
4587                                 *d++ = 's';
4588                             }
4589                             else
4590                                 *d++ = (U8)fc;
4591                         }
4592                         else {
4593                             Copy(tmpbuf, d, ulen, U8);
4594                             d += ulen;
4595                         }
4596                     }
4597                     break;
4598                 }
4599                 else if (full_folding && *s == LATIN_SMALL_LETTER_SHARP_S) {
4600                     /* Under full casefolding, LATIN SMALL LETTER SHARP S
4601                      * becomes "ss", which may require growing the SV. */
4602                     if (SvLEN(dest) < ++min) {
4603                         const UV o = d - (U8*)SvPVX_const(dest);
4604                         d = o + (U8*) SvGROW(dest, min);
4605                      }
4606                     *(d)++ = 's';
4607                     *d = 's';
4608                 }
4609                 else { /* If it's not one of those two, the fold is their lower
4610                           case */
4611                     *d = toLOWER_LATIN1(*s);
4612                 }
4613              }
4614         }
4615     }
4616     *d = '\0';
4617     SvCUR_set(dest, d - (U8*)SvPVX_const(dest));
4618
4619 #ifdef USE_LOCALE_CTYPE
4620     if (IN_LC_RUNTIME(LC_CTYPE)) {
4621         TAINT;
4622         SvTAINTED_on(dest);
4623     }
4624 #endif
4625     if (SvTAINTED(source))
4626         SvTAINT(dest);
4627     SvSETMAGIC(dest);
4628     RETURN;
4629 }
4630
4631 /* Arrays. */
4632
4633 PP(pp_aslice)
4634 {
4635     dSP; dMARK; dORIGMARK;
4636     AV *const av = MUTABLE_AV(POPs);
4637     const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
4638
4639     if (SvTYPE(av) == SVt_PVAV) {
4640         const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
4641         bool can_preserve = FALSE;
4642
4643         if (localizing) {
4644             MAGIC *mg;
4645             HV *stash;
4646
4647             can_preserve = SvCANEXISTDELETE(av);
4648         }
4649
4650         if (lval && localizing) {
4651             SV **svp;
4652             SSize_t max = -1;
4653             for (svp = MARK + 1; svp <= SP; svp++) {
4654                 const SSize_t elem = SvIV(*svp);
4655                 if (elem > max)
4656                     max = elem;
4657             }
4658             if (max > AvMAX(av))
4659                 av_extend(av, max);
4660         }
4661
4662         while (++MARK <= SP) {
4663             SV **svp;
4664             SSize_t elem = SvIV(*MARK);
4665             bool preeminent = TRUE;
4666
4667             if (localizing && can_preserve) {
4668                 /* If we can determine whether the element exist,
4669                  * Try to preserve the existenceness of a tied array
4670                  * element by using EXISTS and DELETE if possible.
4671                  * Fallback to FETCH and STORE otherwise. */
4672                 preeminent = av_exists(av, elem);
4673             }
4674