b52be7c84bfb085f79ef877be9d3823971bf99e6
[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                 /*EMPTY*/;
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           U8 *result;
2433           U8 *send;
2434           STRLEN l;
2435           UV nchar = 0;
2436           UV nwide = 0;
2437
2438           send = tmps + len;
2439           while (tmps < send) {
2440             const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2441             tmps += UTF8SKIP(tmps);
2442             targlen += UNISKIP(~c);
2443             nchar++;
2444             if (c > 0xff)
2445                 nwide++;
2446           }
2447
2448           /* Now rewind strings and write them. */
2449           tmps -= len;
2450
2451           if (nwide) {
2452               Newxz(result, targlen + 1, U8);
2453               while (tmps < send) {
2454                   const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2455                   tmps += UTF8SKIP(tmps);
2456                   result = uvchr_to_utf8_flags(result, ~c, UNICODE_ALLOW_ANY);
2457               }
2458               *result = '\0';
2459               result -= targlen;
2460               sv_setpvn(TARG, (char*)result, targlen);
2461               SvUTF8_on(TARG);
2462           }
2463           else {
2464               Newxz(result, nchar + 1, U8);
2465               while (tmps < send) {
2466                   const U8 c = (U8)utf8n_to_uvchr(tmps, 0, &l, UTF8_ALLOW_ANY);
2467                   tmps += UTF8SKIP(tmps);
2468                   *result++ = ~c;
2469               }
2470               *result = '\0';
2471               result -= nchar;
2472               sv_setpvn(TARG, (char*)result, nchar);
2473               SvUTF8_off(TARG);
2474           }
2475           Safefree(result);
2476           SETs(TARG);
2477           RETURN;
2478         }
2479 #ifdef LIBERAL
2480         {
2481             register long *tmpl;
2482             for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2483                 *tmps = ~*tmps;
2484             tmpl = (long*)tmps;
2485             for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
2486                 *tmpl = ~*tmpl;
2487             tmps = (U8*)tmpl;
2488         }
2489 #endif
2490         for ( ; anum > 0; anum--, tmps++)
2491             *tmps = ~*tmps;
2492
2493         SETs(TARG);
2494       }
2495       RETURN;
2496     }
2497 }
2498
2499 /* integer versions of some of the above */
2500
2501 PP(pp_i_multiply)
2502 {
2503     dVAR; dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
2504     {
2505       dPOPTOPiirl;
2506       SETi( left * right );
2507       RETURN;
2508     }
2509 }
2510
2511 PP(pp_i_divide)
2512 {
2513     IV num;
2514     dVAR; dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
2515     {
2516       dPOPiv;
2517       if (value == 0)
2518           DIE(aTHX_ "Illegal division by zero");
2519       num = POPi;
2520
2521       /* avoid FPE_INTOVF on some platforms when num is IV_MIN */
2522       if (value == -1)
2523           value = - num;
2524       else
2525           value = num / value;
2526       PUSHi( value );
2527       RETURN;
2528     }
2529 }
2530
2531 STATIC
2532 PP(pp_i_modulo_0)
2533 {
2534      /* This is the vanilla old i_modulo. */
2535      dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2536      {
2537           dPOPTOPiirl;
2538           if (!right)
2539                DIE(aTHX_ "Illegal modulus zero");
2540           /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2541           if (right == -1)
2542               SETi( 0 );
2543           else
2544               SETi( left % right );
2545           RETURN;
2546      }
2547 }
2548
2549 #if defined(__GLIBC__) && IVSIZE == 8
2550 STATIC
2551 PP(pp_i_modulo_1)
2552 {
2553      /* This is the i_modulo with the workaround for the _moddi3 bug
2554       * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
2555       * See below for pp_i_modulo. */
2556      dVAR; dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2557      {
2558           dPOPTOPiirl;
2559           if (!right)
2560                DIE(aTHX_ "Illegal modulus zero");
2561           /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2562           if (right == -1)
2563               SETi( 0 );
2564           else
2565               SETi( left % PERL_ABS(right) );
2566           RETURN;
2567      }
2568 }
2569 #endif
2570
2571 PP(pp_i_modulo)
2572 {
2573      dVAR; dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2574      {
2575           dPOPTOPiirl;
2576           if (!right)
2577                DIE(aTHX_ "Illegal modulus zero");
2578           /* The assumption is to use hereafter the old vanilla version... */
2579           PL_op->op_ppaddr =
2580                PL_ppaddr[OP_I_MODULO] =
2581                    Perl_pp_i_modulo_0;
2582           /* .. but if we have glibc, we might have a buggy _moddi3
2583            * (at least glicb 2.2.5 is known to have this bug), in other
2584            * words our integer modulus with negative quad as the second
2585            * argument might be broken.  Test for this and re-patch the
2586            * opcode dispatch table if that is the case, remembering to
2587            * also apply the workaround so that this first round works
2588            * right, too.  See [perl #9402] for more information. */
2589 #if defined(__GLIBC__) && IVSIZE == 8
2590           {
2591                IV l =   3;
2592                IV r = -10;
2593                /* Cannot do this check with inlined IV constants since
2594                 * that seems to work correctly even with the buggy glibc. */
2595                if (l % r == -3) {
2596                     /* Yikes, we have the bug.
2597                      * Patch in the workaround version. */
2598                     PL_op->op_ppaddr =
2599                          PL_ppaddr[OP_I_MODULO] =
2600                              &Perl_pp_i_modulo_1;
2601                     /* Make certain we work right this time, too. */
2602                     right = PERL_ABS(right);
2603                }
2604           }
2605 #endif
2606           /* avoid FPE_INTOVF on some platforms when left is IV_MIN */
2607           if (right == -1)
2608               SETi( 0 );
2609           else
2610               SETi( left % right );
2611           RETURN;
2612      }
2613 }
2614
2615 PP(pp_i_add)
2616 {
2617     dVAR; dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
2618     {
2619       dPOPTOPiirl_ul;
2620       SETi( left + right );
2621       RETURN;
2622     }
2623 }
2624
2625 PP(pp_i_subtract)
2626 {
2627     dVAR; dSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
2628     {
2629       dPOPTOPiirl_ul;
2630       SETi( left - right );
2631       RETURN;
2632     }
2633 }
2634
2635 PP(pp_i_lt)
2636 {
2637     dVAR; dSP; tryAMAGICbinSET(lt,0);
2638     {
2639       dPOPTOPiirl;
2640       SETs(boolSV(left < right));
2641       RETURN;
2642     }
2643 }
2644
2645 PP(pp_i_gt)
2646 {
2647     dVAR; dSP; tryAMAGICbinSET(gt,0);
2648     {
2649       dPOPTOPiirl;
2650       SETs(boolSV(left > right));
2651       RETURN;
2652     }
2653 }
2654
2655 PP(pp_i_le)
2656 {
2657     dVAR; dSP; tryAMAGICbinSET(le,0);
2658     {
2659       dPOPTOPiirl;
2660       SETs(boolSV(left <= right));
2661       RETURN;
2662     }
2663 }
2664
2665 PP(pp_i_ge)
2666 {
2667     dVAR; dSP; tryAMAGICbinSET(ge,0);
2668     {
2669       dPOPTOPiirl;
2670       SETs(boolSV(left >= right));
2671       RETURN;
2672     }
2673 }
2674
2675 PP(pp_i_eq)
2676 {
2677     dVAR; dSP; tryAMAGICbinSET(eq,0);
2678     {
2679       dPOPTOPiirl;
2680       SETs(boolSV(left == right));
2681       RETURN;
2682     }
2683 }
2684
2685 PP(pp_i_ne)
2686 {
2687     dVAR; dSP; tryAMAGICbinSET(ne,0);
2688     {
2689       dPOPTOPiirl;
2690       SETs(boolSV(left != right));
2691       RETURN;
2692     }
2693 }
2694
2695 PP(pp_i_ncmp)
2696 {
2697     dVAR; dSP; dTARGET; tryAMAGICbin(ncmp,0);
2698     {
2699       dPOPTOPiirl;
2700       I32 value;
2701
2702       if (left > right)
2703         value = 1;
2704       else if (left < right)
2705         value = -1;
2706       else
2707         value = 0;
2708       SETi(value);
2709       RETURN;
2710     }
2711 }
2712
2713 PP(pp_i_negate)
2714 {
2715     dVAR; dSP; dTARGET; tryAMAGICun(neg);
2716     SETi(-TOPi);
2717     RETURN;
2718 }
2719
2720 /* High falutin' math. */
2721
2722 PP(pp_atan2)
2723 {
2724     dVAR; dSP; dTARGET; tryAMAGICbin(atan2,0);
2725     {
2726       dPOPTOPnnrl;
2727       SETn(Perl_atan2(left, right));
2728       RETURN;
2729     }
2730 }
2731
2732 PP(pp_sin)
2733 {
2734     dVAR; dSP; dTARGET;
2735     int amg_type = sin_amg;
2736     const char *neg_report = NULL;
2737     NV (*func)(NV) = Perl_sin;
2738     const int op_type = PL_op->op_type;
2739
2740     switch (op_type) {
2741     case OP_COS:
2742         amg_type = cos_amg;
2743         func = Perl_cos;
2744         break;
2745     case OP_EXP:
2746         amg_type = exp_amg;
2747         func = Perl_exp;
2748         break;
2749     case OP_LOG:
2750         amg_type = log_amg;
2751         func = Perl_log;
2752         neg_report = "log";
2753         break;
2754     case OP_SQRT:
2755         amg_type = sqrt_amg;
2756         func = Perl_sqrt;
2757         neg_report = "sqrt";
2758         break;
2759     }
2760
2761     tryAMAGICun_var(amg_type);
2762     {
2763       const NV value = POPn;
2764       if (neg_report) {
2765           if (op_type == OP_LOG ? (value <= 0.0) : (value < 0.0)) {
2766               SET_NUMERIC_STANDARD();
2767               DIE(aTHX_ "Can't take %s of %"NVgf, neg_report, value);
2768           }
2769       }
2770       XPUSHn(func(value));
2771       RETURN;
2772     }
2773 }
2774
2775 /* Support Configure command-line overrides for rand() functions.
2776    After 5.005, perhaps we should replace this by Configure support
2777    for drand48(), random(), or rand().  For 5.005, though, maintain
2778    compatibility by calling rand() but allow the user to override it.
2779    See INSTALL for details.  --Andy Dougherty  15 July 1998
2780 */
2781 /* Now it's after 5.005, and Configure supports drand48() and random(),
2782    in addition to rand().  So the overrides should not be needed any more.
2783    --Jarkko Hietaniemi  27 September 1998
2784  */
2785
2786 #ifndef HAS_DRAND48_PROTO
2787 extern double drand48 (void);
2788 #endif
2789
2790 PP(pp_rand)
2791 {
2792     dVAR; dSP; dTARGET;
2793     NV value;
2794     if (MAXARG < 1)
2795         value = 1.0;
2796     else
2797         value = POPn;
2798     if (value == 0.0)
2799         value = 1.0;
2800     if (!PL_srand_called) {
2801         (void)seedDrand01((Rand_seed_t)seed());
2802         PL_srand_called = TRUE;
2803     }
2804     value *= Drand01();
2805     XPUSHn(value);
2806     RETURN;
2807 }
2808
2809 PP(pp_srand)
2810 {
2811     dVAR; dSP;
2812     const UV anum = (MAXARG < 1) ? seed() : POPu;
2813     (void)seedDrand01((Rand_seed_t)anum);
2814     PL_srand_called = TRUE;
2815     EXTEND(SP, 1);
2816     RETPUSHYES;
2817 }
2818
2819 PP(pp_int)
2820 {
2821     dVAR; dSP; dTARGET; tryAMAGICun(int);
2822     {
2823       const IV iv = TOPi; /* attempt to convert to IV if possible. */
2824       /* XXX it's arguable that compiler casting to IV might be subtly
2825          different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2826          else preferring IV has introduced a subtle behaviour change bug. OTOH
2827          relying on floating point to be accurate is a bug.  */
2828
2829       if (!SvOK(TOPs))
2830         SETu(0);
2831       else if (SvIOK(TOPs)) {
2832         if (SvIsUV(TOPs)) {
2833             const UV uv = TOPu;
2834             SETu(uv);
2835         } else
2836             SETi(iv);
2837       } else {
2838           const NV value = TOPn;
2839           if (value >= 0.0) {
2840               if (value < (NV)UV_MAX + 0.5) {
2841                   SETu(U_V(value));
2842               } else {
2843                   SETn(Perl_floor(value));
2844               }
2845           }
2846           else {
2847               if (value > (NV)IV_MIN - 0.5) {
2848                   SETi(I_V(value));
2849               } else {
2850                   SETn(Perl_ceil(value));
2851               }
2852           }
2853       }
2854     }
2855     RETURN;
2856 }
2857
2858 PP(pp_abs)
2859 {
2860     dVAR; dSP; dTARGET; tryAMAGICun(abs);
2861     {
2862       /* This will cache the NV value if string isn't actually integer  */
2863       const IV iv = TOPi;
2864
2865       if (!SvOK(TOPs))
2866         SETu(0);
2867       else if (SvIOK(TOPs)) {
2868         /* IVX is precise  */
2869         if (SvIsUV(TOPs)) {
2870           SETu(TOPu);   /* force it to be numeric only */
2871         } else {
2872           if (iv >= 0) {
2873             SETi(iv);
2874           } else {
2875             if (iv != IV_MIN) {
2876               SETi(-iv);
2877             } else {
2878               /* 2s complement assumption. Also, not really needed as
2879                  IV_MIN and -IV_MIN should both be %100...00 and NV-able  */
2880               SETu(IV_MIN);
2881             }
2882           }
2883         }
2884       } else{
2885         const NV value = TOPn;
2886         if (value < 0.0)
2887           SETn(-value);
2888         else
2889           SETn(value);
2890       }
2891     }
2892     RETURN;
2893 }
2894
2895 PP(pp_oct)
2896 {
2897     dVAR; dSP; dTARGET;
2898     const char *tmps;
2899     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2900     STRLEN len;
2901     NV result_nv;
2902     UV result_uv;
2903     SV* const sv = POPs;
2904
2905     tmps = (SvPV_const(sv, len));
2906     if (DO_UTF8(sv)) {
2907          /* If Unicode, try to downgrade
2908           * If not possible, croak. */
2909          SV* const tsv = sv_2mortal(newSVsv(sv));
2910         
2911          SvUTF8_on(tsv);
2912          sv_utf8_downgrade(tsv, FALSE);
2913          tmps = SvPV_const(tsv, len);
2914     }
2915     if (PL_op->op_type == OP_HEX)
2916         goto hex;
2917
2918     while (*tmps && len && isSPACE(*tmps))
2919         tmps++, len--;
2920     if (*tmps == '0')
2921         tmps++, len--;
2922     if (*tmps == 'x') {
2923     hex:
2924         result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2925     }
2926     else if (*tmps == 'b')
2927         result_uv = grok_bin (tmps, &len, &flags, &result_nv);
2928     else
2929         result_uv = grok_oct (tmps, &len, &flags, &result_nv);
2930
2931     if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
2932         XPUSHn(result_nv);
2933     }
2934     else {
2935         XPUSHu(result_uv);
2936     }
2937     RETURN;
2938 }
2939
2940 /* String stuff. */
2941
2942 PP(pp_length)
2943 {
2944     dVAR; dSP; dTARGET;
2945     SV * const sv = TOPs;
2946
2947     if (DO_UTF8(sv))
2948         SETi(sv_len_utf8(sv));
2949     else
2950         SETi(sv_len(sv));
2951     RETURN;
2952 }
2953
2954 PP(pp_substr)
2955 {
2956     dVAR; dSP; dTARGET;
2957     SV *sv;
2958     I32 len = 0;
2959     STRLEN curlen;
2960     STRLEN utf8_curlen;
2961     I32 pos;
2962     I32 rem;
2963     I32 fail;
2964     const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
2965     const char *tmps;
2966     const I32 arybase = CopARYBASE_get(PL_curcop);
2967     SV *repl_sv = NULL;
2968     const char *repl = NULL;
2969     STRLEN repl_len;
2970     const int num_args = PL_op->op_private & 7;
2971     bool repl_need_utf8_upgrade = FALSE;
2972     bool repl_is_utf8 = FALSE;
2973
2974     SvTAINTED_off(TARG);                        /* decontaminate */
2975     SvUTF8_off(TARG);                           /* decontaminate */
2976     if (num_args > 2) {
2977         if (num_args > 3) {
2978             repl_sv = POPs;
2979             repl = SvPV_const(repl_sv, repl_len);
2980             repl_is_utf8 = DO_UTF8(repl_sv) && SvCUR(repl_sv);
2981         }
2982         len = POPi;
2983     }
2984     pos = POPi;
2985     sv = POPs;
2986     PUTBACK;
2987     if (repl_sv) {
2988         if (repl_is_utf8) {
2989             if (!DO_UTF8(sv))
2990                 sv_utf8_upgrade(sv);
2991         }
2992         else if (DO_UTF8(sv))
2993             repl_need_utf8_upgrade = TRUE;
2994     }
2995     tmps = SvPV_const(sv, curlen);
2996     if (DO_UTF8(sv)) {
2997         utf8_curlen = sv_len_utf8(sv);
2998         if (utf8_curlen == curlen)
2999             utf8_curlen = 0;
3000         else
3001             curlen = utf8_curlen;
3002     }
3003     else
3004         utf8_curlen = 0;
3005
3006     if (pos >= arybase) {
3007         pos -= arybase;
3008         rem = curlen-pos;
3009         fail = rem;
3010         if (num_args > 2) {
3011             if (len < 0) {
3012                 rem += len;
3013                 if (rem < 0)
3014                     rem = 0;
3015             }
3016             else if (rem > len)
3017                      rem = len;
3018         }
3019     }
3020     else {
3021         pos += curlen;
3022         if (num_args < 3)
3023             rem = curlen;
3024         else if (len >= 0) {
3025             rem = pos+len;
3026             if (rem > (I32)curlen)
3027                 rem = curlen;
3028         }
3029         else {
3030             rem = curlen+len;
3031             if (rem < pos)
3032                 rem = pos;
3033         }
3034         if (pos < 0)
3035             pos = 0;
3036         fail = rem;
3037         rem -= pos;
3038     }
3039     if (fail < 0) {
3040         if (lvalue || repl)
3041             Perl_croak(aTHX_ "substr outside of string");
3042         if (ckWARN(WARN_SUBSTR))
3043             Perl_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3044         RETPUSHUNDEF;
3045     }
3046     else {
3047         const I32 upos = pos;
3048         const I32 urem = rem;
3049         if (utf8_curlen)
3050             sv_pos_u2b(sv, &pos, &rem);
3051         tmps += pos;
3052         /* we either return a PV or an LV. If the TARG hasn't been used
3053          * before, or is of that type, reuse it; otherwise use a mortal
3054          * instead. Note that LVs can have an extended lifetime, so also
3055          * dont reuse if refcount > 1 (bug #20933) */
3056         if (SvTYPE(TARG) > SVt_NULL) {
3057             if ( (SvTYPE(TARG) == SVt_PVLV)
3058                     ? (!lvalue || SvREFCNT(TARG) > 1)
3059                     : lvalue)
3060             {
3061                 TARG = sv_newmortal();
3062             }
3063         }
3064
3065         sv_setpvn(TARG, tmps, rem);
3066 #ifdef USE_LOCALE_COLLATE
3067         sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3068 #endif
3069         if (utf8_curlen)
3070             SvUTF8_on(TARG);
3071         if (repl) {
3072             SV* repl_sv_copy = NULL;
3073
3074             if (repl_need_utf8_upgrade) {
3075                 repl_sv_copy = newSVsv(repl_sv);
3076                 sv_utf8_upgrade(repl_sv_copy);
3077                 repl = SvPV_const(repl_sv_copy, repl_len);
3078                 repl_is_utf8 = DO_UTF8(repl_sv_copy) && SvCUR(sv);
3079             }
3080             sv_insert(sv, pos, rem, repl, repl_len);
3081             if (repl_is_utf8)
3082                 SvUTF8_on(sv);
3083             if (repl_sv_copy)
3084                 SvREFCNT_dec(repl_sv_copy);
3085         }
3086         else if (lvalue) {              /* it's an lvalue! */
3087             if (!SvGMAGICAL(sv)) {
3088                 if (SvROK(sv)) {
3089                     SvPV_force_nolen(sv);
3090                     if (ckWARN(WARN_SUBSTR))
3091                         Perl_warner(aTHX_ packWARN(WARN_SUBSTR),
3092                                 "Attempt to use reference as lvalue in substr");
3093                 }
3094                 if (isGV_with_GP(sv))
3095                     SvPV_force_nolen(sv);
3096                 else if (SvOK(sv))      /* is it defined ? */
3097                     (void)SvPOK_only_UTF8(sv);
3098                 else
3099                     sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
3100             }
3101
3102             if (SvTYPE(TARG) < SVt_PVLV) {
3103                 sv_upgrade(TARG, SVt_PVLV);
3104                 sv_magic(TARG, NULL, PERL_MAGIC_substr, NULL, 0);
3105             }
3106             else
3107                 SvOK_off(TARG);
3108
3109             LvTYPE(TARG) = 'x';
3110             if (LvTARG(TARG) != sv) {
3111                 if (LvTARG(TARG))
3112                     SvREFCNT_dec(LvTARG(TARG));
3113                 LvTARG(TARG) = SvREFCNT_inc_simple(sv);
3114             }
3115             LvTARGOFF(TARG) = upos;
3116             LvTARGLEN(TARG) = urem;
3117         }
3118     }
3119     SPAGAIN;
3120     PUSHs(TARG);                /* avoid SvSETMAGIC here */
3121     RETURN;
3122 }
3123
3124 PP(pp_vec)
3125 {
3126     dVAR; dSP; dTARGET;
3127     register const IV size   = POPi;
3128     register const IV offset = POPi;
3129     register SV * const src = POPs;
3130     const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3131
3132     SvTAINTED_off(TARG);                /* decontaminate */
3133     if (lvalue) {                       /* it's an lvalue! */
3134         if (SvREFCNT(TARG) > 1) /* don't share the TARG (#20933) */
3135             TARG = sv_newmortal();
3136         if (SvTYPE(TARG) < SVt_PVLV) {
3137             sv_upgrade(TARG, SVt_PVLV);
3138             sv_magic(TARG, NULL, PERL_MAGIC_vec, NULL, 0);
3139         }
3140         LvTYPE(TARG) = 'v';
3141         if (LvTARG(TARG) != src) {
3142             if (LvTARG(TARG))
3143                 SvREFCNT_dec(LvTARG(TARG));
3144             LvTARG(TARG) = SvREFCNT_inc_simple(src);
3145         }
3146         LvTARGOFF(TARG) = offset;
3147         LvTARGLEN(TARG) = size;
3148     }
3149
3150     sv_setuv(TARG, do_vecget(src, offset, size));
3151     PUSHs(TARG);
3152     RETURN;
3153 }
3154
3155 PP(pp_index)
3156 {
3157     dVAR; dSP; dTARGET;
3158     SV *big;
3159     SV *little;
3160     SV *temp = NULL;
3161     STRLEN biglen;
3162     STRLEN llen = 0;
3163     I32 offset;
3164     I32 retval;
3165     const char *tmps;
3166     const char *tmps2;
3167     const I32 arybase = CopARYBASE_get(PL_curcop);
3168     bool big_utf8;
3169     bool little_utf8;
3170     const bool is_index = PL_op->op_type == OP_INDEX;
3171
3172     if (MAXARG >= 3) {
3173         /* arybase is in characters, like offset, so combine prior to the
3174            UTF-8 to bytes calculation.  */
3175         offset = POPi - arybase;
3176     }
3177     little = POPs;
3178     big = POPs;
3179     big_utf8 = DO_UTF8(big);
3180     little_utf8 = DO_UTF8(little);
3181     if (big_utf8 ^ little_utf8) {
3182         /* One needs to be upgraded.  */
3183         if (little_utf8 && !PL_encoding) {
3184             /* Well, maybe instead we might be able to downgrade the small
3185                string?  */
3186             STRLEN little_len;
3187             const U8 * const little_pv = (U8*) SvPV_const(little, little_len);
3188             char * const pv = (char*)bytes_from_utf8(little_pv, &little_len,
3189                                                      &little_utf8);
3190             if (little_utf8) {
3191                 /* If the large string is ISO-8859-1, and it's not possible to
3192                    convert the small string to ISO-8859-1, then there is no
3193                    way that it could be found anywhere by index.  */
3194                 retval = -1;
3195                 goto fail;
3196             }
3197
3198             /* At this point, pv is a malloc()ed string. So donate it to temp
3199                to ensure it will get free()d  */
3200             little = temp = newSV(0);
3201             sv_usepvn(temp, pv, little_len);
3202         } else {
3203             SV * const bytes = little_utf8 ? big : little;
3204             STRLEN len;
3205             const char * const p = SvPV_const(bytes, len);
3206
3207             temp = newSVpvn(p, len);
3208
3209             if (PL_encoding) {
3210                 sv_recode_to_utf8(temp, PL_encoding);
3211             } else {
3212                 sv_utf8_upgrade(temp);
3213             }
3214             if (little_utf8) {
3215                 big = temp;
3216                 big_utf8 = TRUE;
3217             } else {
3218                 little = temp;
3219             }
3220         }
3221     }
3222     /* Don't actually need the NULL initialisation, but it keeps gcc quiet.  */
3223     tmps2 = is_index ? NULL : SvPV_const(little, llen);
3224     tmps = SvPV_const(big, biglen);
3225
3226     if (MAXARG < 3)
3227         offset = is_index ? 0 : biglen;
3228     else {
3229         if (big_utf8 && offset > 0)
3230             sv_pos_u2b(big, &offset, 0);
3231         offset += llen;
3232     }
3233     if (offset < 0)
3234         offset = 0;
3235     else if (offset > (I32)biglen)
3236         offset = biglen;
3237     if (!(tmps2 = is_index
3238           ? fbm_instr((unsigned char*)tmps + offset,
3239                       (unsigned char*)tmps + biglen, little, 0)
3240           : rninstr(tmps,  tmps  + offset,
3241                     tmps2, tmps2 + llen)))
3242         retval = -1;
3243     else {
3244         retval = tmps2 - tmps;
3245         if (retval > 0 && big_utf8)
3246             sv_pos_b2u(big, &retval);
3247     }
3248     if (temp)
3249         SvREFCNT_dec(temp);
3250  fail:
3251     PUSHi(retval + arybase);
3252     RETURN;
3253 }
3254
3255 PP(pp_sprintf)
3256 {
3257     dVAR; dSP; dMARK; dORIGMARK; dTARGET;
3258     do_sprintf(TARG, SP-MARK, MARK+1);
3259     TAINT_IF(SvTAINTED(TARG));
3260     SP = ORIGMARK;
3261     PUSHTARG;
3262     RETURN;
3263 }
3264
3265 PP(pp_ord)
3266 {
3267     dVAR; dSP; dTARGET;
3268     SV *argsv = POPs;
3269     STRLEN len;
3270     const U8 *s = (U8*)SvPV_const(argsv, len);
3271     SV *tmpsv;
3272
3273     if (PL_encoding && SvPOK(argsv) && !DO_UTF8(argsv)) {
3274         tmpsv = sv_2mortal(newSVsv(argsv));
3275         s = (U8*)sv_recode_to_utf8(tmpsv, PL_encoding);
3276         argsv = tmpsv;
3277     }
3278
3279     XPUSHu(DO_UTF8(argsv) ?
3280            utf8n_to_uvchr(s, UTF8_MAXBYTES, 0, UTF8_ALLOW_ANYUV) :
3281            (*s & 0xff));
3282
3283     RETURN;
3284 }
3285
3286 PP(pp_chr)
3287 {
3288     dVAR; dSP; dTARGET;
3289     char *tmps;
3290     UV value;
3291
3292     if (((SvIOK_notUV(TOPs) && SvIV(TOPs) < 0)
3293          ||
3294          (SvNOK(TOPs) && SvNV(TOPs) < 0.0))) {
3295         if (IN_BYTES) {
3296             value = POPu; /* chr(-1) eq chr(0xff), etc. */
3297         } else {
3298             (void) POPs; /* Ignore the argument value. */
3299             value = UNICODE_REPLACEMENT;
3300         }
3301     } else {
3302         value = POPu;
3303     }
3304
3305     SvUPGRADE(TARG,SVt_PV);
3306
3307     if (value > 255 && !IN_BYTES) {
3308         SvGROW(TARG, (STRLEN)UNISKIP(value)+1);
3309         tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3310         SvCUR_set(TARG, tmps - SvPVX_const(TARG));
3311         *tmps = '\0';
3312         (void)SvPOK_only(TARG);
3313         SvUTF8_on(TARG);
3314         XPUSHs(TARG);
3315         RETURN;
3316     }
3317
3318     SvGROW(TARG,2);
3319     SvCUR_set(TARG, 1);
3320     tmps = SvPVX(TARG);
3321     *tmps++ = (char)value;
3322     *tmps = '\0';
3323     (void)SvPOK_only(TARG);
3324     if (PL_encoding && !IN_BYTES) {
3325         sv_recode_to_utf8(TARG, PL_encoding);
3326         tmps = SvPVX(TARG);
3327         if (SvCUR(TARG) == 0 || !is_utf8_string((U8*)tmps, SvCUR(TARG)) ||
3328             memEQ(tmps, "\xef\xbf\xbd\0", 4)) {
3329             SvGROW(TARG, 3);
3330             tmps = SvPVX(TARG);
3331             SvCUR_set(TARG, 2);
3332             *tmps++ = (U8)UTF8_EIGHT_BIT_HI(value);
3333             *tmps++ = (U8)UTF8_EIGHT_BIT_LO(value);
3334             *tmps = '\0';
3335             SvUTF8_on(TARG);
3336         }
3337     }
3338     XPUSHs(TARG);
3339     RETURN;
3340 }
3341
3342 PP(pp_crypt)
3343 {
3344 #ifdef HAS_CRYPT
3345     dVAR; dSP; dTARGET;
3346     dPOPTOPssrl;
3347     STRLEN len;
3348     const char *tmps = SvPV_const(left, len);
3349
3350     if (DO_UTF8(left)) {
3351          /* If Unicode, try to downgrade.
3352           * If not possible, croak.
3353           * Yes, we made this up.  */
3354          SV* const tsv = sv_2mortal(newSVsv(left));
3355
3356          SvUTF8_on(tsv);
3357          sv_utf8_downgrade(tsv, FALSE);
3358          tmps = SvPV_const(tsv, len);
3359     }
3360 #   ifdef USE_ITHREADS
3361 #     ifdef HAS_CRYPT_R
3362     if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3363       /* This should be threadsafe because in ithreads there is only
3364        * one thread per interpreter.  If this would not be true,
3365        * we would need a mutex to protect this malloc. */
3366         PL_reentrant_buffer->_crypt_struct_buffer =
3367           (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3368 #if defined(__GLIBC__) || defined(__EMX__)
3369         if (PL_reentrant_buffer->_crypt_struct_buffer) {
3370             PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3371             /* work around glibc-2.2.5 bug */
3372             PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3373         }
3374 #endif
3375     }
3376 #     endif /* HAS_CRYPT_R */
3377 #   endif /* USE_ITHREADS */
3378 #   ifdef FCRYPT
3379     sv_setpv(TARG, fcrypt(tmps, SvPV_nolen_const(right)));
3380 #   else
3381     sv_setpv(TARG, PerlProc_crypt(tmps, SvPV_nolen_const(right)));
3382 #   endif
3383     SETs(TARG);
3384     RETURN;
3385 #else
3386     DIE(aTHX_
3387       "The crypt() function is unimplemented due to excessive paranoia.");
3388 #endif
3389 }
3390
3391 PP(pp_ucfirst)
3392 {
3393     dVAR;
3394     dSP;
3395     SV *sv = TOPs;
3396     const U8 *s;
3397     STRLEN slen;
3398     const int op_type = PL_op->op_type;
3399
3400     SvGETMAGIC(sv);
3401     if (DO_UTF8(sv) &&
3402         (s = (const U8*)SvPV_nomg_const(sv, slen)) && slen &&
3403         UTF8_IS_START(*s)) {
3404         U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3405         STRLEN ulen;
3406         STRLEN tculen;
3407
3408         utf8_to_uvchr(s, &ulen);
3409         if (op_type == OP_UCFIRST) {
3410             toTITLE_utf8(s, tmpbuf, &tculen);
3411         } else {
3412             toLOWER_utf8(s, tmpbuf, &tculen);
3413         }
3414
3415         if (!SvPADTMP(sv) || SvREADONLY(sv) || ulen != tculen) {
3416             dTARGET;
3417             /* slen is the byte length of the whole SV.
3418              * ulen is the byte length of the original Unicode character
3419              * stored as UTF-8 at s.
3420              * tculen is the byte length of the freshly titlecased (or
3421              * lowercased) Unicode character stored as UTF-8 at tmpbuf.
3422              * We first set the result to be the titlecased (/lowercased)
3423              * character, and then append the rest of the SV data. */
3424             sv_setpvn(TARG, (char*)tmpbuf, tculen);
3425             if (slen > ulen)
3426                 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3427             SvUTF8_on(TARG);
3428             sv = TARG;
3429             SETs(sv);
3430         }
3431         else {
3432             s = (U8*)SvPV_force_nomg(sv, slen);
3433             Copy(tmpbuf, s, tculen, U8);
3434         }
3435     }
3436     else {
3437         U8 *s1;
3438         if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3439             dTARGET;
3440             SvUTF8_off(TARG);                           /* decontaminate */
3441             sv_setsv_nomg(TARG, sv);
3442             sv = TARG;
3443             SETs(sv);
3444         }
3445         s1 = (U8*)SvPV_force_nomg(sv, slen);
3446         if (*s1) {
3447             if (IN_LOCALE_RUNTIME) {
3448                 TAINT;
3449                 SvTAINTED_on(sv);
3450                 *s1 = (op_type == OP_UCFIRST)
3451                     ? toUPPER_LC(*s1) : toLOWER_LC(*s1);
3452             }
3453             else
3454                 *s1 = (op_type == OP_UCFIRST) ? toUPPER(*s1) : toLOWER(*s1);
3455         }
3456     }
3457     SvSETMAGIC(sv);
3458     RETURN;
3459 }
3460
3461 PP(pp_uc)
3462 {
3463     dVAR;
3464     dSP;
3465     SV *sv = TOPs;
3466     STRLEN len;
3467
3468     SvGETMAGIC(sv);
3469     if (DO_UTF8(sv)) {
3470         dTARGET;
3471         STRLEN ulen;
3472         register U8 *d;
3473         const U8 *s;
3474         const U8 *send;
3475         U8 tmpbuf[UTF8_MAXBYTES+1];
3476
3477         s = (const U8*)SvPV_nomg_const(sv,len);
3478         if (!len) {
3479             SvUTF8_off(TARG);                           /* decontaminate */
3480             sv_setpvn(TARG, "", 0);
3481             sv = TARG;
3482             SETs(sv);
3483         }
3484         else {
3485             STRLEN min = len + 1;
3486
3487             SvUPGRADE(TARG, SVt_PV);
3488             SvGROW(TARG, min);
3489             (void)SvPOK_only(TARG);
3490             d = (U8*)SvPVX(TARG);
3491             send = s + len;
3492             while (s < send) {
3493                 STRLEN u = UTF8SKIP(s);
3494
3495                 toUPPER_utf8(s, tmpbuf, &ulen);
3496                 if (ulen > u && (SvLEN(TARG) < (min += ulen - u))) {
3497                     /* If the eventually required minimum size outgrows
3498                      * the available space, we need to grow. */
3499                     const UV o = d - (U8*)SvPVX_const(TARG);
3500
3501                     /* If someone uppercases one million U+03B0s we
3502                      * SvGROW() one million times.  Or we could try
3503                      * guessing how much to allocate without allocating
3504                      * too much. Such is life. */
3505                     SvGROW(TARG, min);
3506                     d = (U8*)SvPVX(TARG) + o;
3507                 }
3508                 Copy(tmpbuf, d, ulen, U8);
3509                 d += ulen;
3510                 s += u;
3511             }
3512             *d = '\0';
3513             SvUTF8_on(TARG);
3514             SvCUR_set(TARG, d - (U8*)SvPVX_const(TARG));
3515             sv = TARG;
3516             SETs(sv);
3517         }
3518     }
3519     else {
3520         U8 *s;
3521         if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3522             dTARGET;
3523             SvUTF8_off(TARG);                           /* decontaminate */
3524             sv_setsv_nomg(TARG, sv);
3525             sv = TARG;
3526             SETs(sv);
3527         }
3528         s = (U8*)SvPV_force_nomg(sv, len);
3529         if (len) {
3530             register const U8 *send = s + len;
3531
3532             if (IN_LOCALE_RUNTIME) {
3533                 TAINT;
3534                 SvTAINTED_on(sv);
3535                 for (; s < send; s++)
3536                     *s = toUPPER_LC(*s);
3537             }
3538             else {
3539                 for (; s < send; s++)
3540                     *s = toUPPER(*s);
3541             }
3542         }
3543     }
3544     SvSETMAGIC(sv);
3545     RETURN;
3546 }
3547
3548 PP(pp_lc)
3549 {
3550     dVAR;
3551     dSP;
3552     SV *sv = TOPs;
3553     STRLEN len;
3554
3555     SvGETMAGIC(sv);
3556     if (DO_UTF8(sv)) {
3557         dTARGET;
3558         const U8 *s;
3559         STRLEN ulen;
3560         register U8 *d;
3561         const U8 *send;
3562         U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
3563
3564         s = (const U8*)SvPV_nomg_const(sv,len);
3565         if (!len) {
3566             SvUTF8_off(TARG);                           /* decontaminate */
3567             sv_setpvn(TARG, "", 0);
3568             sv = TARG;
3569             SETs(sv);
3570         }
3571         else {
3572             STRLEN min = len + 1;
3573
3574             SvUPGRADE(TARG, SVt_PV);
3575             SvGROW(TARG, min);
3576             (void)SvPOK_only(TARG);
3577             d = (U8*)SvPVX(TARG);
3578             send = s + len;
3579             while (s < send) {
3580                 const STRLEN u = UTF8SKIP(s);
3581                 const UV uv = toLOWER_utf8(s, tmpbuf, &ulen);
3582
3583 #define GREEK_CAPITAL_LETTER_SIGMA 0x03A3 /* Unicode U+03A3 */
3584                 if (uv == GREEK_CAPITAL_LETTER_SIGMA) {
3585                     /*EMPTY*/
3586                      /*
3587                       * Now if the sigma is NOT followed by
3588                       * /$ignorable_sequence$cased_letter/;
3589                       * and it IS preceded by
3590                       * /$cased_letter$ignorable_sequence/;
3591                       * where $ignorable_sequence is
3592                       * [\x{2010}\x{AD}\p{Mn}]*
3593                       * and $cased_letter is
3594                       * [\p{Ll}\p{Lo}\p{Lt}]
3595                       * then it should be mapped to 0x03C2,
3596                       * (GREEK SMALL LETTER FINAL SIGMA),
3597                       * instead of staying 0x03A3.
3598                       * "should be": in other words,
3599                       * this is not implemented yet.
3600                       * See lib/unicore/SpecialCasing.txt.
3601                       */
3602                 }
3603                 if (ulen > u && (SvLEN(TARG) < (min += ulen - u))) {
3604                     /* If the eventually required minimum size outgrows
3605                      * the available space, we need to grow. */
3606                     const UV o = d - (U8*)SvPVX_const(TARG);
3607
3608                     /* If someone lowercases one million U+0130s we
3609                      * SvGROW() one million times.  Or we could try
3610                      * guessing how much to allocate without allocating.
3611                      * too much.  Such is life. */
3612                     SvGROW(TARG, min);
3613                     d = (U8*)SvPVX(TARG) + o;
3614                 }
3615                 Copy(tmpbuf, d, ulen, U8);
3616                 d += ulen;
3617                 s += u;
3618             }
3619             *d = '\0';
3620             SvUTF8_on(TARG);
3621             SvCUR_set(TARG, d - (U8*)SvPVX_const(TARG));
3622             sv = TARG;
3623             SETs(sv);
3624         }
3625     }
3626     else {
3627         U8 *s;
3628         if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3629             dTARGET;
3630             SvUTF8_off(TARG);                           /* decontaminate */
3631             sv_setsv_nomg(TARG, sv);
3632             sv = TARG;
3633             SETs(sv);
3634         }
3635
3636         s = (U8*)SvPV_force_nomg(sv, len);
3637         if (len) {
3638             register const U8 * const send = s + len;
3639
3640             if (IN_LOCALE_RUNTIME) {
3641                 TAINT;
3642                 SvTAINTED_on(sv);
3643                 for (; s < send; s++)
3644                     *s = toLOWER_LC(*s);
3645             }
3646             else {
3647                 for (; s < send; s++)
3648                     *s = toLOWER(*s);
3649             }
3650         }
3651     }
3652     SvSETMAGIC(sv);
3653     RETURN;
3654 }
3655
3656 PP(pp_quotemeta)
3657 {
3658     dVAR; dSP; dTARGET;
3659     SV * const sv = TOPs;
3660     STRLEN len;
3661     register const char *s = SvPV_const(sv,len);
3662
3663     SvUTF8_off(TARG);                           /* decontaminate */
3664     if (len) {
3665         register char *d;
3666         SvUPGRADE(TARG, SVt_PV);
3667         SvGROW(TARG, (len * 2) + 1);
3668         d = SvPVX(TARG);
3669         if (DO_UTF8(sv)) {
3670             while (len) {
3671                 if (UTF8_IS_CONTINUED(*s)) {
3672                     STRLEN ulen = UTF8SKIP(s);
3673                     if (ulen > len)
3674                         ulen = len;
3675                     len -= ulen;
3676                     while (ulen--)
3677                         *d++ = *s++;
3678                 }
3679                 else {
3680                     if (!isALNUM(*s))
3681                         *d++ = '\\';
3682                     *d++ = *s++;
3683                     len--;
3684                 }
3685             }
3686             SvUTF8_on(TARG);
3687         }
3688         else {
3689             while (len--) {
3690                 if (!isALNUM(*s))
3691                     *d++ = '\\';
3692                 *d++ = *s++;
3693             }
3694         }
3695         *d = '\0';
3696         SvCUR_set(TARG, d - SvPVX_const(TARG));
3697         (void)SvPOK_only_UTF8(TARG);
3698     }
3699     else
3700         sv_setpvn(TARG, s, len);
3701     SETs(TARG);
3702     if (SvSMAGICAL(TARG))
3703         mg_set(TARG);
3704     RETURN;
3705 }
3706
3707 /* Arrays. */
3708
3709 PP(pp_aslice)
3710 {
3711     dVAR; dSP; dMARK; dORIGMARK;
3712     register AV* const av = (AV*)POPs;
3713     register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3714
3715     if (SvTYPE(av) == SVt_PVAV) {
3716         const I32 arybase = CopARYBASE_get(PL_curcop);
3717         if (lval && PL_op->op_private & OPpLVAL_INTRO) {
3718             register SV **svp;
3719             I32 max = -1;
3720             for (svp = MARK + 1; svp <= SP; svp++) {
3721                 const I32 elem = SvIVx(*svp);
3722                 if (elem > max)
3723                     max = elem;
3724             }
3725             if (max > AvMAX(av))
3726                 av_extend(av, max);
3727         }
3728         while (++MARK <= SP) {
3729             register SV **svp;
3730             I32 elem = SvIVx(*MARK);
3731
3732             if (elem > 0)
3733                 elem -= arybase;
3734             svp = av_fetch(av, elem, lval);
3735             if (lval) {
3736                 if (!svp || *svp == &PL_sv_undef)
3737                     DIE(aTHX_ PL_no_aelem, elem);
3738                 if (PL_op->op_private & OPpLVAL_INTRO)
3739                     save_aelem(av, elem, svp);
3740             }
3741             *MARK = svp ? *svp : &PL_sv_undef;
3742         }
3743     }
3744     if (GIMME != G_ARRAY) {
3745         MARK = ORIGMARK;
3746         *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
3747         SP = MARK;
3748     }
3749     RETURN;
3750 }
3751
3752 /* Associative arrays. */
3753
3754 PP(pp_each)
3755 {
3756     dVAR;
3757     dSP;
3758     HV * const hash = (HV*)POPs;
3759     HE *entry;
3760     const I32 gimme = GIMME_V;
3761
3762     PUTBACK;
3763     /* might clobber stack_sp */
3764     entry = hv_iternext(hash);
3765     SPAGAIN;
3766
3767     EXTEND(SP, 2);
3768     if (entry) {
3769         SV* const sv = hv_iterkeysv(entry);
3770         PUSHs(sv);      /* won't clobber stack_sp */
3771         if (gimme == G_ARRAY) {
3772             SV *val;
3773             PUTBACK;
3774             /* might clobber stack_sp */
3775             val = hv_iterval(hash, entry);
3776             SPAGAIN;
3777             PUSHs(val);
3778         }
3779     }
3780     else if (gimme == G_SCALAR)
3781         RETPUSHUNDEF;
3782
3783     RETURN;
3784 }
3785
3786 PP(pp_delete)
3787 {
3788     dVAR;
3789     dSP;
3790     const I32 gimme = GIMME_V;
3791     const I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
3792
3793     if (PL_op->op_private & OPpSLICE) {
3794         dMARK; dORIGMARK;
3795         HV * const hv = (HV*)POPs;
3796         const U32 hvtype = SvTYPE(hv);
3797         if (hvtype == SVt_PVHV) {                       /* hash element */
3798             while (++MARK <= SP) {
3799                 SV * const sv = hv_delete_ent(hv, *MARK, discard, 0);
3800                 *MARK = sv ? sv : &PL_sv_undef;
3801             }
3802         }
3803         else if (hvtype == SVt_PVAV) {                  /* array element */
3804             if (PL_op->op_flags & OPf_SPECIAL) {
3805                 while (++MARK <= SP) {
3806                     SV * const sv = av_delete((AV*)hv, SvIV(*MARK), discard);
3807                     *MARK = sv ? sv : &PL_sv_undef;
3808                 }
3809             }
3810         }
3811         else
3812             DIE(aTHX_ "Not a HASH reference");
3813         if (discard)
3814             SP = ORIGMARK;
3815         else if (gimme == G_SCALAR) {
3816             MARK = ORIGMARK;
3817             if (SP > MARK)
3818                 *++MARK = *SP;
3819             else
3820                 *++MARK = &PL_sv_undef;
3821             SP = MARK;
3822         }
3823     }
3824     else {
3825         SV *keysv = POPs;
3826         HV * const hv = (HV*)POPs;
3827         SV *sv;
3828         if (SvTYPE(hv) == SVt_PVHV)
3829             sv = hv_delete_ent(hv, keysv, discard, 0);
3830         else if (SvTYPE(hv) == SVt_PVAV) {
3831             if (PL_op->op_flags & OPf_SPECIAL)
3832                 sv = av_delete((AV*)hv, SvIV(keysv), discard);
3833             else
3834                 DIE(aTHX_ "panic: avhv_delete no longer supported");
3835         }
3836         else
3837             DIE(aTHX_ "Not a HASH reference");
3838         if (!sv)
3839             sv = &PL_sv_undef;
3840         if (!discard)
3841             PUSHs(sv);
3842     }
3843     RETURN;
3844 }
3845
3846 PP(pp_exists)
3847 {
3848     dVAR;
3849     dSP;
3850     SV *tmpsv;
3851     HV *hv;
3852
3853     if (PL_op->op_private & OPpEXISTS_SUB) {
3854         GV *gv;
3855         SV * const sv = POPs;
3856         CV * const cv = sv_2cv(sv, &hv, &gv, 0);
3857         if (cv)
3858             RETPUSHYES;
3859         if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
3860             RETPUSHYES;
3861         RETPUSHNO;
3862     }
3863     tmpsv = POPs;
3864     hv = (HV*)POPs;
3865     if (SvTYPE(hv) == SVt_PVHV) {
3866         if (hv_exists_ent(hv, tmpsv, 0))
3867             RETPUSHYES;
3868     }
3869     else if (SvTYPE(hv) == SVt_PVAV) {
3870         if (PL_op->op_flags & OPf_SPECIAL) {            /* array element */
3871             if (av_exists((AV*)hv, SvIV(tmpsv)))
3872                 RETPUSHYES;
3873         }
3874     }
3875     else {
3876         DIE(aTHX_ "Not a HASH reference");
3877     }
3878     RETPUSHNO;
3879 }
3880
3881 PP(pp_hslice)
3882 {
3883     dVAR; dSP; dMARK; dORIGMARK;
3884     register HV * const hv = (HV*)POPs;
3885     register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3886     const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
3887     bool other_magic = FALSE;
3888
3889     if (localizing) {
3890         MAGIC *mg;
3891         HV *stash;
3892
3893         other_magic = mg_find((SV*)hv, PERL_MAGIC_env) ||
3894             ((mg = mg_find((SV*)hv, PERL_MAGIC_tied))
3895              /* Try to preserve the existenceness of a tied hash
3896               * element by using EXISTS and DELETE if possible.
3897               * Fallback to FETCH and STORE otherwise */
3898              && (stash = SvSTASH(SvRV(SvTIED_obj((SV*)hv, mg))))
3899              && gv_fetchmethod_autoload(stash, "EXISTS", TRUE)
3900              && gv_fetchmethod_autoload(stash, "DELETE", TRUE));
3901     }
3902
3903     while (++MARK <= SP) {
3904         SV * const keysv = *MARK;
3905         SV **svp;
3906         HE *he;
3907         bool preeminent = FALSE;
3908
3909         if (localizing) {
3910             preeminent = SvRMAGICAL(hv) && !other_magic ? 1 :
3911                 hv_exists_ent(hv, keysv, 0);
3912         }
3913
3914         he = hv_fetch_ent(hv, keysv, lval, 0);
3915         svp = he ? &HeVAL(he) : 0;
3916
3917         if (lval) {
3918             if (!svp || *svp == &PL_sv_undef) {
3919                 DIE(aTHX_ PL_no_helem_sv, keysv);
3920             }
3921             if (localizing) {
3922                 if (HvNAME_get(hv) && isGV(*svp))
3923                     save_gp((GV*)*svp, !(PL_op->op_flags & OPf_SPECIAL));
3924                 else {
3925                     if (preeminent)
3926                         save_helem(hv, keysv, svp);
3927                     else {
3928                         STRLEN keylen;
3929                         const char * const key = SvPV_const(keysv, keylen);
3930                         SAVEDELETE(hv, savepvn(key,keylen),
3931                                    SvUTF8(keysv) ? -keylen : keylen);
3932                     }
3933                 }
3934             }
3935         }
3936         *MARK = svp ? *svp : &PL_sv_undef;
3937     }
3938     if (GIMME != G_ARRAY) {
3939         MARK = ORIGMARK;
3940         *++MARK = SP > ORIGMARK ? *SP : &PL_sv_undef;
3941         SP = MARK;
3942     }
3943     RETURN;
3944 }
3945
3946 /* List operators. */
3947
3948 PP(pp_list)
3949 {
3950     dVAR; dSP; dMARK;
3951     if (GIMME != G_ARRAY) {
3952         if (++MARK <= SP)
3953             *MARK = *SP;                /* unwanted list, return last item */
3954         else
3955             *MARK = &PL_sv_undef;
3956         SP = MARK;
3957     }
3958     RETURN;
3959 }
3960
3961 PP(pp_lslice)
3962 {
3963     dVAR;
3964     dSP;
3965     SV ** const lastrelem = PL_stack_sp;
3966     SV ** const lastlelem = PL_stack_base + POPMARK;
3967     SV ** const firstlelem = PL_stack_base + POPMARK + 1;
3968     register SV ** const firstrelem = lastlelem + 1;
3969     const I32 arybase = CopARYBASE_get(PL_curcop);
3970     I32 is_something_there = PL_op->op_flags & OPf_MOD;
3971
3972     register const I32 max = lastrelem - lastlelem;
3973     register SV **lelem;
3974
3975     if (GIMME != G_ARRAY) {
3976         I32 ix = SvIVx(*lastlelem);
3977         if (ix < 0)
3978             ix += max;
3979         else
3980             ix -= arybase;
3981         if (ix < 0 || ix >= max)
3982             *firstlelem = &PL_sv_undef;
3983         else
3984             *firstlelem = firstrelem[ix];
3985         SP = firstlelem;
3986         RETURN;
3987     }
3988
3989     if (max == 0) {
3990         SP = firstlelem - 1;
3991         RETURN;
3992     }
3993
3994     for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
3995         I32 ix = SvIVx(*lelem);
3996         if (ix < 0)
3997             ix += max;
3998         else
3999             ix -= arybase;
4000         if (ix < 0 || ix >= max)
4001             *lelem = &PL_sv_undef;
4002         else {
4003             is_something_there = TRUE;
4004             if (!(*lelem = firstrelem[ix]))
4005                 *lelem = &PL_sv_undef;
4006         }
4007     }
4008     if (is_something_there)
4009         SP = lastlelem;
4010     else
4011         SP = firstlelem - 1;
4012     RETURN;
4013 }
4014
4015 PP(pp_anonlist)
4016 {
4017     dVAR; dSP; dMARK; dORIGMARK;
4018     const I32 items = SP - MARK;
4019     SV * const av = sv_2mortal((SV*)av_make(items, MARK+1));
4020     SP = ORIGMARK;              /* av_make() might realloc stack_sp */
4021     XPUSHs(av);
4022     RETURN;
4023 }
4024
4025 PP(pp_anonhash)
4026 {
4027     dVAR; dSP; dMARK; dORIGMARK;
4028     HV* const hv = (HV*)sv_2mortal((SV*)newHV());
4029
4030     while (MARK < SP) {
4031         SV * const key = *++MARK;
4032         SV * const val = newSV(0);
4033         if (MARK < SP)
4034             sv_setsv(val, *++MARK);
4035         else if (ckWARN(WARN_MISC))
4036             Perl_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
4037         (void)hv_store_ent(hv,key,val,0);
4038     }
4039     SP = ORIGMARK;
4040     XPUSHs((SV*)hv);
4041     RETURN;
4042 }
4043
4044 PP(pp_splice)
4045 {
4046     dVAR; dSP; dMARK; dORIGMARK;
4047     register AV *ary = (AV*)*++MARK;
4048     register SV **src;
4049     register SV **dst;
4050     register I32 i;
4051     register I32 offset;
4052     register I32 length;
4053     I32 newlen;
4054     I32 after;
4055     I32 diff;
4056     const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4057
4058     if (mg) {
4059         *MARK-- = SvTIED_obj((SV*)ary, mg);
4060         PUSHMARK(MARK);
4061         PUTBACK;
4062         ENTER;
4063         call_method("SPLICE",GIMME_V);
4064         LEAVE;
4065         SPAGAIN;
4066         RETURN;
4067     }
4068
4069     SP++;
4070
4071     if (++MARK < SP) {
4072         offset = i = SvIVx(*MARK);
4073         if (offset < 0)
4074             offset += AvFILLp(ary) + 1;
4075         else
4076             offset -= CopARYBASE_get(PL_curcop);
4077         if (offset < 0)
4078             DIE(aTHX_ PL_no_aelem, i);
4079         if (++MARK < SP) {
4080             length = SvIVx(*MARK++);
4081             if (length < 0) {
4082                 length += AvFILLp(ary) - offset + 1;
4083                 if (length < 0)
4084                     length = 0;
4085             }
4086         }
4087         else
4088             length = AvMAX(ary) + 1;            /* close enough to infinity */
4089     }
4090     else {
4091         offset = 0;
4092         length = AvMAX(ary) + 1;
4093     }
4094     if (offset > AvFILLp(ary) + 1) {
4095         if (ckWARN(WARN_MISC))
4096             Perl_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
4097         offset = AvFILLp(ary) + 1;
4098     }
4099     after = AvFILLp(ary) + 1 - (offset + length);
4100     if (after < 0) {                            /* not that much array */
4101         length += after;                        /* offset+length now in array */
4102         after = 0;
4103         if (!AvALLOC(ary))
4104             av_extend(ary, 0);
4105     }
4106
4107     /* At this point, MARK .. SP-1 is our new LIST */
4108
4109     newlen = SP - MARK;
4110     diff = newlen - length;
4111     if (newlen && !AvREAL(ary) && AvREIFY(ary))
4112         av_reify(ary);
4113
4114     /* make new elements SVs now: avoid problems if they're from the array */
4115     for (dst = MARK, i = newlen; i; i--) {
4116         SV * const h = *dst;
4117         *dst++ = newSVsv(h);
4118     }
4119
4120     if (diff < 0) {                             /* shrinking the area */
4121         SV **tmparyval;
4122         if (newlen) {
4123             Newx(tmparyval, newlen, SV*);       /* so remember insertion */
4124             Copy(MARK, tmparyval, newlen, SV*);
4125         }
4126
4127         MARK = ORIGMARK + 1;
4128         if (GIMME == G_ARRAY) {                 /* copy return vals to stack */
4129             MEXTEND(MARK, length);
4130             Copy(AvARRAY(ary)+offset, MARK, length, SV*);
4131             if (AvREAL(ary)) {
4132                 EXTEND_MORTAL(length);
4133                 for (i = length, dst = MARK; i; i--) {
4134                     sv_2mortal(*dst);   /* free them eventualy */
4135                     dst++;
4136                 }
4137             }
4138             MARK += length - 1;
4139         }
4140         else {
4141             *MARK = AvARRAY(ary)[offset+length-1];
4142             if (AvREAL(ary)) {
4143                 sv_2mortal(*MARK);
4144                 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
4145                     SvREFCNT_dec(*dst++);       /* free them now */
4146             }
4147         }
4148         AvFILLp(ary) += diff;
4149
4150         /* pull up or down? */
4151
4152         if (offset < after) {                   /* easier to pull up */
4153             if (offset) {                       /* esp. if nothing to pull */
4154                 src = &AvARRAY(ary)[offset-1];
4155                 dst = src - diff;               /* diff is negative */
4156                 for (i = offset; i > 0; i--)    /* can't trust Copy */
4157                     *dst-- = *src--;
4158             }
4159             dst = AvARRAY(ary);
4160             SvPV_set(ary, (char*)(AvARRAY(ary) - diff)); /* diff is negative */
4161             AvMAX(ary) += diff;
4162         }
4163         else {
4164             if (after) {                        /* anything to pull down? */
4165                 src = AvARRAY(ary) + offset + length;
4166                 dst = src + diff;               /* diff is negative */
4167                 Move(src, dst, after, SV*);
4168             }
4169             dst = &AvARRAY(ary)[AvFILLp(ary)+1];
4170                                                 /* avoid later double free */
4171         }
4172         i = -diff;
4173         while (i)
4174             dst[--i] = &PL_sv_undef;
4175         
4176         if (newlen) {
4177             Copy( tmparyval, AvARRAY(ary) + offset, newlen, SV* );
4178             Safefree(tmparyval);
4179         }
4180     }
4181     else {                                      /* no, expanding (or same) */
4182         SV** tmparyval = NULL;
4183         if (length) {
4184             Newx(tmparyval, length, SV*);       /* so remember deletion */
4185             Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
4186         }
4187
4188         if (diff > 0) {                         /* expanding */
4189             /* push up or down? */
4190             if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
4191                 if (offset) {
4192                     src = AvARRAY(ary);
4193                     dst = src - diff;
4194                     Move(src, dst, offset, SV*);
4195                 }
4196                 SvPV_set(ary, (char*)(AvARRAY(ary) - diff));/* diff is positive */
4197                 AvMAX(ary) += diff;
4198                 AvFILLp(ary) += diff;
4199             }
4200             else {
4201                 if (AvFILLp(ary) + diff >= AvMAX(ary))  /* oh, well */
4202                     av_extend(ary, AvFILLp(ary) + diff);
4203                 AvFILLp(ary) += diff;
4204
4205                 if (after) {
4206                     dst = AvARRAY(ary) + AvFILLp(ary);
4207                     src = dst - diff;
4208                     for (i = after; i; i--) {
4209                         *dst-- = *src--;
4210                     }
4211                 }
4212             }
4213         }
4214
4215         if (newlen) {
4216             Copy( MARK, AvARRAY(ary) + offset, newlen, SV* );
4217         }
4218
4219         MARK = ORIGMARK + 1;
4220         if (GIMME == G_ARRAY) {                 /* copy return vals to stack */
4221             if (length) {
4222                 Copy(tmparyval, MARK, length, SV*);
4223                 if (AvREAL(ary)) {
4224                     EXTEND_MORTAL(length);
4225                     for (i = length, dst = MARK; i; i--) {
4226                         sv_2mortal(*dst);       /* free them eventualy */
4227                         dst++;
4228                     }
4229                 }
4230             }
4231             MARK += length - 1;
4232         }
4233         else if (length--) {
4234             *MARK = tmparyval[length];
4235             if (AvREAL(ary)) {
4236                 sv_2mortal(*MARK);
4237                 while (length-- > 0)
4238                     SvREFCNT_dec(tmparyval[length]);
4239             }
4240         }
4241         else
4242             *MARK = &PL_sv_undef;
4243         Safefree(tmparyval);
4244     }
4245     SP = MARK;
4246     RETURN;
4247 }
4248
4249 PP(pp_push)
4250 {
4251     dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4252     register AV *ary = (AV*)*++MARK;
4253     const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4254
4255     if (mg) {
4256         *MARK-- = SvTIED_obj((SV*)ary, mg);
4257         PUSHMARK(MARK);
4258         PUTBACK;
4259         ENTER;
4260         call_method("PUSH",G_SCALAR|G_DISCARD);
4261         LEAVE;
4262         SPAGAIN;
4263         SP = ORIGMARK;
4264         PUSHi( AvFILL(ary) + 1 );
4265     }
4266     else {
4267         for (++MARK; MARK <= SP; MARK++) {
4268             SV * const sv = newSV(0);
4269             if (*MARK)
4270                 sv_setsv(sv, *MARK);
4271             av_store(ary, AvFILLp(ary)+1, sv);
4272         }
4273         SP = ORIGMARK;
4274         PUSHi( AvFILLp(ary) + 1 );
4275     }
4276     RETURN;
4277 }
4278
4279 PP(pp_shift)
4280 {
4281     dVAR;
4282     dSP;
4283     AV * const av = (AV*)POPs;
4284     SV * const sv = PL_op->op_type == OP_SHIFT ? av_shift(av) : av_pop(av);
4285     EXTEND(SP, 1);
4286     assert (sv);
4287     if (AvREAL(av))
4288         (void)sv_2mortal(sv);
4289     PUSHs(sv);
4290     RETURN;
4291 }
4292
4293 PP(pp_unshift)
4294 {
4295     dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4296     register AV *ary = (AV*)*++MARK;
4297     const MAGIC * const mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied);
4298
4299     if (mg) {
4300         *MARK-- = SvTIED_obj((SV*)ary, mg);
4301         PUSHMARK(MARK);
4302         PUTBACK;
4303         ENTER;
4304         call_method("UNSHIFT",G_SCALAR|G_DISCARD);
4305         LEAVE;
4306         SPAGAIN;
4307     }
4308     else {
4309         register I32 i = 0;
4310         av_unshift(ary, SP - MARK);
4311         while (MARK < SP) {
4312             SV * const sv = newSVsv(*++MARK);
4313             (void)av_store(ary, i++, sv);
4314         }
4315     }
4316     SP = ORIGMARK;
4317     PUSHi( AvFILL(ary) + 1 );
4318     RETURN;
4319 }
4320
4321 PP(pp_reverse)
4322 {
4323     dVAR; dSP; dMARK;
4324     SV ** const oldsp = SP;
4325
4326     if (GIMME == G_ARRAY) {
4327         MARK++;
4328         while (MARK < SP) {
4329             register SV * const tmp = *MARK;
4330             *MARK++ = *SP;
4331             *SP-- = tmp;
4332         }
4333         /* safe as long as stack cannot get extended in the above */
4334         SP = oldsp;
4335     }
4336     else {
4337         register char *up;
4338         register char *down;
4339         register I32 tmp;
4340         dTARGET;
4341         STRLEN len;
4342         I32 padoff_du;
4343
4344         SvUTF8_off(TARG);                               /* decontaminate */
4345         if (SP - MARK > 1)
4346             do_join(TARG, &PL_sv_no, MARK, SP);
4347         else
4348             sv_setsv(TARG, (SP > MARK)
4349                     ? *SP
4350                     : (padoff_du = find_rundefsvoffset(),
4351                         (padoff_du == NOT_IN_PAD
4352                          || PAD_COMPNAME_FLAGS_isOUR(padoff_du))
4353                         ? DEFSV : PAD_SVl(padoff_du)));
4354         up = SvPV_force(TARG, len);
4355         if (len > 1) {
4356             if (DO_UTF8(TARG)) {        /* first reverse each character */
4357                 U8* s = (U8*)SvPVX(TARG);
4358                 const U8* send = (U8*)(s + len);
4359                 while (s < send) {
4360                     if (UTF8_IS_INVARIANT(*s)) {
4361                         s++;
4362                         continue;
4363                     }
4364                     else {
4365                         if (!utf8_to_uvchr(s, 0))
4366                             break;
4367                         up = (char*)s;
4368                         s += UTF8SKIP(s);
4369                         down = (char*)(s - 1);
4370                         /* reverse this character */
4371                         while (down > up) {
4372                             tmp = *up;
4373                             *up++ = *down;
4374                             *down-- = (char)tmp;
4375                         }
4376                     }
4377                 }
4378                 up = SvPVX(TARG);
4379             }
4380             down = SvPVX(TARG) + len - 1;
4381             while (down > up) {
4382                 tmp = *up;
4383                 *up++ = *down;
4384                 *down-- = (char)tmp;
4385             }
4386             (void)SvPOK_only_UTF8(TARG);
4387         }
4388         SP = MARK + 1;
4389         SETTARG;
4390     }
4391     RETURN;
4392 }
4393
4394 PP(pp_split)
4395 {
4396     dVAR; dSP; dTARG;
4397     AV *ary;
4398     register IV limit = POPi;                   /* note, negative is forever */
4399     SV * const sv = POPs;
4400     STRLEN len;
4401     register const char *s = SvPV_const(sv, len);
4402     const bool do_utf8 = DO_UTF8(sv);
4403     const char *strend = s + len;
4404     register PMOP *pm;
4405     register REGEXP *rx;
4406     register SV *dstr;
4407     register const char *m;
4408     I32 iters = 0;
4409     const STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (strend - s);
4410     I32 maxiters = slen + 10;
4411     const char *orig;
4412     const I32 origlimit = limit;
4413     I32 realarray = 0;
4414     I32 base;
4415     const I32 gimme = GIMME_V;
4416     const I32 oldsave = PL_savestack_ix;
4417     I32 make_mortal = 1;
4418     bool multiline = 0;
4419     MAGIC *mg = NULL;
4420
4421 #ifdef DEBUGGING
4422     Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4423 #else
4424     pm = (PMOP*)POPs;
4425 #endif
4426     if (!pm || !s)
4427         DIE(aTHX_ "panic: pp_split");
4428     rx = PM_GETRE(pm);
4429
4430     TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
4431              (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
4432
4433     RX_MATCH_UTF8_set(rx, do_utf8);
4434
4435     if (pm->op_pmreplroot) {
4436 #ifdef USE_ITHREADS
4437         ary = GvAVn((GV*)PAD_SVl(INT2PTR(PADOFFSET, pm->op_pmreplroot)));
4438 #else
4439         ary = GvAVn((GV*)pm->op_pmreplroot);
4440 #endif
4441     }
4442     else if (gimme != G_ARRAY)
4443         ary = GvAVn(PL_defgv);
4444     else
4445         ary = NULL;
4446     if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4447         realarray = 1;
4448         PUTBACK;
4449         av_extend(ary,0);
4450         av_clear(ary);
4451         SPAGAIN;
4452         if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4453             PUSHMARK(SP);
4454             XPUSHs(SvTIED_obj((SV*)ary, mg));
4455         }
4456         else {
4457             if (!AvREAL(ary)) {
4458                 I32 i;
4459                 AvREAL_on(ary);
4460                 AvREIFY_off(ary);
4461                 for (i = AvFILLp(ary); i >= 0; i--)
4462                     AvARRAY(ary)[i] = &PL_sv_undef;     /* don't free mere refs */
4463             }
4464             /* temporarily switch stacks */
4465             SAVESWITCHSTACK(PL_curstack, ary);
4466             make_mortal = 0;
4467         }
4468     }
4469     base = SP - PL_stack_base;
4470     orig = s;
4471     if (pm->op_pmflags & PMf_SKIPWHITE) {
4472         if (pm->op_pmflags & PMf_LOCALE) {
4473             while (isSPACE_LC(*s))
4474                 s++;
4475         }
4476         else {
4477             while (isSPACE(*s))
4478                 s++;
4479         }
4480     }
4481     if (pm->op_pmflags & PMf_MULTILINE) {
4482         multiline = 1;
4483     }
4484
4485     if (!limit)
4486         limit = maxiters + 2;
4487     if (pm->op_pmflags & PMf_WHITE) {
4488         while (--limit) {
4489             m = s;
4490             while (m < strend &&
4491                    !((pm->op_pmflags & PMf_LOCALE)
4492                      ? isSPACE_LC(*m) : isSPACE(*m)))
4493                 ++m;
4494             if (m >= strend)
4495                 break;
4496
4497             dstr = newSVpvn(s, m-s);
4498             if (make_mortal)
4499                 sv_2mortal(dstr);
4500             if (do_utf8)
4501                 (void)SvUTF8_on(dstr);
4502             XPUSHs(dstr);
4503
4504             s = m + 1;
4505             while (s < strend &&
4506                    ((pm->op_pmflags & PMf_LOCALE)
4507                     ? isSPACE_LC(*s) : isSPACE(*s)))
4508                 ++s;
4509         }
4510     }
4511     else if (rx->precomp[0] == '^' && rx->precomp[1] == '\0') {
4512         while (--limit) {
4513             for (m = s; m < strend && *m != '\n'; m++)
4514                 ;
4515             m++;
4516             if (m >= strend)
4517                 break;
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             s = m;
4525         }
4526     }
4527     else if (do_utf8 == ((rx->reganch & ROPT_UTF8) != 0) &&
4528              (rx->reganch & RE_USE_INTUIT) && !rx->nparens
4529              && (rx->reganch & ROPT_CHECK_ALL)
4530              && !(rx->reganch & ROPT_ANCH)) {
4531         const int tail = (rx->reganch & RE_INTUIT_TAIL);
4532         SV * const csv = CALLREG_INTUIT_STRING(aTHX_ rx);
4533
4534         len = rx->minlen;
4535         if (len == 1 && !(rx->reganch & ROPT_UTF8) && !tail) {
4536             const char c = *SvPV_nolen_const(csv);
4537             while (--limit) {
4538                 for (m = s; m < strend && *m != c; m++)
4539                     ;
4540                 if (m >= strend)
4541                     break;
4542                 dstr = newSVpvn(s, m-s);
4543                 if (make_mortal)
4544                     sv_2mortal(dstr);
4545                 if (do_utf8)
4546                     (void)SvUTF8_on(dstr);
4547                 XPUSHs(dstr);
4548                 /* The rx->minlen is in characters but we want to step
4549                  * s ahead by bytes. */
4550                 if (do_utf8)
4551                     s = (char*)utf8_hop((U8*)m, len);
4552                 else
4553                     s = m + len; /* Fake \n at the end */
4554             }
4555         }
4556         else {
4557             while (s < strend && --limit &&
4558               (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
4559                              csv, multiline ? FBMrf_MULTILINE : 0)) )
4560             {
4561                 dstr = newSVpvn(s, m-s);
4562                 if (make_mortal)
4563                     sv_2mortal(dstr);
4564                 if (do_utf8)
4565                     (void)SvUTF8_on(dstr);
4566                 XPUSHs(dstr);
4567                 /* The rx->minlen is in characters but we want to step
4568                  * s ahead by bytes. */
4569                 if (do_utf8)
4570                     s = (char*)utf8_hop((U8*)m, len);
4571                 else
4572                     s = m + len; /* Fake \n at the end */
4573             }
4574         }
4575     }
4576     else {
4577         maxiters += slen * rx->nparens;
4578         while (s < strend && --limit)
4579         {
4580             I32 rex_return;
4581             PUTBACK;
4582             rex_return = CALLREGEXEC(aTHX_ rx, (char*)s, (char*)strend, (char*)orig, 1 ,
4583                             sv, NULL, 0);
4584             SPAGAIN;
4585             if (rex_return == 0)
4586                 break;
4587             TAINT_IF(RX_MATCH_TAINTED(rx));
4588             if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
4589                 m = s;
4590                 s = orig;
4591                 orig = rx->subbeg;
4592                 s = orig + (m - s);
4593                 strend = s + (strend - m);
4594             }
4595             m = rx->startp[0] + orig;
4596             dstr = newSVpvn(s, m-s);
4597             if (make_mortal)
4598                 sv_2mortal(dstr);
4599             if (do_utf8)
4600                 (void)SvUTF8_on(dstr);
4601             XPUSHs(dstr);
4602             if (rx->nparens) {
4603                 I32 i;
4604                 for (i = 1; i <= (I32)rx->nparens; i++) {
4605                     s = rx->startp[i] + orig;
4606                     m = rx->endp[i] + orig;
4607
4608                     /* japhy (07/27/01) -- the (m && s) test doesn't catch
4609                        parens that didn't match -- they should be set to
4610                        undef, not the empty string */
4611                     if (m >= orig && s >= orig) {
4612                         dstr = newSVpvn(s, m-s);
4613                     }
4614                     else
4615                         dstr = &PL_sv_undef;  /* undef, not "" */
4616                     if (make_mortal)
4617                         sv_2mortal(dstr);
4618                     if (do_utf8)
4619                         (void)SvUTF8_on(dstr);
4620                     XPUSHs(dstr);
4621                 }
4622             }
4623             s = rx->endp[0] + orig;
4624         }
4625     }
4626
4627     iters = (SP - PL_stack_base) - base;
4628     if (iters > maxiters)
4629         DIE(aTHX_ "Split loop");
4630
4631     /* keep field after final delim? */
4632     if (s < strend || (iters && origlimit)) {
4633         const STRLEN l = strend - s;
4634         dstr = newSVpvn(s, l);
4635         if (make_mortal)
4636             sv_2mortal(dstr);
4637         if (do_utf8)
4638             (void)SvUTF8_on(dstr);
4639         XPUSHs(dstr);
4640         iters++;
4641     }
4642     else if (!origlimit) {
4643         while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
4644             if (TOPs && !make_mortal)
4645                 sv_2mortal(TOPs);
4646             iters--;
4647             *SP-- = &PL_sv_undef;
4648         }
4649     }
4650
4651     PUTBACK;
4652     LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */
4653     SPAGAIN;
4654     if (realarray) {
4655         if (!mg) {
4656             if (SvSMAGICAL(ary)) {
4657                 PUTBACK;
4658                 mg_set((SV*)ary);
4659                 SPAGAIN;
4660             }
4661             if (gimme == G_ARRAY) {
4662                 EXTEND(SP, iters);
4663                 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4664                 SP += iters;
4665                 RETURN;
4666             }
4667         }
4668         else {
4669             PUTBACK;
4670             ENTER;
4671             call_method("PUSH",G_SCALAR|G_DISCARD);
4672             LEAVE;
4673             SPAGAIN;
4674             if (gimme == G_ARRAY) {
4675                 I32 i;
4676                 /* EXTEND should not be needed - we just popped them */
4677                 EXTEND(SP, iters);
4678                 for (i=0; i < iters; i++) {
4679                     SV **svp = av_fetch(ary, i, FALSE);
4680                     PUSHs((svp) ? *svp : &PL_sv_undef);
4681                 }
4682                 RETURN;
4683             }
4684         }
4685     }
4686     else {
4687         if (gimme == G_ARRAY)
4688             RETURN;
4689     }
4690
4691     GETTARGET;
4692     PUSHi(iters);
4693     RETURN;
4694 }
4695
4696 PP(pp_lock)
4697 {
4698     dVAR;
4699     dSP;
4700     dTOPss;
4701     SV *retsv = sv;
4702     SvLOCK(sv);
4703     if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
4704         || SvTYPE(retsv) == SVt_PVCV) {
4705         retsv = refto(retsv);
4706     }
4707     SETs(retsv);
4708     RETURN;
4709 }
4710
4711
4712 PP(unimplemented_op)
4713 {
4714     dVAR;
4715     DIE(aTHX_ "panic: unimplemented op %s (#%d) called", OP_NAME(PL_op),
4716         PL_op->op_type);
4717 }
4718
4719 /*
4720  * Local variables:
4721  * c-indentation-style: bsd
4722  * c-basic-offset: 4
4723  * indent-tabs-mode: t
4724  * End:
4725  *
4726  * ex: set ts=8 sts=4 sw=4 noet:
4727  */