ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/staticperl/perl/pp.c
Revision: 1.1
Committed: Thu Jun 30 14:26:42 2005 UTC (21 years, 3 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: PERL-5-8-7, HEAD
Branch point for: PERL
Log Message:
*** empty log message ***

File Contents

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