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