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