e316c8eba05f9239808c1e36329947abcda7ec35
[p5sagit/p5-mst-13.2.git] / pp.c
1 /*    pp.c
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4  *    2000, 2001, 2002, 2003, 2004, 2005, 2006, 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 to discover,
13  * and no knowing what you'll find around a corner.  And Elves, sir!" --Samwise
14  */
15
16 /* This file contains general pp ("push/pop") functions that execute the
17  * opcodes that make up a perl program. A typical pp function expects to
18  * find its arguments on the stack, and usually pushes its results onto
19  * the stack, hence the 'pp' terminology. Each OP structure contains
20  * a pointer to the relevant pp_foo() function.
21  */
22
23 #include "EXTERN.h"
24 #define PERL_IN_PP_C
25 #include "perl.h"
26 #include "keywords.h"
27
28 #include "reentr.h"
29
30 /* XXX I can't imagine anyone who doesn't have this actually _needs_
31    it, since pid_t is an integral type.
32    --AD  2/20/1998
33 */
34 #ifdef NEED_GETPID_PROTO
35 extern Pid_t getpid (void);
36 #endif
37
38 /*
39  * Some BSDs and Cygwin default to POSIX math instead of IEEE.
40  * This switches them over to IEEE.
41  */
42 #if defined(LIBM_LIB_VERSION)
43     _LIB_VERSION_TYPE _LIB_VERSION = _IEEE_;
44 #endif
45
46 /* variations on pp_null */
47
48 PP(pp_stub)
49 {
50     dVAR;
51     dSP;
52     if (GIMME_V == G_SCALAR)
53         XPUSHs(&PL_sv_undef);
54     RETURN;
55 }
56
57 /* Pushy stuff. */
58
59 PP(pp_padav)
60 {
61     dVAR; dSP; dTARGET;
62     I32 gimme;
63     if (PL_op->op_private & OPpLVAL_INTRO)
64         SAVECLEARSV(PAD_SVl(PL_op->op_targ));
65     EXTEND(SP, 1);
66     if (PL_op->op_flags & OPf_REF) {
67         PUSHs(TARG);
68         RETURN;
69     } else if (LVRET) {
70         if (GIMME == G_SCALAR)
71             Perl_croak(aTHX_ "Can't return array to lvalue scalar context");
72         PUSHs(TARG);
73         RETURN;
74     }
75     gimme = GIMME_V;
76     if (gimme == G_ARRAY) {
77         const I32 maxarg = AvFILL((AV*)TARG) + 1;
78         EXTEND(SP, maxarg);
79         if (SvMAGICAL(TARG)) {
80             U32 i;
81             for (i=0; i < (U32)maxarg; i++) {
82                 SV * const * const svp = av_fetch((AV*)TARG, i, FALSE);
83                 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
84             }
85         }
86         else {
87             Copy(AvARRAY((AV*)TARG), SP+1, maxarg, SV*);
88         }
89         SP += maxarg;
90     }
91     else if (gimme == G_SCALAR) {
92         SV* const sv = sv_newmortal();
93         const I32 maxarg = AvFILL((AV*)TARG) + 1;
94         sv_setiv(sv, maxarg);
95         PUSHs(sv);
96     }
97     RETURN;
98 }
99
100 PP(pp_padhv)
101 {
102     dVAR; dSP; dTARGET;
103     I32 gimme;
104
105     XPUSHs(TARG);
106     if (PL_op->op_private & OPpLVAL_INTRO)
107         SAVECLEARSV(PAD_SVl(PL_op->op_targ));
108     if (PL_op->op_flags & OPf_REF)
109         RETURN;
110     else if (LVRET) {
111         if (GIMME == G_SCALAR)
112             Perl_croak(aTHX_ "Can't return hash to lvalue scalar context");
113         RETURN;
114     }
115     gimme = GIMME_V;
116     if (gimme == G_ARRAY) {
117         RETURNOP(do_kv());
118     }
119     else if (gimme == G_SCALAR) {
120         SV* const sv = Perl_hv_scalar(aTHX_ (HV*)TARG);
121         SETs(sv);
122     }
123     RETURN;
124 }
125
126 /* Translations. */
127
128 PP(pp_rv2gv)
129 {
130     dVAR; dSP; dTOPss;
131
132     if (SvROK(sv)) {
133       wasref:
134         tryAMAGICunDEREF(to_gv);
135
136         sv = SvRV(sv);
137         if (SvTYPE(sv) == SVt_PVIO) {
138             GV * const gv = (GV*) sv_newmortal();
139             gv_init(gv, 0, "", 0, 0);
140             GvIOp(gv) = (IO *)sv;
141             SvREFCNT_inc_void_NN(sv);
142             sv = (SV*) gv;
143         }
144         else if (SvTYPE(sv) != SVt_PVGV)
145             DIE(aTHX_ "Not a GLOB reference");
146     }
147     else {
148         if (SvTYPE(sv) != SVt_PVGV) {
149             if (SvGMAGICAL(sv)) {
150                 mg_get(sv);
151                 if (SvROK(sv))
152                     goto wasref;
153             }
154             if (!SvOK(sv) && sv != &PL_sv_undef) {
155                 /* If this is a 'my' scalar and flag is set then vivify
156                  * NI-S 1999/05/07
157                  */
158                 if (SvREADONLY(sv))
159                     Perl_croak(aTHX_ PL_no_modify);
160                 if (PL_op->op_private & OPpDEREF) {
161                     GV *gv;
162                     if (cUNOP->op_targ) {
163                         STRLEN len;
164                         SV * const namesv = PAD_SV(cUNOP->op_targ);
165                         const char * const name = SvPV(namesv, len);
166                         gv = (GV*)newSV(0);
167                         gv_init(gv, CopSTASH(PL_curcop), name, len, 0);
168                     }
169                     else {
170                         const char * const name = CopSTASHPV(PL_curcop);
171                         gv = newGVgen(name);
172                     }
173                     if (SvTYPE(sv) < SVt_RV)
174                         sv_upgrade(sv, SVt_RV);
175                     else if (SvPVX_const(sv)) {
176                         SvPV_free(sv);
177                         SvLEN_set(sv, 0);
178                         SvCUR_set(sv, 0);
179                     }
180                     SvRV_set(sv, (SV*)gv);
181                     SvROK_on(sv);
182                     SvSETMAGIC(sv);
183                     goto wasref;
184                 }
185                 if (PL_op->op_flags & OPf_REF ||
186                     PL_op->op_private & HINT_STRICT_REFS)
187                     DIE(aTHX_ PL_no_usym, "a symbol");
188                 if (ckWARN(WARN_UNINITIALIZED))
189                     report_uninit(sv);
190                 RETSETUNDEF;
191             }
192             if ((PL_op->op_flags & OPf_SPECIAL) &&
193                 !(PL_op->op_flags & OPf_MOD))
194             {
195                 SV * const temp = (SV*)gv_fetchsv(sv, 0, SVt_PVGV);
196                 if (!temp
197                     && (!is_gv_magical_sv(sv,0)
198                         || !(sv = (SV*)gv_fetchsv(sv, GV_ADD, SVt_PVGV)))) {
199                     RETSETUNDEF;
200                 }
201                 sv = temp;
202             }
203             else {
204                 if (PL_op->op_private & HINT_STRICT_REFS)
205                     DIE(aTHX_ PL_no_symref_sv, sv, "a symbol");
206                 if ((PL_op->op_private & (OPpLVAL_INTRO|OPpDONT_INIT_GV))
207                     == OPpDONT_INIT_GV) {
208                     /* We are the target of a coderef assignment.  Return
209                        the scalar unchanged, and let pp_sasssign deal with
210                        things.  */
211                     RETURN;
212                 }
213                 sv = (SV*)gv_fetchsv(sv, GV_ADD, SVt_PVGV);
214             }
215         }
216     }
217     if (PL_op->op_private & OPpLVAL_INTRO)
218         save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
219     SETs(sv);
220     RETURN;
221 }
222
223 PP(pp_rv2sv)
224 {
225     dVAR; dSP; dTOPss;
226     GV *gv = NULL;
227
228     if (SvROK(sv)) {
229       wasref:
230         tryAMAGICunDEREF(to_sv);
231
232         sv = SvRV(sv);
233         switch (SvTYPE(sv)) {
234         case SVt_PVAV:
235         case SVt_PVHV:
236         case SVt_PVCV:
237         case SVt_PVFM:
238         case SVt_PVIO:
239             DIE(aTHX_ "Not a SCALAR reference");
240         }
241     }
242     else {
243         gv = (GV*)sv;
244
245         if (SvTYPE(gv) != SVt_PVGV) {
246             if (SvGMAGICAL(sv)) {
247                 mg_get(sv);
248                 if (SvROK(sv))
249                     goto wasref;
250             }
251             if (PL_op->op_private & HINT_STRICT_REFS) {
252                 if (SvOK(sv))
253                     DIE(aTHX_ PL_no_symref_sv, sv, "a SCALAR");
254                 else
255                     DIE(aTHX_ PL_no_usym, "a SCALAR");
256             }
257             if (!SvOK(sv)) {
258                 if (PL_op->op_flags & OPf_REF)
259                     DIE(aTHX_ PL_no_usym, "a SCALAR");
260                 if (ckWARN(WARN_UNINITIALIZED))
261                     report_uninit(sv);
262                 RETSETUNDEF;
263             }
264             if ((PL_op->op_flags & OPf_SPECIAL) &&
265                 !(PL_op->op_flags & OPf_MOD))
266             {
267                 gv = (GV*)gv_fetchsv(sv, 0, SVt_PV);
268                 if (!gv
269                     && (!is_gv_magical_sv(sv, 0)
270                         || !(gv = (GV*)gv_fetchsv(sv, GV_ADD, SVt_PV))))
271                 {
272                     RETSETUNDEF;
273                 }
274             }
275             else {
276                 gv = (GV*)gv_fetchsv(sv, GV_ADD, SVt_PV);
277             }
278         }
279         sv = GvSVn(gv);
280     }
281     if (PL_op->op_flags & OPf_MOD) {
282         if (PL_op->op_private & OPpLVAL_INTRO) {
283             if (cUNOP->op_first->op_type == OP_NULL)
284                 sv = save_scalar((GV*)TOPs);
285             else if (gv)
286                 sv = save_scalar(gv);
287             else
288                 Perl_croak(aTHX_ PL_no_localize_ref);
289         }
290         else if (PL_op->op_private & OPpDEREF)
291             vivify_ref(sv, PL_op->op_private & OPpDEREF);
292     }
293     SETs(sv);
294     RETURN;
295 }
296
297 PP(pp_av2arylen)
298 {
299     dVAR; dSP;
300     AV * const av = (AV*)TOPs;
301     SV ** const sv = Perl_av_arylen_p(aTHX_ (AV*)av);
302     if (!*sv) {
303         *sv = newSV(0);
304         sv_upgrade(*sv, SVt_PVMG);
305         sv_magic(*sv, (SV*)av, PERL_MAGIC_arylen, NULL, 0);
306     }
307     SETs(*sv);
308     RETURN;
309 }
310
311 PP(pp_pos)
312 {
313     dVAR; dSP; dTARGET; dPOPss;
314
315     if (PL_op->op_flags & OPf_MOD || LVRET) {
316         if (SvTYPE(TARG) < SVt_PVLV) {
317             sv_upgrade(TARG, SVt_PVLV);
318             sv_magic(TARG, NULL, PERL_MAGIC_pos, NULL, 0);
319         }
320
321         LvTYPE(TARG) = '.';
322         if (LvTARG(TARG) != sv) {
323             if (LvTARG(TARG))
324                 SvREFCNT_dec(LvTARG(TARG));
325             LvTARG(TARG) = SvREFCNT_inc_simple(sv);
326         }
327         PUSHs(TARG);    /* no SvSETMAGIC */
328         RETURN;
329     }
330     else {
331         if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
332             const MAGIC * const mg = mg_find(sv, PERL_MAGIC_regex_global);
333             if (mg && mg->mg_len >= 0) {
334                 I32 i = mg->mg_len;
335                 if (DO_UTF8(sv))
336                     sv_pos_b2u(sv, &i);
337                 PUSHi(i + CopARYBASE_get(PL_curcop));
338                 RETURN;
339             }
340         }
341         RETPUSHUNDEF;
342     }
343 }
344
345 PP(pp_rv2cv)
346 {
347     dVAR; dSP;
348     GV *gv;
349     HV *stash;
350     const I32 flags = (PL_op->op_flags & OPf_SPECIAL)
351         ? 0
352         : ((PL_op->op_private & (OPpLVAL_INTRO|OPpMAY_RETURN_CONSTANT)) == OPpMAY_RETURN_CONSTANT)
353             ? GV_ADD|GV_NOEXPAND
354             : GV_ADD;
355     /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
356     /* (But not in defined().) */
357
358     CV *cv = sv_2cv(TOPs, &stash, &gv, flags);
359     if (cv) {
360         if (CvCLONE(cv))
361             cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
362         if ((PL_op->op_private & OPpLVAL_INTRO)) {
363             if (gv && GvCV(gv) == cv && (gv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv), FALSE)))
364                 cv = GvCV(gv);
365             if (!CvLVALUE(cv))
366                 DIE(aTHX_ "Can't modify non-lvalue subroutine call");
367         }
368     }
369     else if ((flags == (GV_ADD|GV_NOEXPAND)) && gv && SvROK(gv)) {
370         cv = (CV*)gv;
371     }    
372     else
373         cv = (CV*)&PL_sv_undef;
374     SETs((SV*)cv);
375     RETURN;
376 }
377
378 PP(pp_prototype)
379 {
380     dVAR; dSP;
381     CV *cv;
382     HV *stash;
383     GV *gv;
384     SV *ret = &PL_sv_undef;
385
386     if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
387         const char * const s = SvPVX_const(TOPs);
388         if (strnEQ(s, "CORE::", 6)) {
389             const int code = keyword(s + 6, SvCUR(TOPs) - 6);
390             if (code < 0) {     /* Overridable. */
391 #define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
392                 int i = 0, n = 0, seen_question = 0;
393                 I32 oa;
394                 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
395
396                 if (code == -KEY_chop || code == -KEY_chomp
397                         || code == -KEY_exec || code == -KEY_system)
398                     goto set;
399                 while (i < MAXO) {      /* The slow way. */
400                     if (strEQ(s + 6, PL_op_name[i])
401                         || strEQ(s + 6, PL_op_desc[i]))
402                     {
403                         goto found;
404                     }
405                     i++;
406                 }
407                 goto nonesuch;          /* Should not happen... */
408               found:
409                 oa = PL_opargs[i] >> OASHIFT;
410                 while (oa) {
411                     if (oa & OA_OPTIONAL && !seen_question) {
412                         seen_question = 1;
413                         str[n++] = ';';
414                     }
415                     if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
416                         && (oa & (OA_OPTIONAL - 1)) <= OA_SCALARREF
417                         /* But globs are already references (kinda) */
418                         && (oa & (OA_OPTIONAL - 1)) != OA_FILEREF
419                     ) {
420                         str[n++] = '\\';
421                     }
422                     str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
423                     oa = oa >> 4;
424                 }
425                 str[n++] = '\0';
426                 ret = sv_2mortal(newSVpvn(str, n - 1));
427             }
428             else if (code)              /* Non-Overridable */
429                 goto set;
430             else {                      /* None such */
431               nonesuch:
432                 DIE(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
433             }
434         }
435     }
436     cv = sv_2cv(TOPs, &stash, &gv, 0);
437     if (cv && SvPOK(cv))
438         ret = sv_2mortal(newSVpvn(SvPVX_const(cv), SvCUR(cv)));
439   set:
440     SETs(ret);
441     RETURN;
442 }
443
444 PP(pp_anoncode)
445 {
446     dVAR; dSP;
447     CV* cv = (CV*)PAD_SV(PL_op->op_targ);
448     if (CvCLONE(cv))
449         cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
450     EXTEND(SP,1);
451     PUSHs((SV*)cv);
452     RETURN;
453 }
454
455 PP(pp_srefgen)
456 {
457     dVAR; dSP;
458     *SP = refto(*SP);
459     RETURN;
460 }
461
462 PP(pp_refgen)
463 {
464     dVAR; dSP; dMARK;
465     if (GIMME != G_ARRAY) {
466         if (++MARK <= SP)
467             *MARK = *SP;
468         else
469             *MARK = &PL_sv_undef;
470         *MARK = refto(*MARK);
471         SP = MARK;
472         RETURN;
473     }
474     EXTEND_MORTAL(SP - MARK);
475     while (++MARK <= SP)
476         *MARK = refto(*MARK);
477     RETURN;
478 }
479
480 STATIC SV*
481 S_refto(pTHX_ SV *sv)
482 {
483     dVAR;
484     SV* rv;
485
486     if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
487         if (LvTARGLEN(sv))
488             vivify_defelem(sv);
489         if (!(sv = LvTARG(sv)))
490             sv = &PL_sv_undef;
491         else
492             SvREFCNT_inc_void_NN(sv);
493     }
494     else if (SvTYPE(sv) == SVt_PVAV) {
495         if (!AvREAL((AV*)sv) && AvREIFY((AV*)sv))
496             av_reify((AV*)sv);
497         SvTEMP_off(sv);
498         SvREFCNT_inc_void_NN(sv);
499     }
500     else if (SvPADTMP(sv) && !IS_PADGV(sv))
501         sv = newSVsv(sv);
502     else {
503         SvTEMP_off(sv);
504         SvREFCNT_inc_void_NN(sv);
505     }
506     rv = sv_newmortal();
507     sv_upgrade(rv, SVt_RV);
508     SvRV_set(rv, sv);
509     SvROK_on(rv);
510     return rv;
511 }
512
513 PP(pp_ref)
514 {
515     dVAR; dSP; dTARGET;
516     const char *pv;
517     SV * const sv = POPs;
518
519     if (sv)
520         SvGETMAGIC(sv);
521
522     if (!sv || !SvROK(sv))
523         RETPUSHNO;
524
525     pv = sv_reftype(SvRV(sv),TRUE);
526     PUSHp(pv, strlen(pv));
527     RETURN;
528 }
529
530 PP(pp_bless)
531 {
532     dVAR; dSP;
533     HV *stash;
534
535     if (MAXARG == 1)
536         stash = CopSTASH(PL_curcop);
537     else {
538         SV * const ssv = POPs;
539         STRLEN len;
540         const char *ptr;
541
542         if (ssv && !SvGMAGICAL(ssv) && !SvAMAGIC(ssv) && SvROK(ssv))
543             Perl_croak(aTHX_ "Attempt to bless into a reference");
544         ptr = SvPV_const(ssv,len);
545         if (len == 0 && ckWARN(WARN_MISC))
546             Perl_warner(aTHX_ packWARN(WARN_MISC),
547                    "Explicit blessing to '' (assuming package main)");
548         stash = gv_stashpvn(ptr, len, TRUE);
549     }
550
551     (void)sv_bless(TOPs, stash);
552     RETURN;
553 }
554
555 PP(pp_gelem)
556 {
557     dVAR; dSP;
558
559     SV *sv = POPs;
560     const char * const elem = SvPV_nolen_const(sv);
561     GV * const gv = (GV*)POPs;
562     SV * tmpRef = NULL;
563
564     sv = NULL;
565     if (elem) {
566         /* elem will always be NUL terminated.  */
567         const char * const second_letter = elem + 1;
568         switch (*elem) {
569         case 'A':
570             if (strEQ(second_letter, "RRAY"))
571                 tmpRef = (SV*)GvAV(gv);
572             break;
573         case 'C':
574             if (strEQ(second_letter, "ODE"))
575                 tmpRef = (SV*)GvCVu(gv);
576             break;
577         case 'F':
578             if (strEQ(second_letter, "ILEHANDLE")) {
579                 /* finally deprecated in 5.8.0 */
580                 deprecate("*glob{FILEHANDLE}");
581                 tmpRef = (SV*)GvIOp(gv);
582             }
583             else
584                 if (strEQ(second_letter, "ORMAT"))
585                     tmpRef = (SV*)GvFORM(gv);
586             break;
587         case 'G':
588             if (strEQ(second_letter, "LOB"))
589                 tmpRef = (SV*)gv;
590             break;
591         case 'H':
592             if (strEQ(second_letter, "ASH"))
593                 tmpRef = (SV*)GvHV(gv);
594             break;
595         case 'I':
596             if (*second_letter == 'O' && !elem[2])
597                 tmpRef = (SV*)GvIOp(gv);
598             break;
599         case 'N':
600             if (strEQ(second_letter, "AME"))
601                 sv = newSVpvn(GvNAME(gv), GvNAMELEN(gv));
602             break;
603         case 'P':
604             if (strEQ(second_letter, "ACKAGE")) {
605                 const HV * const stash = GvSTASH(gv);
606                 const HEK * const hek = stash ? HvNAME_HEK(stash) : NULL;
607                 sv = hek ? newSVhek(hek) : newSVpvs("__ANON__");
608             }
609             break;
610         case 'S':
611             if (strEQ(second_letter, "CALAR"))
612                 tmpRef = GvSVn(gv);
613             break;
614         }
615     }
616     if (tmpRef)
617         sv = newRV(tmpRef);
618     if (sv)
619         sv_2mortal(sv);
620     else
621         sv = &PL_sv_undef;
622     XPUSHs(sv);
623     RETURN;
624 }
625
626 /* Pattern matching */
627
628 PP(pp_study)
629 {
630     dVAR; dSP; dPOPss;
631     register unsigned char *s;
632     register I32 pos;
633     register I32 ch;
634     register I32 *sfirst;
635     register I32 *snext;
636     STRLEN len;
637
638     if (sv == PL_lastscream) {
639         if (SvSCREAM(sv))
640             RETPUSHYES;
641     }
642     s = (unsigned char*)(SvPV(sv, len));
643     pos = len;
644     if (pos <= 0 || !SvPOK(sv)) {
645         /* No point in studying a zero length string, and not safe to study
646            anything that doesn't appear to be a simple scalar (and hence might
647            change between now and when the regexp engine runs without our set
648            magic ever running) such as a reference to an object with overloaded
649            stringification.  */
650         RETPUSHNO;
651     }
652
653     if (PL_lastscream) {
654         SvSCREAM_off(PL_lastscream);
655         SvREFCNT_dec(PL_lastscream);
656     }
657     PL_lastscream = SvREFCNT_inc_simple(sv);
658
659     s = (unsigned char*)(SvPV(sv, len));
660     pos = len;
661     if (pos <= 0)
662         RETPUSHNO;
663     if (pos > PL_maxscream) {
664         if (PL_maxscream < 0) {
665             PL_maxscream = pos + 80;
666             Newx(PL_screamfirst, 256, I32);
667             Newx(PL_screamnext, PL_maxscream, I32);
668         }
669         else {
670             PL_maxscream = pos + pos / 4;
671             Renew(PL_screamnext, PL_maxscream, I32);
672         }
673     }
674
675     sfirst = PL_screamfirst;
676     snext = PL_screamnext;
677
678     if (!sfirst || !snext)
679         DIE(aTHX_ "do_study: out of memory");
680
681     for (ch = 256; ch; --ch)
682         *sfirst++ = -1;
683     sfirst -= 256;
684
685     while (--pos >= 0) {
686         register const I32 ch = s[pos];
687         if (sfirst[ch] >= 0)
688             snext[pos] = sfirst[ch] - pos;
689         else
690             snext[pos] = -pos;
691         sfirst[ch] = pos;
692     }
693
694     SvSCREAM_on(sv);
695     /* piggyback on m//g magic */
696     sv_magic(sv, NULL, PERL_MAGIC_regex_global, NULL, 0);
697     RETPUSHYES;
698 }
699
700 PP(pp_trans)
701 {
702     dVAR; dSP; dTARG;
703     SV *sv;
704
705     if (PL_op->op_flags & OPf_STACKED)
706         sv = POPs;
707     else if (PL_op->op_private & OPpTARGET_MY)
708         sv = GETTARGET;
709     else {
710         sv = DEFSV;
711         EXTEND(SP,1);
712     }
713     TARG = sv_newmortal();
714     PUSHi(do_trans(sv));
715     RETURN;
716 }
717
718 /* Lvalue operators. */
719
720 PP(pp_schop)
721 {
722     dVAR; dSP; dTARGET;
723     do_chop(TARG, TOPs);
724     SETTARG;
725     RETURN;
726 }
727
728 PP(pp_chop)
729 {
730     dVAR; dSP; dMARK; dTARGET; dORIGMARK;
731     while (MARK < SP)
732         do_chop(TARG, *++MARK);
733     SP = ORIGMARK;
734     XPUSHTARG;
735     RETURN;
736 }
737
738 PP(pp_schomp)
739 {
740     dVAR; dSP; dTARGET;
741     SETi(do_chomp(TOPs));
742     RETURN;
743 }
744
745 PP(pp_chomp)
746 {
747     dVAR; dSP; dMARK; dTARGET;
748     register I32 count = 0;
749
750     while (SP > MARK)
751         count += do_chomp(POPs);
752     XPUSHi(count);
753     RETURN;
754 }
755
756 PP(pp_undef)
757 {
758     dVAR; dSP;
759     SV *sv;
760
761     if (!PL_op->op_private) {
762         EXTEND(SP, 1);
763         RETPUSHUNDEF;
764     }
765
766     sv = POPs;
767     if (!sv)
768         RETPUSHUNDEF;
769
770     SV_CHECK_THINKFIRST_COW_DROP(sv);
771
772     switch (SvTYPE(sv)) {
773     case SVt_NULL:
774         break;
775     case SVt_PVAV:
776         av_undef((AV*)sv);
777         break;
778     case SVt_PVHV:
779         hv_undef((HV*)sv);
780         break;
781     case SVt_PVCV:
782         if (cv_const_sv((CV*)sv) && ckWARN(WARN_MISC))
783             Perl_warner(aTHX_ packWARN(WARN_MISC), "Constant subroutine %s undefined",
784                  CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
785         /* FALLTHROUGH */
786     case SVt_PVFM:
787         {
788             /* let user-undef'd sub keep its identity */
789             GV* const gv = CvGV((CV*)sv);
790             cv_undef((CV*)sv);
791             CvGV((CV*)sv) = gv;
792         }
793         break;
794     case SVt_PVGV:
795         if (SvFAKE(sv))
796             SvSetMagicSV(sv, &PL_sv_undef);
797         else {
798             GP *gp;
799             gp_free((GV*)sv);
800             Newxz(gp, 1, GP);
801             GvGP(sv) = gp_ref(gp);
802             GvSV(sv) = newSV(0);
803             GvLINE(sv) = CopLINE(PL_curcop);
804             GvEGV(sv) = (GV*)sv;
805             GvMULTI_on(sv);
806         }
807         break;
808     default:
809         if (SvTYPE(sv) >= SVt_PV && SvPVX_const(sv) && SvLEN(sv)) {
810             SvPV_free(sv);
811             SvPV_set(sv, NULL);
812             SvLEN_set(sv, 0);
813         }
814         SvOK_off(sv);
815         SvSETMAGIC(sv);
816     }
817
818     RETPUSHUNDEF;
819 }
820
821 PP(pp_predec)
822 {
823     dVAR; dSP;
824     if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
825         DIE(aTHX_ PL_no_modify);
826     if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
827         && SvIVX(TOPs) != IV_MIN)
828     {
829         SvIV_set(TOPs, SvIVX(TOPs) - 1);
830         SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
831     }
832     else
833         sv_dec(TOPs);
834     SvSETMAGIC(TOPs);
835     return NORMAL;
836 }
837
838 PP(pp_postinc)
839 {
840     dVAR; dSP; dTARGET;
841     if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
842         DIE(aTHX_ PL_no_modify);
843     sv_setsv(TARG, TOPs);
844     if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
845         && SvIVX(TOPs) != IV_MAX)
846     {
847         SvIV_set(TOPs, SvIVX(TOPs) + 1);
848         SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
849     }
850     else
851         sv_inc(TOPs);
852     SvSETMAGIC(TOPs);
853     /* special case for undef: see thread at 2003-03/msg00536.html in archive */
854     if (!SvOK(TARG))
855         sv_setiv(TARG, 0);
856     SETs(TARG);
857     return NORMAL;
858 }
859
860 PP(pp_postdec)
861 {
862     dVAR; dSP; dTARGET;
863     if (SvTYPE(TOPs) >= SVt_PVGV && SvTYPE(TOPs) != SVt_PVLV)
864         DIE(aTHX_ PL_no_modify);
865     sv_setsv(TARG, TOPs);
866     if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
867         && SvIVX(TOPs) != IV_MIN)
868     {
869         SvIV_set(TOPs, SvIVX(TOPs) - 1);
870         SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
871     }
872     else
873         sv_dec(TOPs);
874     SvSETMAGIC(TOPs);
875     SETs(TARG);
876     return NORMAL;
877 }
878
879 /* Ordinary operators. */
880
881 PP(pp_pow)
882 {
883     dVAR; dSP; dATARGET;
884 #ifdef PERL_PRESERVE_IVUV
885     bool is_int = 0;
886 #endif
887     tryAMAGICbin(pow,opASSIGN);
888 #ifdef PERL_PRESERVE_IVUV
889     /* For integer to integer power, we do the calculation by hand wherever
890        we're sure it is safe; otherwise we call pow() and try to convert to
891        integer afterwards. */
892     {
893         SvIV_please(TOPs);
894         if (SvIOK(TOPs)) {
895             SvIV_please(TOPm1s);
896             if (SvIOK(TOPm1s)) {
897                 UV power;
898                 bool baseuok;
899                 UV baseuv;
900
901                 if (SvUOK(TOPs)) {
902                     power = SvUVX(TOPs);
903                 } else {
904                     const IV iv = SvIVX(TOPs);
905                     if (iv >= 0) {
906                         power = iv;
907                     } else {
908                         goto float_it; /* Can't do negative powers this way.  */
909                     }
910                 }
911
912                 baseuok = SvUOK(TOPm1s);
913                 if (baseuok) {
914                     baseuv = SvUVX(TOPm1s);
915                 } else {
916                     const IV iv = SvIVX(TOPm1s);
917                     if (iv >= 0) {
918                         baseuv = iv;
919                         baseuok = TRUE; /* effectively it's a UV now */
920                     } else {
921                         baseuv = -iv; /* abs, baseuok == false records sign */
922                     }
923                 }
924                 /* now we have integer ** positive integer. */
925                 is_int = 1;
926
927                 /* foo & (foo - 1) is zero only for a power of 2.  */
928                 if (!(baseuv & (baseuv - 1))) {
929                     /* We are raising power-of-2 to a positive integer.
930                        The logic here will work for any base (even non-integer
931                        bases) but it can be less accurate than
932                        pow (base,power) or exp (power * log (base)) when the
933                        intermediate values start to spill out of the mantissa.
934                        With powers of 2 we know this can't happen.
935                        And powers of 2 are the favourite thing for perl
936                        programmers to notice ** not doing what they mean. */
937                     NV result = 1.0;
938                     NV base = baseuok ? baseuv : -(NV)baseuv;
939
940                     if (power & 1) {
941                         result *= base;
942                     }
943                     while (power >>= 1) {
944                         base *= base;
945                         if (power & 1) {
946                             result *= base;
947                         }
948                     }
949                     SP--;
950                     SETn( result );
951                     SvIV_please(TOPs);
952                     RETURN;
953                 } else {
954                     register unsigned int highbit = 8 * sizeof(UV);
955                     register unsigned int diff = 8 * sizeof(UV);
956                     while (diff >>= 1) {
957                         highbit -= diff;
958                         if (baseuv >> highbit) {
959                             highbit += diff;
960                         }
961                     }
962                     /* we now have baseuv < 2 ** highbit */
963                     if (power * highbit <= 8 * sizeof(UV)) {
964                         /* result will definitely fit in UV, so use UV math
965                            on same algorithm as above */
966                         register UV result = 1;
967                         register UV base = baseuv;
968                         const bool odd_power = (bool)(power & 1);
969                         if (odd_power) {
970                             result *= base;
971                         }
972                         while (power >>= 1) {
973                             base *= base;
974                             if (power & 1) {
975                                 result *= base;
976                             }
977                         }
978                         SP--;
979                         if (baseuok || !odd_power)
980                             /* answer is positive */
981                             SETu( result );
982                         else if (result <= (UV)IV_MAX)
983                             /* answer negative, fits in IV */
984                             SETi( -(IV)result );
985                         else if (result == (UV)IV_MIN) 
986                             /* 2's complement assumption: special case IV_MIN */
987                             SETi( IV_MIN );
988                         else
989                             /* answer negative, doesn't fit */
990                             SETn( -(NV)result );
991                         RETURN;
992                     } 
993                 }
994             }
995         }
996     }
997   float_it:
998 #endif    
999     {
1000         dPOPTOPnnrl;
1001
1002 #if defined(USE_LONG_DOUBLE) && defined(HAS_AIX_POWL_NEG_BASE_BUG)
1003     /*
1004     We are building perl with long double support and are on an AIX OS
1005     afflicted with a powl() function that wrongly returns NaNQ for any
1006     negative base.  This was reported to IBM as PMR #23047-379 on
1007     03/06/2006.  The problem exists in at least the following versions
1008     of AIX and the libm fileset, and no doubt others as well:
1009
1010         AIX 4.3.3-ML10      bos.adt.libm 4.3.3.50
1011         AIX 5.1.0-ML04      bos.adt.libm 5.1.0.29
1012         AIX 5.2.0           bos.adt.libm 5.2.0.85
1013
1014     So, until IBM fixes powl(), we provide the following workaround to
1015     handle the problem ourselves.  Our logic is as follows: for
1016     negative bases (left), we use fmod(right, 2) to check if the
1017     exponent is an odd or even integer:
1018
1019         - if odd,  powl(left, right) == -powl(-left, right)
1020         - if even, powl(left, right) ==  powl(-left, right)
1021
1022     If the exponent is not an integer, the result is rightly NaNQ, so
1023     we just return that (as NV_NAN).
1024     */
1025
1026         if (left < 0.0) {
1027             NV mod2 = Perl_fmod( right, 2.0 );
1028             if (mod2 == 1.0 || mod2 == -1.0) {  /* odd integer */
1029                 SETn( -Perl_pow( -left, right) );
1030             } else if (mod2 == 0.0) {           /* even integer */
1031                 SETn( Perl_pow( -left, right) );
1032             } else {                            /* fractional power */
1033                 SETn( NV_NAN );
1034             }
1035         } else {
1036             SETn( Perl_pow( left, right) );
1037         }
1038 #else
1039         SETn( Perl_pow( left, right) );
1040 #endif  /* HAS_AIX_POWL_NEG_BASE_BUG */
1041
1042 #ifdef PERL_PRESERVE_IVUV
1043         if (is_int)
1044             SvIV_please(TOPs);
1045 #endif
1046         RETURN;
1047     }
1048 }
1049
1050 PP(pp_multiply)
1051 {
1052     dVAR; dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
1053 #ifdef PERL_PRESERVE_IVUV
1054     SvIV_please(TOPs);
1055     if (SvIOK(TOPs)) {
1056         /* Unless the left argument is integer in range we are going to have to
1057            use NV maths. Hence only attempt to coerce the right argument if
1058            we know the left is integer.  */
1059         /* Left operand is defined, so is it IV? */
1060         SvIV_please(TOPm1s);
1061         if (SvIOK(TOPm1s)) {
1062             bool auvok = SvUOK(TOPm1s);
1063             bool buvok = SvUOK(TOPs);
1064             const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
1065             const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
1066             UV alow;
1067             UV ahigh;
1068             UV blow;
1069             UV bhigh;
1070
1071             if (auvok) {
1072                 alow = SvUVX(TOPm1s);
1073             } else {
1074                 const IV aiv = SvIVX(TOPm1s);
1075                 if (aiv >= 0) {
1076                     alow = aiv;
1077                     auvok = TRUE; /* effectively it's a UV now */
1078                 } else {
1079                     alow = -aiv; /* abs, auvok == false records sign */
1080                 }
1081             }
1082             if (buvok) {
1083                 blow = SvUVX(TOPs);
1084             } else {
1085                 const IV biv = SvIVX(TOPs);
1086                 if (biv >= 0) {
1087                     blow = biv;
1088                     buvok = TRUE; /* effectively it's a UV now */
1089                 } else {
1090                     blow = -biv; /* abs, buvok == false records sign */
1091                 }
1092             }
1093
1094             /* If this does sign extension on unsigned it's time for plan B  */
1095             ahigh = alow >> (4 * sizeof (UV));
1096             alow &= botmask;
1097             bhigh = blow >> (4 * sizeof (UV));
1098             blow &= botmask;
1099             if (ahigh && bhigh) {
1100                 NOOP;
1101                 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
1102                    which is overflow. Drop to NVs below.  */
1103             } else if (!ahigh && !bhigh) {
1104                 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
1105                    so the unsigned multiply cannot overflow.  */
1106                 const UV product = alow * blow;
1107                 if (auvok == buvok) {
1108                     /* -ve * -ve or +ve * +ve gives a +ve result.  */
1109                     SP--;
1110                     SETu( product );
1111                     RETURN;
1112                 } else if (product <= (UV)IV_MIN) {
1113                     /* 2s complement assumption that (UV)-IV_MIN is correct.  */
1114                     /* -ve result, which could overflow an IV  */
1115                     SP--;
1116                     SETi( -(IV)product );
1117                     RETURN;
1118                 } /* else drop to NVs below. */
1119             } else {
1120                 /* One operand is large, 1 small */
1121                 UV product_middle;
1122                 if (bhigh) {
1123                     /* swap the operands */
1124                     ahigh = bhigh;
1125                     bhigh = blow; /* bhigh now the temp var for the swap */
1126                     blow = alow;
1127                     alow = bhigh;
1128                 }
1129                 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1130                    multiplies can't overflow. shift can, add can, -ve can.  */
1131                 product_middle = ahigh * blow;
1132                 if (!(product_middle & topmask)) {
1133                     /* OK, (ahigh * blow) won't lose bits when we shift it.  */
1134                     UV product_low;
1135                     product_middle <<= (4 * sizeof (UV));
1136                     product_low = alow * blow;
1137
1138                     /* as for pp_add, UV + something mustn't get smaller.
1139                        IIRC ANSI mandates this wrapping *behaviour* for
1140                        unsigned whatever the actual representation*/
1141                     product_low += product_middle;
1142                     if (product_low >= product_middle) {
1143                         /* didn't overflow */
1144                         if (auvok == buvok) {
1145                             /* -ve * -ve or +ve * +ve gives a +ve result.  */
1146                             SP--;
1147                             SETu( product_low );
1148                             RETURN;
1149                         } else if (product_low <= (UV)IV_MIN) {
1150                             /* 2s complement assumption again  */
1151                             /* -ve result, which could overflow an IV  */
1152                             SP--;
1153                             SETi( -(IV)product_low );
1154                             RETURN;
1155                         } /* else drop to NVs below. */
1156                     }
1157                 } /* product_middle too large */
1158             } /* ahigh && bhigh */
1159         } /* SvIOK(TOPm1s) */
1160     } /* SvIOK(TOPs) */
1161 #endif
1162     {
1163       dPOPTOPnnrl;
1164       SETn( left * right );
1165       RETURN;
1166     }
1167 }
1168
1169 PP(pp_divide)
1170 {
1171     dVAR; dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
1172     /* Only try to do UV divide first
1173        if ((SLOPPYDIVIDE is true) or
1174            (PERL_PRESERVE_IVUV is true and one or both SV is a UV too large
1175             to preserve))
1176        The assumption is that it is better to use floating point divide
1177        whenever possible, only doing integer divide first if we can't be sure.
1178        If NV_PRESERVES_UV is true then we know at compile time that no UV
1179        can be too large to preserve, so don't need to compile the code to
1180        test the size of UVs.  */
1181
1182 #ifdef SLOPPYDIVIDE
1183 #  define PERL_TRY_UV_DIVIDE
1184     /* ensure that 20./5. == 4. */
1185 #else
1186 #  ifdef PERL_PRESERVE_IVUV
1187 #    ifndef NV_PRESERVES_UV
1188 #      define PERL_TRY_UV_DIVIDE
1189 #    endif
1190 #  endif
1191 #endif
1192
1193 #ifdef PERL_TRY_UV_DIVIDE
1194     SvIV_please(TOPs);
1195     if (SvIOK(TOPs)) {
1196         SvIV_please(TOPm1s);
1197         if (SvIOK(TOPm1s)) {
1198             bool left_non_neg = SvUOK(TOPm1s);
1199             bool right_non_neg = SvUOK(TOPs);
1200             UV left;
1201             UV right;
1202
1203             if (right_non_neg) {
1204                 right = SvUVX(TOPs);
1205             }
1206             else {
1207                 const IV biv = SvIVX(TOPs);
1208                 if (biv >= 0) {
1209                     right = biv;
1210                     right_non_neg = TRUE; /* effectively it's a UV now */
1211                 }
1212                 else {
1213                     right = -biv;
1214                 }
1215             }
1216             /* historically undef()/0 gives a "Use of uninitialized value"
1217                warning before dieing, hence this test goes here.
1218                If it were immediately before the second SvIV_please, then
1219                DIE() would be invoked before left was even inspected, so
1220                no inpsection would give no warning.  */
1221             if (right == 0)
1222                 DIE(aTHX_ "Illegal division by zero");
1223
1224             if (left_non_neg) {
1225                 left = SvUVX(TOPm1s);
1226             }
1227             else {
1228                 const IV aiv = SvIVX(TOPm1s);
1229                 if (aiv >= 0) {
1230                     left = aiv;
1231                     left_non_neg = TRUE; /* effectively it's a UV now */
1232                 }
1233                 else {
1234                     left = -aiv;
1235                 }
1236             }
1237
1238             if (left >= right
1239 #ifdef SLOPPYDIVIDE
1240                 /* For sloppy divide we always attempt integer division.  */
1241 #else
1242                 /* Otherwise we only attempt it if either or both operands
1243                    would not be preserved by an NV.  If both fit in NVs
1244                    we fall through to the NV divide code below.  However,
1245                    as left >= right to ensure integer result here, we know that
1246                    we can skip the test on the right operand - right big
1247                    enough not to be preserved can't get here unless left is
1248                    also too big.  */
1249
1250                 && (left > ((UV)1 << NV_PRESERVES_UV_BITS))
1251 #endif
1252                 ) {
1253                 /* Integer division can't overflow, but it can be imprecise.  */
1254                 const UV result = left / right;
1255                 if (result * right == left) {
1256                     SP--; /* result is valid */
1257                     if (left_non_neg == right_non_neg) {
1258                         /* signs identical, result is positive.  */
1259                         SETu( result );
1260                         RETURN;
1261                     }
1262                     /* 2s complement assumption */
1263                     if (result <= (UV)IV_MIN)
1264                         SETi( -(IV)result );
1265                     else {
1266                         /* It's exact but too negative for IV. */
1267                         SETn( -(NV)result );
1268                     }
1269                     RETURN;
1270                 } /* tried integer divide but it was not an integer result */
1271             } /* else (PERL_ABS(result) < 1.0) or (both UVs in range for NV) */
1272         } /* left wasn't SvIOK */
1273     } /* right wasn't SvIOK */
1274 #endif /* PERL_TRY_UV_DIVIDE */
1275     {
1276         dPOPPOPnnrl;
1277         if (right == 0.0)
1278             DIE(aTHX_ "Illegal division by zero");
1279         PUSHn( left / right );
1280         RETURN;
1281     }
1282 }
1283
1284 PP(pp_modulo)
1285 {
1286     dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1287     {
1288         UV left  = 0;
1289         UV right = 0;
1290         bool left_neg = FALSE;
1291         bool right_neg = FALSE;
1292         bool use_double = FALSE;
1293         bool dright_valid = FALSE;
1294         NV dright = 0.0;
1295         NV dleft  = 0.0;
1296
1297         SvIV_please(TOPs);
1298         if (SvIOK(TOPs)) {
1299             right_neg = !SvUOK(TOPs);
1300             if (!right_neg) {
1301                 right = SvUVX(POPs);
1302             } else {
1303                 const IV biv = SvIVX(POPs);
1304                 if (biv >= 0) {
1305                     right = biv;
1306                     right_neg = FALSE; /* effectively it's a UV now */
1307                 } else {
1308                     right = -biv;
1309                 }
1310             }
1311         }
1312         else {
1313             dright = POPn;
1314             right_neg = dright < 0;
1315             if (right_neg)
1316                 dright = -dright;
1317             if (dright < UV_MAX_P1) {
1318                 right = U_V(dright);
1319                 dright_valid = TRUE; /* In case we need to use double below.  */
1320             } else {
1321                 use_double = TRUE;
1322             }
1323         }
1324
1325         /* At this point use_double is only true if right is out of range for
1326            a UV.  In range NV has been rounded down to nearest UV and
1327            use_double false.  */
1328         SvIV_please(TOPs);
1329         if (!use_double && SvIOK(TOPs)) {
1330             if (SvIOK(TOPs)) {
1331                 left_neg = !SvUOK(TOPs);
1332                 if (!left_neg) {
1333                     left = SvUVX(POPs);
1334                 } else {
1335                     const IV aiv = SvIVX(POPs);
1336                     if (aiv >= 0) {
1337                         left = aiv;
1338                         left_neg = FALSE; /* effectively it's a UV now */
1339                     } else {
1340                         left = -aiv;
1341                     }
1342                 }
1343             }
1344         }
1345         else {
1346             dleft = POPn;
1347             left_neg = dleft < 0;
1348             if (left_neg)
1349                 dleft = -dleft;
1350
1351             /* This should be exactly the 5.6 behaviour - if left and right are
1352                both in range for UV then use U_V() rather than floor.  */
1353             if (!use_double) {
1354                 if (dleft < UV_MAX_P1) {
1355                     /* right was in range, so is dleft, so use UVs not double.
1356                      */
1357                     left = U_V(dleft);
1358                 }
1359                 /* left is out of range for UV, right was in range, so promote
1360                    right (back) to double.  */
1361                 else {
1362                     /* The +0.5 is used in 5.6 even though it is not strictly
1363                        consistent with the implicit +0 floor in the U_V()
1364                        inside the #if 1. */
1365                     dleft = Perl_floor(dleft + 0.5);
1366                     use_double = TRUE;
1367                     if (dright_valid)
1368                         dright = Perl_floor(dright + 0.5);
1369                     else
1370                         dright = right;
1371                 }
1372             }
1373         }
1374         if (use_double) {
1375             NV dans;
1376
1377             if (!dright)
1378                 DIE(aTHX_ "Illegal modulus zero");
1379
1380             dans = Perl_fmod(dleft, dright);
1381             if ((left_neg != right_neg) && dans)
1382                 dans = dright - dans;
1383             if (right_neg)
1384                 dans = -dans;
1385             sv_setnv(TARG, dans);
1386         }
1387         else {
1388             UV ans;
1389
1390             if (!right)
1391                 DIE(aTHX_ "Illegal modulus zero");
1392
1393             ans = left % right;
1394             if ((left_neg != right_neg) && ans)
1395                 ans = right - ans;
1396             if (right_neg) {
1397                 /* XXX may warn: unary minus operator applied to unsigned type */
1398                 /* could change -foo to be (~foo)+1 instead     */
1399                 if (ans <= ~((UV)IV_MAX)+1)
1400                     sv_setiv(TARG, ~ans+1);
1401                 else
1402                     sv_setnv(TARG, -(NV)ans);
1403             }
1404             else
1405                 sv_setuv(TARG, ans);
1406         }
1407         PUSHTARG;
1408         RETURN;
1409     }
1410 }
1411
1412 PP(pp_repeat)
1413 {
1414   dVAR; dSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
1415   {
1416     register IV count;
1417     dPOPss;
1418     SvGETMAGIC(sv);
1419     if (SvIOKp(sv)) {
1420          if (SvUOK(sv)) {
1421               const UV uv = SvUV(sv);
1422               if (uv > IV_MAX)
1423                    count = IV_MAX; /* The best we can do? */
1424               else
1425                    count = uv;
1426          } else {
1427               const IV iv = SvIV(sv);
1428               if (iv < 0)
1429                    count = 0;
1430               else
1431                    count = iv;
1432          }
1433     }
1434     else if (SvNOKp(sv)) {
1435          const NV nv = SvNV(sv);
1436          if (nv < 0.0)
1437               count = 0;
1438          else
1439               count = (IV)nv;
1440     }
1441     else
1442          count = SvIVx(sv);
1443     if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1444         dMARK;
1445         static const char oom_list_extend[] = "Out of memory during list extend";
1446         const I32 items = SP - MARK;
1447         const I32 max = items * count;
1448
1449         MEM_WRAP_CHECK_1(max, SV*, oom_list_extend);
1450         /* Did the max computation overflow? */
1451         if (items > 0 && max > 0 && (max < items || max < count))
1452            Perl_croak(aTHX_ oom_list_extend);
1453         MEXTEND(MARK, max);
1454         if (count > 1) {
1455             while (SP > MARK) {
1456 #if 0
1457               /* This code was intended to fix 20010809.028:
1458
1459                  $x = 'abcd';
1460                  for (($x =~ /./g) x 2) {
1461                      print chop; # "abcdabcd" expected as output.
1462                  }
1463
1464                * but that change (#11635) broke this code:
1465
1466                $x = [("foo")x2]; # only one "foo" ended up in the anonlist.
1467
1468                * I can't think of a better fix that doesn't introduce
1469                * an efficiency hit by copying the SVs. The stack isn't
1470                * refcounted, and mortalisation obviously doesn't
1471                * Do The Right Thing when the stack has more than
1472                * one pointer to the same mortal value.
1473                * .robin.
1474                */
1475                 if (*SP) {
1476                     *SP = sv_2mortal(newSVsv(*SP));
1477                     SvREADONLY_on(*SP);
1478                 }
1479 #else
1480                if (*SP)
1481                    SvTEMP_off((*SP));
1482 #endif
1483                 SP--;
1484             }
1485             MARK++;
1486             repeatcpy((char*)(MARK + items), (char*)MARK,
1487                 items * sizeof(SV*), count - 1);
1488             SP += max;
1489         }
1490         else if (count <= 0)
1491             SP -= items;
1492     }
1493     else {      /* Note: mark already snarfed by pp_list */
1494         SV * const tmpstr = POPs;
1495         STRLEN len;
1496         bool isutf;
1497         static const char oom_string_extend[] =
1498           "Out of memory during string extend";
1499
1500         SvSetSV(TARG, tmpstr);
1501         SvPV_force(TARG, len);
1502         isutf = DO_UTF8(TARG);
1503         if (count != 1) {
1504             if (count < 1)
1505                 SvCUR_set(TARG, 0);
1506             else {
1507                 const STRLEN max = (UV)count * len;
1508                 if (len > ((MEM_SIZE)~0)/count)
1509                      Perl_croak(aTHX_ oom_string_extend);
1510                 MEM_WRAP_CHECK_1(max, char, oom_string_extend);
1511                 SvGROW(TARG, max + 1);
1512                 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1513                 SvCUR_set(TARG, SvCUR(TARG) * count);
1514             }
1515             *SvEND(TARG) = '\0';
1516         }
1517         if (isutf)
1518             (void)SvPOK_only_UTF8(TARG);
1519         else
1520             (void)SvPOK_only(TARG);
1521
1522         if (PL_op->op_private & OPpREPEAT_DOLIST) {
1523             /* The parser saw this as a list repeat, and there
1524                are probably several items on the stack. But we're
1525                in scalar context, and there's no pp_list to save us
1526                now. So drop the rest of the items -- robin@kitsite.com
1527              */
1528             dMARK;
1529             SP = MARK;
1530         }
1531         PUSHTARG;
1532     }
1533     RETURN;
1534   }
1535 }
1536
1537 PP(pp_subtract)
1538 {
1539     dVAR; dSP; dATARGET; bool useleft; tryAMAGICbin(subtr,opASSIGN);
1540     useleft = USE_LEFT(TOPm1s);
1541 #ifdef PERL_PRESERVE_IVUV
1542     /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1543        "bad things" happen if you rely on signed integers wrapping.  */
1544     SvIV_please(TOPs);
1545     if (SvIOK(TOPs)) {
1546         /* Unless the left argument is integer in range we are going to have to
1547            use NV maths. Hence only attempt to coerce the right argument if
1548            we know the left is integer.  */
1549         register UV auv = 0;
1550         bool auvok = FALSE;
1551         bool a_valid = 0;
1552
1553         if (!useleft) {
1554             auv = 0;
1555             a_valid = auvok = 1;
1556             /* left operand is undef, treat as zero.  */
1557         } else {
1558             /* Left operand is defined, so is it IV? */
1559             SvIV_please(TOPm1s);
1560             if (SvIOK(TOPm1s)) {
1561                 if ((auvok = SvUOK(TOPm1s)))
1562                     auv = SvUVX(TOPm1s);
1563                 else {
1564                     register const IV aiv = SvIVX(TOPm1s);
1565                     if (aiv >= 0) {
1566                         auv = aiv;
1567                         auvok = 1;      /* Now acting as a sign flag.  */
1568                     } else { /* 2s complement assumption for IV_MIN */
1569                         auv = (UV)-aiv;
1570                     }
1571                 }
1572                 a_valid = 1;
1573             }
1574         }
1575         if (a_valid) {
1576             bool result_good = 0;
1577             UV result;
1578             register UV buv;
1579             bool buvok = SvUOK(TOPs);
1580         
1581             if (buvok)
1582                 buv = SvUVX(TOPs);
1583             else {
1584                 register const IV biv = SvIVX(TOPs);
1585                 if (biv >= 0) {
1586                     buv = biv;
1587                     buvok = 1;
1588                 } else
1589                     buv = (UV)-biv;
1590             }
1591             /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1592                else "IV" now, independent of how it came in.
1593                if a, b represents positive, A, B negative, a maps to -A etc
1594                a - b =>  (a - b)
1595                A - b => -(a + b)
1596                a - B =>  (a + b)
1597                A - B => -(a - b)
1598                all UV maths. negate result if A negative.
1599                subtract if signs same, add if signs differ. */
1600
1601             if (auvok ^ buvok) {
1602                 /* Signs differ.  */
1603                 result = auv + buv;
1604                 if (result >= auv)
1605                     result_good = 1;
1606             } else {
1607                 /* Signs same */
1608                 if (auv >= buv) {
1609                     result = auv - buv;
1610                     /* Must get smaller */
1611                     if (result <= auv)
1612                         result_good = 1;
1613                 } else {
1614                     result = buv - auv;
1615                     if (result <= buv) {
1616                         /* result really should be -(auv-buv). as its negation
1617                            of true value, need to swap our result flag  */
1618                         auvok = !auvok;
1619                         result_good = 1;
1620                     }
1621                 }
1622             }
1623             if (result_good) {
1624                 SP--;
1625                 if (auvok)
1626                     SETu( result );
1627                 else {
1628                     /* Negate result */
1629                     if (result <= (UV)IV_MIN)
1630                         SETi( -(IV)result );
1631                     else {
1632                         /* result valid, but out of range for IV.  */
1633                         SETn( -(NV)result );
1634                     }
1635                 }
1636                 RETURN;
1637             } /* Overflow, drop through to NVs.  */
1638         }
1639     }
1640 #endif
1641     useleft = USE_LEFT(TOPm1s);
1642     {
1643         dPOPnv;
1644         if (!useleft) {
1645             /* left operand is undef, treat as zero - value */
1646             SETn(-value);
1647             RETURN;
1648         }
1649         SETn( TOPn - value );
1650         RETURN;
1651     }
1652 }
1653
1654 PP(pp_left_shift)
1655 {
1656     dVAR; dSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1657     {
1658       const IV shift = POPi;
1659       if (PL_op->op_private & HINT_INTEGER) {
1660         const IV i = TOPi;
1661         SETi(i << shift);
1662       }
1663       else {
1664         const UV u = TOPu;
1665         SETu(u << shift);
1666       }
1667       RETURN;
1668     }
1669 }
1670
1671 PP(pp_right_shift)
1672 {
1673     dVAR; dSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1674     {
1675       const IV shift = POPi;
1676       if (PL_op->op_private & HINT_INTEGER) {
1677         const IV i = TOPi;
1678         SETi(i >> shift);
1679       }
1680       else {
1681         const UV u = TOPu;
1682         SETu(u >> shift);
1683       }
1684       RETURN;
1685     }
1686 }
1687
1688 PP(pp_lt)
1689 {
1690     dVAR; dSP; tryAMAGICbinSET(lt,0);
1691 #ifdef PERL_PRESERVE_IVUV
1692     SvIV_please(TOPs);
1693     if (SvIOK(TOPs)) {
1694         SvIV_please(TOPm1s);
1695         if (SvIOK(TOPm1s)) {
1696             bool auvok = SvUOK(TOPm1s);
1697             bool buvok = SvUOK(TOPs);
1698         
1699             if (!auvok && !buvok) { /* ## IV < IV ## */
1700                 const IV aiv = SvIVX(TOPm1s);
1701                 const IV biv = SvIVX(TOPs);
1702                 
1703                 SP--;
1704                 SETs(boolSV(aiv < biv));
1705                 RETURN;
1706             }
1707             if (auvok && buvok) { /* ## UV < UV ## */
1708                 const UV auv = SvUVX(TOPm1s);
1709                 const UV buv = SvUVX(TOPs);
1710                 
1711                 SP--;
1712                 SETs(boolSV(auv < buv));
1713                 RETURN;
1714             }
1715             if (auvok) { /* ## UV < IV ## */
1716                 UV auv;
1717                 const IV biv = SvIVX(TOPs);
1718                 SP--;
1719                 if (biv < 0) {
1720                     /* As (a) is a UV, it's >=0, so it cannot be < */
1721                     SETs(&PL_sv_no);
1722                     RETURN;
1723                 }
1724                 auv = SvUVX(TOPs);
1725                 SETs(boolSV(auv < (UV)biv));
1726                 RETURN;
1727             }
1728             { /* ## IV < UV ## */
1729                 const IV aiv = SvIVX(TOPm1s);
1730                 UV buv;
1731                 
1732                 if (aiv < 0) {
1733                     /* As (b) is a UV, it's >=0, so it must be < */
1734                     SP--;
1735                     SETs(&PL_sv_yes);
1736                     RETURN;
1737                 }
1738                 buv = SvUVX(TOPs);
1739                 SP--;
1740                 SETs(boolSV((UV)aiv < buv));
1741                 RETURN;
1742             }
1743         }
1744     }
1745 #endif
1746 #ifndef NV_PRESERVES_UV
1747 #ifdef PERL_PRESERVE_IVUV
1748     else
1749 #endif
1750     if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1751         SP--;
1752         SETs(boolSV(SvRV(TOPs) < SvRV(TOPp1s)));
1753         RETURN;
1754     }
1755 #endif
1756     {
1757 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1758       dPOPTOPnnrl;
1759       if (Perl_isnan(left) || Perl_isnan(right))
1760           RETSETNO;
1761       SETs(boolSV(left < right));
1762 #else
1763       dPOPnv;
1764       SETs(boolSV(TOPn < value));
1765 #endif
1766       RETURN;
1767     }
1768 }
1769
1770 PP(pp_gt)
1771 {
1772     dVAR; dSP; tryAMAGICbinSET(gt,0);
1773 #ifdef PERL_PRESERVE_IVUV
1774     SvIV_please(TOPs);
1775     if (SvIOK(TOPs)) {
1776         SvIV_please(TOPm1s);
1777         if (SvIOK(TOPm1s)) {
1778             bool auvok = SvUOK(TOPm1s);
1779             bool buvok = SvUOK(TOPs);
1780         
1781             if (!auvok && !buvok) { /* ## IV > IV ## */
1782                 const IV aiv = SvIVX(TOPm1s);
1783                 const IV biv = SvIVX(TOPs);
1784
1785                 SP--;
1786                 SETs(boolSV(aiv > biv));
1787                 RETURN;
1788             }
1789             if (auvok && buvok) { /* ## UV > UV ## */
1790                 const UV auv = SvUVX(TOPm1s);
1791                 const UV buv = SvUVX(TOPs);
1792                 
1793                 SP--;
1794                 SETs(boolSV(auv > buv));
1795                 RETURN;
1796             }
1797             if (auvok) { /* ## UV > IV ## */
1798                 UV auv;
1799                 const IV biv = SvIVX(TOPs);
1800
1801                 SP--;
1802                 if (biv < 0) {
1803                     /* As (a) is a UV, it's >=0, so it must be > */
1804                     SETs(&PL_sv_yes);
1805                     RETURN;
1806                 }
1807                 auv = SvUVX(TOPs);
1808                 SETs(boolSV(auv > (UV)biv));
1809                 RETURN;
1810             }
1811             { /* ## IV > UV ## */
1812                 const IV aiv = SvIVX(TOPm1s);
1813                 UV buv;
1814                 
1815                 if (aiv < 0) {
1816                     /* As (b) is a UV, it's >=0, so it cannot be > */
1817                     SP--;
1818                     SETs(&PL_sv_no);
1819                     RETURN;
1820                 }
1821                 buv = SvUVX(TOPs);
1822                 SP--;
1823                 SETs(boolSV((UV)aiv > buv));
1824                 RETURN;
1825             }
1826         }
1827     }
1828 #endif
1829 #ifndef NV_PRESERVES_UV
1830 #ifdef PERL_PRESERVE_IVUV
1831     else
1832 #endif
1833     if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1834         SP--;
1835         SETs(boolSV(SvRV(TOPs) > SvRV(TOPp1s)));
1836         RETURN;
1837     }
1838 #endif
1839     {
1840 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1841       dPOPTOPnnrl;
1842       if (Perl_isnan(left) || Perl_isnan(right))
1843           RETSETNO;
1844       SETs(boolSV(left > right));
1845 #else
1846       dPOPnv;
1847       SETs(boolSV(TOPn > value));
1848 #endif
1849       RETURN;
1850     }
1851 }
1852
1853 PP(pp_le)
1854 {
1855     dVAR; dSP; tryAMAGICbinSET(le,0);
1856 #ifdef PERL_PRESERVE_IVUV
1857     SvIV_please(TOPs);
1858     if (SvIOK(TOPs)) {
1859         SvIV_please(TOPm1s);
1860         if (SvIOK(TOPm1s)) {
1861             bool auvok = SvUOK(TOPm1s);
1862             bool buvok = SvUOK(TOPs);
1863         
1864             if (!auvok && !buvok) { /* ## IV <= IV ## */
1865                 const IV aiv = SvIVX(TOPm1s);
1866                 const IV biv = SvIVX(TOPs);
1867                 
1868                 SP--;
1869                 SETs(boolSV(aiv <= biv));
1870                 RETURN;
1871             }
1872             if (auvok && buvok) { /* ## UV <= UV ## */
1873                 UV auv = SvUVX(TOPm1s);
1874                 UV buv = SvUVX(TOPs);
1875                 
1876                 SP--;
1877                 SETs(boolSV(auv <= buv));
1878                 RETURN;
1879             }
1880             if (auvok) { /* ## UV <= IV ## */
1881                 UV auv;
1882                 const IV biv = SvIVX(TOPs);
1883
1884                 SP--;
1885                 if (biv < 0) {
1886                     /* As (a) is a UV, it's >=0, so a cannot be <= */
1887                     SETs(&PL_sv_no);
1888                     RETURN;
1889                 }
1890                 auv = SvUVX(TOPs);
1891                 SETs(boolSV(auv <= (UV)biv));
1892                 RETURN;
1893             }
1894             { /* ## IV <= UV ## */
1895                 const IV aiv = SvIVX(TOPm1s);
1896                 UV buv;
1897
1898                 if (aiv < 0) {
1899                     /* As (b) is a UV, it's >=0, so a must be <= */
1900                     SP--;
1901                     SETs(&PL_sv_yes);
1902                     RETURN;
1903                 }
1904                 buv = SvUVX(TOPs);
1905                 SP--;
1906                 SETs(boolSV((UV)aiv <= buv));
1907                 RETURN;
1908             }
1909         }
1910     }
1911 #endif
1912 #ifndef NV_PRESERVES_UV
1913 #ifdef PERL_PRESERVE_IVUV
1914     else
1915 #endif
1916     if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
1917         SP--;
1918         SETs(boolSV(SvRV(TOPs) <= SvRV(TOPp1s)));
1919         RETURN;
1920     }
1921 #endif
1922     {
1923 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1924       dPOPTOPnnrl;
1925       if (Perl_isnan(left) || Perl_isnan(right))
1926           RETSETNO;
1927       SETs(boolSV(left <= right));
1928 #else
1929       dPOPnv;
1930       SETs(boolSV(TOPn <= value));
1931 #endif
1932       RETURN;
1933     }
1934 }
1935
1936 PP(pp_ge)
1937 {
1938     dVAR; dSP; tryAMAGICbinSET(ge,0);
1939 #ifdef PERL_PRESERVE_IVUV
1940     SvIV_please(TOPs);
1941     if (SvIOK(TOPs)) {
1942         SvIV_please(TOPm1s);
1943         if (SvIOK(TOPm1s)) {
1944             bool auvok = SvUOK(TOPm1s);
1945             bool buvok = SvUOK(TOPs);
1946         
1947             if (!auvok && !buvok) { /* ## IV >= IV ## */
1948                 const IV aiv = SvIVX(TOPm1s);
1949                 const IV biv = SvIVX(TOPs);
1950
1951                 SP--;
1952                 SETs(boolSV(aiv >= biv));
1953                 RETURN;
1954             }
1955             if (auvok && buvok) { /* ## UV >= UV ## */
1956                 const UV auv = SvUVX(TOPm1s);
1957                 const UV buv = SvUVX(TOPs);
1958
1959                 SP--;
1960                 SETs(boolSV(auv >= buv));
1961                 RETURN;
1962             }
1963             if (auvok) { /* ## UV >= IV ## */
1964                 UV auv;
1965                 const IV biv = SvIVX(TOPs);
1966
1967                 SP--;
1968                 if (biv < 0) {
1969                     /* As (a) is a UV, it's >=0, so it must be >= */
1970                     SETs(&PL_sv_yes);
1971                     RETURN;
1972                 }
1973                 auv = SvUVX(TOPs);
1974                 SETs(boolSV(auv >= (UV)biv));
1975                 RETURN;
1976             }
1977             { /* ## IV >= UV ## */
1978                 const IV aiv = SvIVX(TOPm1s);
1979                 UV buv;
1980
1981                 if (aiv < 0) {
1982                     /* As (b) is a UV, it's >=0, so a cannot be >= */
1983                     SP--;
1984                     SETs(&PL_sv_no);
1985                     RETURN;
1986                 }
1987                 buv = SvUVX(TOPs);
1988                 SP--;
1989                 SETs(boolSV((UV)aiv >= buv));
1990                 RETURN;
1991             }
1992         }
1993     }
1994 #endif
1995 #ifndef NV_PRESERVES_UV
1996 #ifdef PERL_PRESERVE_IVUV
1997     else
1998 #endif
1999     if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2000         SP--;
2001         SETs(boolSV(SvRV(TOPs) >= SvRV(TOPp1s)));
2002         RETURN;
2003     }
2004 #endif
2005     {
2006 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2007       dPOPTOPnnrl;
2008       if (Perl_isnan(left) || Perl_isnan(right))
2009           RETSETNO;
2010       SETs(boolSV(left >= right));
2011 #else
2012       dPOPnv;
2013       SETs(boolSV(TOPn >= value));
2014 #endif
2015       RETURN;
2016     }
2017 }
2018
2019 PP(pp_ne)
2020 {
2021     dVAR; dSP; tryAMAGICbinSET(ne,0);
2022 #ifndef NV_PRESERVES_UV
2023     if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2024         SP--;
2025         SETs(boolSV(SvRV(TOPs) != SvRV(TOPp1s)));
2026         RETURN;
2027     }
2028 #endif
2029 #ifdef PERL_PRESERVE_IVUV
2030     SvIV_please(TOPs);
2031     if (SvIOK(TOPs)) {
2032         SvIV_please(TOPm1s);
2033         if (SvIOK(TOPm1s)) {
2034             const bool auvok = SvUOK(TOPm1s);
2035             const bool buvok = SvUOK(TOPs);
2036         
2037             if (auvok == buvok) { /* ## IV == IV or UV == UV ## */
2038                 /* Casting IV to UV before comparison isn't going to matter
2039                    on 2s complement. On 1s complement or sign&magnitude
2040                    (if we have any of them) it could make negative zero
2041                    differ from normal zero. As I understand it. (Need to
2042                    check - is negative zero implementation defined behaviour
2043                    anyway?). NWC  */
2044                 const UV buv = SvUVX(POPs);
2045                 const UV auv = SvUVX(TOPs);
2046
2047                 SETs(boolSV(auv != buv));
2048                 RETURN;
2049             }
2050             {                   /* ## Mixed IV,UV ## */
2051                 IV iv;
2052                 UV uv;
2053                 
2054                 /* != is commutative so swap if needed (save code) */
2055                 if (auvok) {
2056                     /* swap. top of stack (b) is the iv */
2057                     iv = SvIVX(TOPs);
2058                     SP--;
2059                     if (iv < 0) {
2060                         /* As (a) is a UV, it's >0, so it cannot be == */
2061                         SETs(&PL_sv_yes);
2062                         RETURN;
2063                     }
2064                     uv = SvUVX(TOPs);
2065                 } else {
2066                     iv = SvIVX(TOPm1s);
2067                     SP--;
2068                     if (iv < 0) {
2069                         /* As (b) is a UV, it's >0, so it cannot be == */
2070                         SETs(&PL_sv_yes);
2071                         RETURN;
2072                     }
2073                     uv = SvUVX(*(SP+1)); /* Do I want TOPp1s() ? */
2074                 }
2075                 SETs(boolSV((UV)iv != uv));
2076                 RETURN;
2077             }
2078         }
2079     }
2080 #endif
2081     {
2082 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2083       dPOPTOPnnrl;
2084       if (Perl_isnan(left) || Perl_isnan(right))
2085           RETSETYES;
2086       SETs(boolSV(left != right));
2087 #else
2088       dPOPnv;
2089       SETs(boolSV(TOPn != value));
2090 #endif
2091       RETURN;
2092     }
2093 }
2094
2095 PP(pp_ncmp)
2096 {
2097     dVAR; dSP; dTARGET; tryAMAGICbin(ncmp,0);
2098 #ifndef NV_PRESERVES_UV
2099     if (SvROK(TOPs) && !SvAMAGIC(TOPs) && SvROK(TOPm1s) && !SvAMAGIC(TOPm1s)) {
2100         const UV right = PTR2UV(SvRV(POPs));
2101         const UV left = PTR2UV(SvRV(TOPs));
2102         SETi((left > right) - (left < right));
2103         RETURN;
2104     }
2105 #endif
2106 #ifdef PERL_PRESERVE_IVUV
2107     /* Fortunately it seems NaN isn't IOK */
2108     SvIV_please(TOPs);
2109     if (SvIOK(TOPs)) {
2110         SvIV_please(TOPm1s);
2111         if (SvIOK(TOPm1s)) {
2112             const bool leftuvok = SvUOK(TOPm1s);
2113             const bool rightuvok = SvUOK(TOPs);
2114             I32 value;
2115             if (!leftuvok && !rightuvok) { /* ## IV <=> IV ## */
2116                 const IV leftiv = SvIVX(TOPm1s);
2117                 const IV rightiv = SvIVX(TOPs);
2118                 
2119                 if (leftiv > rightiv)
2120                     value = 1;
2121                 else if (leftiv < rightiv)
2122                     value = -1;
2123                 else
2124                     value = 0;
2125             } else if (leftuvok && rightuvok) { /* ## UV <=> UV ## */
2126                 const UV leftuv = SvUVX(TOPm1s);
2127                 const UV rightuv = SvUVX(TOPs);
2128                 
2129                 if (leftuv > rightuv)
2130                     value = 1;
2131                 else if (leftuv < rightuv)
2132                     value = -1;
2133                 else
2134                     value = 0;
2135             } else if (leftuvok) { /* ## UV <=> IV ## */
2136                 const IV rightiv = SvIVX(TOPs);
2137                 if (rightiv < 0) {
2138                     /* As (a) is a UV, it's >=0, so it cannot be < */
2139                     value = 1;
2140                 } else {
2141                     const UV leftuv = SvUVX(TOPm1s);
2142                     if (leftuv > (UV)rightiv) {
2143                         value = 1;
2144                     } else if (leftuv < (UV)rightiv) {
2145                         value = -1;
2146                     } else {
2147                         value = 0;
2148                     }
2149                 }
2150             } else { /* ## IV <=> UV ## */
2151                 const IV leftiv = SvIVX(TOPm1s);
2152                 if (leftiv < 0) {
2153                     /* As (b) is a UV, it's >=0, so it must be < */
2154                     value = -1;
2155                 } else {
2156                     const UV rightuv = SvUVX(TOPs);
2157                     if ((UV)leftiv > rightuv) {
2158                         value = 1;
2159                     } else if ((UV)leftiv < rightuv) {
2160                         value = -1;
2161                     } else {
2162                         value = 0;
2163                     }
2164                 }
2165             }
2166             SP--;
2167             SETi(value);
2168             RETURN;
2169         }
2170     }
2171 #endif
2172     {
2173       dPOPTOPnnrl;
2174       I32 value;
2175
2176 #ifdef Perl_isnan
2177       if (Perl_isnan(left) || Perl_isnan(right)) {
2178           SETs(&PL_sv_undef);
2179           RETURN;
2180        }
2181       value = (left > right) - (left < right);
2182 #else
2183       if (left == right)
2184         value = 0;
2185       else if (left < right)
2186         value = -1;
2187       else if (left > right)
2188         value = 1;
2189       else {
2190         SETs(&PL_sv_undef);
2191         RETURN;
2192       }
2193 #endif
2194       SETi(value);
2195       RETURN;
2196     }
2197 }
2198
2199 PP(pp_sle)
2200 {
2201     dVAR; dSP;
2202
2203     int amg_type = sle_amg;
2204     int multiplier = 1;
2205     int rhs = 1;
2206
2207     switch (PL_op->op_type) {
2208     case OP_SLT:
2209         amg_type = slt_amg;
2210         /* cmp < 0 */
2211         rhs = 0;
2212         break;
2213     case OP_SGT:
2214         amg_type = sgt_amg;
2215         /* cmp > 0 */
2216         multiplier = -1;
2217         rhs = 0;
2218         break;
2219     case OP_SGE:
2220         amg_type = sge_amg;
2221         /* cmp >= 0 */
2222         multiplier = -1;
2223         break;
2224     }
2225
2226     tryAMAGICbinSET_var(amg_type,0);
2227     {
2228       dPOPTOPssrl;
2229       const int cmp = (IN_LOCALE_RUNTIME
2230                  ? sv_cmp_locale(left, right)
2231                  : sv_cmp(left, right));
2232       SETs(boolSV(cmp * multiplier < rhs));
2233       RETURN;
2234     }
2235 }
2236
2237 PP(pp_seq)
2238 {
2239     dVAR; dSP; tryAMAGICbinSET(seq,0);
2240     {
2241       dPOPTOPssrl;
2242       SETs(boolSV(sv_eq(left, right)));
2243       RETURN;
2244     }
2245 }
2246
2247 PP(pp_sne)
2248 {
2249     dVAR; dSP; tryAMAGICbinSET(sne,0);
2250     {
2251       dPOPTOPssrl;
2252       SETs(boolSV(!sv_eq(left, right)));
2253       RETURN;
2254     }
2255 }
2256
2257 PP(pp_scmp)
2258 {
2259     dVAR; dSP; dTARGET;  tryAMAGICbin(scmp,0);
2260     {
2261       dPOPTOPssrl;
2262       const int cmp = (IN_LOCALE_RUNTIME
2263                  ? sv_cmp_locale(left, right)
2264                  : sv_cmp(left, right));
2265       SETi( cmp );
2266       RETURN;
2267     }
2268 }
2269
2270 PP(pp_bit_and)
2271 {
2272     dVAR; dSP; dATARGET; tryAMAGICbin(band,opASSIGN);
2273     {
2274       dPOPTOPssrl;
2275       SvGETMAGIC(left);
2276       SvGETMAGIC(right);
2277       if (SvNIOKp(left) || SvNIOKp(right)) {
2278         if (PL_op->op_private & HINT_INTEGER) {
2279           const IV i = SvIV_nomg(left) & SvIV_nomg(right);
2280           SETi(i);
2281         }
2282         else {
2283           const UV u = SvUV_nomg(left) & SvUV_nomg(right);
2284           SETu(u);
2285         }
2286       }
2287       else {
2288         do_vop(PL_op->op_type, TARG, left, right);
2289         SETTARG;
2290       }
2291       RETURN;
2292     }
2293 }
2294
2295 PP(pp_bit_or)
2296 {
2297     dVAR; dSP; dATARGET;
2298     const int op_type = PL_op->op_type;
2299
2300     tryAMAGICbin_var((op_type == OP_BIT_OR ? bor_amg : bxor_amg), opASSIGN);
2301     {
2302       dPOPTOPssrl;
2303       SvGETMAGIC(left);
2304       SvGETMAGIC(right);
2305       if (SvNIOKp(left) || SvNIOKp(right)) {
2306         if (PL_op->op_private & HINT_INTEGER) {
2307           const IV l = (USE_LEFT(left) ? SvIV_nomg(left) : 0);
2308           const IV r = SvIV_nomg(right);
2309           const IV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2310           SETi(result);
2311         }
2312         else {
2313           const UV l = (USE_LEFT(left) ? SvUV_nomg(left) : 0);
2314           const UV r = SvUV_nomg(right);
2315           const UV result = op_type == OP_BIT_OR ? (l | r) : (l ^ r);
2316           SETu(result);
2317         }
2318       }
2319       else {
2320         do_vop(op_type, TARG, left, right);
2321         SETTARG;
2322       }
2323       RETURN;
2324     }
2325 }
2326
2327 PP(pp_negate)
2328 {
2329     dVAR; dSP; dTARGET; tryAMAGICun(neg);
2330     {
2331         dTOPss;
2332         const int flags = SvFLAGS(sv);
2333         SvGETMAGIC(sv);
2334         if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
2335             /* It's publicly an integer, or privately an integer-not-float */
2336         oops_its_an_int:
2337             if (SvIsUV(sv)) {
2338                 if (SvIVX(sv) == IV_MIN) {
2339                     /* 2s complement assumption. */
2340                     SETi(SvIVX(sv));    /* special case: -((UV)IV_MAX+1) == IV_MIN */
2341                     RETURN;
2342                 }
2343                 else if (SvUVX(sv) <= IV_MAX) {
2344                     SETi(-SvIVX(sv));
2345                     RETURN;
2346                 }
2347             }
2348             else if (SvIVX(sv) != IV_MIN) {
2349                 SETi(-SvIVX(sv));
2350                 RETURN;
2351             }
2352 #ifdef PERL_PRESERVE_IVUV
2353             else {
2354                 SETu((UV)IV_MIN);
2355                 RETURN;
2356             }
2357 #endif
2358         }
2359         if (SvNIOKp(sv))
2360             SETn(-SvNV(sv));
2361         else if (SvPOKp(sv)) {
2362             STRLEN len;
2363             const char * const s = SvPV_const(sv, len);
2364             if (isIDFIRST(*s)) {
2365                 sv_setpvn(TARG, "-", 1);
2366                 sv_catsv(TARG, sv);
2367             }
2368             else if (*s == '+' || *s == '-') {
2369                 sv_setsv(TARG, sv);
2370                 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
2371             }
2372             else if (DO_UTF8(sv)) {
2373                 SvIV_please(sv);
2374                 if (SvIOK(sv))
2375                     goto oops_its_an_int;
2376                 if (SvNOK(sv))
2377                     sv_setnv(TARG, -SvNV(sv));
2378                 else {
2379                     sv_setpvn(TARG, "-", 1);
2380                     sv_catsv(TARG, sv);
2381                 }
2382             }
2383             else {
2384                 SvIV_please(sv);
2385                 if (SvIOK(sv))
2386                   goto oops_its_an_int;
2387                 sv_setnv(TARG, -SvNV(sv));
2388             }
2389             SETTARG;
2390         }
2391         else
2392             SETn(-SvNV(sv));
2393     }
2394     RETURN;
2395 }
2396
2397 PP(pp_not)
2398 {
2399     dVAR; dSP; tryAMAGICunSET(not);
2400     *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
2401     return NORMAL;
2402 }
2403
2404 PP(pp_complement)
2405 {
2406     dVAR; dSP; dTARGET; tryAMAGICun(compl);
2407     {
2408       dTOPss;
2409       SvGETMAGIC(sv);
2410       if (SvNIOKp(sv)) {
2411         if (PL_op->op_private & HINT_INTEGER) {
2412           const IV i = ~SvIV_nomg(sv);
2413           SETi(i);
2414         }
2415         else {
2416           const UV u = ~SvUV_nomg(sv);
2417           SETu(u);
2418         }
2419       }
2420       else {
2421         register U8 *tmps;
2422         register I32 anum;
2423         STRLEN len;
2424
2425         (void)SvPV_nomg_const(sv,len); /* force check for uninit var */
2426         sv_setsv_nomg(TARG, sv);
2427         tmps = (U8*)SvPV_force(TARG, len);
2428         anum = len;
2429         if (SvUTF8(TARG)) {
2430           /* Calculate exact length, let's not estimate. */
2431           STRLEN targlen = 0;
2432           STRLEN l;
2433           UV nchar = 0;
2434           UV nwide = 0;
2435           U8 * const send = tmps + len;
2436           U8 * const origtmps = tmps;
2437           const UV utf8flags = UTF8_ALLOW_ANYUV;
2438
2439           while (tmps < send) {
2440             const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2441             tmps += l;
2442             targlen += UNISKIP(~c);
2443             nchar++;
2444             if (c > 0xff)
2445                 nwide++;
2446           }
2447
2448           /* Now rewind strings and write them. */
2449           tmps = origtmps;
2450
2451           if (nwide) {
2452               U8 *result;
2453               U8 *p;
2454
2455               Newx(result, targlen + 1, U8);
2456               p = result;
2457               while (tmps < send) {
2458                   const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2459                   tmps += l;
2460                   p = uvchr_to_utf8_flags(p, ~c, UNICODE_ALLOW_ANY);
2461               }
2462               *p = '\0';
2463               sv_usepvn_flags(TARG, (char*)result, targlen,
2464                               SV_HAS_TRAILING_NUL);
2465               SvUTF8_on(TARG);
2466           }
2467           else {
2468               U8 *result;
2469               U8 *p;
2470
2471               Newx(result, nchar + 1, U8);
2472               p = result;
2473               while (tmps < send) {
2474                   const U8 c = (U8)utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
2475                   tmps += l;
2476                   *p++ = ~c;
2477               }
2478               *p = '\0';
2479               sv_usepvn_flags(TARG, (char*)result, nchar, SV_HAS_TRAILING_NUL);
2480               SvUTF8_off(TARG);
2481           }
2482           SETs(TARG);
2483           RETURN;
2484         }
2485 #ifdef LIBERAL
2486         {
2487             register long *tmpl;
2488             for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2489                 *tmps = ~*tmps;
2490             tmpl = (long*)tmps;
2491             for ( ; anum >= (I32)sizeof(long); anum -= (I32)sizeof(long), tmpl++)
2492                 *tmpl = ~*tmpl;
2493             tmps = (U8*)tmpl;
2494         }
2495 #endif
2496         for ( ; anum > 0; anum--, tmps++)
2497             *tmps = ~*tmps;
2498
2499         SETs(TARG);
2500       }
2501       RETURN;
2502     }
2503 }
2504
2505 /* integer versions of some of the above */
2506
2507 PP(pp_i_multiply)
2508 {
2509     dVAR; dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
2510     {
2511       dPOPTOPiirl;
2512       SETi( left * right );
2513       RETURN;
2514     }
2515 }
2516
2517 PP(pp_i_divide)
2518 {
2519     IV num;
2520     dVAR; dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
2521     {
2522       dPOPiv;
2523       if (value == 0)
2524           DIE(aTHX_ "Illegal division by zero");
2525       num = POPi;
2526
2527       /* avoid FPE_INTOVF on some platforms when num is IV_MIN */
2528       if (value == -1)
2529           value = - num;
2530       else
2531           value = num / value;
2532       PUSHi( value );
2533       RETURN;
2534     }
2535 }
2536
2537 STATIC
2538 PP(pp_i_modulo_0)
2539 {
2540      /* This is the vanilla old i_modulo. */
2541      dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2542      {
2543           dPOPTOPiirl;
2544           if (!right)
2545                DIE(aTHX_ "Illegal modulus zero");
2546           /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2547           if (right == -1)
2548               SETi( 0 );
2549           else
2550               SETi( left % right );
2551           RETURN;
2552      }
2553 }
2554
2555 #if defined(__GLIBC__) && IVSIZE == 8
2556 STATIC
2557 PP(pp_i_modulo_1)
2558 {
2559      /* This is the i_modulo with the workaround for the _moddi3 bug
2560       * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
2561       * See below for pp_i_modulo. */
2562      dVAR; dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2563      {
2564           dPOPTOPiirl;
2565           if (!right)
2566                DIE(aTHX_ "Illegal modulus zero");
2567           /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2568           if (right == -1)
2569               SETi( 0 );
2570           else
2571               SETi( left % PERL_ABS(right) );
2572           RETURN;
2573      }
2574 }
2575 #endif
2576
2577 PP(pp_i_modulo)
2578 {
2579      dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2580      {
2581           dPOPTOPiirl;
2582           if (!right)
2583                DIE(aTHX_ "Illegal modulus zero");
2584           /* The assumption is to use hereafter the old vanilla version... */
2585           PL_op->op_ppaddr =
2586                PL_ppaddr[OP_I_MODULO] =
2587                    Perl_pp_i_modulo_0;
2588           /* .. but if we have glibc, we might have a buggy _moddi3
2589            * (at least glicb 2.2.5 is known to have this bug), in other
2590            * words our integer modulus with negative quad as the second
2591            * argument might be broken.  Test for this and re-patch the
2592            * opcode dispatch table if that is the case, remembering to
2593            * also apply the workaround so that this first round works
2594            * right, too.  See [perl #9402] for more information. */
2595 #if defined(__GLIBC__) && IVSIZE == 8
2596           {
2597                IV l =   3;
2598                IV r = -10;
2599                /* Cannot do this check with inlined IV constants since
2600                 * that seems to work correctly even with the buggy glibc. */
2601                if (l % r == -3) {
2602                     /* Yikes, we have the bug.
2603                      * Patch in the workaround version. */
2604                     PL_op->op_ppaddr =
2605                          PL_ppaddr[OP_I_MODULO] =
2606                              &Perl_pp_i_modulo_1;
2607                     /* Make certain we work right this time, too. */
2608                     right = PERL_ABS(right);
2609                }
2610           }
2611 #endif
2612           /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2613           if (right == -1)
2614               SETi( 0 );
2615           else
2616               SETi( left % right );
2617           RETURN;
2618      }
2619 }
2620
2621 PP(pp_i_add)
2622 {
2623     dVAR; dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
2624     {
2625       dPOPTOPiirl_ul;
2626       SETi( left + right );
2627       RETURN;
2628     }
2629 }
2630
2631 PP(pp_i_subtract)
2632 {
2633     dVAR; dSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
2634     {
2635       dPOPTOPiirl_ul;
2636       SETi( left - right );
2637       RETURN;
2638     }
2639 }
2640
2641 PP(pp_i_lt)
2642 {
2643     dVAR; dSP; tryAMAGICbinSET(lt,0);
2644     {
2645       dPOPTOPiirl;
2646       SETs(boolSV(left < right));
2647       RETURN;
2648     }
2649 }
2650
2651 PP(pp_i_gt)
2652 {
2653     dVAR; dSP; tryAMAGICbinSET(gt,0);
2654     {
2655       dPOPTOPiirl;
2656       SETs(boolSV(left > right));
2657       RETURN;
2658     }
2659 }
2660
2661 PP(pp_i_le)
2662 {
2663     dVAR; dSP; tryAMAGICbinSET(le,0);
2664     {
2665       dPOPTOPiirl;
2666       SETs(boolSV(left <= right));
2667       RETURN;
2668     }
2669 }
2670
2671 PP(pp_i_ge)
2672 {
2673     dVAR; dSP; tryAMAGICbinSET(ge,0);
2674     {
2675       dPOPTOPiirl;
2676       SETs(boolSV(left >= right));
2677       RETURN;
2678     }
2679 }
2680
2681 PP(pp_i_eq)
2682 {
2683     dVAR; dSP; tryAMAGICbinSET(eq,0);
2684     {
2685       dPOPTOPiirl;
2686       SETs(boolSV(left == right));
2687       RETURN;
2688     }
2689 }
2690
2691 PP(pp_i_ne)
2692 {
2693     dVAR; dSP; tryAMAGICbinSET(ne,0);
2694     {
2695       dPOPTOPiirl;
2696       SETs(boolSV(left != right));
2697       RETURN;
2698     }
2699 }
2700
2701 PP(pp_i_ncmp)
2702 {
2703     dVAR; dSP; dTARGET; tryAMAGICbin(ncmp,0);
2704     {
2705       dPOPTOPiirl;
2706       I32 value;
2707
2708       if (left > right)
2709         value = 1;
2710       else if (left < right)
2711         value = -1;
2712       else
2713         value = 0;
2714       SETi(value);
2715       RETURN;
2716     }
2717 }
2718
2719 PP(pp_i_negate)
2720 {
2721     dVAR; dSP; dTARGET; tryAMAGICun(neg);
2722     SETi(-TOPi);
2723     RETURN;
2724 }
2725
2726 /* High falutin' math. */
2727
2728 PP(pp_atan2)
2729 {
2730     dVAR; dSP; dTARGET; tryAMAGICbin(atan2,0);
2731     {
2732       dPOPTOPnnrl;
2733       SETn(Perl_atan2(left, right));
2734       RETURN;
2735     }
2736 }
2737
2738 PP(pp_sin)
2739 {
2740     dVAR; dSP; dTARGET;
2741     int amg_type = sin_amg;
2742     const char *neg_report = NULL;
2743     NV (*func)(NV) = Perl_sin;
2744     const int op_type = PL_op->op_type;
2745
2746     switch (op_type) {
2747     case OP_COS:
2748         amg_type = cos_amg;
2749         func = Perl_cos;
2750         break;
2751     case OP_EXP:
2752         amg_type = exp_amg;
2753         func = Perl_exp;
2754         break;
2755     case OP_LOG:
2756         amg_type = log_amg;
2757         func = Perl_log;
2758         neg_report = "log";
2759         break;
2760     case OP_SQRT:
2761         amg_type = sqrt_amg;
2762         func = Perl_sqrt;
2763         neg_report = "sqrt";
2764         break;
2765     }
2766
2767     tryAMAGICun_var(amg_type);
2768     {
2769       const NV value = POPn;
2770       if (neg_report) {
2771           if (op_type == OP_LOG ? (value <= 0.0) : (value < 0.0)) {
2772               SET_NUMERIC_STANDARD();
2773               DIE(aTHX_ "Can't take %s of %"NVgf, neg_report, value);
2774           }
2775       }
2776       XPUSHn(func(value));
2777       RETURN;
2778     }
2779 }
2780
2781 /* Support Configure command-line overrides for rand() functions.
2782    After 5.005, perhaps we should replace this by Configure support
2783    for drand48(), random(), or rand().  For 5.005, though, maintain
2784    compatibility by calling rand() but allow the user to override it.
2785    See INSTALL for details.  --Andy Dougherty  15 July 1998
2786 */
2787 /* Now it's after 5.005, and Configure supports drand48() and random(),
2788    in addition to rand().  So the overrides should not be needed any more.
2789    --Jarkko Hietaniemi  27 September 1998
2790  */
2791
2792 #ifndef HAS_DRAND48_PROTO
2793 extern double drand48 (void);
2794 #endif
2795
2796 PP(pp_rand)
2797 {
2798     dVAR; dSP; dTARGET;
2799     NV value;
2800     if (MAXARG < 1)
2801         value = 1.0;
2802     else
2803         value = POPn;
2804     if (value == 0.0)
2805         value = 1.0;
2806     if (!PL_srand_called) {
2807         (void)seedDrand01((Rand_seed_t)seed());
2808         PL_srand_called = TRUE;
2809     }
2810     value *= Drand01();
2811     XPUSHn(value);
2812     RETURN;
2813 }
2814
2815 PP(pp_srand)
2816 {
2817     dVAR; dSP;
2818     const UV anum = (MAXARG < 1) ? seed() : POPu;
2819     (void)seedDrand01((Rand_seed_t)anum);
2820     PL_srand_called = TRUE;
2821     EXTEND(SP, 1);
2822     RETPUSHYES;
2823 }
2824
2825 PP(pp_int)
2826 {
2827     dVAR; dSP; dTARGET; tryAMAGICun(int);
2828     {
2829       const IV iv = TOPi; /* attempt to convert to IV if possible. */
2830       /* XXX it's arguable that compiler casting to IV might be subtly
2831          different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2832          else preferring IV has introduced a subtle behaviour change bug. OTOH
2833          relying on floating point to be accurate is a bug.  */
2834
2835       if (!SvOK(TOPs))
2836         SETu(0);
2837       else if (SvIOK(TOPs)) {
2838         if (SvIsUV(TOPs)) {
2839             const UV uv = TOPu;
2840             SETu(uv);
2841         } else
2842             SETi(iv);
2843       } else {
2844           const NV value = TOPn;
2845           if (value >= 0.0) {
2846               if (value < (NV)UV_MAX + 0.5) {
2847                   SETu(U_V(value));
2848               } else {
2849                   SETn(Perl_floor(value));
2850               }
2851           }
2852           else {
2853               if (value > (NV)IV_MIN - 0.5) {
2854                   SETi(I_V(value));
2855               } else {
2856                   SETn(Perl_ceil(value));
2857               }
2858           }
2859       }
2860     }
2861     RETURN;
2862 }
2863
2864 PP(pp_abs)
2865 {
2866     dVAR; dSP; dTARGET; tryAMAGICun(abs);
2867     {
2868       /* This will cache the NV value if string isn't actually integer  */
2869       const IV iv = TOPi;
2870
2871       if (!SvOK(TOPs))
2872         SETu(0);
2873       else if (SvIOK(TOPs)) {
2874         /* IVX is precise  */
2875         if (SvIsUV(TOPs)) {
2876           SETu(TOPu);   /* force it to be numeric only */
2877         } else {
2878           if (iv >= 0) {
2879             SETi(iv);
2880           } else {
2881             if (iv != IV_MIN) {
2882               SETi(-iv);
2883             } else {
2884               /* 2s complement assumption. Also, not really needed as
2885                  IV_MIN and -IV_MIN should both be %100...00 and NV-able  */
2886               SETu(IV_MIN);
2887             }
2888           }
2889         }
2890       } else{
2891         const NV value = TOPn;
2892         if (value < 0.0)
2893           SETn(-value);
2894         else
2895           SETn(value);
2896       }
2897     }
2898     RETURN;
2899 }
2900
2901 PP(pp_oct)
2902 {
2903     dVAR; dSP; dTARGET;
2904     const char *tmps;
2905     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2906     STRLEN len;
2907     NV result_nv;
2908     UV result_uv;
2909     SV* const sv = POPs;
2910
2911     tmps = (SvPV_const(sv, len));
2912     if (DO_UTF8(sv)) {
2913          /* If Unicode, try to downgrade
2914           * If not possible, croak. */
2915          SV* const tsv = sv_2mortal(newSVsv(sv));
2916         
2917          SvUTF8_on(tsv);
2918          sv_utf8_downgrade(tsv, FALSE);
2919          tmps = SvPV_const(tsv, len);
2920     }
2921     if (PL_op->op_type == OP_HEX)
2922         goto hex;
2923
2924     while (*tmps && len && isSPACE(*tmps))
2925         tmps++, len--;
2926     if (*tmps == '0')
2927         tmps++, len--;
2928     if (*tmps == 'x') {
2929     hex:
2930         result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2931     }
2932     else if (*tmps == 'b')
2933         result_uv = grok_bin (tmps, &len, &flags, &result_nv);
2934     else
2935         result_uv = grok_oct (tmps, &len, &flags, &result_nv);
2936
2937     if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
2938         XPUSHn(result_nv);
2939     }
2940     else {
2941         XPUSHu(result_uv);
2942     }
2943     RETURN;
2944 }
2945
2946 /* String stuff. */
2947
2948 PP(pp_length)
2949 {
2950     dVAR; dSP; dTARGET;
2951     SV * const sv = TOPs;
2952
2953     if (SvAMAGIC(sv)) {
2954         /* For an overloaded scalar, we can't know in advance if it's going to
2955            be UTF-8 or not. Also, we can't call sv_len_utf8 as it likes to
2956            cache the length. Maybe that should be a documented feature of it.
2957         */
2958         STRLEN len;
2959         const char *const p = SvPV_const(sv, len);
2960
2961         if (DO_UTF8(sv)) {
2962             SETi(utf8_length((U8*)p, (U8*)p + len));
2963         }
2964         else
2965             SETi(len);
2966
2967     }
2968     else if (DO_UTF8(sv))
2969         SETi(sv_len_utf8(sv));
2970     else
2971         SETi(sv_len(sv));
2972     RETURN;
2973 }
2974
2975 PP(pp_substr)
2976 {
2977     dVAR; dSP; dTARGET;
2978     SV *sv;
2979     I32 len = 0;
2980     STRLEN curlen;
2981     STRLEN utf8_curlen;
2982     I32 pos;
2983     I32 rem;
2984     I32 fail;
2985     const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
2986     const char *tmps;
2987     const I32 arybase = CopARYBASE_get(PL_curcop);
2988     SV *repl_sv = NULL;
2989     const char *repl = NULL;
2990     STRLEN repl_len;
2991     const int num_args = PL_op->op_private & 7;
2992     bool repl_need_utf8_upgrade = FALSE;
2993     bool repl_is_utf8 = FALSE;
2994
2995     SvTAINTED_off(TARG);                        /* decontaminate */
2996     SvUTF8_off(TARG);                           /* decontaminate */
2997     if (num_args > 2) {
2998         if (num_args > 3) {
2999             repl_sv = POPs;
3000             repl = SvPV_const(repl_sv, repl_len);
3001             repl_is_utf8 = DO_UTF8(repl_sv) && SvCUR(repl_sv);
3002         }
3003         len = POPi;
3004     }
3005     pos = POPi;
3006     sv = POPs;
3007     PUTBACK;
3008     if (repl_sv) {
3009         if (repl_is_utf8) {
3010             if (!DO_UTF8(sv))
3011                 sv_utf8_upgrade(sv);
3012         }
3013         else if (DO_UTF8(sv))
3014             repl_need_utf8_upgrade = TRUE;
3015     }
3016     tmps = SvPV_const(sv, curlen);
3017     if (DO_UTF8(sv)) {
3018         utf8_curlen = sv_len_utf8(sv);
3019         if (utf8_curlen == curlen)
3020             utf8_curlen = 0;
3021         else
3022             curlen = utf8_curlen;
3023     }
3024     else
3025         utf8_curlen = 0;
3026
3027     if (pos >= arybase) {
3028         pos -= arybase;
3029         rem = curlen-pos;
3030         fail = rem;
3031         if (num_args > 2) {
3032             if (len < 0) {
3033                 rem += len;
3034                 if (rem < 0)
3035                     rem = 0;
3036             }
3037             else if (rem > len)
3038                      rem = len;
3039         }
3040     }
3041     else {
3042         pos += curlen;
3043         if (num_args < 3)
3044             rem = curlen;
3045         else if (len >= 0) {
3046             rem = pos+len;
3047             if (rem > (I32)curlen)
3048                 rem = curlen;
3049         }
3050         else {
3051             rem = curlen+len;
3052             if (rem < pos)
3053                 rem = pos;
3054         }
3055         if (pos < 0)
3056             pos = 0;
3057         fail = rem;
3058         rem -= pos;
3059     }
3060     if (fail < 0) {
3061         if (lvalue || repl)
3062             Perl_croak(aTHX_ "substr outside of string");
3063         if (ckWARN(WARN_SUBSTR))
3064             Perl_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3065         RETPUSHUNDEF;
3066     }
3067     else {
3068         const I32 upos = pos;
3069         const I32 urem = rem;
3070         if (utf8_curlen)
3071             sv_pos_u2b(sv, &pos, &rem);
3072         tmps += pos;
3073         /* we either return a PV or an LV. If the TARG hasn't been used
3074          * before, or is of that type, reuse it; otherwise use a mortal
3075          * instead. Note that LVs can have an extended lifetime, so also
3076          * dont reuse if refcount > 1 (bug #20933) */
3077         if (SvTYPE(TARG) > SVt_NULL) {
3078             if ( (SvTYPE(TARG) == SVt_PVLV)
3079                     ? (!lvalue || SvREFCNT(TARG) > 1)
3080                     : lvalue)
3081             {
3082                 TARG = sv_newmortal();
3083             }
3084         }
3085
3086         sv_setpvn(TARG, tmps, rem);
3087 #ifdef USE_LOCALE_COLLATE
3088         sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3089 #endif
3090         if (utf8_curlen)
3091             SvUTF8_on(TARG);
3092         if (repl) {
3093             SV* repl_sv_copy = NULL;
3094
3095             if (repl_need_utf8_upgrade) {
3096                 repl_sv_copy = newSVsv(repl_sv);
3097                 sv_utf8_upgrade(repl_sv_copy);
3098                 repl = SvPV_const(repl_sv_copy, repl_len);
3099                 repl_is_utf8 = DO_UTF8(repl_sv_copy) && SvCUR(sv);
3100             }
3101             sv_insert(sv, pos, rem, repl, repl_len);
3102             if (repl_is_utf8)
3103                 SvUTF8_on(sv);
3104             if (repl_sv_copy)
3105                 SvREFCNT_dec(repl_sv_copy);
3106         }
3107         else if (lvalue) {              /* it's an lvalue! */
3108             if (!SvGMAGICAL(sv)) {
3109                 if (SvROK(sv)) {
3110                     SvPV_force_nolen(sv);
3111                     if (ckWARN(WARN_SUBSTR))
3112                         Perl_warner(aTHX_ packWARN(WARN_SUBSTR),
3113                                 "Attempt to use reference as lvalue in substr");
3114                 }
3115                 if (isGV_with_GP(sv))
3116                     SvPV_force_nolen(sv);
3117                 else if (SvOK(sv))      /* is it defined ? */
3118                     (void)SvPOK_only_UTF8(sv);
3119                 else
3120                     sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
3121             }
3122
3123             if (SvTYPE(TARG) < SVt_PVLV) {
3124                 sv_upgrade(TARG, SVt_PVLV);
3125                 sv_magic(TARG, NULL, PERL_MAGIC_substr, NULL, 0);
3126             }
3127             else
3128                 SvOK_off(TARG);
3129
3130             LvTYPE(TARG) = 'x';
3131             if (LvTARG(TARG) != sv) {
3132                 if (LvTARG(TARG))
3133                     SvREFCNT_dec(LvTARG(TARG));
3134                 LvTARG(TARG) = SvREFCNT_inc_simple(sv);
3135             }
3136             LvTARGOFF(TARG) = upos;
3137             LvTARGLEN(TARG) = urem;
3138         }
3139     }
3140     SPAGAIN;
3141     PUSHs(TARG);                /* avoid SvSETMAGIC here */
3142     RETURN;
3143 }
3144
3145 PP(pp_vec)
3146 {
3147     dVAR; dSP; dTARGET;
3148     register const IV size   = POPi;
3149     register const IV offset = POPi;
3150     register SV * const src = POPs;
3151     const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3152
3153     SvTAINTED_off(TARG);                /* decontaminate */
3154     if (lvalue) {                       /* it's an lvalue! */
3155         if (SvREFCNT(TARG) > 1) /* don't share the TARG (#20933) */
3156             TARG = sv_newmortal();
3157         if (SvTYPE(TARG) < SVt_PVLV) {
3158             sv_upgrade(TARG, SVt_PVLV);
3159             sv_magic(TARG, NULL, PERL_MAGIC_vec, NULL, 0);
3160         }
3161         LvTYPE(TARG) = 'v';
3162         if (LvTARG(TARG) != src) {
3163             if (LvTARG(TARG))
3164                 SvREFCNT_dec(LvTARG(TARG));
3165             LvTARG(TARG) = SvREFCNT_inc_simple(src);
3166         }
3167         LvTARGOFF(TARG) = offset;
3168         LvTARGLEN(TARG) = size;
3169     }
3170
3171     sv_setuv(TARG, do_vecget(src, offset, size));
3172     PUSHs(TARG);
3173     RETURN;
3174 }
3175
3176 PP(pp_index)
3177 {
3178     dVAR; dSP; dTARGET;
3179     SV *big;
3180     SV *little;
3181     SV *temp = NULL;
3182     STRLEN biglen;
3183     STRLEN llen = 0;
3184     I32 offset;
3185     I32 retval;
3186     const char *tmps;
3187     const char *tmps2;
3188     const I32 arybase = CopARYBASE_get(PL_curcop);
3189     bool big_utf8;
3190     bool little_utf8;
3191     const bool is_index = PL_op->op_type == OP_INDEX;
3192
3193     if (MAXARG >= 3) {
3194         /* arybase is in characters, like offset, so combine prior to the
3195            UTF-8 to bytes calculation.  */
3196         offset = POPi - arybase;
3197     }
3198     little = POPs;
3199     big = POPs;
3200     big_utf8 = DO_UTF8(big);
3201     little_utf8 = DO_UTF8(little);
3202     if (big_utf8 ^ little_utf8) {
3203         /* One needs to be upgraded.  */
3204         if (little_utf8 && !PL_encoding) {
3205             /* Well, maybe instead we might be able to downgrade the small
3206                string?  */
3207             STRLEN little_len;
3208             const U8 * const little_pv = (U8*) SvPV_const(little, little_len);
3209             char * const pv = (char*)bytes_from_utf8(little_pv, &little_len,
3210                                                      &little_utf8);
3211             if (little_utf8) {
3212                 /* If the large string is ISO-8859-1, and it's not possible to
3213                    convert the small string to ISO-8859-1, then there is no
3214                    way that it could be found anywhere by index.  */
3215                 retval = -1;
3216                 goto fail;
3217             }
3218
3219             /* At this point, pv is a malloc()ed string. So donate it to temp
3220                to ensure it will get free()d  */
3221             little = temp = newSV(0);
3222             sv_usepvn(temp, pv, little_len);
3223         } else {
3224             SV * const bytes = little_utf8 ? big : little;
3225             STRLEN len;
3226             const char * const p = SvPV_const(bytes, len);
3227
3228             temp = newSVpvn(p, len);
3229
3230             if (PL_encoding) {
3231                 sv_recode_to_utf8(temp, PL_encoding);
3232             } else {
3233                 sv_utf8_upgrade(temp);
3234             }
3235             if (little_utf8) {
3236                 big = temp;
3237                 big_utf8 = TRUE;
3238             } else {
3239                 little = temp;
3240             }
3241         }
3242     }
3243     /* Don't actually need the NULL initialisation, but it keeps gcc quiet.  */
3244     tmps2 = is_index ? NULL : SvPV_const(little, llen);
3245     tmps = SvPV_const(big, biglen);
3246
3247     if (MAXARG < 3)
3248         offset = is_index ? 0 : biglen;
3249     else {
3250         if (big_utf8 && offset > 0)
3251             sv_pos_u2b(big, &offset, 0);
3252         offset += llen;
3253     }
3254     if (offset < 0)
3255         offset = 0;
3256     else if (offset > (I32)biglen)
3257         offset = biglen;
3258     if (!(tmps2 = is_index
3259           ? fbm_instr((unsigned char*)tmps + offset,
3260                       (unsigned char*)tmps + biglen, little, 0)
3261           : rninstr(tmps,  tmps  + offset,
3262                     tmps2, tmps2 + llen)))
3263         retval = -1;
3264     else {
3265         retval = tmps2 - tmps;
3266         if (retval > 0 && big_utf8)
3267             sv_pos_b2u(big, &retval);
3268     }
3269     if (temp)
3270         SvREFCNT_dec(temp);
3271  fail:
3272     PUSHi(retval + arybase);
3273     RETURN;
3274 }
3275
3276 PP(pp_sprintf)
3277 {
3278     dVAR; dSP; dMARK; dORIGMARK; dTARGET;
3279     do_sprintf(TARG, SP-MARK, MARK+1);
3280     TAINT_IF(SvTAINTED(TARG));
3281     SP = ORIGMARK;
3282     PUSHTARG;
3283     RETURN;
3284 }
3285
3286 PP(pp_ord)
3287 {
3288     dVAR; dSP; dTARGET;
3289     SV *argsv = POPs;
3290     STRLEN len;
3291     const U8 *s = (U8*)SvPV_const(argsv, len);
3292     SV *tmpsv;
3293
3294     if (PL_encoding && SvPOK(argsv) && !DO_UTF8(argsv)) {
3295         tmpsv = sv_2mortal(newSVsv(argsv));
3296         s = (U8*)sv_recode_to_utf8(tmpsv, PL_encoding);
3297         argsv = tmpsv;
3298     }
3299
3300     XPUSHu(DO_UTF8(argsv) ?
3301            utf8n_to_uvchr(s, UTF8_MAXBYTES, 0, UTF8_ALLOW_ANYUV) :
3302            (*s & 0xff));
3303
3304     RETURN;
3305 }
3306
3307 PP(pp_chr)
3308 {
3309     dVAR; dSP; dTARGET;
3310     char *tmps;
3311     UV value;
3312
3313     if (((SvIOK_notUV(TOPs) && SvIV(TOPs) < 0)
3314          ||
3315          (SvNOK(TOPs) && SvNV(TOPs) < 0.0))) {
3316         if (IN_BYTES) {
3317             value = POPu; /* chr(-1) eq chr(0xff), etc. */
3318         } else {
3319             (void) POPs; /* Ignore the argument value. */
3320             value = UNICODE_REPLACEMENT;
3321         }
3322     } else {
3323         value = POPu;
3324     }
3325
3326     SvUPGRADE(TARG,SVt_PV);
3327
3328     if (value > 255 && !IN_BYTES) {
3329         SvGROW(TARG, (STRLEN)UNISKIP(value)+1);
3330         tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3331         SvCUR_set(TARG, tmps - SvPVX_const(TARG));
3332         *tmps = '\0';
3333         (void)SvPOK_only(TARG);
3334         SvUTF8_on(TARG);
3335         XPUSHs(TARG);
3336         RETURN;
3337     }
3338
3339     SvGROW(TARG,2);
3340     SvCUR_set(TARG, 1);
3341     tmps = SvPVX(TARG);
3342     *tmps++ = (char)value;
3343     *tmps = '\0';
3344     (void)SvPOK_only(TARG);
3345     if (PL_encoding && !IN_BYTES) {
3346         sv_recode_to_utf8(TARG, PL_encoding);
3347         tmps = SvPVX(TARG);
3348         if (SvCUR(TARG) == 0 || !is_utf8_string((U8*)tmps, SvCUR(TARG)) ||
3349             memEQ(tmps, "\xef\xbf\xbd\0", 4)) {
3350             SvGROW(TARG, 3);
3351             tmps = SvPVX(TARG);
3352             SvCUR_set(TARG, 2);
3353             *tmps++ = (U8)UTF8_EIGHT_BIT_HI(value);
3354             *tmps++ = (U8)UTF8_EIGHT_BIT_LO(value);
3355             *tmps = '\0';
3356             SvUTF8_on(TARG);
3357         }
3358     }
3359     XPUSHs(TARG);
3360     RETURN;
3361 }
3362
3363 PP(pp_crypt)
3364 {
3365 #ifdef HAS_CRYPT
3366     dVAR; dSP; dTARGET;
3367     dPOPTOPssrl;
3368     STRLEN len;
3369     const char *tmps = SvPV_const(left, len);
3370
3371     if (DO_UTF8(left)) {
3372          /* If Unicode, try to downgrade.
3373           * If not possible, croak.
3374           * Yes, we made this up.  */
3375          SV* const tsv = sv_2mortal(newSVsv(left));
3376
3377          SvUTF8_on(tsv);
3378          sv_utf8_downgrade(tsv, FALSE);
3379          tmps = SvPV_const(tsv, len);
3380     }
3381 #   ifdef USE_ITHREADS
3382 #     ifdef HAS_CRYPT_R
3383     if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3384       /* This should be threadsafe because in ithreads there is only
3385        * one thread per interpreter.  If this would not be true,
3386        * we would need a mutex to protect this malloc. */
3387         PL_reentrant_buffer->_crypt_struct_buffer =
3388           (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3389 #if defined(__GLIBC__) || defined(__EMX__)
3390         if (PL_reentrant_buffer->_crypt_struct_buffer) {
3391             PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3392             /* work around glibc-2.2.5 bug */
3393             PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3394         }
3395 #endif
3396     }
3397 #     endif /* HAS_CRYPT_R */
3398 #   endif /* USE_ITHREADS */
3399 #   ifdef FCRYPT
3400     sv_setpv(TARG, fcrypt(tmps, SvPV_nolen_const(right)));
3401 #   else
3402     sv_setpv(TARG, PerlProc_crypt(tmps, SvPV_nolen_const(right)));
3403 #   endif
3404     SETs(TARG);
3405     RETURN;
3406 #else
3407     DIE(aTHX_
3408       "The crypt() function is unimplemented due to excessive paranoia.");
3409 #endif
3410 }
3411
3412 PP(pp_ucfirst)
3413 {
3414     dVAR;
3415     dSP;
3416     SV *sv = TOPs;
3417     const U8 *s;
3418     STRLEN slen;
3419     const int op_type = PL_op->op_type;
3420
3421     SvGETMAGIC(sv);
3422     if (DO_UTF8(sv) &&
3423         (s = (const U8*)SvPV_nomg_const(sv, slen)) && slen &&
3424         UTF8_IS_START(*s)) {
3425         U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3426         STRLEN ulen;
3427         STRLEN tculen;
3428
3429         utf8_to_uvchr(s, &ulen);
3430         if (op_type == OP_UCFIRST) {
3431             toTITLE_utf8(s, tmpbuf, &tculen);
3432         } else {
3433             toLOWER_utf8(s, tmpbuf, &tculen);
3434         }
3435
3436         if (!SvPADTMP(sv) || SvREADONLY(sv) || ulen != tculen) {
3437             dTARGET;
3438             /* slen is the byte length of the whole SV.
3439              * ulen is the byte length of the original Unicode character
3440              * stored as UTF-8 at s.
3441              * tculen is the byte length of the freshly titlecased (or
3442              * lowercased) Unicode character stored as UTF-8 at tmpbuf.
3443              * We first set the result to be the titlecased (/lowercased)
3444              * character, and then append the rest of the SV data. */
3445             sv_setpvn(TARG, (char*)tmpbuf, tculen);
3446             if (slen > ulen)
3447                 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3448             SvUTF8_on(TARG);
3449             sv = TARG;
3450             SETs(sv);
3451         }
3452         else {
3453             s = (U8*)SvPV_force_nomg(sv, slen);
3454             Copy(tmpbuf, s, tculen, U8);
3455         }
3456     }
3457     else {
3458         U8 *s1;
3459         if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3460             dTARGET;
3461             SvUTF8_off(TARG);                           /* decontaminate */
3462             sv_setsv_nomg(TARG, sv);
3463             sv = TARG;
3464             SETs(sv);
3465         }
3466         s1 = (U8*)SvPV_force_nomg(sv, slen);
3467         if (*s1) {
3468             if (IN_LOCALE_RUNTIME) {
3469                 TAINT;
3470                 SvTAINTED_on(sv);
3471                 *s1 = (op_type == OP_UCFIRST)
3472                     ? toUPPER_LC(*s1) : toLOWER_LC(*s1);
3473             }
3474             else
3475                 *s1 = (op_type == OP_UCFIRST) ? toUPPER(*s1) : toLOWER(*s1);
3476         }
3477     }
3478     SvSETMAGIC(sv);
3479     RETURN;
3480 }
3481
3482 PP(pp_uc)
3483 {
3484     dVAR;
3485     dSP;
3486     SV *sv = TOPs;
3487     STRLEN len;
3488
3489     SvGETMAGIC(sv);
3490     if (DO_UTF8(sv)) {
3491         dTARGET;
3492         STRLEN ulen;
3493         register U8 *d;
3494         const U8 *s;
3495         const U8 *send;
3496         U8 tmpbuf[UTF8_MAXBYTES+1];
3497
3498         s = (const U8*)SvPV_nomg_const(sv,len);
3499         if (!len) {
3500             SvUTF8_off(TARG);                           /* decontaminate */
3501             sv_setpvn(TARG, "", 0);
3502             sv = TARG;
3503             SETs(sv);
3504         }
3505         else {
3506             STRLEN min = len + 1;
3507
3508             SvUPGRADE(TARG, SVt_PV);
3509             SvGROW(TARG, min);
3510             (void)SvPOK_only(TARG);
3511             d = (U8*)SvPVX(TARG);
3512             send = s + len;
3513             while (s < send) {
3514                 STRLEN u = UTF8SKIP(s);
3515
3516                 toUPPER_utf8(s, tmpbuf, &ulen);
3517                 if (ulen > u && (SvLEN(TARG) < (min += ulen - u))) {
3518                     /* If the eventually required minimum size outgrows
3519                      * the available space, we need to grow. */
3520                     const UV o = d - (U8*)SvPVX_const(TARG);
3521
3522                     /* If someone uppercases one million U+03B0s we
3523                      * SvGROW() one million times.  Or we could try
3524                      * guessing how much to allocate without allocating
3525                      * too much. Such is life. */
3526                     SvGROW(TARG, min);
3527                     d = (U8*)SvPVX(TARG) + o;
3528                 }
3529                 Copy(tmpbuf, d, ulen, U8);
3530                 d += ulen;
3531                 s += u;
3532             }
3533             *d = '\0';
3534             SvUTF8_on(TARG);
3535             SvCUR_set(TARG, d - (U8*)SvPVX_const(TARG));
3536             sv = TARG;
3537             SETs(sv);
3538         }
3539     }
3540     else {
3541         U8 *s;
3542         if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3543             dTARGET;
3544             SvUTF8_off(TARG);                           /* decontaminate */
3545             sv_setsv_nomg(TARG, sv);
3546             sv = TARG;
3547             SETs(sv);
3548         }
3549         s = (U8*)SvPV_force_nomg(sv, len);
3550         if (len) {
3551             register const U8 *send = s + len;
3552
3553             if (IN_LOCALE_RUNTIME) {
3554                 TAINT;
3555                 SvTAINTED_on(sv);
3556                 for (; s < send; s++)
3557                     *s = toUPPER_LC(*s);
3558             }
3559             else {
3560                 for (; s < send; s++)
3561                     *s = toUPPER(*s);
3562             }
3563         }
3564     }
3565     SvSETMAGIC(sv);
3566     RETURN;
3567 }
3568
3569 PP(pp_lc)
3570 {
3571     dVAR;
3572     dSP;
3573     SV *sv = TOPs;
3574     STRLEN len;
3575
3576     SvGETMAGIC(sv);
3577     if (DO_UTF8(sv)) {
3578         dTARGET;
3579         const U8 *s;
3580         STRLEN ulen;
3581         register U8 *d;
3582         const U8 *send;
3583         U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3584
3585         s = (const U8*)SvPV_nomg_const(sv,len);
3586         if (!len) {
3587             SvUTF8_off(TARG);                           /* decontaminate */
3588             sv_setpvn(TARG, "", 0);
3589             sv = TARG;
3590             SETs(sv);
3591         }
3592         else {
3593             STRLEN min = len + 1;
3594
3595             SvUPGRADE(TARG, SVt_PV);
3596             SvGROW(TARG, min);
3597             (void)SvPOK_only(TARG);
3598             d = (U8*)SvPVX(TARG);
3599             send = s + len;
3600             while (s < send) {
3601                 const STRLEN u = UTF8SKIP(s);
3602                 const UV uv = toLOWER_utf8(s, tmpbuf, &ulen);
3603
3604 #define GREEK_CAPITAL_LETTER_SIGMA 0x03A3 /* Unicode U+03A3 */
3605                 if (uv == GREEK_CAPITAL_LETTER_SIGMA) {
3606                     NOOP;
3607                      /*
3608                       * Now if the sigma is NOT followed by
3609                       * /$ignorable_sequence$cased_letter/;
3610                       * and it IS preceded by
3611                       * /$cased_letter$ignorable_sequence/;
3612                       * where $ignorable_sequence is
3613                       * [\x{2010}\x{AD}\p{Mn}]*
3614                       * and $cased_letter is
3615                       * [\p{Ll}\p{Lo}\p{Lt}]
3616                       * then it should be mapped to 0x03C2,
3617                       * (GREEK SMALL LETTER FINAL SIGMA),
3618                       * instead of staying 0x03A3.
3619                       * "should be": in other words,
3620                       * this is not implemented yet.
3621                       * See lib/unicore/SpecialCasing.txt.
3622                       */
3623                 }
3624                 if (ulen > u && (SvLEN(TARG) < (min += ulen - u))) {
3625                     /* If the eventually required minimum size outgrows
3626                      * the available space, we need to grow. */
3627                     const UV o = d - (U8*)SvPVX_const(TARG);
3628
3629                     /* If someone lowercases one million U+0130s we
3630                      * SvGROW() one million times.  Or we could try
3631                      * guessing how much to allocate without allocating.
3632                      * too much.  Such is life. */
3633                     SvGROW(TARG, min);
3634                     d = (U8*)SvPVX(TARG) + o;
3635                 }
3636                 Copy(tmpbuf, d, ulen, U8);
3637                 d += ulen;
3638                 s += u;
3639             }
3640             *d = '\0';
3641             SvUTF8_on(TARG);
3642             SvCUR_set(TARG, d - (U8*)SvPVX_const(TARG));
3643             sv = TARG;
3644             SETs(sv);
3645         }
3646     }
3647     else {
3648         U8 *s;
3649         if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3650             dTARGET;
3651             SvUTF8_off(TARG);                           /* decontaminate */
3652             sv_setsv_nomg(TARG, sv);
3653             sv = TARG;
3654             SETs(sv);
3655         }
3656
3657         s = (U8*)SvPV_force_nomg(sv, len);
3658         if (len) {
3659             register const U8 * const send = s + len;
3660
3661             if (IN_LOCALE_RUNTIME) {
3662                 TAINT;
3663                 SvTAINTED_on(sv);
3664                 for (; s < send; s++)
3665                     *s = toLOWER_LC(*s);
3666             }
3667             else {
3668                 for (; s < send; s++)
3669                     *s = toLOWER(*s);
3670             }
3671         }
3672     }
3673     SvSETMAGIC(sv);
3674     RETURN;
3675 }
3676
3677 PP(pp_quotemeta)
3678 {
3679     dVAR; dSP; dTARGET;
3680     SV * const sv = TOPs;
3681     STRLEN len;
3682     register const char *s = SvPV_const(sv,len);
3683
3684     SvUTF8_off(TARG);                           /* decontaminate */
3685     if (len) {
3686         register char *d;
3687         SvUPGRADE(TARG, SVt_PV);
3688         SvGROW(TARG, (len * 2) + 1);
3689         d = SvPVX(TARG);
3690         if (DO_UTF8(sv)) {
3691             while (len) {
3692                 if (UTF8_IS_CONTINUED(*s)) {
3693                     STRLEN ulen = UTF8SKIP(s);
3694                     if (ulen > len)
3695                         ulen = len;
3696                     len -= ulen;
3697                     while (ulen--)
3698                         *d++ = *s++;
3699                 }
3700                 else {
3701                     if (!isALNUM(*s))
3702                         *d++ = '\\';
3703                     *d++ = *s++;
3704                     len--;
3705                 }
3706             }
3707             SvUTF8_on(TARG);
3708         }
3709         else {
3710             while (len--) {
3711                 if (!isALNUM(*s))
3712                     *d++ = '\\';
3713                 *d++ = *s++;
3714             }
3715         }
3716         *d = '\0';
3717         SvCUR_set(TARG, d - SvPVX_const(TARG));
3718         (void)SvPOK_only_UTF8(TARG);
3719     }
3720     else
3721         sv_setpvn(TARG, s, len);
3722     SETs(TARG);
3723     if (SvSMAGICAL(TARG))
3724         mg_set(TARG);
3725     RETURN;
3726 }
3727
3728 /* Arrays. */
3729
3730 PP(pp_aslice)
3731 {
3732     dVAR; dSP; dMARK; dORIGMARK;
3733     register AV* const av = (AV*)POPs;
3734     register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3735
3736     if (SvTYPE(av) == SVt_PVAV) {
3737         const I32 arybase = CopARYBASE_get(PL_curcop);
3738         if (lval && PL_op->op_private & OPpLVAL_INTRO) {
3739             register SV **svp;
3740             I32 max = -1;
3741             for (svp = MARK + 1; svp <= SP; svp++) {
3742                 const I32 elem = SvIVx(*svp);
3743                 if (elem > max)
3744                     max = elem;
3745             }
3746             if (max > AvMAX(av))
3747                 av_extend(av, max);
3748         }
3749         while (++MARK <= SP) {
3750             register SV **svp;
3751             I32 elem = SvIVx(*MARK);
3752
3753             if (elem > 0)
3754                 elem -= arybase;
3755             svp = av_fetch(av, elem, lval);
3756             if (lval) {
3757                 if (!svp || *svp == &PL_sv_undef)
3758                     DIE(aTHX_ PL_no_aelem, elem);
3759                 if (PL_op->op_private & OPpLVAL_INTRO)
3760                     save_aelem(av, elem, svp);
3761             }
3762             *MARK = svp ? *svp : &PL_sv_undef;
3763         }
3764     }
3765     if (GIMME != G_ARRAY) {
3766         MARK = ORIGMARK;
3767         *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
3768         SP = MARK;
3769     }
3770     RETURN;
3771 }
3772
3773 /* Associative arrays. */
3774
3775 PP(pp_each)
3776 {
3777     dVAR;
3778     dSP;
3779     HV * const hash = (HV*)POPs;
3780     HE *entry;
3781     const I32 gimme = GIMME_V;
3782
3783     PUTBACK;
3784     /* might clobber stack_sp */
3785     entry = hv_iternext(hash);
3786     SPAGAIN;
3787
3788     EXTEND(SP, 2);
3789     if (entry) {
3790         SV* const sv = hv_iterkeysv(entry);
3791         PUSHs(sv);      /* won't clobber stack_sp */
3792         if (gimme == G_ARRAY) {
3793             SV *val;
3794             PUTBACK;
3795             /* might clobber stack_sp */
3796             val = hv_iterval(hash, entry);
3797             SPAGAIN;
3798             PUSHs(val);
3799         }
3800     }
3801     else if (gimme == G_SCALAR)
3802         RETPUSHUNDEF;
3803
3804     RETURN;
3805 }
3806
3807 PP(pp_delete)
3808 {
3809     dVAR;
3810     dSP;
3811     const I32 gimme = GIMME_V;
3812     const I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
3813
3814     if (PL_op->op_private & OPpSLICE) {
3815         dMARK; dORIGMARK;
3816         HV * const hv = (HV*)POPs;
3817         const U32 hvtype = SvTYPE(hv);
3818         if (hvtype == SVt_PVHV) {                       /* hash element */
3819             while (++MARK <= SP) {
3820                 SV * const sv = hv_delete_ent(hv, *MARK, discard, 0);
3821                 *MARK = sv ? sv : &PL_sv_undef;
3822             }
3823         }
3824         else if (hvtype == SVt_PVAV) {                  /* array element */
3825             if (PL_op->op_flags & OPf_SPECIAL) {
3826                 while (++MARK <= SP) {
3827                     SV * const sv = av_delete((AV*)hv, SvIV(*MARK), discard);
3828                     *MARK = sv ? sv : &PL_sv_undef;
3829                 }
3830             }
3831         }
3832         else
3833             DIE(aTHX_ "Not a HASH reference");
3834         if (discard)
3835             SP = ORIGMARK;
3836         else if (gimme == G_SCALAR) {
3837             MARK = ORIGMARK;
3838             if (SP > MARK)
3839                 *++MARK = *SP;
3840             else
3841                 *++MARK = &PL_sv_undef;
3842             SP = MARK;
3843         }
3844     }
3845     else {
3846         SV *keysv = POPs;
3847         HV * const hv = (HV*)POPs;
3848         SV *sv;
3849         if (SvTYPE(hv) == SVt_PVHV)
3850             sv = hv_delete_ent(hv, keysv, discard, 0);
3851         else if (SvTYPE(hv) == SVt_PVAV) {
3852             if (PL_op->op_flags & OPf_SPECIAL)
3853                 sv = av_delete((AV*)hv, SvIV(keysv), discard);
3854             else
3855                 DIE(aTHX_ "panic: avhv_delete no longer supported");
3856         }
3857         else
3858             DIE(aTHX_ "Not a HASH reference");
3859         if (!sv)
3860             sv = &PL_sv_undef;
3861         if (!discard)
3862             PUSHs(sv);
3863     }
3864     RETURN;
3865 }
3866
3867 PP(pp_exists)
3868 {
3869     dVAR;
3870     dSP;
3871     SV *tmpsv;
3872     HV *hv;
3873
3874     if (PL_op->op_private & OPpEXISTS_SUB) {
3875         GV *gv;
3876         SV * const sv = POPs;
3877         CV * const cv = sv_2cv(sv, &hv, &gv, 0);
3878         if (cv)
3879             RETPUSHYES;
3880         if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
3881             RETPUSHYES;
3882         RETPUSHNO;
3883     }
3884     tmpsv = POPs;
3885     hv = (HV*)POPs;
3886     if (SvTYPE(hv) == SVt_PVHV) {
3887         if (hv_exists_ent(hv, tmpsv, 0))
3888             RETPUSHYES;
3889     }
3890     else if (SvTYPE(hv) == SVt_PVAV) {
3891         if (PL_op->op_flags & OPf_SPECIAL) {            /* array element */
3892             if (av_exists((AV*)hv, SvIV(tmpsv)))
3893                 RETPUSHYES;
3894         }
3895     }
3896     else {
3897         DIE(aTHX_ "Not a HASH reference");
3898     }
3899     RETPUSHNO;
3900 }
3901
3902 PP(pp_hslice)
3903 {
3904     dVAR; dSP; dMARK; dORIGMARK;
3905     register HV * const hv = (HV*)POPs;
3906     register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3907     const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
3908     bool other_magic = FALSE;
3909
3910     if (localizing) {
3911         MAGIC *mg;
3912         HV *stash;
3913
3914         other_magic = mg_find((SV*)hv, PERL_MAGIC_env) ||
3915             ((mg = mg_find((SV*)hv, PERL_MAGIC_tied))
3916              /* Try to preserve the existenceness of a tied hash
3917               * element by using EXISTS and DELETE if possible.
3918               * Fallback to FETCH and STORE otherwise */
3919              && (stash = SvSTASH(SvRV(SvTIED_obj((SV*)hv, mg))))
3920              && gv_fetchmethod_autoload(stash, "EXISTS", TRUE)
3921              && gv_fetchmethod_autoload(stash, "DELETE", TRUE));
3922     }
3923
3924     while (++MARK <= SP) {
3925         SV * const keysv = *MARK;
3926         SV **svp;
3927         HE *he;
3928         bool preeminent = FALSE;
3929
3930         if (localizing) {
3931             preeminent = SvRMAGICAL(hv) && !other_magic ? 1 :
3932                 hv_exists_ent(hv, keysv, 0);
3933         }
3934
3935         he = hv_fetch_ent(hv, keysv, lval, 0);
3936         svp = he ? &HeVAL(he) : 0;
3937
3938         if (lval) {
3939             if (!svp || *svp == &PL_sv_undef) {
3940                 DIE(aTHX_ PL_no_helem_sv, keysv);
3941             }
3942             if (localizing) {
3943                 if (HvNAME_get(hv) && isGV(*svp))
3944                     save_gp((GV*)*svp, !(PL_op->op_flags & OPf_SPECIAL));
3945                 else {
3946                     if (preeminent)
3947                         save_helem(hv, keysv, svp);
3948                     else {
3949                         STRLEN keylen;
3950                         const char * const key = SvPV_const(keysv, keylen);
3951                         SAVEDELETE(hv, savepvn(key,keylen),
3952                                    SvUTF8(keysv) ? -keylen : keylen);
3953                     }
3954                 }
3955             }
3956         }
3957         *MARK = svp ? *svp : &PL_sv_undef;
3958     }
3959     if (GIMME != G_ARRAY) {
3960         MARK = ORIGMARK;
3961         *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
3962         SP = MARK;
3963     }
3964     RETURN;
3965 }
3966
3967 /* List operators. */
3968
3969 PP(pp_list)
3970 {
3971     dVAR; dSP; dMARK;
3972     if (GIMME != G_ARRAY) {
3973         if (++MARK <= SP)
3974             *MARK = *SP;                /* unwanted list, return last item */
3975         else
3976             *MARK = &PL_sv_undef;
3977         SP = MARK;
3978     }
3979     RETURN;
3980 }
3981
3982 PP(pp_lslice)
3983 {
3984     dVAR;
3985     dSP;
3986     SV ** const lastrelem = PL_stack_sp;
3987     SV ** const lastlelem = PL_stack_base + POPMARK;
3988     SV ** const firstlelem = PL_stack_base + POPMARK + 1;
3989     register SV ** const firstrelem = lastlelem + 1;
3990     const I32 arybase = CopARYBASE_get(PL_curcop);
3991     I32 is_something_there = PL_op->op_flags & OPf_MOD;
3992
3993     register const I32 max = lastrelem - lastlelem;
3994     register SV **lelem;
3995
3996     if (GIMME != G_ARRAY) {
3997         I32 ix = SvIVx(*lastlelem);
3998         if (ix < 0)
3999             ix += max;
4000         else
4001             ix -= arybase;
4002         if (ix < 0 || ix >= max)
4003             *firstlelem = &PL_sv_undef;
4004         else
4005             *firstlelem = firstrelem[ix];
4006         SP = firstlelem;
4007         RETURN;
4008     }
4009
4010     if (max == 0) {
4011         SP = firstlelem - 1;
4012         RETURN;
4013     }
4014
4015     for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
4016         I32 ix = SvIVx(*lelem);
4017         if (ix < 0)
4018             ix += max;
4019         else
4020             ix -= arybase;
4021         if (ix < 0 || ix >= max)
4022             *lelem = &PL_sv_undef;
4023         else {
4024             is_something_there = TRUE;
4025             if (!(*lelem = firstrelem[ix]))
4026                 *lelem = &PL_sv_undef;
4027         }
4028     }
4029     if (is_something_there)
4030         SP = lastlelem;
4031     else
4032         SP = firstlelem - 1;
4033     RETURN;
4034 }
4035
4036 PP(pp_anonlist)
4037 {
4038     dVAR; dSP; dMARK; dORIGMARK;
4039     const I32 items = SP - MARK;
4040     SV * const av = sv_2mortal((SV*)av_make(items, MARK+1));
4041     SP = ORIGMARK;              /* av_make() might realloc stack_sp */
4042     XPUSHs(av);
4043     RETURN;
4044 }
4045
4046 PP(pp_anonhash)
4047 {
4048     dVAR; dSP; dMARK; dORIGMARK;
4049     HV* const hv = (HV*)sv_2mortal((SV*)newHV());
4050
4051     while (MARK < SP) {
4052         SV * const key = *++MARK;
4053         SV * const val = newSV(0);
4054         if (MARK < SP)
4055             sv_setsv(val, *++MARK);
4056         else if (ckWARN(WARN_MISC))
4057             Perl_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
4058         (void)hv_store_ent(hv,key,val,0);
4059     }
4060     SP = ORIGMARK;
4061     XPUSHs((SV*)hv);
4062     RETURN;
4063 }
4064
4065 PP(pp_splice)
4066 {
4067     dVAR; dSP; dMARK; dORIGMARK;
4068     register AV *ary = (AV*)*++MARK;
4069     register SV **src;
4070     register SV **dst;
4071     register I32 i;
4072     register I32 offset;
4073     register I32 length;
4074     I32 newlen;
4075     I32 after;
4076     I32 diff;
4077     const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4078
4079     if (mg) {
4080         *MARK-- = SvTIED_obj((SV*)ary, mg);
4081         PUSHMARK(MARK);
4082         PUTBACK;
4083         ENTER;
4084         call_method("SPLICE",GIMME_V);
4085         LEAVE;
4086         SPAGAIN;
4087         RETURN;
4088     }
4089
4090     SP++;
4091
4092     if (++MARK < SP) {
4093         offset = i = SvIVx(*MARK);
4094         if (offset < 0)
4095             offset += AvFILLp(ary) + 1;
4096         else
4097             offset -= CopARYBASE_get(PL_curcop);
4098         if (offset < 0)
4099             DIE(aTHX_ PL_no_aelem, i);
4100         if (++MARK < SP) {
4101             length = SvIVx(*MARK++);
4102             if (length < 0) {
4103                 length += AvFILLp(ary) - offset + 1;
4104                 if (length < 0)
4105                     length = 0;
4106             }
4107         }
4108         else
4109             length = AvMAX(ary) + 1;            /* close enough to infinity */
4110     }
4111     else {
4112         offset = 0;
4113         length = AvMAX(ary) + 1;
4114     }
4115     if (offset > AvFILLp(ary) + 1) {
4116         if (ckWARN(WARN_MISC))
4117             Perl_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
4118         offset = AvFILLp(ary) + 1;
4119     }
4120     after = AvFILLp(ary) + 1 - (offset + length);
4121     if (after < 0) {                            /* not that much array */
4122         length += after;                        /* offset+length now in array */
4123         after = 0;
4124         if (!AvALLOC(ary))
4125             av_extend(ary, 0);
4126     }
4127
4128     /* At this point, MARK .. SP-1 is our new LIST */
4129
4130     newlen = SP - MARK;
4131     diff = newlen - length;
4132     if (newlen && !AvREAL(ary) && AvREIFY(ary))
4133         av_reify(ary);
4134
4135     /* make new elements SVs now: avoid problems if they're from the array */
4136     for (dst = MARK, i = newlen; i; i--) {
4137         SV * const h = *dst;
4138         *dst++ = newSVsv(h);
4139     }
4140
4141     if (diff < 0) {                             /* shrinking the area */
4142         SV **tmparyval;
4143         if (newlen) {
4144             Newx(tmparyval, newlen, SV*);       /* so remember insertion */
4145             Copy(MARK, tmparyval, newlen, SV*);
4146         }
4147
4148         MARK = ORIGMARK + 1;
4149         if (GIMME == G_ARRAY) {                 /* copy return vals to stack */
4150             MEXTEND(MARK, length);
4151             Copy(AvARRAY(ary)+offset, MARK, length, SV*);
4152             if (AvREAL(ary)) {
4153                 EXTEND_MORTAL(length);
4154                 for (i = length, dst = MARK; i; i--) {
4155                     sv_2mortal(*dst);   /* free them eventualy */
4156                     dst++;
4157                 }
4158             }
4159             MARK += length - 1;
4160         }
4161         else {
4162             *MARK = AvARRAY(ary)[offset+length-1];
4163             if (AvREAL(ary)) {
4164                 sv_2mortal(*MARK);
4165                 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
4166                     SvREFCNT_dec(*dst++);       /* free them now */
4167             }
4168         }
4169         AvFILLp(ary) += diff;
4170
4171         /* pull up or down? */
4172
4173         if (offset < after) {                   /* easier to pull up */
4174             if (offset) {                       /* esp. if nothing to pull */
4175                 src = &AvARRAY(ary)[offset-1];
4176                 dst = src - diff;               /* diff is negative */
4177                 for (i = offset; i > 0; i--)    /* can't trust Copy */
4178                     *dst-- = *src--;
4179             }
4180             dst = AvARRAY(ary);
4181             SvPV_set(ary, (char*)(AvARRAY(ary) - diff)); /* diff is negative */
4182             AvMAX(ary) += diff;
4183         }
4184         else {
4185             if (after) {                        /* anything to pull down? */
4186                 src = AvARRAY(ary) + offset + length;
4187                 dst = src + diff;               /* diff is negative */
4188                 Move(src, dst, after, SV*);
4189             }
4190             dst = &AvARRAY(ary)[AvFILLp(ary)+1];
4191                                                 /* avoid later double free */
4192         }
4193         i = -diff;
4194         while (i)
4195             dst[--i] = &PL_sv_undef;
4196         
4197         if (newlen) {
4198             Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
4199             Safefree(tmparyval);
4200         }
4201     }
4202     else {                                      /* no, expanding (or same) */
4203         SV** tmparyval = NULL;
4204         if (length) {
4205             Newx(tmparyval, length, SV*);       /* so remember deletion */
4206             Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
4207         }
4208
4209         if (diff > 0) {                         /* expanding */
4210             /* push up or down? */
4211             if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
4212                 if (offset) {
4213                     src = AvARRAY(ary);
4214                     dst = src - diff;
4215                     Move(src, dst, offset, SV*);
4216                 }
4217                 SvPV_set(ary, (char*)(AvARRAY(ary) - diff));/* diff is positive */
4218                 AvMAX(ary) += diff;
4219                 AvFILLp(ary) += diff;
4220             }
4221             else {
4222                 if (AvFILLp(ary) + diff >= AvMAX(ary))  /* oh, well */
4223                     av_extend(ary, AvFILLp(ary) + diff);
4224                 AvFILLp(ary) += diff;
4225
4226                 if (after) {
4227                     dst = AvARRAY(ary) + AvFILLp(ary);
4228                     src = dst - diff;
4229                     for (i = after; i; i--) {
4230                         *dst-- = *src--;
4231                     }
4232                 }
4233             }
4234         }
4235
4236         if (newlen) {
4237             Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
4238         }
4239
4240         MARK = ORIGMARK + 1;
4241         if (GIMME == G_ARRAY) {                 /* copy return vals to stack */
4242             if (length) {
4243                 Copy(tmparyval, MARK, length, SV*);
4244                 if (AvREAL(ary)) {
4245                     EXTEND_MORTAL(length);
4246                     for (i = length, dst = MARK; i; i--) {
4247                         sv_2mortal(*dst);       /* free them eventualy */
4248                         dst++;
4249                     }
4250                 }
4251             }
4252             MARK += length - 1;
4253         }
4254         else if (length--) {
4255             *MARK = tmparyval[length];
4256             if (AvREAL(ary)) {
4257                 sv_2mortal(*MARK);
4258                 while (length-- > 0)
4259                     SvREFCNT_dec(tmparyval[length]);
4260             }
4261         }
4262         else
4263             *MARK = &PL_sv_undef;
4264         Safefree(tmparyval);
4265     }
4266     SP = MARK;
4267     RETURN;
4268 }
4269
4270 PP(pp_push)
4271 {
4272     dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4273     register AV *ary = (AV*)*++MARK;
4274     const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4275
4276     if (mg) {
4277         *MARK-- = SvTIED_obj((SV*)ary, mg);
4278         PUSHMARK(MARK);
4279         PUTBACK;
4280         ENTER;
4281         call_method("PUSH",G_SCALAR|G_DISCARD);
4282         LEAVE;
4283         SPAGAIN;
4284         SP = ORIGMARK;
4285         PUSHi( AvFILL(ary) + 1 );
4286     }
4287     else {
4288         for (++MARK; MARK <= SP; MARK++) {
4289             SV * const sv = newSV(0);
4290             if (*MARK)
4291                 sv_setsv(sv, *MARK);
4292             av_store(ary, AvFILLp(ary)+1, sv);
4293         }
4294         SP = ORIGMARK;
4295         PUSHi( AvFILLp(ary) + 1 );
4296     }
4297     RETURN;
4298 }
4299
4300 PP(pp_shift)
4301 {
4302     dVAR;
4303     dSP;
4304     AV * const av = (AV*)POPs;
4305     SV * const sv = PL_op->op_type == OP_SHIFT ? av_shift(av) : av_pop(av);
4306     EXTEND(SP, 1);
4307     assert (sv);
4308     if (AvREAL(av))
4309         (void)sv_2mortal(sv);
4310     PUSHs(sv);
4311     RETURN;
4312 }
4313
4314 PP(pp_unshift)
4315 {
4316     dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4317     register AV *ary = (AV*)*++MARK;
4318     const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4319
4320     if (mg) {
4321         *MARK-- = SvTIED_obj((SV*)ary, mg);
4322         PUSHMARK(MARK);
4323         PUTBACK;
4324         ENTER;
4325         call_method("UNSHIFT",G_SCALAR|G_DISCARD);
4326         LEAVE;
4327         SPAGAIN;
4328     }
4329     else {
4330         register I32 i = 0;
4331         av_unshift(ary, SP - MARK);
4332         while (MARK < SP) {
4333             SV * const sv = newSVsv(*++MARK);
4334             (void)av_store(ary, i++, sv);
4335         }
4336     }
4337     SP = ORIGMARK;
4338     PUSHi( AvFILL(ary) + 1 );
4339     RETURN;
4340 }
4341
4342 PP(pp_reverse)
4343 {
4344     dVAR; dSP; dMARK;
4345     SV ** const oldsp = SP;
4346
4347     if (GIMME == G_ARRAY) {
4348         MARK++;
4349         while (MARK < SP) {
4350             register SV * const tmp = *MARK;
4351             *MARK++ = *SP;
4352             *SP-- = tmp;
4353         }
4354         /* safe as long as stack cannot get extended in the above */
4355         SP = oldsp;
4356     }
4357     else {
4358         register char *up;
4359         register char *down;
4360         register I32 tmp;
4361         dTARGET;
4362         STRLEN len;
4363         PADOFFSET padoff_du;
4364
4365         SvUTF8_off(TARG);                               /* decontaminate */
4366         if (SP - MARK > 1)
4367             do_join(TARG, &PL_sv_no, MARK, SP);
4368         else
4369             sv_setsv(TARG, (SP > MARK)
4370                     ? *SP
4371                     : (padoff_du = find_rundefsvoffset(),
4372                         (padoff_du == NOT_IN_PAD
4373                          || PAD_COMPNAME_FLAGS_isOUR(padoff_du))
4374                         ? DEFSV : PAD_SVl(padoff_du)));
4375         up = SvPV_force(TARG, len);
4376         if (len > 1) {
4377             if (DO_UTF8(TARG)) {        /* first reverse each character */
4378                 U8* s = (U8*)SvPVX(TARG);
4379                 const U8* send = (U8*)(s + len);
4380                 while (s < send) {
4381                     if (UTF8_IS_INVARIANT(*s)) {
4382                         s++;
4383                         continue;
4384                     }
4385                     else {
4386                         if (!utf8_to_uvchr(s, 0))
4387                             break;
4388                         up = (char*)s;
4389                         s += UTF8SKIP(s);
4390                         down = (char*)(s - 1);
4391                         /* reverse this character */
4392                         while (down > up) {
4393                             tmp = *up;
4394                             *up++ = *down;
4395                             *down-- = (char)tmp;
4396                         }
4397                     }
4398                 }
4399                 up = SvPVX(TARG);
4400             }
4401             down = SvPVX(TARG) + len - 1;
4402             while (down > up) {
4403                 tmp = *up;
4404                 *up++ = *down;
4405                 *down-- = (char)tmp;
4406             }
4407             (void)SvPOK_only_UTF8(TARG);
4408         }
4409         SP = MARK + 1;
4410         SETTARG;
4411     }
4412     RETURN;
4413 }
4414
4415 PP(pp_split)
4416 {
4417     dVAR; dSP; dTARG;
4418     AV *ary;
4419     register IV limit = POPi;                   /* note, negative is forever */
4420     SV * const sv = POPs;
4421     STRLEN len;
4422     register const char *s = SvPV_const(sv, len);
4423     const bool do_utf8 = DO_UTF8(sv);
4424     const char *strend = s + len;
4425     register PMOP *pm;
4426     register REGEXP *rx;
4427     register SV *dstr;
4428     register const char *m;
4429     I32 iters = 0;
4430     const STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (STRLEN)(strend - s);
4431     I32 maxiters = slen + 10;
4432     const char *orig;
4433     const I32 origlimit = limit;
4434     I32 realarray = 0;
4435     I32 base;
4436     const I32 gimme = GIMME_V;
4437     const I32 oldsave = PL_savestack_ix;
4438     I32 make_mortal = 1;
4439     bool multiline = 0;
4440     MAGIC *mg = NULL;
4441
4442 #ifdef DEBUGGING
4443     Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4444 #else
4445     pm = (PMOP*)POPs;
4446 #endif
4447     if (!pm || !s)
4448         DIE(aTHX_ "panic: pp_split");
4449     rx = PM_GETRE(pm);
4450
4451     TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
4452              (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
4453
4454     RX_MATCH_UTF8_set(rx, do_utf8);
4455
4456     if (pm->op_pmreplroot) {
4457 #ifdef USE_ITHREADS
4458         ary = GvAVn((GV*)PAD_SVl(INT2PTR(PADOFFSET, pm->op_pmreplroot)));
4459 #else
4460         ary = GvAVn((GV*)pm->op_pmreplroot);
4461 #endif
4462     }
4463     else if (gimme != G_ARRAY)
4464         ary = GvAVn(PL_defgv);
4465     else
4466         ary = NULL;
4467     if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4468         realarray = 1;
4469         PUTBACK;
4470         av_extend(ary,0);
4471         av_clear(ary);
4472         SPAGAIN;
4473         if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4474             PUSHMARK(SP);
4475             XPUSHs(SvTIED_obj((SV*)ary, mg));
4476         }
4477         else {
4478             if (!AvREAL(ary)) {
4479                 I32 i;
4480                 AvREAL_on(ary);
4481                 AvREIFY_off(ary);
4482                 for (i = AvFILLp(ary); i >= 0; i--)
4483                     AvARRAY(ary)[i] = &PL_sv_undef;     /* don't free mere refs */
4484             }
4485             /* temporarily switch stacks */
4486             SAVESWITCHSTACK(PL_curstack, ary);
4487             make_mortal = 0;
4488         }
4489     }
4490     base = SP - PL_stack_base;
4491     orig = s;
4492     if (pm->op_pmflags & PMf_SKIPWHITE) {
4493         if (pm->op_pmflags & PMf_LOCALE) {
4494             while (isSPACE_LC(*s))
4495                 s++;
4496         }
4497         else {
4498             while (isSPACE(*s))
4499                 s++;
4500         }
4501     }
4502     if (pm->op_pmflags & PMf_MULTILINE) {
4503         multiline = 1;
4504     }
4505
4506     if (!limit)
4507         limit = maxiters + 2;
4508     if (pm->op_pmflags & PMf_WHITE) {
4509         while (--limit) {
4510             m = s;
4511             while (m < strend &&
4512                    !((pm->op_pmflags & PMf_LOCALE)
4513                      ? isSPACE_LC(*m) : isSPACE(*m)))
4514                 ++m;
4515             if (m >= strend)
4516                 break;
4517
4518             dstr = newSVpvn(s, m-s);
4519             if (make_mortal)
4520                 sv_2mortal(dstr);
4521             if (do_utf8)
4522                 (void)SvUTF8_on(dstr);
4523             XPUSHs(dstr);
4524
4525             s = m + 1;
4526             while (s < strend &&
4527                    ((pm->op_pmflags & PMf_LOCALE)
4528                     ? isSPACE_LC(*s) : isSPACE(*s)))
4529                 ++s;
4530         }
4531     }
4532     else if (rx->precomp[0] == '^' && rx->precomp[1] == '\0') {
4533         while (--limit) {
4534             for (m = s; m < strend && *m != '\n'; m++)
4535                 ;
4536             m++;
4537             if (m >= strend)
4538                 break;
4539             dstr = newSVpvn(s, m-s);
4540             if (make_mortal)
4541                 sv_2mortal(dstr);
4542             if (do_utf8)
4543                 (void)SvUTF8_on(dstr);
4544             XPUSHs(dstr);
4545             s = m;
4546         }
4547     }
4548     else if (do_utf8 == ((rx->reganch & ROPT_UTF8) != 0) &&
4549              (rx->reganch & RE_USE_INTUIT) && !rx->nparens
4550              && (rx->reganch & ROPT_CHECK_ALL)
4551              && !(rx->reganch & ROPT_ANCH)) {
4552         const int tail = (rx->reganch & RE_INTUIT_TAIL);
4553         SV * const csv = CALLREG_INTUIT_STRING(aTHX_ rx);
4554
4555         len = rx->minlen;
4556         if (len == 1 && !(rx->reganch & ROPT_UTF8) && !tail) {
4557             const char c = *SvPV_nolen_const(csv);
4558             while (--limit) {
4559                 for (m = s; m < strend && *m != c; m++)
4560                     ;
4561                 if (m >= strend)
4562                     break;
4563                 dstr = newSVpvn(s, m-s);
4564                 if (make_mortal)
4565                     sv_2mortal(dstr);
4566                 if (do_utf8)
4567                     (void)SvUTF8_on(dstr);
4568                 XPUSHs(dstr);
4569                 /* The rx->minlen is in characters but we want to step
4570                  * s ahead by bytes. */
4571                 if (do_utf8)
4572                     s = (char*)utf8_hop((U8*)m, len);
4573                 else
4574                     s = m + len; /* Fake \n at the end */
4575             }
4576         }
4577         else {
4578             while (s < strend && --limit &&
4579               (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
4580                              csv, multiline ? FBMrf_MULTILINE : 0)) )
4581             {
4582                 dstr = newSVpvn(s, m-s);
4583                 if (make_mortal)
4584                     sv_2mortal(dstr);
4585                 if (do_utf8)
4586                     (void)SvUTF8_on(dstr);
4587                 XPUSHs(dstr);
4588                 /* The rx->minlen is in characters but we want to step
4589                  * s ahead by bytes. */
4590                 if (do_utf8)
4591                     s = (char*)utf8_hop((U8*)m, len);
4592                 else
4593                     s = m + len; /* Fake \n at the end */
4594             }
4595         }
4596     }
4597     else {
4598         maxiters += slen * rx->nparens;
4599         while (s < strend && --limit)
4600         {
4601             I32 rex_return;
4602             PUTBACK;
4603             rex_return = CALLREGEXEC(aTHX_ rx, (char*)s, (char*)strend, (char*)orig, 1 ,
4604                             sv, NULL, 0);
4605             SPAGAIN;
4606             if (rex_return == 0)
4607                 break;
4608             TAINT_IF(RX_MATCH_TAINTED(rx));
4609             if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
4610                 m = s;
4611                 s = orig;
4612                 orig = rx->subbeg;
4613                 s = orig + (m - s);
4614                 strend = s + (strend - m);
4615             }
4616             m = rx->startp[0] + orig;
4617             dstr = newSVpvn(s, m-s);
4618             if (make_mortal)
4619                 sv_2mortal(dstr);
4620             if (do_utf8)
4621                 (void)SvUTF8_on(dstr);
4622             XPUSHs(dstr);
4623             if (rx->nparens) {
4624                 I32 i;
4625                 for (i = 1; i <= (I32)rx->nparens; i++) {
4626                     s = rx->startp[i] + orig;
4627                     m = rx->endp[i] + orig;
4628
4629                     /* japhy (07/27/01) -- the (m && s) test doesn't catch
4630                        parens that didn't match -- they should be set to
4631                        undef, not the empty string */
4632                     if (m >= orig && s >= orig) {
4633                         dstr = newSVpvn(s, m-s);
4634                     }
4635                     else
4636                         dstr = &PL_sv_undef;  /* undef, not "" */
4637                     if (make_mortal)
4638                         sv_2mortal(dstr);
4639                     if (do_utf8)
4640                         (void)SvUTF8_on(dstr);
4641                     XPUSHs(dstr);
4642                 }
4643             }
4644             s = rx->endp[0] + orig;
4645         }
4646     }
4647
4648     iters = (SP - PL_stack_base) - base;
4649     if (iters > maxiters)
4650         DIE(aTHX_ "Split loop");
4651
4652     /* keep field after final delim? */
4653     if (s < strend || (iters && origlimit)) {
4654         const STRLEN l = strend - s;
4655         dstr = newSVpvn(s, l);
4656         if (make_mortal)
4657             sv_2mortal(dstr);
4658         if (do_utf8)
4659             (void)SvUTF8_on(dstr);
4660         XPUSHs(dstr);
4661         iters++;
4662     }
4663     else if (!origlimit) {
4664         while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
4665             if (TOPs && !make_mortal)
4666                 sv_2mortal(TOPs);
4667             iters--;
4668             *SP-- = &PL_sv_undef;
4669         }
4670     }
4671
4672     PUTBACK;
4673     LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */
4674     SPAGAIN;
4675     if (realarray) {
4676         if (!mg) {
4677             if (SvSMAGICAL(ary)) {
4678                 PUTBACK;
4679                 mg_set((SV*)ary);
4680                 SPAGAIN;
4681             }
4682             if (gimme == G_ARRAY) {
4683                 EXTEND(SP, iters);
4684                 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4685                 SP += iters;
4686                 RETURN;
4687             }
4688         }
4689         else {
4690             PUTBACK;
4691             ENTER;
4692             call_method("PUSH",G_SCALAR|G_DISCARD);
4693             LEAVE;
4694             SPAGAIN;
4695             if (gimme == G_ARRAY) {
4696                 I32 i;
4697                 /* EXTEND should not be needed - we just popped them */
4698                 EXTEND(SP, iters);
4699                 for (i=0; i < iters; i++) {
4700                     SV **svp = av_fetch(ary, i, FALSE);
4701                     PUSHs((svp) ? *svp : &PL_sv_undef);
4702                 }
4703                 RETURN;
4704             }
4705         }
4706     }
4707     else {
4708         if (gimme == G_ARRAY)
4709             RETURN;
4710     }
4711
4712     GETTARGET;
4713     PUSHi(iters);
4714     RETURN;
4715 }
4716
4717 PP(pp_lock)
4718 {
4719     dVAR;
4720     dSP;
4721     dTOPss;
4722     SV *retsv = sv;
4723     SvLOCK(sv);
4724     if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
4725         || SvTYPE(retsv) == SVt_PVCV) {
4726         retsv = refto(retsv);
4727     }
4728     SETs(retsv);
4729     RETURN;
4730 }
4731
4732
4733 PP(unimplemented_op)
4734 {
4735     dVAR;
4736     DIE(aTHX_ "panic: unimplemented op %s (#%d) called", OP_NAME(PL_op),
4737         PL_op->op_type);
4738 }
4739
4740 /*
4741  * Local variables:
4742  * c-indentation-style: bsd
4743  * c-basic-offset: 4
4744  * indent-tabs-mode: t
4745  * End:
4746  *
4747  * ex: set ts=8 sts=4 sw=4 noet:
4748  */