Finally, this "Negative repeat count" warning wasn't such a great
[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 (count < 0)
1390         count = 0;
1391     if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1392         dMARK;
1393         I32 items = SP - MARK;
1394         I32 max;
1395         static const char list_extend[] = "panic: list extend";
1396
1397         max = items * count;
1398         MEM_WRAP_CHECK_1(max, SV*, list_extend);
1399         if (items > 0 && max > 0 && (max < items || max < count))
1400            Perl_croak(aTHX_ list_extend);
1401         MEXTEND(MARK, max);
1402         if (count > 1) {
1403             while (SP > MARK) {
1404 #if 0
1405               /* This code was intended to fix 20010809.028:
1406
1407                  $x = 'abcd';
1408                  for (($x =~ /./g) x 2) {
1409                      print chop; # "abcdabcd" expected as output.
1410                  }
1411
1412                * but that change (#11635) broke this code:
1413
1414                $x = [("foo")x2]; # only one "foo" ended up in the anonlist.
1415
1416                * I can't think of a better fix that doesn't introduce
1417                * an efficiency hit by copying the SVs. The stack isn't
1418                * refcounted, and mortalisation obviously doesn't
1419                * Do The Right Thing when the stack has more than
1420                * one pointer to the same mortal value.
1421                * .robin.
1422                */
1423                 if (*SP) {
1424                     *SP = sv_2mortal(newSVsv(*SP));
1425                     SvREADONLY_on(*SP);
1426                 }
1427 #else
1428                if (*SP)
1429                    SvTEMP_off((*SP));
1430 #endif
1431                 SP--;
1432             }
1433             MARK++;
1434             repeatcpy((char*)(MARK + items), (char*)MARK,
1435                 items * sizeof(SV*), count - 1);
1436             SP += max;
1437         }
1438         else if (count <= 0)
1439             SP -= items;
1440     }
1441     else {      /* Note: mark already snarfed by pp_list */
1442         SV *tmpstr = POPs;
1443         STRLEN len;
1444         bool isutf;
1445
1446         SvSetSV(TARG, tmpstr);
1447         SvPV_force(TARG, len);
1448         isutf = DO_UTF8(TARG);
1449         if (count != 1) {
1450             if (count < 1)
1451                 SvCUR_set(TARG, 0);
1452             else {
1453                 MEM_WRAP_CHECK_1(count, len, "panic: string extend");
1454                 SvGROW(TARG, (count * len) + 1);
1455                 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1456                 SvCUR(TARG) *= count;
1457             }
1458             *SvEND(TARG) = '\0';
1459         }
1460         if (isutf)
1461             (void)SvPOK_only_UTF8(TARG);
1462         else
1463             (void)SvPOK_only(TARG);
1464
1465         if (PL_op->op_private & OPpREPEAT_DOLIST) {
1466             /* The parser saw this as a list repeat, and there
1467                are probably several items on the stack. But we're
1468                in scalar context, and there's no pp_list to save us
1469                now. So drop the rest of the items -- robin@kitsite.com
1470              */
1471             dMARK;
1472             SP = MARK;
1473         }
1474         PUSHTARG;
1475     }
1476     RETURN;
1477   }
1478 }
1479
1480 PP(pp_subtract)
1481 {
1482     dSP; dATARGET; bool useleft; tryAMAGICbin(subtr,opASSIGN);
1483     useleft = USE_LEFT(TOPm1s);
1484 #ifdef PERL_PRESERVE_IVUV
1485     /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1486        "bad things" happen if you rely on signed integers wrapping.  */
1487     SvIV_please(TOPs);
1488     if (SvIOK(TOPs)) {
1489         /* Unless the left argument is integer in range we are going to have to
1490            use NV maths. Hence only attempt to coerce the right argument if
1491            we know the left is integer.  */
1492         register UV auv = 0;
1493         bool auvok = FALSE;
1494         bool a_valid = 0;
1495
1496         if (!useleft) {
1497             auv = 0;
1498             a_valid = auvok = 1;
1499             /* left operand is undef, treat as zero.  */
1500         } else {
1501             /* Left operand is defined, so is it IV? */
1502             SvIV_please(TOPm1s);
1503             if (SvIOK(TOPm1s)) {
1504                 if ((auvok = SvUOK(TOPm1s)))
1505                     auv = SvUVX(TOPm1s);
1506                 else {
1507                     register IV aiv = SvIVX(TOPm1s);
1508                     if (aiv >= 0) {
1509                         auv = aiv;
1510                         auvok = 1;      /* Now acting as a sign flag.  */
1511                     } else { /* 2s complement assumption for IV_MIN */
1512                         auv = (UV)-aiv;
1513                     }
1514                 }
1515                 a_valid = 1;
1516             }
1517         }
1518         if (a_valid) {
1519             bool result_good = 0;
1520             UV result;
1521             register UV buv;
1522             bool buvok = SvUOK(TOPs);
1523         
1524             if (buvok)
1525                 buv = SvUVX(TOPs);
1526             else {
1527                 register IV biv = SvIVX(TOPs);
1528                 if (biv >= 0) {
1529                     buv = biv;
1530                     buvok = 1;
1531                 } else
1532                     buv = (UV)-biv;
1533             }
1534             /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1535                else "IV" now, independent of how it came in.
1536                if a, b represents positive, A, B negative, a maps to -A etc
1537                a - b =>  (a - b)
1538                A - b => -(a + b)
1539                a - B =>  (a + b)
1540                A - B => -(a - b)
1541                all UV maths. negate result if A negative.
1542                subtract if signs same, add if signs differ. */
1543
1544             if (auvok ^ buvok) {
1545                 /* Signs differ.  */
1546                 result = auv + buv;
1547                 if (result >= auv)
1548                     result_good = 1;
1549             } else {
1550                 /* Signs same */
1551                 if (auv >= buv) {
1552                     result = auv - buv;
1553                     /* Must get smaller */
1554                     if (result <= auv)
1555                         result_good = 1;
1556                 } else {
1557                     result = buv - auv;
1558                     if (result <= buv) {
1559                         /* result really should be -(auv-buv). as its negation
1560                            of true value, need to swap our result flag  */
1561                         auvok = !auvok;
1562                         result_good = 1;
1563                     }
1564                 }
1565             }
1566             if (result_good) {
1567                 SP--;
1568                 if (auvok)
1569                     SETu( result );
1570                 else {
1571                     /* Negate result */
1572                     if (result <= (UV)IV_MIN)
1573                         SETi( -(IV)result );
1574                     else {
1575                         /* result valid, but out of range for IV.  */
1576                         SETn( -(NV)result );
1577                     }
1578                 }
1579                 RETURN;
1580             } /* Overflow, drop through to NVs.  */
1581         }
1582     }
1583 #endif
1584     useleft = USE_LEFT(TOPm1s);
1585     {
1586         dPOPnv;
1587         if (!useleft) {
1588             /* left operand is undef, treat as zero - value */
1589             SETn(-value);
1590             RETURN;
1591         }
1592         SETn( TOPn - value );
1593         RETURN;
1594     }
1595 }
1596
1597 PP(pp_left_shift)
1598 {
1599     dSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1600     {
1601       IV shift = POPi;
1602       if (PL_op->op_private & HINT_INTEGER) {
1603         IV i = TOPi;
1604         SETi(i << shift);
1605       }
1606       else {
1607         UV u = TOPu;
1608         SETu(u << shift);
1609       }
1610       RETURN;
1611     }
1612 }
1613
1614 PP(pp_right_shift)
1615 {
1616     dSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1617     {
1618       IV shift = POPi;
1619       if (PL_op->op_private & HINT_INTEGER) {
1620         IV i = TOPi;
1621         SETi(i >> shift);
1622       }
1623       else {
1624         UV u = TOPu;
1625         SETu(u >> shift);
1626       }
1627       RETURN;
1628     }
1629 }
1630
1631 PP(pp_lt)
1632 {
1633     dSP; tryAMAGICbinSET(lt,0);
1634 #ifdef PERL_PRESERVE_IVUV
1635     SvIV_please(TOPs);
1636     if (SvIOK(TOPs)) {
1637         SvIV_please(TOPm1s);
1638         if (SvIOK(TOPm1s)) {
1639             bool auvok = SvUOK(TOPm1s);
1640             bool buvok = SvUOK(TOPs);
1641         
1642             if (!auvok && !buvok) { /* ## IV < IV ## */
1643                 IV aiv = SvIVX(TOPm1s);
1644                 IV biv = SvIVX(TOPs);
1645                 
1646                 SP--;
1647                 SETs(boolSV(aiv < biv));
1648                 RETURN;
1649             }
1650             if (auvok && buvok) { /* ## UV < UV ## */
1651                 UV auv = SvUVX(TOPm1s);
1652                 UV buv = SvUVX(TOPs);
1653                 
1654                 SP--;
1655                 SETs(boolSV(auv < buv));
1656                 RETURN;
1657             }
1658             if (auvok) { /* ## UV < IV ## */
1659                 UV auv;
1660                 IV biv;
1661                 
1662                 biv = SvIVX(TOPs);
1663                 SP--;
1664                 if (biv < 0) {
1665                     /* As (a) is a UV, it's >=0, so it cannot be < */
1666                     SETs(&PL_sv_no);
1667                     RETURN;
1668                 }
1669                 auv = SvUVX(TOPs);
1670                 SETs(boolSV(auv < (UV)biv));
1671                 RETURN;
1672             }
1673             { /* ## IV < UV ## */
1674                 IV aiv;
1675                 UV buv;
1676                 
1677                 aiv = SvIVX(TOPm1s);
1678                 if (aiv < 0) {
1679                     /* As (b) is a UV, it's >=0, so it must be < */
1680                     SP--;
1681                     SETs(&PL_sv_yes);
1682                     RETURN;
1683                 }
1684                 buv = SvUVX(TOPs);
1685                 SP--;
1686                 SETs(boolSV((UV)aiv < buv));
1687                 RETURN;
1688             }
1689         }
1690     }
1691 #endif
1692 #ifndef NV_PRESERVES_UV
1693 #ifdef PERL_PRESERVE_IVUV
1694     else
1695 #endif
1696         if (SvROK(TOPs) && SvROK(TOPm1s)) {
1697             SP--;
1698             SETs(boolSV(SvRV(TOPs) < SvRV(TOPp1s)));
1699             RETURN;
1700         }
1701 #endif
1702     {
1703       dPOPnv;
1704       SETs(boolSV(TOPn < value));
1705       RETURN;
1706     }
1707 }
1708
1709 PP(pp_gt)
1710 {
1711     dSP; tryAMAGICbinSET(gt,0);
1712 #ifdef PERL_PRESERVE_IVUV
1713     SvIV_please(TOPs);
1714     if (SvIOK(TOPs)) {
1715         SvIV_please(TOPm1s);
1716         if (SvIOK(TOPm1s)) {
1717             bool auvok = SvUOK(TOPm1s);
1718             bool buvok = SvUOK(TOPs);
1719         
1720             if (!auvok && !buvok) { /* ## IV > IV ## */
1721                 IV aiv = SvIVX(TOPm1s);
1722                 IV biv = SvIVX(TOPs);
1723                 
1724                 SP--;
1725                 SETs(boolSV(aiv > biv));
1726                 RETURN;
1727             }
1728             if (auvok && buvok) { /* ## UV > UV ## */
1729                 UV auv = SvUVX(TOPm1s);
1730                 UV buv = SvUVX(TOPs);
1731                 
1732                 SP--;
1733                 SETs(boolSV(auv > buv));
1734                 RETURN;
1735             }
1736             if (auvok) { /* ## UV > IV ## */
1737                 UV auv;
1738                 IV biv;
1739                 
1740                 biv = SvIVX(TOPs);
1741                 SP--;
1742                 if (biv < 0) {
1743                     /* As (a) is a UV, it's >=0, so it must be > */
1744                     SETs(&PL_sv_yes);
1745                     RETURN;
1746                 }
1747                 auv = SvUVX(TOPs);
1748                 SETs(boolSV(auv > (UV)biv));
1749                 RETURN;
1750             }
1751             { /* ## IV > UV ## */
1752                 IV aiv;
1753                 UV buv;
1754                 
1755                 aiv = SvIVX(TOPm1s);
1756                 if (aiv < 0) {
1757                     /* As (b) is a UV, it's >=0, so it cannot be > */
1758                     SP--;
1759                     SETs(&PL_sv_no);
1760                     RETURN;
1761                 }
1762                 buv = SvUVX(TOPs);
1763                 SP--;
1764                 SETs(boolSV((UV)aiv > buv));
1765                 RETURN;
1766             }
1767         }
1768     }
1769 #endif
1770 #ifndef NV_PRESERVES_UV
1771 #ifdef PERL_PRESERVE_IVUV
1772     else
1773 #endif
1774         if (SvROK(TOPs) && SvROK(TOPm1s)) {
1775         SP--;
1776         SETs(boolSV(SvRV(TOPs) > SvRV(TOPp1s)));
1777         RETURN;
1778     }
1779 #endif
1780     {
1781       dPOPnv;
1782       SETs(boolSV(TOPn > value));
1783       RETURN;
1784     }
1785 }
1786
1787 PP(pp_le)
1788 {
1789     dSP; tryAMAGICbinSET(le,0);
1790 #ifdef PERL_PRESERVE_IVUV
1791     SvIV_please(TOPs);
1792     if (SvIOK(TOPs)) {
1793         SvIV_please(TOPm1s);
1794         if (SvIOK(TOPm1s)) {
1795             bool auvok = SvUOK(TOPm1s);
1796             bool buvok = SvUOK(TOPs);
1797         
1798             if (!auvok && !buvok) { /* ## IV <= IV ## */
1799                 IV aiv = SvIVX(TOPm1s);
1800                 IV biv = SvIVX(TOPs);
1801                 
1802                 SP--;
1803                 SETs(boolSV(aiv <= biv));
1804                 RETURN;
1805             }
1806             if (auvok && buvok) { /* ## UV <= UV ## */
1807                 UV auv = SvUVX(TOPm1s);
1808                 UV buv = SvUVX(TOPs);
1809                 
1810                 SP--;
1811                 SETs(boolSV(auv <= buv));
1812                 RETURN;
1813             }
1814             if (auvok) { /* ## UV <= IV ## */
1815                 UV auv;
1816                 IV biv;
1817                 
1818                 biv = SvIVX(TOPs);
1819                 SP--;
1820                 if (biv < 0) {
1821                     /* As (a) is a UV, it's >=0, so a cannot be <= */
1822                     SETs(&PL_sv_no);
1823                     RETURN;
1824                 }
1825                 auv = SvUVX(TOPs);
1826                 SETs(boolSV(auv <= (UV)biv));
1827                 RETURN;
1828             }
1829             { /* ## IV <= UV ## */
1830                 IV aiv;
1831                 UV buv;
1832                 
1833                 aiv = SvIVX(TOPm1s);
1834                 if (aiv < 0) {
1835                     /* As (b) is a UV, it's >=0, so a must be <= */
1836                     SP--;
1837                     SETs(&PL_sv_yes);
1838                     RETURN;
1839                 }
1840                 buv = SvUVX(TOPs);
1841                 SP--;
1842                 SETs(boolSV((UV)aiv <= buv));
1843                 RETURN;
1844             }
1845         }
1846     }
1847 #endif
1848 #ifndef NV_PRESERVES_UV
1849 #ifdef PERL_PRESERVE_IVUV
1850     else
1851 #endif
1852         if (SvROK(TOPs) && SvROK(TOPm1s)) {
1853         SP--;
1854         SETs(boolSV(SvRV(TOPs) <= SvRV(TOPp1s)));
1855         RETURN;
1856     }
1857 #endif
1858     {
1859       dPOPnv;
1860       SETs(boolSV(TOPn <= value));
1861       RETURN;
1862     }
1863 }
1864
1865 PP(pp_ge)
1866 {
1867     dSP; tryAMAGICbinSET(ge,0);
1868 #ifdef PERL_PRESERVE_IVUV
1869     SvIV_please(TOPs);
1870     if (SvIOK(TOPs)) {
1871         SvIV_please(TOPm1s);
1872         if (SvIOK(TOPm1s)) {
1873             bool auvok = SvUOK(TOPm1s);
1874             bool buvok = SvUOK(TOPs);
1875         
1876             if (!auvok && !buvok) { /* ## IV >= IV ## */
1877                 IV aiv = SvIVX(TOPm1s);
1878                 IV biv = SvIVX(TOPs);
1879                 
1880                 SP--;
1881                 SETs(boolSV(aiv >= biv));
1882                 RETURN;
1883             }
1884             if (auvok && buvok) { /* ## UV >= UV ## */
1885                 UV auv = SvUVX(TOPm1s);
1886                 UV buv = SvUVX(TOPs);
1887                 
1888                 SP--;
1889                 SETs(boolSV(auv >= buv));
1890                 RETURN;
1891             }
1892             if (auvok) { /* ## UV >= IV ## */
1893                 UV auv;
1894                 IV biv;
1895                 
1896                 biv = SvIVX(TOPs);
1897                 SP--;
1898                 if (biv < 0) {
1899                     /* As (a) is a UV, it's >=0, so it must be >= */
1900                     SETs(&PL_sv_yes);
1901                     RETURN;
1902                 }
1903                 auv = SvUVX(TOPs);
1904                 SETs(boolSV(auv >= (UV)biv));
1905                 RETURN;
1906             }
1907             { /* ## IV >= UV ## */
1908                 IV aiv;
1909                 UV buv;
1910                 
1911                 aiv = SvIVX(TOPm1s);
1912                 if (aiv < 0) {
1913                     /* As (b) is a UV, it's >=0, so a cannot be >= */
1914                     SP--;
1915                     SETs(&PL_sv_no);
1916                     RETURN;
1917                 }
1918                 buv = SvUVX(TOPs);
1919                 SP--;
1920                 SETs(boolSV((UV)aiv >= buv));
1921                 RETURN;
1922             }
1923         }
1924     }
1925 #endif
1926 #ifndef NV_PRESERVES_UV
1927 #ifdef PERL_PRESERVE_IVUV
1928     else
1929 #endif
1930         if (SvROK(TOPs) && SvROK(TOPm1s)) {
1931         SP--;
1932         SETs(boolSV(SvRV(TOPs) >= SvRV(TOPp1s)));
1933         RETURN;
1934     }
1935 #endif
1936     {
1937       dPOPnv;
1938       SETs(boolSV(TOPn >= value));
1939       RETURN;
1940     }
1941 }
1942
1943 PP(pp_ne)
1944 {
1945     dSP; tryAMAGICbinSET(ne,0);
1946 #ifndef NV_PRESERVES_UV
1947     if (SvROK(TOPs) && SvROK(TOPm1s)) {
1948         SP--;
1949         SETs(boolSV(SvRV(TOPs) != SvRV(TOPp1s)));
1950         RETURN;
1951     }
1952 #endif
1953 #ifdef PERL_PRESERVE_IVUV
1954     SvIV_please(TOPs);
1955     if (SvIOK(TOPs)) {
1956         SvIV_please(TOPm1s);
1957         if (SvIOK(TOPm1s)) {
1958             bool auvok = SvUOK(TOPm1s);
1959             bool buvok = SvUOK(TOPs);
1960         
1961             if (auvok == buvok) { /* ## IV == IV or UV == UV ## */
1962                 /* Casting IV to UV before comparison isn't going to matter
1963                    on 2s complement. On 1s complement or sign&magnitude
1964                    (if we have any of them) it could make negative zero
1965                    differ from normal zero. As I understand it. (Need to
1966                    check - is negative zero implementation defined behaviour
1967                    anyway?). NWC  */
1968                 UV buv = SvUVX(POPs);
1969                 UV auv = SvUVX(TOPs);
1970                 
1971                 SETs(boolSV(auv != buv));
1972                 RETURN;
1973             }
1974             {                   /* ## Mixed IV,UV ## */
1975                 IV iv;
1976                 UV uv;
1977                 
1978                 /* != is commutative so swap if needed (save code) */
1979                 if (auvok) {
1980                     /* swap. top of stack (b) is the iv */
1981                     iv = SvIVX(TOPs);
1982                     SP--;
1983                     if (iv < 0) {
1984                         /* As (a) is a UV, it's >0, so it cannot be == */
1985                         SETs(&PL_sv_yes);
1986                         RETURN;
1987                     }
1988                     uv = SvUVX(TOPs);
1989                 } else {
1990                     iv = SvIVX(TOPm1s);
1991                     SP--;
1992                     if (iv < 0) {
1993                         /* As (b) is a UV, it's >0, so it cannot be == */
1994                         SETs(&PL_sv_yes);
1995                         RETURN;
1996                     }
1997                     uv = SvUVX(*(SP+1)); /* Do I want TOPp1s() ? */
1998                 }
1999                 SETs(boolSV((UV)iv != uv));
2000                 RETURN;
2001             }
2002         }
2003     }
2004 #endif
2005     {
2006       dPOPnv;
2007       SETs(boolSV(TOPn != value));
2008       RETURN;
2009     }
2010 }
2011
2012 PP(pp_ncmp)
2013 {
2014     dSP; dTARGET; tryAMAGICbin(ncmp,0);
2015 #ifndef NV_PRESERVES_UV
2016     if (SvROK(TOPs) && SvROK(TOPm1s)) {
2017         UV right = PTR2UV(SvRV(POPs));
2018         UV left = PTR2UV(SvRV(TOPs));
2019         SETi((left > right) - (left < right));
2020         RETURN;
2021     }
2022 #endif
2023 #ifdef PERL_PRESERVE_IVUV
2024     /* Fortunately it seems NaN isn't IOK */
2025     SvIV_please(TOPs);
2026     if (SvIOK(TOPs)) {
2027         SvIV_please(TOPm1s);
2028         if (SvIOK(TOPm1s)) {
2029             bool leftuvok = SvUOK(TOPm1s);
2030             bool rightuvok = SvUOK(TOPs);
2031             I32 value;
2032             if (!leftuvok && !rightuvok) { /* ## IV <=> IV ## */
2033                 IV leftiv = SvIVX(TOPm1s);
2034                 IV rightiv = SvIVX(TOPs);
2035                 
2036                 if (leftiv > rightiv)
2037                     value = 1;
2038                 else if (leftiv < rightiv)
2039                     value = -1;
2040                 else
2041                     value = 0;
2042             } else if (leftuvok && rightuvok) { /* ## UV <=> UV ## */
2043                 UV leftuv = SvUVX(TOPm1s);
2044                 UV rightuv = SvUVX(TOPs);
2045                 
2046                 if (leftuv > rightuv)
2047                     value = 1;
2048                 else if (leftuv < rightuv)
2049                     value = -1;
2050                 else
2051                     value = 0;
2052             } else if (leftuvok) { /* ## UV <=> IV ## */
2053                 UV leftuv;
2054                 IV rightiv;
2055                 
2056                 rightiv = SvIVX(TOPs);
2057                 if (rightiv < 0) {
2058                     /* As (a) is a UV, it's >=0, so it cannot be < */
2059                     value = 1;
2060                 } else {
2061                     leftuv = SvUVX(TOPm1s);
2062                     if (leftuv > (UV)rightiv) {
2063                         value = 1;
2064                     } else if (leftuv < (UV)rightiv) {
2065                         value = -1;
2066                     } else {
2067                         value = 0;
2068                     }
2069                 }
2070             } else { /* ## IV <=> UV ## */
2071                 IV leftiv;
2072                 UV rightuv;
2073                 
2074                 leftiv = SvIVX(TOPm1s);
2075                 if (leftiv < 0) {
2076                     /* As (b) is a UV, it's >=0, so it must be < */
2077                     value = -1;
2078                 } else {
2079                     rightuv = SvUVX(TOPs);
2080                     if ((UV)leftiv > rightuv) {
2081                         value = 1;
2082                     } else if ((UV)leftiv < rightuv) {
2083                         value = -1;
2084                     } else {
2085                         value = 0;
2086                     }
2087                 }
2088             }
2089             SP--;
2090             SETi(value);
2091             RETURN;
2092         }
2093     }
2094 #endif
2095     {
2096       dPOPTOPnnrl;
2097       I32 value;
2098
2099 #ifdef Perl_isnan
2100       if (Perl_isnan(left) || Perl_isnan(right)) {
2101           SETs(&PL_sv_undef);
2102           RETURN;
2103        }
2104       value = (left > right) - (left < right);
2105 #else
2106       if (left == right)
2107         value = 0;
2108       else if (left < right)
2109         value = -1;
2110       else if (left > right)
2111         value = 1;
2112       else {
2113         SETs(&PL_sv_undef);
2114         RETURN;
2115       }
2116 #endif
2117       SETi(value);
2118       RETURN;
2119     }
2120 }
2121
2122 PP(pp_slt)
2123 {
2124     dSP; tryAMAGICbinSET(slt,0);
2125     {
2126       dPOPTOPssrl;
2127       int cmp = (IN_LOCALE_RUNTIME
2128                  ? sv_cmp_locale(left, right)
2129                  : sv_cmp(left, right));
2130       SETs(boolSV(cmp < 0));
2131       RETURN;
2132     }
2133 }
2134
2135 PP(pp_sgt)
2136 {
2137     dSP; tryAMAGICbinSET(sgt,0);
2138     {
2139       dPOPTOPssrl;
2140       int cmp = (IN_LOCALE_RUNTIME
2141                  ? sv_cmp_locale(left, right)
2142                  : sv_cmp(left, right));
2143       SETs(boolSV(cmp > 0));
2144       RETURN;
2145     }
2146 }
2147
2148 PP(pp_sle)
2149 {
2150     dSP; tryAMAGICbinSET(sle,0);
2151     {
2152       dPOPTOPssrl;
2153       int cmp = (IN_LOCALE_RUNTIME
2154                  ? sv_cmp_locale(left, right)
2155                  : sv_cmp(left, right));
2156       SETs(boolSV(cmp <= 0));
2157       RETURN;
2158     }
2159 }
2160
2161 PP(pp_sge)
2162 {
2163     dSP; tryAMAGICbinSET(sge,0);
2164     {
2165       dPOPTOPssrl;
2166       int cmp = (IN_LOCALE_RUNTIME
2167                  ? sv_cmp_locale(left, right)
2168                  : sv_cmp(left, right));
2169       SETs(boolSV(cmp >= 0));
2170       RETURN;
2171     }
2172 }
2173
2174 PP(pp_seq)
2175 {
2176     dSP; tryAMAGICbinSET(seq,0);
2177     {
2178       dPOPTOPssrl;
2179       SETs(boolSV(sv_eq(left, right)));
2180       RETURN;
2181     }
2182 }
2183
2184 PP(pp_sne)
2185 {
2186     dSP; tryAMAGICbinSET(sne,0);
2187     {
2188       dPOPTOPssrl;
2189       SETs(boolSV(!sv_eq(left, right)));
2190       RETURN;
2191     }
2192 }
2193
2194 PP(pp_scmp)
2195 {
2196     dSP; dTARGET;  tryAMAGICbin(scmp,0);
2197     {
2198       dPOPTOPssrl;
2199       int cmp = (IN_LOCALE_RUNTIME
2200                  ? sv_cmp_locale(left, right)
2201                  : sv_cmp(left, right));
2202       SETi( cmp );
2203       RETURN;
2204     }
2205 }
2206
2207 PP(pp_bit_and)
2208 {
2209     dSP; dATARGET; tryAMAGICbin(band,opASSIGN);
2210     {
2211       dPOPTOPssrl;
2212       if (SvGMAGICAL(left)) mg_get(left);
2213       if (SvGMAGICAL(right)) mg_get(right);
2214       if (SvNIOKp(left) || SvNIOKp(right)) {
2215         if (PL_op->op_private & HINT_INTEGER) {
2216           IV i = SvIV_nomg(left) & SvIV_nomg(right);
2217           SETi(i);
2218         }
2219         else {
2220           UV u = SvUV_nomg(left) & SvUV_nomg(right);
2221           SETu(u);
2222         }
2223       }
2224       else {
2225         do_vop(PL_op->op_type, TARG, left, right);
2226         SETTARG;
2227       }
2228       RETURN;
2229     }
2230 }
2231
2232 PP(pp_bit_xor)
2233 {
2234     dSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
2235     {
2236       dPOPTOPssrl;
2237       if (SvGMAGICAL(left)) mg_get(left);
2238       if (SvGMAGICAL(right)) mg_get(right);
2239       if (SvNIOKp(left) || SvNIOKp(right)) {
2240         if (PL_op->op_private & HINT_INTEGER) {
2241           IV i = (USE_LEFT(left) ? SvIV_nomg(left) : 0) ^ SvIV_nomg(right);
2242           SETi(i);
2243         }
2244         else {
2245           UV u = (USE_LEFT(left) ? SvUV_nomg(left) : 0) ^ SvUV_nomg(right);
2246           SETu(u);
2247         }
2248       }
2249       else {
2250         do_vop(PL_op->op_type, TARG, left, right);
2251         SETTARG;
2252       }
2253       RETURN;
2254     }
2255 }
2256
2257 PP(pp_bit_or)
2258 {
2259     dSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
2260     {
2261       dPOPTOPssrl;
2262       if (SvGMAGICAL(left)) mg_get(left);
2263       if (SvGMAGICAL(right)) mg_get(right);
2264       if (SvNIOKp(left) || SvNIOKp(right)) {
2265         if (PL_op->op_private & HINT_INTEGER) {
2266           IV i = (USE_LEFT(left) ? SvIV_nomg(left) : 0) | SvIV_nomg(right);
2267           SETi(i);
2268         }
2269         else {
2270           UV u = (USE_LEFT(left) ? SvUV_nomg(left) : 0) | SvUV_nomg(right);
2271           SETu(u);
2272         }
2273       }
2274       else {
2275         do_vop(PL_op->op_type, TARG, left, right);
2276         SETTARG;
2277       }
2278       RETURN;
2279     }
2280 }
2281
2282 PP(pp_negate)
2283 {
2284     dSP; dTARGET; tryAMAGICun(neg);
2285     {
2286         dTOPss;
2287         int flags = SvFLAGS(sv);
2288         if (SvGMAGICAL(sv))
2289             mg_get(sv);
2290         if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
2291             /* It's publicly an integer, or privately an integer-not-float */
2292         oops_its_an_int:
2293             if (SvIsUV(sv)) {
2294                 if (SvIVX(sv) == IV_MIN) {
2295                     /* 2s complement assumption. */
2296                     SETi(SvIVX(sv));    /* special case: -((UV)IV_MAX+1) == IV_MIN */
2297                     RETURN;
2298                 }
2299                 else if (SvUVX(sv) <= IV_MAX) {
2300                     SETi(-SvIVX(sv));
2301                     RETURN;
2302                 }
2303             }
2304             else if (SvIVX(sv) != IV_MIN) {
2305                 SETi(-SvIVX(sv));
2306                 RETURN;
2307             }
2308 #ifdef PERL_PRESERVE_IVUV
2309             else {
2310                 SETu((UV)IV_MIN);
2311                 RETURN;
2312             }
2313 #endif
2314         }
2315         if (SvNIOKp(sv))
2316             SETn(-SvNV(sv));
2317         else if (SvPOKp(sv)) {
2318             STRLEN len;
2319             char *s = SvPV(sv, len);
2320             if (isIDFIRST(*s)) {
2321                 sv_setpvn(TARG, "-", 1);
2322                 sv_catsv(TARG, sv);
2323             }
2324             else if (*s == '+' || *s == '-') {
2325                 sv_setsv(TARG, sv);
2326                 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
2327             }
2328             else if (DO_UTF8(sv)) {
2329                 SvIV_please(sv);
2330                 if (SvIOK(sv))
2331                     goto oops_its_an_int;
2332                 if (SvNOK(sv))
2333                     sv_setnv(TARG, -SvNV(sv));
2334                 else {
2335                     sv_setpvn(TARG, "-", 1);
2336                     sv_catsv(TARG, sv);
2337                 }
2338             }
2339             else {
2340                 SvIV_please(sv);
2341                 if (SvIOK(sv))
2342                   goto oops_its_an_int;
2343                 sv_setnv(TARG, -SvNV(sv));
2344             }
2345             SETTARG;
2346         }
2347         else
2348             SETn(-SvNV(sv));
2349     }
2350     RETURN;
2351 }
2352
2353 PP(pp_not)
2354 {
2355     dSP; tryAMAGICunSET(not);
2356     *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
2357     return NORMAL;
2358 }
2359
2360 PP(pp_complement)
2361 {
2362     dSP; dTARGET; tryAMAGICun(compl);
2363     {
2364       dTOPss;
2365       if (SvGMAGICAL(sv))
2366           mg_get(sv);
2367       if (SvNIOKp(sv)) {
2368         if (PL_op->op_private & HINT_INTEGER) {
2369           IV i = ~SvIV_nomg(sv);
2370           SETi(i);
2371         }
2372         else {
2373           UV u = ~SvUV_nomg(sv);
2374           SETu(u);
2375         }
2376       }
2377       else {
2378         register U8 *tmps;
2379         register I32 anum;
2380         STRLEN len;
2381
2382         (void)SvPV_nomg(sv,len); /* force check for uninit var */
2383         sv_setsv_nomg(TARG, sv);
2384         tmps = (U8*)SvPV_force(TARG, len);
2385         anum = len;
2386         if (SvUTF8(TARG)) {
2387           /* Calculate exact length, let's not estimate. */
2388           STRLEN targlen = 0;
2389           U8 *result;
2390           U8 *send;
2391           STRLEN l;
2392           UV nchar = 0;
2393           UV nwide = 0;
2394
2395           send = tmps + len;
2396           while (tmps < send) {
2397             UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2398             tmps += UTF8SKIP(tmps);
2399             targlen += UNISKIP(~c);
2400             nchar++;
2401             if (c > 0xff)
2402                 nwide++;
2403           }
2404
2405           /* Now rewind strings and write them. */
2406           tmps -= len;
2407
2408           if (nwide) {
2409               Newz(0, result, targlen + 1, U8);
2410               while (tmps < send) {
2411                   UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2412                   tmps += UTF8SKIP(tmps);
2413                   result = uvchr_to_utf8_flags(result, ~c, UNICODE_ALLOW_ANY);
2414               }
2415               *result = '\0';
2416               result -= targlen;
2417               sv_setpvn(TARG, (char*)result, targlen);
2418               SvUTF8_on(TARG);
2419           }
2420           else {
2421               Newz(0, result, nchar + 1, U8);
2422               while (tmps < send) {
2423                   U8 c = (U8)utf8n_to_uvchr(tmps, 0, &l, UTF8_ALLOW_ANY);
2424                   tmps += UTF8SKIP(tmps);
2425                   *result++ = ~c;
2426               }
2427               *result = '\0';
2428               result -= nchar;
2429               sv_setpvn(TARG, (char*)result, nchar);
2430               SvUTF8_off(TARG);
2431           }
2432           Safefree(result);
2433           SETs(TARG);
2434           RETURN;
2435         }
2436 #ifdef LIBERAL
2437         {
2438             register long *tmpl;
2439             for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2440                 *tmps = ~*tmps;
2441             tmpl = (long*)tmps;
2442             for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
2443                 *tmpl = ~*tmpl;
2444             tmps = (U8*)tmpl;
2445         }
2446 #endif
2447         for ( ; anum > 0; anum--, tmps++)
2448             *tmps = ~*tmps;
2449
2450         SETs(TARG);
2451       }
2452       RETURN;
2453     }
2454 }
2455
2456 /* integer versions of some of the above */
2457
2458 PP(pp_i_multiply)
2459 {
2460     dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
2461     {
2462       dPOPTOPiirl;
2463       SETi( left * right );
2464       RETURN;
2465     }
2466 }
2467
2468 PP(pp_i_divide)
2469 {
2470     dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
2471     {
2472       dPOPiv;
2473       if (value == 0)
2474         DIE(aTHX_ "Illegal division by zero");
2475       value = POPi / value;
2476       PUSHi( value );
2477       RETURN;
2478     }
2479 }
2480
2481 STATIC
2482 PP(pp_i_modulo_0)
2483 {
2484      /* This is the vanilla old i_modulo. */
2485      dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2486      {
2487           dPOPTOPiirl;
2488           if (!right)
2489                DIE(aTHX_ "Illegal modulus zero");
2490           SETi( left % right );
2491           RETURN;
2492      }
2493 }
2494
2495 #if defined(__GLIBC__) && IVSIZE == 8
2496 STATIC
2497 PP(pp_i_modulo_1)
2498 {
2499      /* This is the i_modulo with the workaround for the _moddi3 bug
2500       * in (at least) glibc 2.2.5 (the PERL_ABS() the workaround).
2501       * See below for pp_i_modulo. */
2502      dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2503      {
2504           dPOPTOPiirl;
2505           if (!right)
2506                DIE(aTHX_ "Illegal modulus zero");
2507           SETi( left % PERL_ABS(right) );
2508           RETURN;
2509      }
2510 }
2511 #endif
2512
2513 PP(pp_i_modulo)
2514 {
2515      dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2516      {
2517           dPOPTOPiirl;
2518           if (!right)
2519                DIE(aTHX_ "Illegal modulus zero");
2520           /* The assumption is to use hereafter the old vanilla version... */
2521           PL_op->op_ppaddr =
2522                PL_ppaddr[OP_I_MODULO] =
2523                    &Perl_pp_i_modulo_0;
2524           /* .. but if we have glibc, we might have a buggy _moddi3
2525            * (at least glicb 2.2.5 is known to have this bug), in other
2526            * words our integer modulus with negative quad as the second
2527            * argument might be broken.  Test for this and re-patch the
2528            * opcode dispatch table if that is the case, remembering to
2529            * also apply the workaround so that this first round works
2530            * right, too.  See [perl #9402] for more information. */
2531 #if defined(__GLIBC__) && IVSIZE == 8
2532           {
2533                IV l =   3;
2534                IV r = -10;
2535                /* Cannot do this check with inlined IV constants since
2536                 * that seems to work correctly even with the buggy glibc. */
2537                if (l % r == -3) {
2538                     /* Yikes, we have the bug.
2539                      * Patch in the workaround version. */
2540                     PL_op->op_ppaddr =
2541                          PL_ppaddr[OP_I_MODULO] =
2542                              &Perl_pp_i_modulo_1;
2543                     /* Make certain we work right this time, too. */
2544                     right = PERL_ABS(right);
2545                }
2546           }
2547 #endif
2548           SETi( left % right );
2549           RETURN;
2550      }
2551 }
2552
2553 PP(pp_i_add)
2554 {
2555     dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
2556     {
2557       dPOPTOPiirl_ul;
2558       SETi( left + right );
2559       RETURN;
2560     }
2561 }
2562
2563 PP(pp_i_subtract)
2564 {
2565     dSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
2566     {
2567       dPOPTOPiirl_ul;
2568       SETi( left - right );
2569       RETURN;
2570     }
2571 }
2572
2573 PP(pp_i_lt)
2574 {
2575     dSP; tryAMAGICbinSET(lt,0);
2576     {
2577       dPOPTOPiirl;
2578       SETs(boolSV(left < right));
2579       RETURN;
2580     }
2581 }
2582
2583 PP(pp_i_gt)
2584 {
2585     dSP; tryAMAGICbinSET(gt,0);
2586     {
2587       dPOPTOPiirl;
2588       SETs(boolSV(left > right));
2589       RETURN;
2590     }
2591 }
2592
2593 PP(pp_i_le)
2594 {
2595     dSP; tryAMAGICbinSET(le,0);
2596     {
2597       dPOPTOPiirl;
2598       SETs(boolSV(left <= right));
2599       RETURN;
2600     }
2601 }
2602
2603 PP(pp_i_ge)
2604 {
2605     dSP; tryAMAGICbinSET(ge,0);
2606     {
2607       dPOPTOPiirl;
2608       SETs(boolSV(left >= right));
2609       RETURN;
2610     }
2611 }
2612
2613 PP(pp_i_eq)
2614 {
2615     dSP; tryAMAGICbinSET(eq,0);
2616     {
2617       dPOPTOPiirl;
2618       SETs(boolSV(left == right));
2619       RETURN;
2620     }
2621 }
2622
2623 PP(pp_i_ne)
2624 {
2625     dSP; tryAMAGICbinSET(ne,0);
2626     {
2627       dPOPTOPiirl;
2628       SETs(boolSV(left != right));
2629       RETURN;
2630     }
2631 }
2632
2633 PP(pp_i_ncmp)
2634 {
2635     dSP; dTARGET; tryAMAGICbin(ncmp,0);
2636     {
2637       dPOPTOPiirl;
2638       I32 value;
2639
2640       if (left > right)
2641         value = 1;
2642       else if (left < right)
2643         value = -1;
2644       else
2645         value = 0;
2646       SETi(value);
2647       RETURN;
2648     }
2649 }
2650
2651 PP(pp_i_negate)
2652 {
2653     dSP; dTARGET; tryAMAGICun(neg);
2654     SETi(-TOPi);
2655     RETURN;
2656 }
2657
2658 /* High falutin' math. */
2659
2660 PP(pp_atan2)
2661 {
2662     dSP; dTARGET; tryAMAGICbin(atan2,0);
2663     {
2664       dPOPTOPnnrl;
2665       SETn(Perl_atan2(left, right));
2666       RETURN;
2667     }
2668 }
2669
2670 PP(pp_sin)
2671 {
2672     dSP; dTARGET; tryAMAGICun(sin);
2673     {
2674       NV value;
2675       value = POPn;
2676       value = Perl_sin(value);
2677       XPUSHn(value);
2678       RETURN;
2679     }
2680 }
2681
2682 PP(pp_cos)
2683 {
2684     dSP; dTARGET; tryAMAGICun(cos);
2685     {
2686       NV value;
2687       value = POPn;
2688       value = Perl_cos(value);
2689       XPUSHn(value);
2690       RETURN;
2691     }
2692 }
2693
2694 /* Support Configure command-line overrides for rand() functions.
2695    After 5.005, perhaps we should replace this by Configure support
2696    for drand48(), random(), or rand().  For 5.005, though, maintain
2697    compatibility by calling rand() but allow the user to override it.
2698    See INSTALL for details.  --Andy Dougherty  15 July 1998
2699 */
2700 /* Now it's after 5.005, and Configure supports drand48() and random(),
2701    in addition to rand().  So the overrides should not be needed any more.
2702    --Jarkko Hietaniemi  27 September 1998
2703  */
2704
2705 #ifndef HAS_DRAND48_PROTO
2706 extern double drand48 (void);
2707 #endif
2708
2709 PP(pp_rand)
2710 {
2711     dSP; dTARGET;
2712     NV value;
2713     if (MAXARG < 1)
2714         value = 1.0;
2715     else
2716         value = POPn;
2717     if (value == 0.0)
2718         value = 1.0;
2719     if (!PL_srand_called) {
2720         (void)seedDrand01((Rand_seed_t)seed());
2721         PL_srand_called = TRUE;
2722     }
2723     value *= Drand01();
2724     XPUSHn(value);
2725     RETURN;
2726 }
2727
2728 PP(pp_srand)
2729 {
2730     dSP;
2731     UV anum;
2732     if (MAXARG < 1)
2733         anum = seed();
2734     else
2735         anum = POPu;
2736     (void)seedDrand01((Rand_seed_t)anum);
2737     PL_srand_called = TRUE;
2738     EXTEND(SP, 1);
2739     RETPUSHYES;
2740 }
2741
2742 PP(pp_exp)
2743 {
2744     dSP; dTARGET; tryAMAGICun(exp);
2745     {
2746       NV value;
2747       value = POPn;
2748       value = Perl_exp(value);
2749       XPUSHn(value);
2750       RETURN;
2751     }
2752 }
2753
2754 PP(pp_log)
2755 {
2756     dSP; dTARGET; tryAMAGICun(log);
2757     {
2758       NV value;
2759       value = POPn;
2760       if (value <= 0.0) {
2761         SET_NUMERIC_STANDARD();
2762         DIE(aTHX_ "Can't take log of %"NVgf, value);
2763       }
2764       value = Perl_log(value);
2765       XPUSHn(value);
2766       RETURN;
2767     }
2768 }
2769
2770 PP(pp_sqrt)
2771 {
2772     dSP; dTARGET; tryAMAGICun(sqrt);
2773     {
2774       NV value;
2775       value = POPn;
2776       if (value < 0.0) {
2777         SET_NUMERIC_STANDARD();
2778         DIE(aTHX_ "Can't take sqrt of %"NVgf, value);
2779       }
2780       value = Perl_sqrt(value);
2781       XPUSHn(value);
2782       RETURN;
2783     }
2784 }
2785
2786 PP(pp_int)
2787 {
2788     dSP; dTARGET; tryAMAGICun(int);
2789     {
2790       NV value;
2791       IV iv = TOPi; /* attempt to convert to IV if possible. */
2792       /* XXX it's arguable that compiler casting to IV might be subtly
2793          different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2794          else preferring IV has introduced a subtle behaviour change bug. OTOH
2795          relying on floating point to be accurate is a bug.  */
2796
2797       if (SvIOK(TOPs)) {
2798         if (SvIsUV(TOPs)) {
2799             UV uv = TOPu;
2800             SETu(uv);
2801         } else
2802             SETi(iv);
2803       } else {
2804           value = TOPn;
2805           if (value >= 0.0) {
2806               if (value < (NV)UV_MAX + 0.5) {
2807                   SETu(U_V(value));
2808               } else {
2809                   SETn(Perl_floor(value));
2810               }
2811           }
2812           else {
2813               if (value > (NV)IV_MIN - 0.5) {
2814                   SETi(I_V(value));
2815               } else {
2816                   SETn(Perl_ceil(value));
2817               }
2818           }
2819       }
2820     }
2821     RETURN;
2822 }
2823
2824 PP(pp_abs)
2825 {
2826     dSP; dTARGET; tryAMAGICun(abs);
2827     {
2828       /* This will cache the NV value if string isn't actually integer  */
2829       IV iv = TOPi;
2830
2831       if (SvIOK(TOPs)) {
2832         /* IVX is precise  */
2833         if (SvIsUV(TOPs)) {
2834           SETu(TOPu);   /* force it to be numeric only */
2835         } else {
2836           if (iv >= 0) {
2837             SETi(iv);
2838           } else {
2839             if (iv != IV_MIN) {
2840               SETi(-iv);
2841             } else {
2842               /* 2s complement assumption. Also, not really needed as
2843                  IV_MIN and -IV_MIN should both be %100...00 and NV-able  */
2844               SETu(IV_MIN);
2845             }
2846           }
2847         }
2848       } else{
2849         NV value = TOPn;
2850         if (value < 0.0)
2851           value = -value;
2852         SETn(value);
2853       }
2854     }
2855     RETURN;
2856 }
2857
2858
2859 PP(pp_hex)
2860 {
2861     dSP; dTARGET;
2862     char *tmps;
2863     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2864     STRLEN len;
2865     NV result_nv;
2866     UV result_uv;
2867     SV* sv = POPs;
2868
2869     tmps = (SvPVx(sv, len));
2870     if (DO_UTF8(sv)) {
2871          /* If Unicode, try to downgrade
2872           * If not possible, croak. */
2873          SV* tsv = sv_2mortal(newSVsv(sv));
2874         
2875          SvUTF8_on(tsv);
2876          sv_utf8_downgrade(tsv, FALSE);
2877          tmps = SvPVX(tsv);
2878     }
2879     result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2880     if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
2881         XPUSHn(result_nv);
2882     }
2883     else {
2884         XPUSHu(result_uv);
2885     }
2886     RETURN;
2887 }
2888
2889 PP(pp_oct)
2890 {
2891     dSP; dTARGET;
2892     char *tmps;
2893     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES;
2894     STRLEN len;
2895     NV result_nv;
2896     UV result_uv;
2897     SV* sv = POPs;
2898
2899     tmps = (SvPVx(sv, len));
2900     if (DO_UTF8(sv)) {
2901          /* If Unicode, try to downgrade
2902           * If not possible, croak. */
2903          SV* tsv = sv_2mortal(newSVsv(sv));
2904         
2905          SvUTF8_on(tsv);
2906          sv_utf8_downgrade(tsv, FALSE);
2907          tmps = SvPVX(tsv);
2908     }
2909     while (*tmps && len && isSPACE(*tmps))
2910         tmps++, len--;
2911     if (*tmps == '0')
2912         tmps++, len--;
2913     if (*tmps == 'x')
2914         result_uv = grok_hex (tmps, &len, &flags, &result_nv);
2915     else if (*tmps == 'b')
2916         result_uv = grok_bin (tmps, &len, &flags, &result_nv);
2917     else
2918         result_uv = grok_oct (tmps, &len, &flags, &result_nv);
2919
2920     if (flags & PERL_SCAN_GREATER_THAN_UV_MAX) {
2921         XPUSHn(result_nv);
2922     }
2923     else {
2924         XPUSHu(result_uv);
2925     }
2926     RETURN;
2927 }
2928
2929 /* String stuff. */
2930
2931 PP(pp_length)
2932 {
2933     dSP; dTARGET;
2934     SV *sv = TOPs;
2935
2936     if (DO_UTF8(sv))
2937         SETi(sv_len_utf8(sv));
2938     else
2939         SETi(sv_len(sv));
2940     RETURN;
2941 }
2942
2943 PP(pp_substr)
2944 {
2945     dSP; dTARGET;
2946     SV *sv;
2947     I32 len = 0;
2948     STRLEN curlen;
2949     STRLEN utf8_curlen;
2950     I32 pos;
2951     I32 rem;
2952     I32 fail;
2953     I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
2954     char *tmps;
2955     I32 arybase = PL_curcop->cop_arybase;
2956     SV *repl_sv = NULL;
2957     char *repl = 0;
2958     STRLEN repl_len;
2959     int num_args = PL_op->op_private & 7;
2960     bool repl_need_utf8_upgrade = FALSE;
2961     bool repl_is_utf8 = FALSE;
2962
2963     SvTAINTED_off(TARG);                        /* decontaminate */
2964     SvUTF8_off(TARG);                           /* decontaminate */
2965     if (num_args > 2) {
2966         if (num_args > 3) {
2967             repl_sv = POPs;
2968             repl = SvPV(repl_sv, repl_len);
2969             repl_is_utf8 = DO_UTF8(repl_sv) && SvCUR(repl_sv);
2970         }
2971         len = POPi;
2972     }
2973     pos = POPi;
2974     sv = POPs;
2975     PUTBACK;
2976     if (repl_sv) {
2977         if (repl_is_utf8) {
2978             if (!DO_UTF8(sv))
2979                 sv_utf8_upgrade(sv);
2980         }
2981         else if (DO_UTF8(sv))
2982             repl_need_utf8_upgrade = TRUE;
2983     }
2984     tmps = SvPV(sv, curlen);
2985     if (DO_UTF8(sv)) {
2986         utf8_curlen = sv_len_utf8(sv);
2987         if (utf8_curlen == curlen)
2988             utf8_curlen = 0;
2989         else
2990             curlen = utf8_curlen;
2991     }
2992     else
2993         utf8_curlen = 0;
2994
2995     if (pos >= arybase) {
2996         pos -= arybase;
2997         rem = curlen-pos;
2998         fail = rem;
2999         if (num_args > 2) {
3000             if (len < 0) {
3001                 rem += len;
3002                 if (rem < 0)
3003                     rem = 0;
3004             }
3005             else if (rem > len)
3006                      rem = len;
3007         }
3008     }
3009     else {
3010         pos += curlen;
3011         if (num_args < 3)
3012             rem = curlen;
3013         else if (len >= 0) {
3014             rem = pos+len;
3015             if (rem > (I32)curlen)
3016                 rem = curlen;
3017         }
3018         else {
3019             rem = curlen+len;
3020             if (rem < pos)
3021                 rem = pos;
3022         }
3023         if (pos < 0)
3024             pos = 0;
3025         fail = rem;
3026         rem -= pos;
3027     }
3028     if (fail < 0) {
3029         if (lvalue || repl)
3030             Perl_croak(aTHX_ "substr outside of string");
3031         if (ckWARN(WARN_SUBSTR))
3032             Perl_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
3033         RETPUSHUNDEF;
3034     }
3035     else {
3036         I32 upos = pos;
3037         I32 urem = rem;
3038         if (utf8_curlen)
3039             sv_pos_u2b(sv, &pos, &rem);
3040         tmps += pos;
3041         sv_setpvn(TARG, tmps, rem);
3042 #ifdef USE_LOCALE_COLLATE
3043         sv_unmagic(TARG, PERL_MAGIC_collxfrm);
3044 #endif
3045         if (utf8_curlen)
3046             SvUTF8_on(TARG);
3047         if (repl) {
3048             SV* repl_sv_copy = NULL;
3049
3050             if (repl_need_utf8_upgrade) {
3051                 repl_sv_copy = newSVsv(repl_sv);
3052                 sv_utf8_upgrade(repl_sv_copy);
3053                 repl = SvPV(repl_sv_copy, repl_len);
3054                 repl_is_utf8 = DO_UTF8(repl_sv_copy) && SvCUR(sv);
3055             }
3056             sv_insert(sv, pos, rem, repl, repl_len);
3057             if (repl_is_utf8)
3058                 SvUTF8_on(sv);
3059             if (repl_sv_copy)
3060                 SvREFCNT_dec(repl_sv_copy);
3061         }
3062         else if (lvalue) {              /* it's an lvalue! */
3063             if (!SvGMAGICAL(sv)) {
3064                 if (SvROK(sv)) {
3065                     STRLEN n_a;
3066                     SvPV_force(sv,n_a);
3067                     if (ckWARN(WARN_SUBSTR))
3068                         Perl_warner(aTHX_ packWARN(WARN_SUBSTR),
3069                                 "Attempt to use reference as lvalue in substr");
3070                 }
3071                 if (SvOK(sv))           /* is it defined ? */
3072                     (void)SvPOK_only_UTF8(sv);
3073                 else
3074                     sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
3075             }
3076
3077             if (SvREFCNT(TARG) > 1)     /* don't share the TARG (#20933) */
3078                 TARG = sv_newmortal();
3079             if (SvTYPE(TARG) < SVt_PVLV) {
3080                 sv_upgrade(TARG, SVt_PVLV);
3081                 sv_magic(TARG, Nullsv, PERL_MAGIC_substr, Nullch, 0);
3082             }
3083             else
3084                 (void)SvOK_off(TARG);
3085
3086             LvTYPE(TARG) = 'x';
3087             if (LvTARG(TARG) != sv) {
3088                 if (LvTARG(TARG))
3089                     SvREFCNT_dec(LvTARG(TARG));
3090                 LvTARG(TARG) = SvREFCNT_inc(sv);
3091             }
3092             LvTARGOFF(TARG) = upos;
3093             LvTARGLEN(TARG) = urem;
3094         }
3095     }
3096     SPAGAIN;
3097     PUSHs(TARG);                /* avoid SvSETMAGIC here */
3098     RETURN;
3099 }
3100
3101 PP(pp_vec)
3102 {
3103     dSP; dTARGET;
3104     register IV size   = POPi;
3105     register IV offset = POPi;
3106     register SV *src = POPs;
3107     I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
3108
3109     SvTAINTED_off(TARG);                /* decontaminate */
3110     if (lvalue) {                       /* it's an lvalue! */
3111         if (SvREFCNT(TARG) > 1) /* don't share the TARG (#20933) */
3112             TARG = sv_newmortal();
3113         if (SvTYPE(TARG) < SVt_PVLV) {
3114             sv_upgrade(TARG, SVt_PVLV);
3115             sv_magic(TARG, Nullsv, PERL_MAGIC_vec, Nullch, 0);
3116         }
3117         LvTYPE(TARG) = 'v';
3118         if (LvTARG(TARG) != src) {
3119             if (LvTARG(TARG))
3120                 SvREFCNT_dec(LvTARG(TARG));
3121             LvTARG(TARG) = SvREFCNT_inc(src);
3122         }
3123         LvTARGOFF(TARG) = offset;
3124         LvTARGLEN(TARG) = size;
3125     }
3126
3127     sv_setuv(TARG, do_vecget(src, offset, size));
3128     PUSHs(TARG);
3129     RETURN;
3130 }
3131
3132 PP(pp_index)
3133 {
3134     dSP; dTARGET;
3135     SV *big;
3136     SV *little;
3137     I32 offset;
3138     I32 retval;
3139     char *tmps;
3140     char *tmps2;
3141     STRLEN biglen;
3142     I32 arybase = PL_curcop->cop_arybase;
3143
3144     if (MAXARG < 3)
3145         offset = 0;
3146     else
3147         offset = POPi - arybase;
3148     little = POPs;
3149     big = POPs;
3150     tmps = SvPV(big, biglen);
3151     if (offset > 0 && DO_UTF8(big))
3152         sv_pos_u2b(big, &offset, 0);
3153     if (offset < 0)
3154         offset = 0;
3155     else if (offset > (I32)biglen)
3156         offset = biglen;
3157     if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
3158       (unsigned char*)tmps + biglen, little, 0)))
3159         retval = -1;
3160     else
3161         retval = tmps2 - tmps;
3162     if (retval > 0 && DO_UTF8(big))
3163         sv_pos_b2u(big, &retval);
3164     PUSHi(retval + arybase);
3165     RETURN;
3166 }
3167
3168 PP(pp_rindex)
3169 {
3170     dSP; dTARGET;
3171     SV *big;
3172     SV *little;
3173     STRLEN blen;
3174     STRLEN llen;
3175     I32 offset;
3176     I32 retval;
3177     char *tmps;
3178     char *tmps2;
3179     I32 arybase = PL_curcop->cop_arybase;
3180
3181     if (MAXARG >= 3)
3182         offset = POPi;
3183     little = POPs;
3184     big = POPs;
3185     tmps2 = SvPV(little, llen);
3186     tmps = SvPV(big, blen);
3187     if (MAXARG < 3)
3188         offset = blen;
3189     else {
3190         if (offset > 0 && DO_UTF8(big))
3191             sv_pos_u2b(big, &offset, 0);
3192         offset = offset - arybase + llen;
3193     }
3194     if (offset < 0)
3195         offset = 0;
3196     else if (offset > (I32)blen)
3197         offset = blen;
3198     if (!(tmps2 = rninstr(tmps,  tmps  + offset,
3199                           tmps2, tmps2 + llen)))
3200         retval = -1;
3201     else
3202         retval = tmps2 - tmps;
3203     if (retval > 0 && DO_UTF8(big))
3204         sv_pos_b2u(big, &retval);
3205     PUSHi(retval + arybase);
3206     RETURN;
3207 }
3208
3209 PP(pp_sprintf)
3210 {
3211     dSP; dMARK; dORIGMARK; dTARGET;
3212     do_sprintf(TARG, SP-MARK, MARK+1);
3213     TAINT_IF(SvTAINTED(TARG));
3214     if (DO_UTF8(*(MARK+1)))
3215         SvUTF8_on(TARG);
3216     SP = ORIGMARK;
3217     PUSHTARG;
3218     RETURN;
3219 }
3220
3221 PP(pp_ord)
3222 {
3223     dSP; dTARGET;
3224     SV *argsv = POPs;
3225     STRLEN len;
3226     U8 *s = (U8*)SvPVx(argsv, len);
3227     SV *tmpsv;
3228
3229     if (PL_encoding && SvPOK(argsv) && !DO_UTF8(argsv)) {
3230         tmpsv = sv_2mortal(newSVsv(argsv));
3231         s = (U8*)sv_recode_to_utf8(tmpsv, PL_encoding);
3232         argsv = tmpsv;
3233     }
3234
3235     XPUSHu(DO_UTF8(argsv) ?
3236            utf8n_to_uvchr(s, UTF8_MAXLEN, 0, UTF8_ALLOW_ANYUV) :
3237            (*s & 0xff));
3238
3239     RETURN;
3240 }
3241
3242 PP(pp_chr)
3243 {
3244     dSP; dTARGET;
3245     char *tmps;
3246     UV value = POPu;
3247
3248     (void)SvUPGRADE(TARG,SVt_PV);
3249
3250     if (value > 255 && !IN_BYTES) {
3251         SvGROW(TARG, (STRLEN)UNISKIP(value)+1);
3252         tmps = (char*)uvchr_to_utf8_flags((U8*)SvPVX(TARG), value, 0);
3253         SvCUR_set(TARG, tmps - SvPVX(TARG));
3254         *tmps = '\0';
3255         (void)SvPOK_only(TARG);
3256         SvUTF8_on(TARG);
3257         XPUSHs(TARG);
3258         RETURN;
3259     }
3260
3261     SvGROW(TARG,2);
3262     SvCUR_set(TARG, 1);
3263     tmps = SvPVX(TARG);
3264     *tmps++ = (char)value;
3265     *tmps = '\0';
3266     (void)SvPOK_only(TARG);
3267     if (PL_encoding && !IN_BYTES) {
3268         sv_recode_to_utf8(TARG, PL_encoding);
3269         tmps = SvPVX(TARG);
3270         if (SvCUR(TARG) == 0 || !is_utf8_string((U8*)tmps, SvCUR(TARG)) ||
3271             memEQ(tmps, "\xef\xbf\xbd\0", 4)) {
3272             SvGROW(TARG, 3);
3273             tmps = SvPVX(TARG);
3274             SvCUR_set(TARG, 2);
3275             *tmps++ = (U8)UTF8_EIGHT_BIT_HI(value);
3276             *tmps++ = (U8)UTF8_EIGHT_BIT_LO(value);
3277             *tmps = '\0';
3278             SvUTF8_on(TARG);
3279         }
3280     }
3281     XPUSHs(TARG);
3282     RETURN;
3283 }
3284
3285 PP(pp_crypt)
3286 {
3287     dSP; dTARGET;
3288 #ifdef HAS_CRYPT
3289     dPOPTOPssrl;
3290     STRLEN n_a;
3291     STRLEN len;
3292     char *tmps = SvPV(left, len);
3293
3294     if (DO_UTF8(left)) {
3295          /* If Unicode, try to downgrade.
3296           * If not possible, croak.
3297           * Yes, we made this up.  */
3298          SV* tsv = sv_2mortal(newSVsv(left));
3299
3300          SvUTF8_on(tsv);
3301          sv_utf8_downgrade(tsv, FALSE);
3302          tmps = SvPVX(tsv);
3303     }
3304 #   ifdef USE_ITHREADS
3305 #     ifdef HAS_CRYPT_R
3306     if (!PL_reentrant_buffer->_crypt_struct_buffer) {
3307       /* This should be threadsafe because in ithreads there is only
3308        * one thread per interpreter.  If this would not be true,
3309        * we would need a mutex to protect this malloc. */
3310         PL_reentrant_buffer->_crypt_struct_buffer =
3311           (struct crypt_data *)safemalloc(sizeof(struct crypt_data));
3312 #if defined(__GLIBC__) || defined(__EMX__)
3313         if (PL_reentrant_buffer->_crypt_struct_buffer) {
3314             PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0;
3315             /* work around glibc-2.2.5 bug */
3316             PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0;
3317         }
3318 #endif
3319     }
3320 #     endif /* HAS_CRYPT_R */
3321 #   endif /* USE_ITHREADS */
3322 #   ifdef FCRYPT
3323     sv_setpv(TARG, fcrypt(tmps, SvPV(right, n_a)));
3324 #   else
3325     sv_setpv(TARG, PerlProc_crypt(tmps, SvPV(right, n_a)));
3326 #   endif
3327     SETs(TARG);
3328     RETURN;
3329 #else
3330     DIE(aTHX_
3331       "The crypt() function is unimplemented due to excessive paranoia.");
3332 #endif
3333 }
3334
3335 PP(pp_ucfirst)
3336 {
3337     dSP;
3338     SV *sv = TOPs;
3339     register U8 *s;
3340     STRLEN slen;
3341
3342     SvGETMAGIC(sv);
3343     if (DO_UTF8(sv) &&
3344         (s = (U8*)SvPV_nomg(sv, slen)) && slen &&
3345         UTF8_IS_START(*s)) {
3346         U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3347         STRLEN ulen;
3348         STRLEN tculen;
3349
3350         utf8_to_uvchr(s, &ulen);
3351         toTITLE_utf8(s, tmpbuf, &tculen);
3352         utf8_to_uvchr(tmpbuf, 0);
3353
3354         if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3355             dTARGET;
3356             /* slen is the byte length of the whole SV.
3357              * ulen is the byte length of the original Unicode character
3358              * stored as UTF-8 at s.
3359              * tculen is the byte length of the freshly titlecased
3360              * Unicode character stored as UTF-8 at tmpbuf.
3361              * We first set the result to be the titlecased character,
3362              * and then append the rest of the SV data. */
3363             sv_setpvn(TARG, (char*)tmpbuf, tculen);
3364             if (slen > ulen)
3365                 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3366             SvUTF8_on(TARG);
3367             SETs(TARG);
3368         }
3369         else {
3370             s = (U8*)SvPV_force_nomg(sv, slen);
3371             Copy(tmpbuf, s, tculen, U8);
3372         }
3373     }
3374     else {
3375         if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3376             dTARGET;
3377             SvUTF8_off(TARG);                           /* decontaminate */
3378             sv_setsv_nomg(TARG, sv);
3379             sv = TARG;
3380             SETs(sv);
3381         }
3382         s = (U8*)SvPV_force_nomg(sv, slen);
3383         if (*s) {
3384             if (IN_LOCALE_RUNTIME) {
3385                 TAINT;
3386                 SvTAINTED_on(sv);
3387                 *s = toUPPER_LC(*s);
3388             }
3389             else
3390                 *s = toUPPER(*s);
3391         }
3392     }
3393     SvSETMAGIC(sv);
3394     RETURN;
3395 }
3396
3397 PP(pp_lcfirst)
3398 {
3399     dSP;
3400     SV *sv = TOPs;
3401     register U8 *s;
3402     STRLEN slen;
3403
3404     SvGETMAGIC(sv);
3405     if (DO_UTF8(sv) &&
3406         (s = (U8*)SvPV_nomg(sv, slen)) && slen &&
3407         UTF8_IS_START(*s)) {
3408         STRLEN ulen;
3409         U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3410         U8 *tend;
3411         UV uv;
3412
3413         toLOWER_utf8(s, tmpbuf, &ulen);
3414         uv = utf8_to_uvchr(tmpbuf, 0);
3415         tend = uvchr_to_utf8(tmpbuf, uv);
3416
3417         if (!SvPADTMP(sv) || (STRLEN)(tend - tmpbuf) != ulen || SvREADONLY(sv)) {
3418             dTARGET;
3419             sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
3420             if (slen > ulen)
3421                 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3422             SvUTF8_on(TARG);
3423             SETs(TARG);
3424         }
3425         else {
3426             s = (U8*)SvPV_force_nomg(sv, slen);
3427             Copy(tmpbuf, s, ulen, U8);
3428         }
3429     }
3430     else {
3431         if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3432             dTARGET;
3433             SvUTF8_off(TARG);                           /* decontaminate */
3434             sv_setsv_nomg(TARG, sv);
3435             sv = TARG;
3436             SETs(sv);
3437         }
3438         s = (U8*)SvPV_force_nomg(sv, slen);
3439         if (*s) {
3440             if (IN_LOCALE_RUNTIME) {
3441                 TAINT;
3442                 SvTAINTED_on(sv);
3443                 *s = toLOWER_LC(*s);
3444             }
3445             else
3446                 *s = toLOWER(*s);
3447         }
3448     }
3449     SvSETMAGIC(sv);
3450     RETURN;
3451 }
3452
3453 PP(pp_uc)
3454 {
3455     dSP;
3456     SV *sv = TOPs;
3457     register U8 *s;
3458     STRLEN len;
3459
3460     SvGETMAGIC(sv);
3461     if (DO_UTF8(sv)) {
3462         dTARGET;
3463         STRLEN ulen;
3464         register U8 *d;
3465         U8 *send;
3466         U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3467
3468         s = (U8*)SvPV_nomg(sv,len);
3469         if (!len) {
3470             SvUTF8_off(TARG);                           /* decontaminate */
3471             sv_setpvn(TARG, "", 0);
3472             SETs(TARG);
3473         }
3474         else {
3475             STRLEN nchar = utf8_length(s, s + len);
3476
3477             (void)SvUPGRADE(TARG, SVt_PV);
3478             SvGROW(TARG, (nchar * UTF8_MAXLEN_UCLC) + 1);
3479             (void)SvPOK_only(TARG);
3480             d = (U8*)SvPVX(TARG);
3481             send = s + len;
3482             while (s < send) {
3483                 toUPPER_utf8(s, tmpbuf, &ulen);
3484                 Copy(tmpbuf, d, ulen, U8);
3485                 d += ulen;
3486                 s += UTF8SKIP(s);
3487             }
3488             *d = '\0';
3489             SvUTF8_on(TARG);
3490             SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
3491             SETs(TARG);
3492         }
3493     }
3494     else {
3495         if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3496             dTARGET;
3497             SvUTF8_off(TARG);                           /* decontaminate */
3498             sv_setsv_nomg(TARG, sv);
3499             sv = TARG;
3500             SETs(sv);
3501         }
3502         s = (U8*)SvPV_force_nomg(sv, len);
3503         if (len) {
3504             register U8 *send = s + len;
3505
3506             if (IN_LOCALE_RUNTIME) {
3507                 TAINT;
3508                 SvTAINTED_on(sv);
3509                 for (; s < send; s++)
3510                     *s = toUPPER_LC(*s);
3511             }
3512             else {
3513                 for (; s < send; s++)
3514                     *s = toUPPER(*s);
3515             }
3516         }
3517     }
3518     SvSETMAGIC(sv);
3519     RETURN;
3520 }
3521
3522 PP(pp_lc)
3523 {
3524     dSP;
3525     SV *sv = TOPs;
3526     register U8 *s;
3527     STRLEN len;
3528
3529     SvGETMAGIC(sv);
3530     if (DO_UTF8(sv)) {
3531         dTARGET;
3532         STRLEN ulen;
3533         register U8 *d;
3534         U8 *send;
3535         U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
3536
3537         s = (U8*)SvPV_nomg(sv,len);
3538         if (!len) {
3539             SvUTF8_off(TARG);                           /* decontaminate */
3540             sv_setpvn(TARG, "", 0);
3541             SETs(TARG);
3542         }
3543         else {
3544             STRLEN nchar = utf8_length(s, s + len);
3545
3546             (void)SvUPGRADE(TARG, SVt_PV);
3547             SvGROW(TARG, (nchar * UTF8_MAXLEN_UCLC) + 1);
3548             (void)SvPOK_only(TARG);
3549             d = (U8*)SvPVX(TARG);
3550             send = s + len;
3551             while (s < send) {
3552                 UV uv = toLOWER_utf8(s, tmpbuf, &ulen);
3553 #define GREEK_CAPITAL_LETTER_SIGMA 0x03A3 /* Unicode */
3554                 if (uv == GREEK_CAPITAL_LETTER_SIGMA) {
3555                      /*
3556                       * Now if the sigma is NOT followed by
3557                       * /$ignorable_sequence$cased_letter/;
3558                       * and it IS preceded by
3559                       * /$cased_letter$ignorable_sequence/;
3560                       * where $ignorable_sequence is
3561                       * [\x{2010}\x{AD}\p{Mn}]*
3562                       * and $cased_letter is
3563                       * [\p{Ll}\p{Lo}\p{Lt}]
3564                       * then it should be mapped to 0x03C2,
3565                       * (GREEK SMALL LETTER FINAL SIGMA),
3566                       * instead of staying 0x03A3.
3567                       * See lib/unicore/SpecCase.txt.
3568                       */
3569                 }
3570                 Copy(tmpbuf, d, ulen, U8);
3571                 d += ulen;
3572                 s += UTF8SKIP(s);
3573             }
3574             *d = '\0';
3575             SvUTF8_on(TARG);
3576             SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
3577             SETs(TARG);
3578         }
3579     }
3580     else {
3581         if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3582             dTARGET;
3583             SvUTF8_off(TARG);                           /* decontaminate */
3584             sv_setsv_nomg(TARG, sv);
3585             sv = TARG;
3586             SETs(sv);
3587         }
3588
3589         s = (U8*)SvPV_force_nomg(sv, len);
3590         if (len) {
3591             register U8 *send = s + len;
3592
3593             if (IN_LOCALE_RUNTIME) {
3594                 TAINT;
3595                 SvTAINTED_on(sv);
3596                 for (; s < send; s++)
3597                     *s = toLOWER_LC(*s);
3598             }
3599             else {
3600                 for (; s < send; s++)
3601                     *s = toLOWER(*s);
3602             }
3603         }
3604     }
3605     SvSETMAGIC(sv);
3606     RETURN;
3607 }
3608
3609 PP(pp_quotemeta)
3610 {
3611     dSP; dTARGET;
3612     SV *sv = TOPs;
3613     STRLEN len;
3614     register char *s = SvPV(sv,len);
3615     register char *d;
3616
3617     SvUTF8_off(TARG);                           /* decontaminate */
3618     if (len) {
3619         (void)SvUPGRADE(TARG, SVt_PV);
3620         SvGROW(TARG, (len * 2) + 1);
3621         d = SvPVX(TARG);
3622         if (DO_UTF8(sv)) {
3623             while (len) {
3624                 if (UTF8_IS_CONTINUED(*s)) {
3625                     STRLEN ulen = UTF8SKIP(s);
3626                     if (ulen > len)
3627                         ulen = len;
3628                     len -= ulen;
3629                     while (ulen--)
3630                         *d++ = *s++;
3631                 }
3632                 else {
3633                     if (!isALNUM(*s))
3634                         *d++ = '\\';
3635                     *d++ = *s++;
3636                     len--;
3637                 }
3638             }
3639             SvUTF8_on(TARG);
3640         }
3641         else {
3642             while (len--) {
3643                 if (!isALNUM(*s))
3644                     *d++ = '\\';
3645                 *d++ = *s++;
3646             }
3647         }
3648         *d = '\0';
3649         SvCUR_set(TARG, d - SvPVX(TARG));
3650         (void)SvPOK_only_UTF8(TARG);
3651     }
3652     else
3653         sv_setpvn(TARG, s, len);
3654     SETs(TARG);
3655     if (SvSMAGICAL(TARG))
3656         mg_set(TARG);
3657     RETURN;
3658 }
3659
3660 /* Arrays. */
3661
3662 PP(pp_aslice)
3663 {
3664     dSP; dMARK; dORIGMARK;
3665     register SV** svp;
3666     register AV* av = (AV*)POPs;
3667     register I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3668     I32 arybase = PL_curcop->cop_arybase;
3669     I32 elem;
3670
3671     if (SvTYPE(av) == SVt_PVAV) {
3672         if (lval && PL_op->op_private & OPpLVAL_INTRO) {
3673             I32 max = -1;
3674             for (svp = MARK + 1; svp <= SP; svp++) {
3675                 elem = SvIVx(*svp);
3676                 if (elem > max)
3677                     max = elem;
3678             }
3679             if (max > AvMAX(av))
3680                 av_extend(av, max);
3681         }
3682         while (++MARK <= SP) {
3683             elem = SvIVx(*MARK);
3684
3685             if (elem > 0)
3686                 elem -= arybase;
3687             svp = av_fetch(av, elem, lval);
3688             if (lval) {
3689                 if (!svp || *svp == &PL_sv_undef)
3690                     DIE(aTHX_ PL_no_aelem, elem);
3691                 if (PL_op->op_private & OPpLVAL_INTRO)
3692                     save_aelem(av, elem, svp);
3693             }
3694             *MARK = svp ? *svp : &PL_sv_undef;
3695         }
3696     }
3697     if (GIMME != G_ARRAY) {
3698         MARK = ORIGMARK;
3699         *++MARK = *SP;
3700         SP = MARK;
3701     }
3702     RETURN;
3703 }
3704
3705 /* Associative arrays. */
3706
3707 PP(pp_each)
3708 {
3709     dSP;
3710     HV *hash = (HV*)POPs;
3711     HE *entry;
3712     I32 gimme = GIMME_V;
3713
3714     PUTBACK;
3715     /* might clobber stack_sp */
3716     entry = hv_iternext(hash);
3717     SPAGAIN;
3718
3719     EXTEND(SP, 2);
3720     if (entry) {
3721         SV* sv = hv_iterkeysv(entry);
3722         PUSHs(sv);      /* won't clobber stack_sp */
3723         if (gimme == G_ARRAY) {
3724             SV *val;
3725             PUTBACK;
3726             /* might clobber stack_sp */
3727             val = hv_iterval(hash, entry);
3728             SPAGAIN;
3729             PUSHs(val);
3730         }
3731     }
3732     else if (gimme == G_SCALAR)
3733         RETPUSHUNDEF;
3734
3735     RETURN;
3736 }
3737
3738 PP(pp_values)
3739 {
3740     return do_kv();
3741 }
3742
3743 PP(pp_keys)
3744 {
3745     return do_kv();
3746 }
3747
3748 PP(pp_delete)
3749 {
3750     dSP;
3751     I32 gimme = GIMME_V;
3752     I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
3753     SV *sv;
3754     HV *hv;
3755
3756     if (PL_op->op_private & OPpSLICE) {
3757         dMARK; dORIGMARK;
3758         U32 hvtype;
3759         hv = (HV*)POPs;
3760         hvtype = SvTYPE(hv);
3761         if (hvtype == SVt_PVHV) {                       /* hash element */
3762             while (++MARK <= SP) {
3763                 sv = hv_delete_ent(hv, *MARK, discard, 0);
3764                 *MARK = sv ? sv : &PL_sv_undef;
3765             }
3766         }
3767         else if (hvtype == SVt_PVAV) {                  /* array element */
3768             if (PL_op->op_flags & OPf_SPECIAL) {
3769                 while (++MARK <= SP) {
3770                     sv = av_delete((AV*)hv, SvIV(*MARK), discard);
3771                     *MARK = sv ? sv : &PL_sv_undef;
3772                 }
3773             }
3774         }
3775         else
3776             DIE(aTHX_ "Not a HASH reference");
3777         if (discard)
3778             SP = ORIGMARK;
3779         else if (gimme == G_SCALAR) {
3780             MARK = ORIGMARK;
3781             *++MARK = *SP;
3782             SP = MARK;
3783         }
3784     }
3785     else {
3786         SV *keysv = POPs;
3787         hv = (HV*)POPs;
3788         if (SvTYPE(hv) == SVt_PVHV)
3789             sv = hv_delete_ent(hv, keysv, discard, 0);
3790         else if (SvTYPE(hv) == SVt_PVAV) {
3791             if (PL_op->op_flags & OPf_SPECIAL)
3792                 sv = av_delete((AV*)hv, SvIV(keysv), discard);
3793             else
3794                 DIE(aTHX_ "panic: avhv_delete no longer supported");
3795         }
3796         else
3797             DIE(aTHX_ "Not a HASH reference");
3798         if (!sv)
3799             sv = &PL_sv_undef;
3800         if (!discard)
3801             PUSHs(sv);
3802     }
3803     RETURN;
3804 }
3805
3806 PP(pp_exists)
3807 {
3808     dSP;
3809     SV *tmpsv;
3810     HV *hv;
3811
3812     if (PL_op->op_private & OPpEXISTS_SUB) {
3813         GV *gv;
3814         CV *cv;
3815         SV *sv = POPs;
3816         cv = sv_2cv(sv, &hv, &gv, FALSE);
3817         if (cv)
3818             RETPUSHYES;
3819         if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
3820             RETPUSHYES;
3821         RETPUSHNO;
3822     }
3823     tmpsv = POPs;
3824     hv = (HV*)POPs;
3825     if (SvTYPE(hv) == SVt_PVHV) {
3826         if (hv_exists_ent(hv, tmpsv, 0))
3827             RETPUSHYES;
3828     }
3829     else if (SvTYPE(hv) == SVt_PVAV) {
3830         if (PL_op->op_flags & OPf_SPECIAL) {            /* array element */
3831             if (av_exists((AV*)hv, SvIV(tmpsv)))
3832                 RETPUSHYES;
3833         }
3834     }
3835     else {
3836         DIE(aTHX_ "Not a HASH reference");
3837     }
3838     RETPUSHNO;
3839 }
3840
3841 PP(pp_hslice)
3842 {
3843     dSP; dMARK; dORIGMARK;
3844     register HV *hv = (HV*)POPs;
3845     register I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3846     bool localizing = PL_op->op_private & OPpLVAL_INTRO ? TRUE : FALSE;
3847     bool other_magic = FALSE;
3848
3849     if (localizing) {
3850         MAGIC *mg;
3851         HV *stash;
3852
3853         other_magic = mg_find((SV*)hv, PERL_MAGIC_env) ||
3854             ((mg = mg_find((SV*)hv, PERL_MAGIC_tied))
3855              /* Try to preserve the existenceness of a tied hash
3856               * element by using EXISTS and DELETE if possible.
3857               * Fallback to FETCH and STORE otherwise */
3858              && (stash = SvSTASH(SvRV(SvTIED_obj((SV*)hv, mg))))
3859              && gv_fetchmethod_autoload(stash, "EXISTS", TRUE)
3860              && gv_fetchmethod_autoload(stash, "DELETE", TRUE));
3861     }
3862
3863     while (++MARK <= SP) {
3864         SV *keysv = *MARK;
3865         SV **svp;
3866         HE *he;
3867         bool preeminent = FALSE;
3868
3869         if (localizing) {
3870             preeminent = SvRMAGICAL(hv) && !other_magic ? 1 :
3871                 hv_exists_ent(hv, keysv, 0);
3872         }
3873
3874         he = hv_fetch_ent(hv, keysv, lval, 0);
3875         svp = he ? &HeVAL(he) : 0;
3876
3877         if (lval) {
3878             if (!svp || *svp == &PL_sv_undef) {
3879                 STRLEN n_a;
3880                 DIE(aTHX_ PL_no_helem, SvPV(keysv, n_a));
3881             }
3882             if (localizing) {
3883                 if (preeminent)
3884                     save_helem(hv, keysv, svp);
3885                 else {
3886                     STRLEN keylen;
3887                     char *key = SvPV(keysv, keylen);
3888                     SAVEDELETE(hv, savepvn(key,keylen), keylen);
3889                 }
3890             }
3891         }
3892         *MARK = svp ? *svp : &PL_sv_undef;
3893     }
3894     if (GIMME != G_ARRAY) {
3895         MARK = ORIGMARK;
3896         *++MARK = *SP;
3897         SP = MARK;
3898     }
3899     RETURN;
3900 }
3901
3902 /* List operators. */
3903
3904 PP(pp_list)
3905 {
3906     dSP; dMARK;
3907     if (GIMME != G_ARRAY) {
3908         if (++MARK <= SP)
3909             *MARK = *SP;                /* unwanted list, return last item */
3910         else
3911             *MARK = &PL_sv_undef;
3912         SP = MARK;
3913     }
3914     RETURN;
3915 }
3916
3917 PP(pp_lslice)
3918 {
3919     dSP;
3920     SV **lastrelem = PL_stack_sp;
3921     SV **lastlelem = PL_stack_base + POPMARK;
3922     SV **firstlelem = PL_stack_base + POPMARK + 1;
3923     register SV **firstrelem = lastlelem + 1;
3924     I32 arybase = PL_curcop->cop_arybase;
3925     I32 lval = PL_op->op_flags & OPf_MOD;
3926     I32 is_something_there = lval;
3927
3928     register I32 max = lastrelem - lastlelem;
3929     register SV **lelem;
3930     register I32 ix;
3931
3932     if (GIMME != G_ARRAY) {
3933         ix = SvIVx(*lastlelem);
3934         if (ix < 0)
3935             ix += max;
3936         else
3937             ix -= arybase;
3938         if (ix < 0 || ix >= max)
3939             *firstlelem = &PL_sv_undef;
3940         else
3941             *firstlelem = firstrelem[ix];
3942         SP = firstlelem;
3943         RETURN;
3944     }
3945
3946     if (max == 0) {
3947         SP = firstlelem - 1;
3948         RETURN;
3949     }
3950
3951     for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
3952         ix = SvIVx(*lelem);
3953         if (ix < 0)
3954             ix += max;
3955         else
3956             ix -= arybase;
3957         if (ix < 0 || ix >= max)
3958             *lelem = &PL_sv_undef;
3959         else {
3960             is_something_there = TRUE;
3961             if (!(*lelem = firstrelem[ix]))
3962                 *lelem = &PL_sv_undef;
3963         }
3964     }
3965     if (is_something_there)
3966         SP = lastlelem;
3967     else
3968         SP = firstlelem - 1;
3969     RETURN;
3970 }
3971
3972 PP(pp_anonlist)
3973 {
3974     dSP; dMARK; dORIGMARK;
3975     I32 items = SP - MARK;
3976     SV *av = sv_2mortal((SV*)av_make(items, MARK+1));
3977     SP = ORIGMARK;              /* av_make() might realloc stack_sp */
3978     XPUSHs(av);
3979     RETURN;
3980 }
3981
3982 PP(pp_anonhash)
3983 {
3984     dSP; dMARK; dORIGMARK;
3985     HV* hv = (HV*)sv_2mortal((SV*)newHV());
3986
3987     while (MARK < SP) {
3988         SV* key = *++MARK;
3989         SV *val = NEWSV(46, 0);
3990         if (MARK < SP)
3991             sv_setsv(val, *++MARK);
3992         else if (ckWARN(WARN_MISC))
3993             Perl_warner(aTHX_ packWARN(WARN_MISC), "Odd number of elements in anonymous hash");
3994         (void)hv_store_ent(hv,key,val,0);
3995     }
3996     SP = ORIGMARK;
3997     XPUSHs((SV*)hv);
3998     RETURN;
3999 }
4000
4001 PP(pp_splice)
4002 {
4003     dSP; dMARK; dORIGMARK;
4004     register AV *ary = (AV*)*++MARK;
4005     register SV **src;
4006     register SV **dst;
4007     register I32 i;
4008     register I32 offset;
4009     register I32 length;
4010     I32 newlen;
4011     I32 after;
4012     I32 diff;
4013     SV **tmparyval = 0;
4014     MAGIC *mg;
4015
4016     if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4017         *MARK-- = SvTIED_obj((SV*)ary, mg);
4018         PUSHMARK(MARK);
4019         PUTBACK;
4020         ENTER;
4021         call_method("SPLICE",GIMME_V);
4022         LEAVE;
4023         SPAGAIN;
4024         RETURN;
4025     }
4026
4027     SP++;
4028
4029     if (++MARK < SP) {
4030         offset = i = SvIVx(*MARK);
4031         if (offset < 0)
4032             offset += AvFILLp(ary) + 1;
4033         else
4034             offset -= PL_curcop->cop_arybase;
4035         if (offset < 0)
4036             DIE(aTHX_ PL_no_aelem, i);
4037         if (++MARK < SP) {
4038             length = SvIVx(*MARK++);
4039             if (length < 0) {
4040                 length += AvFILLp(ary) - offset + 1;
4041                 if (length < 0)
4042                     length = 0;
4043             }
4044         }
4045         else
4046             length = AvMAX(ary) + 1;            /* close enough to infinity */
4047     }
4048     else {
4049         offset = 0;
4050         length = AvMAX(ary) + 1;
4051     }
4052     if (offset > AvFILLp(ary) + 1) {
4053         if (ckWARN(WARN_MISC))
4054             Perl_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
4055         offset = AvFILLp(ary) + 1;
4056     }
4057     after = AvFILLp(ary) + 1 - (offset + length);
4058     if (after < 0) {                            /* not that much array */
4059         length += after;                        /* offset+length now in array */
4060         after = 0;
4061         if (!AvALLOC(ary))
4062             av_extend(ary, 0);
4063     }
4064
4065     /* At this point, MARK .. SP-1 is our new LIST */
4066
4067     newlen = SP - MARK;
4068     diff = newlen - length;
4069     if (newlen && !AvREAL(ary) && AvREIFY(ary))
4070         av_reify(ary);
4071
4072     if (diff < 0) {                             /* shrinking the area */
4073         if (newlen) {
4074             New(451, tmparyval, newlen, SV*);   /* so remember insertion */
4075             Copy(MARK, tmparyval, newlen, SV*);
4076         }
4077
4078         MARK = ORIGMARK + 1;
4079         if (GIMME == G_ARRAY) {                 /* copy return vals to stack */
4080             MEXTEND(MARK, length);
4081             Copy(AvARRAY(ary)+offset, MARK, length, SV*);
4082             if (AvREAL(ary)) {
4083                 EXTEND_MORTAL(length);
4084                 for (i = length, dst = MARK; i; i--) {
4085                     sv_2mortal(*dst);   /* free them eventualy */
4086                     dst++;
4087                 }
4088             }
4089             MARK += length - 1;
4090         }
4091         else {
4092             *MARK = AvARRAY(ary)[offset+length-1];
4093             if (AvREAL(ary)) {
4094                 sv_2mortal(*MARK);
4095                 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
4096                     SvREFCNT_dec(*dst++);       /* free them now */
4097             }
4098         }
4099         AvFILLp(ary) += diff;
4100
4101         /* pull up or down? */
4102
4103         if (offset < after) {                   /* easier to pull up */
4104             if (offset) {                       /* esp. if nothing to pull */
4105                 src = &AvARRAY(ary)[offset-1];
4106                 dst = src - diff;               /* diff is negative */
4107                 for (i = offset; i > 0; i--)    /* can't trust Copy */
4108                     *dst-- = *src--;
4109             }
4110             dst = AvARRAY(ary);
4111             SvPVX(ary) = (char*)(AvARRAY(ary) - diff); /* diff is negative */
4112             AvMAX(ary) += diff;
4113         }
4114         else {
4115             if (after) {                        /* anything to pull down? */
4116                 src = AvARRAY(ary) + offset + length;
4117                 dst = src + diff;               /* diff is negative */
4118                 Move(src, dst, after, SV*);
4119             }
4120             dst = &AvARRAY(ary)[AvFILLp(ary)+1];
4121                                                 /* avoid later double free */
4122         }
4123         i = -diff;
4124         while (i)
4125             dst[--i] = &PL_sv_undef;
4126         
4127         if (newlen) {
4128             for (src = tmparyval, dst = AvARRAY(ary) + offset;
4129               newlen; newlen--) {
4130                 *dst = NEWSV(46, 0);
4131                 sv_setsv(*dst++, *src++);
4132             }
4133             Safefree(tmparyval);
4134         }
4135     }
4136     else {                                      /* no, expanding (or same) */
4137         if (length) {
4138             New(452, tmparyval, length, SV*);   /* so remember deletion */
4139             Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
4140         }
4141
4142         if (diff > 0) {                         /* expanding */
4143
4144             /* push up or down? */
4145
4146             if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
4147                 if (offset) {
4148                     src = AvARRAY(ary);
4149                     dst = src - diff;
4150                     Move(src, dst, offset, SV*);
4151                 }
4152                 SvPVX(ary) = (char*)(AvARRAY(ary) - diff);/* diff is positive */
4153                 AvMAX(ary) += diff;
4154                 AvFILLp(ary) += diff;
4155             }
4156             else {
4157                 if (AvFILLp(ary) + diff >= AvMAX(ary))  /* oh, well */
4158                     av_extend(ary, AvFILLp(ary) + diff);
4159                 AvFILLp(ary) += diff;
4160
4161                 if (after) {
4162                     dst = AvARRAY(ary) + AvFILLp(ary);
4163                     src = dst - diff;
4164                     for (i = after; i; i--) {
4165                         *dst-- = *src--;
4166                     }
4167                 }
4168             }
4169         }
4170
4171         for (src = MARK, dst = AvARRAY(ary) + offset; newlen; newlen--) {
4172             *dst = NEWSV(46, 0);
4173             sv_setsv(*dst++, *src++);
4174         }
4175         MARK = ORIGMARK + 1;
4176         if (GIMME == G_ARRAY) {                 /* copy return vals to stack */
4177             if (length) {
4178                 Copy(tmparyval, MARK, length, SV*);
4179                 if (AvREAL(ary)) {
4180                     EXTEND_MORTAL(length);
4181                     for (i = length, dst = MARK; i; i--) {
4182                         sv_2mortal(*dst);       /* free them eventualy */
4183                         dst++;
4184                     }
4185                 }
4186                 Safefree(tmparyval);
4187             }
4188             MARK += length - 1;
4189         }
4190         else if (length--) {
4191             *MARK = tmparyval[length];
4192             if (AvREAL(ary)) {
4193                 sv_2mortal(*MARK);
4194                 while (length-- > 0)
4195                     SvREFCNT_dec(tmparyval[length]);
4196             }
4197             Safefree(tmparyval);
4198         }
4199         else
4200             *MARK = &PL_sv_undef;
4201     }
4202     SP = MARK;
4203     RETURN;
4204 }
4205
4206 PP(pp_push)
4207 {
4208     dSP; dMARK; dORIGMARK; dTARGET;
4209     register AV *ary = (AV*)*++MARK;
4210     register SV *sv = &PL_sv_undef;
4211     MAGIC *mg;
4212
4213     if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4214         *MARK-- = SvTIED_obj((SV*)ary, mg);
4215         PUSHMARK(MARK);
4216         PUTBACK;
4217         ENTER;
4218         call_method("PUSH",G_SCALAR|G_DISCARD);
4219         LEAVE;
4220         SPAGAIN;
4221     }
4222     else {
4223         /* Why no pre-extend of ary here ? */
4224         for (++MARK; MARK <= SP; MARK++) {
4225             sv = NEWSV(51, 0);
4226             if (*MARK)
4227                 sv_setsv(sv, *MARK);
4228             av_push(ary, sv);
4229         }
4230     }
4231     SP = ORIGMARK;
4232     PUSHi( AvFILL(ary) + 1 );
4233     RETURN;
4234 }
4235
4236 PP(pp_pop)
4237 {
4238     dSP;
4239     AV *av = (AV*)POPs;
4240     SV *sv = av_pop(av);
4241     if (AvREAL(av))
4242         (void)sv_2mortal(sv);
4243     PUSHs(sv);
4244     RETURN;
4245 }
4246
4247 PP(pp_shift)
4248 {
4249     dSP;
4250     AV *av = (AV*)POPs;
4251     SV *sv = av_shift(av);
4252     EXTEND(SP, 1);
4253     if (!sv)
4254         RETPUSHUNDEF;
4255     if (AvREAL(av))
4256         (void)sv_2mortal(sv);
4257     PUSHs(sv);
4258     RETURN;
4259 }
4260
4261 PP(pp_unshift)
4262 {
4263     dSP; dMARK; dORIGMARK; dTARGET;
4264     register AV *ary = (AV*)*++MARK;
4265     register SV *sv;
4266     register I32 i = 0;
4267     MAGIC *mg;
4268
4269     if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4270         *MARK-- = SvTIED_obj((SV*)ary, mg);
4271         PUSHMARK(MARK);
4272         PUTBACK;
4273         ENTER;
4274         call_method("UNSHIFT",G_SCALAR|G_DISCARD);
4275         LEAVE;
4276         SPAGAIN;
4277     }
4278     else {
4279         av_unshift(ary, SP - MARK);
4280         while (MARK < SP) {
4281             sv = NEWSV(27, 0);
4282             sv_setsv(sv, *++MARK);
4283             (void)av_store(ary, i++, sv);
4284         }
4285     }
4286     SP = ORIGMARK;
4287     PUSHi( AvFILL(ary) + 1 );
4288     RETURN;
4289 }
4290
4291 PP(pp_reverse)
4292 {
4293     dSP; dMARK;
4294     register SV *tmp;
4295     SV **oldsp = SP;
4296
4297     if (GIMME == G_ARRAY) {
4298         MARK++;
4299         while (MARK < SP) {
4300             tmp = *MARK;
4301             *MARK++ = *SP;
4302             *SP-- = tmp;
4303         }
4304         /* safe as long as stack cannot get extended in the above */
4305         SP = oldsp;
4306     }
4307     else {
4308         register char *up;
4309         register char *down;
4310         register I32 tmp;
4311         dTARGET;
4312         STRLEN len;
4313
4314         SvUTF8_off(TARG);                               /* decontaminate */
4315         if (SP - MARK > 1)
4316             do_join(TARG, &PL_sv_no, MARK, SP);
4317         else
4318             sv_setsv(TARG, (SP > MARK) ? *SP : DEFSV);
4319         up = SvPV_force(TARG, len);
4320         if (len > 1) {
4321             if (DO_UTF8(TARG)) {        /* first reverse each character */
4322                 U8* s = (U8*)SvPVX(TARG);
4323                 U8* send = (U8*)(s + len);
4324                 while (s < send) {
4325                     if (UTF8_IS_INVARIANT(*s)) {
4326                         s++;
4327                         continue;
4328                     }
4329                     else {
4330                         if (!utf8_to_uvchr(s, 0))
4331                             break;
4332                         up = (char*)s;
4333                         s += UTF8SKIP(s);
4334                         down = (char*)(s - 1);
4335                         /* reverse this character */
4336                         while (down > up) {
4337                             tmp = *up;
4338                             *up++ = *down;
4339                             *down-- = (char)tmp;
4340                         }
4341                     }
4342                 }
4343                 up = SvPVX(TARG);
4344             }
4345             down = SvPVX(TARG) + len - 1;
4346             while (down > up) {
4347                 tmp = *up;
4348                 *up++ = *down;
4349                 *down-- = (char)tmp;
4350             }
4351             (void)SvPOK_only_UTF8(TARG);
4352         }
4353         SP = MARK + 1;
4354         SETTARG;
4355     }
4356     RETURN;
4357 }
4358
4359 PP(pp_split)
4360 {
4361     dSP; dTARG;
4362     AV *ary;
4363     register IV limit = POPi;                   /* note, negative is forever */
4364     SV *sv = POPs;
4365     STRLEN len;
4366     register char *s = SvPV(sv, len);
4367     bool do_utf8 = DO_UTF8(sv);
4368     char *strend = s + len;
4369     register PMOP *pm;
4370     register REGEXP *rx;
4371     register SV *dstr;
4372     register char *m;
4373     I32 iters = 0;
4374     STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (strend - s);
4375     I32 maxiters = slen + 10;
4376     I32 i;
4377     char *orig;
4378     I32 origlimit = limit;
4379     I32 realarray = 0;
4380     I32 base;
4381     AV *oldstack = PL_curstack;
4382     I32 gimme = GIMME_V;
4383     I32 oldsave = PL_savestack_ix;
4384     I32 make_mortal = 1;
4385     MAGIC *mg = (MAGIC *) NULL;
4386
4387 #ifdef DEBUGGING
4388     Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4389 #else
4390     pm = (PMOP*)POPs;
4391 #endif
4392     if (!pm || !s)
4393         DIE(aTHX_ "panic: pp_split");
4394     rx = PM_GETRE(pm);
4395
4396     TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
4397              (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
4398
4399     RX_MATCH_UTF8_set(rx, do_utf8);
4400
4401     if (pm->op_pmreplroot) {
4402 #ifdef USE_ITHREADS
4403         ary = GvAVn((GV*)PAD_SVl(INT2PTR(PADOFFSET, pm->op_pmreplroot)));
4404 #else
4405         ary = GvAVn((GV*)pm->op_pmreplroot);
4406 #endif
4407     }
4408     else if (gimme != G_ARRAY)
4409         ary = GvAVn(PL_defgv);
4410     else
4411         ary = Nullav;
4412     if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4413         realarray = 1;
4414         PUTBACK;
4415         av_extend(ary,0);
4416         av_clear(ary);
4417         SPAGAIN;
4418         if ((mg = SvTIED_mg((SV*)ary, PERL_MAGIC_tied))) {
4419             PUSHMARK(SP);
4420             XPUSHs(SvTIED_obj((SV*)ary, mg));
4421         }
4422         else {
4423             if (!AvREAL(ary)) {
4424                 AvREAL_on(ary);
4425                 AvREIFY_off(ary);
4426                 for (i = AvFILLp(ary); i >= 0; i--)
4427                     AvARRAY(ary)[i] = &PL_sv_undef;     /* don't free mere refs */
4428             }
4429             /* temporarily switch stacks */
4430             SWITCHSTACK(PL_curstack, ary);
4431             PL_curstackinfo->si_stack = ary;
4432             make_mortal = 0;
4433         }
4434     }
4435     base = SP - PL_stack_base;
4436     orig = s;
4437     if (pm->op_pmflags & PMf_SKIPWHITE) {
4438         if (pm->op_pmflags & PMf_LOCALE) {
4439             while (isSPACE_LC(*s))
4440                 s++;
4441         }
4442         else {
4443             while (isSPACE(*s))
4444                 s++;
4445         }
4446     }
4447     if ((int)(pm->op_pmflags & PMf_MULTILINE) != PL_multiline) {
4448         SAVEINT(PL_multiline);
4449         PL_multiline = pm->op_pmflags & PMf_MULTILINE;
4450     }
4451
4452     if (!limit)
4453         limit = maxiters + 2;
4454     if (pm->op_pmflags & PMf_WHITE) {
4455         while (--limit) {
4456             m = s;
4457             while (m < strend &&
4458                    !((pm->op_pmflags & PMf_LOCALE)
4459                      ? isSPACE_LC(*m) : isSPACE(*m)))
4460                 ++m;
4461             if (m >= strend)
4462                 break;
4463
4464             dstr = NEWSV(30, m-s);
4465             sv_setpvn(dstr, s, m-s);
4466             if (make_mortal)
4467                 sv_2mortal(dstr);
4468             if (do_utf8)
4469                 (void)SvUTF8_on(dstr);
4470             XPUSHs(dstr);
4471
4472             s = m + 1;
4473             while (s < strend &&
4474                    ((pm->op_pmflags & PMf_LOCALE)
4475                     ? isSPACE_LC(*s) : isSPACE(*s)))
4476                 ++s;
4477         }
4478     }
4479     else if (strEQ("^", rx->precomp)) {
4480         while (--limit) {
4481             /*SUPPRESS 530*/
4482             for (m = s; m < strend && *m != '\n'; m++) ;
4483             m++;
4484             if (m >= strend)
4485                 break;
4486             dstr = NEWSV(30, m-s);
4487             sv_setpvn(dstr, s, m-s);
4488             if (make_mortal)
4489                 sv_2mortal(dstr);
4490             if (do_utf8)
4491                 (void)SvUTF8_on(dstr);
4492             XPUSHs(dstr);
4493             s = m;
4494         }
4495     }
4496     else if (do_utf8 == ((rx->reganch & ROPT_UTF8) != 0) &&
4497              (rx->reganch & RE_USE_INTUIT) && !rx->nparens
4498              && (rx->reganch & ROPT_CHECK_ALL)
4499              && !(rx->reganch & ROPT_ANCH)) {
4500         int tail = (rx->reganch & RE_INTUIT_TAIL);
4501         SV *csv = CALLREG_INTUIT_STRING(aTHX_ rx);
4502
4503         len = rx->minlen;
4504         if (len == 1 && !(rx->reganch & ROPT_UTF8) && !tail) {
4505             STRLEN n_a;
4506             char c = *SvPV(csv, n_a);
4507             while (--limit) {
4508                 /*SUPPRESS 530*/
4509                 for (m = s; m < strend && *m != c; m++) ;
4510                 if (m >= strend)
4511                     break;
4512                 dstr = NEWSV(30, m-s);
4513                 sv_setpvn(dstr, s, m-s);
4514                 if (make_mortal)
4515                     sv_2mortal(dstr);
4516                 if (do_utf8)
4517                     (void)SvUTF8_on(dstr);
4518                 XPUSHs(dstr);
4519                 /* The rx->minlen is in characters but we want to step
4520                  * s ahead by bytes. */
4521                 if (do_utf8)
4522                     s = (char*)utf8_hop((U8*)m, len);
4523                 else
4524                     s = m + len; /* Fake \n at the end */
4525             }
4526         }
4527         else {
4528 #ifndef lint
4529             while (s < strend && --limit &&
4530               (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
4531                              csv, PL_multiline ? FBMrf_MULTILINE : 0)) )
4532 #endif
4533             {
4534                 dstr = NEWSV(31, m-s);
4535                 sv_setpvn(dstr, s, m-s);
4536                 if (make_mortal)
4537                     sv_2mortal(dstr);
4538                 if (do_utf8)
4539                     (void)SvUTF8_on(dstr);
4540                 XPUSHs(dstr);
4541                 /* The rx->minlen is in characters but we want to step
4542                  * s ahead by bytes. */
4543                 if (do_utf8)
4544                     s = (char*)utf8_hop((U8*)m, len);
4545                 else
4546                     s = m + len; /* Fake \n at the end */
4547             }
4548         }
4549     }
4550     else {
4551         maxiters += slen * rx->nparens;
4552         while (s < strend && --limit)
4553         {
4554             PUTBACK;
4555             i = CALLREGEXEC(aTHX_ rx, s, strend, orig, 1 , sv, NULL, 0);
4556             SPAGAIN;
4557             if (i == 0)
4558                 break;
4559             TAINT_IF(RX_MATCH_TAINTED(rx));
4560             if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
4561                 m = s;
4562                 s = orig;
4563                 orig = rx->subbeg;
4564                 s = orig + (m - s);
4565                 strend = s + (strend - m);
4566             }
4567             m = rx->startp[0] + orig;
4568             dstr = NEWSV(32, m-s);
4569             sv_setpvn(dstr, s, m-s);
4570             if (make_mortal)
4571                 sv_2mortal(dstr);
4572             if (do_utf8)
4573                 (void)SvUTF8_on(dstr);
4574             XPUSHs(dstr);
4575             if (rx->nparens) {
4576                 for (i = 1; i <= (I32)rx->nparens; i++) {
4577                     s = rx->startp[i] + orig;
4578                     m = rx->endp[i] + orig;
4579
4580                     /* japhy (07/27/01) -- the (m && s) test doesn't catch
4581                        parens that didn't match -- they should be set to
4582                        undef, not the empty string */
4583                     if (m >= orig && s >= orig) {
4584                         dstr = NEWSV(33, m-s);
4585                         sv_setpvn(dstr, s, m-s);
4586                     }
4587                     else
4588                         dstr = &PL_sv_undef;  /* undef, not "" */
4589                     if (make_mortal)
4590                         sv_2mortal(dstr);
4591                     if (do_utf8)
4592                         (void)SvUTF8_on(dstr);
4593                     XPUSHs(dstr);
4594                 }
4595             }
4596             s = rx->endp[0] + orig;
4597         }
4598     }
4599
4600     LEAVE_SCOPE(oldsave);
4601     iters = (SP - PL_stack_base) - base;
4602     if (iters > maxiters)
4603         DIE(aTHX_ "Split loop");
4604
4605     /* keep field after final delim? */
4606     if (s < strend || (iters && origlimit)) {
4607         STRLEN l = strend - s;
4608         dstr = NEWSV(34, l);
4609         sv_setpvn(dstr, s, l);
4610         if (make_mortal)
4611             sv_2mortal(dstr);
4612         if (do_utf8)
4613             (void)SvUTF8_on(dstr);
4614         XPUSHs(dstr);
4615         iters++;
4616     }
4617     else if (!origlimit) {
4618         while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
4619             if (TOPs && !make_mortal)
4620                 sv_2mortal(TOPs);
4621             iters--;
4622             SP--;
4623         }
4624     }
4625
4626     if (realarray) {
4627         if (!mg) {
4628             SWITCHSTACK(ary, oldstack);
4629             PL_curstackinfo->si_stack = oldstack;
4630             if (SvSMAGICAL(ary)) {
4631                 PUTBACK;
4632                 mg_set((SV*)ary);
4633                 SPAGAIN;
4634             }
4635             if (gimme == G_ARRAY) {
4636                 EXTEND(SP, iters);
4637                 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4638                 SP += iters;
4639                 RETURN;
4640             }
4641         }
4642         else {
4643             PUTBACK;
4644             ENTER;
4645             call_method("PUSH",G_SCALAR|G_DISCARD);
4646             LEAVE;
4647             SPAGAIN;
4648             if (gimme == G_ARRAY) {
4649                 /* EXTEND should not be needed - we just popped them */
4650                 EXTEND(SP, iters);
4651                 for (i=0; i < iters; i++) {
4652                     SV **svp = av_fetch(ary, i, FALSE);
4653                     PUSHs((svp) ? *svp : &PL_sv_undef);
4654                 }
4655                 RETURN;
4656             }
4657         }
4658     }
4659     else {
4660         if (gimme == G_ARRAY)
4661             RETURN;
4662     }
4663
4664     GETTARGET;
4665     PUSHi(iters);
4666     RETURN;
4667 }
4668
4669 PP(pp_lock)
4670 {
4671     dSP;
4672     dTOPss;
4673     SV *retsv = sv;
4674     SvLOCK(sv);
4675     if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
4676         || SvTYPE(retsv) == SVt_PVCV) {
4677         retsv = refto(retsv);
4678     }
4679     SETs(retsv);
4680     RETURN;
4681 }
4682
4683 PP(pp_threadsv)
4684 {
4685     DIE(aTHX_ "tried to access per-thread data in non-threaded perl");
4686 }