source: trunk/third/perl/pp_hot.c @ 17035

Revision 17035, 69.2 KB checked in by zacheiss, 23 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r17034, which included commits to RCS files with non-trunk default branches.
Line 
1/*    pp_hot.c
2 *
3 *    Copyright (c) 1991-2001, Larry Wall
4 *
5 *    You may distribute under the terms of either the GNU General Public
6 *    License or the Artistic License, as specified in the README file.
7 *
8 */
9
10/*
11 * Then he heard Merry change the note, and up went the Horn-cry of Buckland,
12 * shaking the air.
13 *
14 *            Awake!  Awake!  Fear, Fire, Foes!  Awake!
15 *                     Fire, Foes!  Awake!
16 */
17
18#include "EXTERN.h"
19#define PERL_IN_PP_HOT_C
20#include "perl.h"
21
22/* Hot code. */
23
24#ifdef USE_THREADS
25static void unset_cvowner(pTHXo_ void *cvarg);
26#endif /* USE_THREADS */
27
28PP(pp_const)
29{
30    dSP;
31    XPUSHs(cSVOP_sv);
32    RETURN;
33}
34
35PP(pp_nextstate)
36{
37    PL_curcop = (COP*)PL_op;
38    TAINT_NOT;          /* Each statement is presumed innocent */
39    PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
40    FREETMPS;
41    return NORMAL;
42}
43
44PP(pp_gvsv)
45{
46    dSP;
47    EXTEND(SP,1);
48    if (PL_op->op_private & OPpLVAL_INTRO)
49        PUSHs(save_scalar(cGVOP_gv));
50    else
51        PUSHs(GvSV(cGVOP_gv));
52    RETURN;
53}
54
55PP(pp_null)
56{
57    return NORMAL;
58}
59
60PP(pp_setstate)
61{
62    PL_curcop = (COP*)PL_op;
63    return NORMAL;
64}
65
66PP(pp_pushmark)
67{
68    PUSHMARK(PL_stack_sp);
69    return NORMAL;
70}
71
72PP(pp_stringify)
73{
74    dSP; dTARGET;
75    STRLEN len;
76    char *s;
77    s = SvPV(TOPs,len);
78    sv_setpvn(TARG,s,len);
79    if (SvUTF8(TOPs))
80        SvUTF8_on(TARG);
81    else
82        SvUTF8_off(TARG);
83    SETTARG;
84    RETURN;
85}
86
87PP(pp_gv)
88{
89    dSP;
90    XPUSHs((SV*)cGVOP_gv);
91    RETURN;
92}
93
94PP(pp_and)
95{
96    dSP;
97    if (!SvTRUE(TOPs))
98        RETURN;
99    else {
100        --SP;
101        RETURNOP(cLOGOP->op_other);
102    }
103}
104
105PP(pp_sassign)
106{
107    dSP; dPOPTOPssrl;
108
109    if (PL_op->op_private & OPpASSIGN_BACKWARDS) {
110        SV *temp;
111        temp = left; left = right; right = temp;
112    }
113    if (PL_tainting && PL_tainted && !SvTAINTED(left))
114        TAINT_NOT;
115    SvSetMagicSV(right, left);
116    SETs(right);
117    RETURN;
118}
119
120PP(pp_cond_expr)
121{
122    dSP;
123    if (SvTRUEx(POPs))
124        RETURNOP(cLOGOP->op_other);
125    else
126        RETURNOP(cLOGOP->op_next);
127}
128
129PP(pp_unstack)
130{
131    I32 oldsave;
132    TAINT_NOT;          /* Each statement is presumed innocent */
133    PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
134    FREETMPS;
135    oldsave = PL_scopestack[PL_scopestack_ix - 1];
136    LEAVE_SCOPE(oldsave);
137    return NORMAL;
138}
139
140PP(pp_concat)
141{
142  dSP; dATARGET; tryAMAGICbin(concat,opASSIGN);
143  {
144    dPOPTOPssrl;
145    SV* rcopy = Nullsv;
146
147    if (SvGMAGICAL(left))
148        mg_get(left);
149    if (TARG == right && SvGMAGICAL(right))
150        mg_get(right);
151
152    if (TARG == right && left != right)
153        /* Clone since otherwise we cannot prepend. */
154        rcopy = sv_2mortal(newSVsv(right));
155
156    if (TARG != left)
157        sv_setsv(TARG, left);
158
159    if (TARG == right) {
160        if (left == right) {
161            /*  $right = $right . $right; */
162            STRLEN rlen;
163            char *rpv = SvPV(right, rlen);
164
165            sv_catpvn(TARG, rpv, rlen);
166        }
167        else /* $right = $left  . $right; */
168            sv_catsv(TARG, rcopy);
169    }
170    else {
171        if (!SvOK(TARG)) /* Avoid warning when concatenating to undef. */
172            sv_setpv(TARG, "");
173        /* $other = $left . $right; */
174        /* $left  = $left . $right; */
175        sv_catsv(TARG, right);
176    }
177
178#if defined(PERL_Y2KWARN)
179    if ((SvIOK(right) || SvNOK(right)) && ckWARN(WARN_Y2K)) {
180        STRLEN n;
181        char *s = SvPV(TARG,n);
182        if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
183            && (n == 2 || !isDIGIT(s[n-3])))
184        {
185            Perl_warner(aTHX_ WARN_Y2K, "Possible Y2K bug: %s",
186                        "about to append an integer to '19'");
187        }
188    }
189#endif
190
191    SETTARG;
192    RETURN;
193  }
194}
195
196PP(pp_padsv)
197{
198    dSP; dTARGET;
199    XPUSHs(TARG);
200    if (PL_op->op_flags & OPf_MOD) {
201        if (PL_op->op_private & OPpLVAL_INTRO)
202            SAVECLEARSV(PL_curpad[PL_op->op_targ]);
203        else if (PL_op->op_private & OPpDEREF) {
204            PUTBACK;
205            vivify_ref(PL_curpad[PL_op->op_targ], PL_op->op_private & OPpDEREF);
206            SPAGAIN;
207        }
208    }
209    RETURN;
210}
211
212PP(pp_readline)
213{
214    tryAMAGICunTARGET(iter, 0);
215    PL_last_in_gv = (GV*)(*PL_stack_sp--);
216    if (SvTYPE(PL_last_in_gv) != SVt_PVGV) {
217        if (SvROK(PL_last_in_gv) && SvTYPE(SvRV(PL_last_in_gv)) == SVt_PVGV)
218            PL_last_in_gv = (GV*)SvRV(PL_last_in_gv);
219        else {
220            dSP;
221            XPUSHs((SV*)PL_last_in_gv);
222            PUTBACK;
223            pp_rv2gv();
224            PL_last_in_gv = (GV*)(*PL_stack_sp--);
225        }
226    }
227    return do_readline();
228}
229
230PP(pp_eq)
231{
232    dSP; tryAMAGICbinSET(eq,0);
233    {
234      dPOPnv;
235      SETs(boolSV(TOPn == value));
236      RETURN;
237    }
238}
239
240PP(pp_preinc)
241{
242    dSP;
243    if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
244        DIE(aTHX_ PL_no_modify);
245    if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
246        SvIVX(TOPs) != IV_MAX)
247    {
248        ++SvIVX(TOPs);
249        SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
250    }
251    else
252        sv_inc(TOPs);
253    SvSETMAGIC(TOPs);
254    return NORMAL;
255}
256
257PP(pp_or)
258{
259    dSP;
260    if (SvTRUE(TOPs))
261        RETURN;
262    else {
263        --SP;
264        RETURNOP(cLOGOP->op_other);
265    }
266}
267
268PP(pp_add)
269{
270    dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
271    {
272      dPOPTOPnnrl_ul;
273      SETn( left + right );
274      RETURN;
275    }
276}
277
278PP(pp_aelemfast)
279{
280    dSP;
281    AV *av = GvAV(cGVOP_gv);
282    U32 lval = PL_op->op_flags & OPf_MOD;
283    SV** svp = av_fetch(av, PL_op->op_private, lval);
284    SV *sv = (svp ? *svp : &PL_sv_undef);
285    EXTEND(SP, 1);
286    if (!lval && SvGMAGICAL(sv))        /* see note in pp_helem() */
287        sv = sv_mortalcopy(sv);
288    PUSHs(sv);
289    RETURN;
290}
291
292PP(pp_join)
293{
294    dSP; dMARK; dTARGET;
295    MARK++;
296    do_join(TARG, *MARK, MARK, SP);
297    SP = MARK;
298    SETs(TARG);
299    RETURN;
300}
301
302PP(pp_pushre)
303{
304    dSP;
305#ifdef DEBUGGING
306    /*
307     * We ass_u_me that LvTARGOFF() comes first, and that two STRLENs
308     * will be enough to hold an OP*.
309     */
310    SV* sv = sv_newmortal();
311    sv_upgrade(sv, SVt_PVLV);
312    LvTYPE(sv) = '/';
313    Copy(&PL_op, &LvTARGOFF(sv), 1, OP*);
314    XPUSHs(sv);
315#else
316    XPUSHs((SV*)PL_op);
317#endif
318    RETURN;
319}
320
321/* Oversized hot code. */
322
323PP(pp_print)
324{
325    dSP; dMARK; dORIGMARK;
326    GV *gv;
327    IO *io;
328    register PerlIO *fp;
329    MAGIC *mg;
330    STRLEN n_a;
331
332    if (PL_op->op_flags & OPf_STACKED)
333        gv = (GV*)*++MARK;
334    else
335        gv = PL_defoutgv;
336    if ((mg = SvTIED_mg((SV*)gv, 'q'))) {
337      had_magic:
338        if (MARK == ORIGMARK) {
339            /* If using default handle then we need to make space to
340             * pass object as 1st arg, so move other args up ...
341             */
342            MEXTEND(SP, 1);
343            ++MARK;
344            Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
345            ++SP;
346        }
347        PUSHMARK(MARK - 1);
348        *MARK = SvTIED_obj((SV*)gv, mg);
349        PUTBACK;
350        ENTER;
351        call_method("PRINT", G_SCALAR);
352        LEAVE;
353        SPAGAIN;
354        MARK = ORIGMARK + 1;
355        *MARK = *SP;
356        SP = MARK;
357        RETURN;
358    }
359    if (!(io = GvIO(gv))) {
360        if ((GvEGV(gv)) && (mg = SvTIED_mg((SV*)GvEGV(gv),'q')))
361            goto had_magic;
362        if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
363            report_evil_fh(gv, io, PL_op->op_type);
364        SETERRNO(EBADF,RMS$_IFI);
365        goto just_say_no;
366    }
367    else if (!(fp = IoOFP(io))) {
368        if (ckWARN2(WARN_CLOSED, WARN_IO))  {
369            if (IoIFP(io)) {
370                /* integrate with report_evil_fh()? */
371                char *name = NULL;
372                if (isGV(gv)) {
373                    SV* sv = sv_newmortal();
374                    gv_efullname4(sv, gv, Nullch, FALSE);
375                    name = SvPV_nolen(sv);
376                }
377                if (name && *name)
378                  Perl_warner(aTHX_ WARN_IO,
379                              "Filehandle %s opened only for input", name);
380                else
381                    Perl_warner(aTHX_ WARN_IO,
382                                "Filehandle opened only for input");
383            }
384            else if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
385                report_evil_fh(gv, io, PL_op->op_type);
386        }
387        SETERRNO(EBADF,IoIFP(io)?RMS$_FAC:RMS$_IFI);
388        goto just_say_no;
389    }
390    else {
391        MARK++;
392        if (PL_ofslen) {
393            while (MARK <= SP) {
394                if (!do_print(*MARK, fp))
395                    break;
396                MARK++;
397                if (MARK <= SP) {
398                    if (PerlIO_write(fp, PL_ofs, PL_ofslen) == 0 || PerlIO_error(fp)) {
399                        MARK--;
400                        break;
401                    }
402                }
403            }
404        }
405        else {
406            while (MARK <= SP) {
407                if (!do_print(*MARK, fp))
408                    break;
409                MARK++;
410            }
411        }
412        if (MARK <= SP)
413            goto just_say_no;
414        else {
415            if (PL_orslen)
416                if (PerlIO_write(fp, PL_ors, PL_orslen) == 0 || PerlIO_error(fp))
417                    goto just_say_no;
418
419            if (IoFLAGS(io) & IOf_FLUSH)
420                if (PerlIO_flush(fp) == EOF)
421                    goto just_say_no;
422        }
423    }
424    SP = ORIGMARK;
425    PUSHs(&PL_sv_yes);
426    RETURN;
427
428  just_say_no:
429    SP = ORIGMARK;
430    PUSHs(&PL_sv_undef);
431    RETURN;
432}
433
434PP(pp_rv2av)
435{
436    dSP; dTOPss;
437    AV *av;
438
439    if (SvROK(sv)) {
440      wasref:
441        tryAMAGICunDEREF(to_av);
442
443        av = (AV*)SvRV(sv);
444        if (SvTYPE(av) != SVt_PVAV)
445            DIE(aTHX_ "Not an ARRAY reference");
446        if (PL_op->op_flags & OPf_REF) {
447            SETs((SV*)av);
448            RETURN;
449        }
450        else if (LVRET) {
451            if (GIMME == G_SCALAR)
452                Perl_croak(aTHX_ "Can't return array to lvalue scalar context");
453            SETs((SV*)av);
454            RETURN;
455        }
456    }
457    else {
458        if (SvTYPE(sv) == SVt_PVAV) {
459            av = (AV*)sv;
460            if (PL_op->op_flags & OPf_REF) {
461                SETs((SV*)av);
462                RETURN;
463            }
464            else if (LVRET) {
465                if (GIMME == G_SCALAR)
466                    Perl_croak(aTHX_ "Can't return array to lvalue"
467                               " scalar context");
468                SETs((SV*)av);
469                RETURN;
470            }
471        }
472        else {
473            GV *gv;
474           
475            if (SvTYPE(sv) != SVt_PVGV) {
476                char *sym;
477                STRLEN len;
478
479                if (SvGMAGICAL(sv)) {
480                    mg_get(sv);
481                    if (SvROK(sv))
482                        goto wasref;
483                }
484                if (!SvOK(sv)) {
485                    if (PL_op->op_flags & OPf_REF ||
486                      PL_op->op_private & HINT_STRICT_REFS)
487                        DIE(aTHX_ PL_no_usym, "an ARRAY");
488                    if (ckWARN(WARN_UNINITIALIZED))
489                        report_uninit();
490                    if (GIMME == G_ARRAY) {
491                        (void)POPs;
492                        RETURN;
493                    }
494                    RETSETUNDEF;
495                }
496                sym = SvPV(sv,len);
497                if ((PL_op->op_flags & OPf_SPECIAL) &&
498                    !(PL_op->op_flags & OPf_MOD))
499                {
500                    gv = (GV*)gv_fetchpv(sym, FALSE, SVt_PVAV);
501                    if (!gv
502                        && (!is_gv_magical(sym,len,0)
503                            || !(gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVAV))))
504                    {
505                        RETSETUNDEF;
506                    }
507                }
508                else {
509                    if (PL_op->op_private & HINT_STRICT_REFS)
510                        DIE(aTHX_ PL_no_symref, sym, "an ARRAY");
511                    gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVAV);
512                }
513            }
514            else {
515                gv = (GV*)sv;
516            }
517            av = GvAVn(gv);
518            if (PL_op->op_private & OPpLVAL_INTRO)
519                av = save_ary(gv);
520            if (PL_op->op_flags & OPf_REF) {
521                SETs((SV*)av);
522                RETURN;
523            }
524            else if (LVRET) {
525                if (GIMME == G_SCALAR)
526                    Perl_croak(aTHX_ "Can't return array to lvalue"
527                               " scalar context");
528                SETs((SV*)av);
529                RETURN;
530            }
531        }
532    }
533
534    if (GIMME == G_ARRAY) {
535        I32 maxarg = AvFILL(av) + 1;
536        (void)POPs;                     /* XXXX May be optimized away? */
537        EXTEND(SP, maxarg);         
538        if (SvRMAGICAL(av)) {
539            U32 i;
540            for (i=0; i < maxarg; i++) {
541                SV **svp = av_fetch(av, i, FALSE);
542                SP[i+1] = (svp) ? *svp : &PL_sv_undef;
543            }
544        }
545        else {
546            Copy(AvARRAY(av), SP+1, maxarg, SV*);
547        }
548        SP += maxarg;
549    }
550    else {
551        dTARGET;
552        I32 maxarg = AvFILL(av) + 1;
553        SETi(maxarg);
554    }
555    RETURN;
556}
557
558PP(pp_rv2hv)
559{
560    dSP; dTOPss;
561    HV *hv;
562
563    if (SvROK(sv)) {
564      wasref:
565        tryAMAGICunDEREF(to_hv);
566
567        hv = (HV*)SvRV(sv);
568        if (SvTYPE(hv) != SVt_PVHV && SvTYPE(hv) != SVt_PVAV)
569            DIE(aTHX_ "Not a HASH reference");
570        if (PL_op->op_flags & OPf_REF) {
571            SETs((SV*)hv);
572            RETURN;
573        }
574        else if (LVRET) {
575            if (GIMME == G_SCALAR)
576                Perl_croak(aTHX_ "Can't return hash to lvalue scalar context");
577            SETs((SV*)hv);
578            RETURN;
579        }
580    }
581    else {
582        if (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV) {
583            hv = (HV*)sv;
584            if (PL_op->op_flags & OPf_REF) {
585                SETs((SV*)hv);
586                RETURN;
587            }
588            else if (LVRET) {
589                if (GIMME == G_SCALAR)
590                    Perl_croak(aTHX_ "Can't return hash to lvalue"
591                               " scalar context");
592                SETs((SV*)hv);
593                RETURN;
594            }
595        }
596        else {
597            GV *gv;
598           
599            if (SvTYPE(sv) != SVt_PVGV) {
600                char *sym;
601                STRLEN len;
602
603                if (SvGMAGICAL(sv)) {
604                    mg_get(sv);
605                    if (SvROK(sv))
606                        goto wasref;
607                }
608                if (!SvOK(sv)) {
609                    if (PL_op->op_flags & OPf_REF ||
610                      PL_op->op_private & HINT_STRICT_REFS)
611                        DIE(aTHX_ PL_no_usym, "a HASH");
612                    if (ckWARN(WARN_UNINITIALIZED))
613                        report_uninit();
614                    if (GIMME == G_ARRAY) {
615                        SP--;
616                        RETURN;
617                    }
618                    RETSETUNDEF;
619                }
620                sym = SvPV(sv,len);
621                if ((PL_op->op_flags & OPf_SPECIAL) &&
622                    !(PL_op->op_flags & OPf_MOD))
623                {
624                    gv = (GV*)gv_fetchpv(sym, FALSE, SVt_PVHV);
625                    if (!gv
626                        && (!is_gv_magical(sym,len,0)
627                            || !(gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVHV))))
628                    {
629                        RETSETUNDEF;
630                    }
631                }
632                else {
633                    if (PL_op->op_private & HINT_STRICT_REFS)
634                        DIE(aTHX_ PL_no_symref, sym, "a HASH");
635                    gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVHV);
636                }
637            }
638            else {
639                gv = (GV*)sv;
640            }
641            hv = GvHVn(gv);
642            if (PL_op->op_private & OPpLVAL_INTRO)
643                hv = save_hash(gv);
644            if (PL_op->op_flags & OPf_REF) {
645                SETs((SV*)hv);
646                RETURN;
647            }
648            else if (LVRET) {
649                if (GIMME == G_SCALAR)
650                    Perl_croak(aTHX_ "Can't return hash to lvalue"
651                               " scalar context");
652                SETs((SV*)hv);
653                RETURN;
654            }
655        }
656    }
657
658    if (GIMME == G_ARRAY) { /* array wanted */
659        *PL_stack_sp = (SV*)hv;
660        return do_kv();
661    }
662    else {
663        dTARGET;
664        if (SvTYPE(hv) == SVt_PVAV)
665            hv = avhv_keys((AV*)hv);
666        if (HvFILL(hv))
667            Perl_sv_setpvf(aTHX_ TARG, "%"IVdf"/%"IVdf,
668                           (IV)HvFILL(hv), (IV)HvMAX(hv) + 1);
669        else
670            sv_setiv(TARG, 0);
671       
672        SETTARG;
673        RETURN;
674    }
675}
676
677STATIC int
678S_do_maybe_phash(pTHX_ AV *ary, SV **lelem, SV **firstlelem, SV **relem,
679                 SV **lastrelem)
680{
681    OP *leftop;
682    I32 i;
683
684    leftop = ((BINOP*)PL_op)->op_last;
685    assert(leftop);
686    assert(leftop->op_type == OP_NULL && leftop->op_targ == OP_LIST);
687    leftop = ((LISTOP*)leftop)->op_first;
688    assert(leftop);
689    /* Skip PUSHMARK and each element already assigned to. */
690    for (i = lelem - firstlelem; i > 0; i--) {
691        leftop = leftop->op_sibling;
692        assert(leftop);
693    }
694    if (leftop->op_type != OP_RV2HV)
695        return 0;
696
697    /* pseudohash */
698    if (av_len(ary) > 0)
699        av_fill(ary, 0);                /* clear all but the fields hash */
700    if (lastrelem >= relem) {
701        while (relem < lastrelem) {     /* gobble up all the rest */
702            SV *tmpstr;
703            assert(relem[0]);
704            assert(relem[1]);
705            /* Avoid a memory leak when avhv_store_ent dies. */
706            tmpstr = sv_newmortal();
707            sv_setsv(tmpstr,relem[1]);  /* value */
708            relem[1] = tmpstr;
709            if (avhv_store_ent(ary,relem[0],tmpstr,0))
710                (void)SvREFCNT_inc(tmpstr);
711            if (SvMAGICAL(ary) != 0 && SvSMAGICAL(tmpstr))
712                mg_set(tmpstr);
713            relem += 2;
714            TAINT_NOT;
715        }
716    }
717    if (relem == lastrelem)
718        return 1;
719    return 2;
720}
721
722STATIC void
723S_do_oddball(pTHX_ HV *hash, SV **relem, SV **firstrelem)
724{
725    if (*relem) {
726        SV *tmpstr;
727        if (ckWARN(WARN_MISC)) {
728            if (relem == firstrelem &&
729                SvROK(*relem) &&
730                (SvTYPE(SvRV(*relem)) == SVt_PVAV ||
731                 SvTYPE(SvRV(*relem)) == SVt_PVHV))
732            {
733                Perl_warner(aTHX_ WARN_MISC,
734                            "Reference found where even-sized list expected");
735            }
736            else
737                Perl_warner(aTHX_ WARN_MISC,
738                            "Odd number of elements in hash assignment");
739        }
740        if (SvTYPE(hash) == SVt_PVAV) {
741            /* pseudohash */
742            tmpstr = sv_newmortal();
743            if (avhv_store_ent((AV*)hash,*relem,tmpstr,0))
744                (void)SvREFCNT_inc(tmpstr);
745            if (SvMAGICAL(hash) && SvSMAGICAL(tmpstr))
746                mg_set(tmpstr);
747        }
748        else {
749            HE *didstore;
750            tmpstr = NEWSV(29,0);
751            didstore = hv_store_ent(hash,*relem,tmpstr,0);
752            if (SvMAGICAL(hash)) {
753                if (SvSMAGICAL(tmpstr))
754                    mg_set(tmpstr);
755                if (!didstore)
756                    sv_2mortal(tmpstr);
757            }
758        }
759        TAINT_NOT;
760    }
761}
762
763PP(pp_aassign)
764{
765    dSP;
766    SV **lastlelem = PL_stack_sp;
767    SV **lastrelem = PL_stack_base + POPMARK;
768    SV **firstrelem = PL_stack_base + POPMARK + 1;
769    SV **firstlelem = lastrelem + 1;
770
771    register SV **relem;
772    register SV **lelem;
773
774    register SV *sv;
775    register AV *ary;
776
777    I32 gimme;
778    HV *hash;
779    I32 i;
780    int magic;
781
782    PL_delaymagic = DM_DELAY;           /* catch simultaneous items */
783
784    /* If there's a common identifier on both sides we have to take
785     * special care that assigning the identifier on the left doesn't
786     * clobber a value on the right that's used later in the list.
787     */
788    if (PL_op->op_private & (OPpASSIGN_COMMON)) {
789        EXTEND_MORTAL(lastrelem - firstrelem + 1);
790        for (relem = firstrelem; relem <= lastrelem; relem++) {
791            /*SUPPRESS 560*/
792            if ((sv = *relem)) {
793                TAINT_NOT;      /* Each item is independent */
794                *relem = sv_mortalcopy(sv);
795            }
796        }
797    }
798
799    relem = firstrelem;
800    lelem = firstlelem;
801    ary = Null(AV*);
802    hash = Null(HV*);
803
804    while (lelem <= lastlelem) {
805        TAINT_NOT;              /* Each item stands on its own, taintwise. */
806        sv = *lelem++;
807        switch (SvTYPE(sv)) {
808        case SVt_PVAV:
809            ary = (AV*)sv;
810            magic = SvMAGICAL(ary) != 0;
811            if (PL_op->op_private & OPpASSIGN_HASH) {
812                switch (do_maybe_phash(ary, lelem, firstlelem, relem,
813                                       lastrelem))
814                {
815                case 0:
816                    goto normal_array;
817                case 1:
818                    do_oddball((HV*)ary, relem, firstrelem);
819                }
820                relem = lastrelem + 1;
821                break;
822            }
823        normal_array:
824            av_clear(ary);
825            av_extend(ary, lastrelem - relem);
826            i = 0;
827            while (relem <= lastrelem) {        /* gobble up all the rest */
828                SV **didstore;
829                sv = NEWSV(28,0);
830                assert(*relem);
831                sv_setsv(sv,*relem);
832                *(relem++) = sv;
833                didstore = av_store(ary,i++,sv);
834                if (magic) {
835                    if (SvSMAGICAL(sv))
836                        mg_set(sv);
837                    if (!didstore)
838                        sv_2mortal(sv);
839                }
840                TAINT_NOT;
841            }
842            break;
843        case SVt_PVHV: {                                /* normal hash */
844                SV *tmpstr;
845
846                hash = (HV*)sv;
847                magic = SvMAGICAL(hash) != 0;
848                hv_clear(hash);
849
850                while (relem < lastrelem) {     /* gobble up all the rest */
851                    HE *didstore;
852                    if (*relem)
853                        sv = *(relem++);
854                    else
855                        sv = &PL_sv_no, relem++;
856                    tmpstr = NEWSV(29,0);
857                    if (*relem)
858                        sv_setsv(tmpstr,*relem);        /* value */
859                    *(relem++) = tmpstr;
860                    didstore = hv_store_ent(hash,sv,tmpstr,0);
861                    if (magic) {
862                        if (SvSMAGICAL(tmpstr))
863                            mg_set(tmpstr);
864                        if (!didstore)
865                            sv_2mortal(tmpstr);
866                    }
867                    TAINT_NOT;
868                }
869                if (relem == lastrelem) {
870                    do_oddball(hash, relem, firstrelem);
871                    relem++;
872                }
873            }
874            break;
875        default:
876            if (SvIMMORTAL(sv)) {
877                if (relem <= lastrelem)
878                    relem++;
879                break;
880            }
881            if (relem <= lastrelem) {
882                sv_setsv(sv, *relem);
883                *(relem++) = sv;
884            }
885            else
886                sv_setsv(sv, &PL_sv_undef);
887            SvSETMAGIC(sv);
888            break;
889        }
890    }
891    if (PL_delaymagic & ~DM_DELAY) {
892        if (PL_delaymagic & DM_UID) {
893#ifdef HAS_SETRESUID
894            (void)setresuid(PL_uid,PL_euid,(Uid_t)-1);
895#else
896#  ifdef HAS_SETREUID
897            (void)setreuid(PL_uid,PL_euid);
898#  else
899#    ifdef HAS_SETRUID
900            if ((PL_delaymagic & DM_UID) == DM_RUID) {
901                (void)setruid(PL_uid);
902                PL_delaymagic &= ~DM_RUID;
903            }
904#    endif /* HAS_SETRUID */
905#    ifdef HAS_SETEUID
906            if ((PL_delaymagic & DM_UID) == DM_EUID) {
907                (void)seteuid(PL_uid);
908                PL_delaymagic &= ~DM_EUID;
909            }
910#    endif /* HAS_SETEUID */
911            if (PL_delaymagic & DM_UID) {
912                if (PL_uid != PL_euid)
913                    DIE(aTHX_ "No setreuid available");
914                (void)PerlProc_setuid(PL_uid);
915            }
916#  endif /* HAS_SETREUID */
917#endif /* HAS_SETRESUID */
918            PL_uid = PerlProc_getuid();
919            PL_euid = PerlProc_geteuid();
920        }
921        if (PL_delaymagic & DM_GID) {
922#ifdef HAS_SETRESGID
923            (void)setresgid(PL_gid,PL_egid,(Gid_t)-1);
924#else
925#  ifdef HAS_SETREGID
926            (void)setregid(PL_gid,PL_egid);
927#  else
928#    ifdef HAS_SETRGID
929            if ((PL_delaymagic & DM_GID) == DM_RGID) {
930                (void)setrgid(PL_gid);
931                PL_delaymagic &= ~DM_RGID;
932            }
933#    endif /* HAS_SETRGID */
934#    ifdef HAS_SETEGID
935            if ((PL_delaymagic & DM_GID) == DM_EGID) {
936                (void)setegid(PL_gid);
937                PL_delaymagic &= ~DM_EGID;
938            }
939#    endif /* HAS_SETEGID */
940            if (PL_delaymagic & DM_GID) {
941                if (PL_gid != PL_egid)
942                    DIE(aTHX_ "No setregid available");
943                (void)PerlProc_setgid(PL_gid);
944            }
945#  endif /* HAS_SETREGID */
946#endif /* HAS_SETRESGID */
947            PL_gid = PerlProc_getgid();
948            PL_egid = PerlProc_getegid();
949        }
950        PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
951    }
952    PL_delaymagic = 0;
953
954    gimme = GIMME_V;
955    if (gimme == G_VOID)
956        SP = firstrelem - 1;
957    else if (gimme == G_SCALAR) {
958        dTARGET;
959        SP = firstrelem;
960        SETi(lastrelem - firstrelem + 1);
961    }
962    else {
963        if (ary || hash)
964            SP = lastrelem;
965        else
966            SP = firstrelem + (lastlelem - firstlelem);
967        lelem = firstlelem + (relem - firstrelem);
968        while (relem <= SP)
969            *relem++ = (lelem <= lastlelem) ? *lelem++ : &PL_sv_undef;
970    }
971    RETURN;
972}
973
974PP(pp_qr)
975{
976    dSP;
977    register PMOP *pm = cPMOP;
978    SV *rv = sv_newmortal();
979    SV *sv = newSVrv(rv, "Regexp");
980    sv_magic(sv,(SV*)ReREFCNT_inc(pm->op_pmregexp),'r',0,0);
981    RETURNX(PUSHs(rv));
982}
983
984PP(pp_match)
985{
986    dSP; dTARG;
987    register PMOP *pm = cPMOP;
988    register char *t;
989    register char *s;
990    char *strend;
991    I32 global;
992    I32 r_flags = REXEC_CHECKED;
993    char *truebase;                     /* Start of string  */
994    register REGEXP *rx = pm->op_pmregexp;
995    bool rxtainted;
996    I32 gimme = GIMME;
997    STRLEN len;
998    I32 minmatch = 0;
999    I32 oldsave = PL_savestack_ix;
1000    I32 update_minmatch = 1;
1001    I32 had_zerolen = 0;
1002
1003    if (PL_op->op_flags & OPf_STACKED)
1004        TARG = POPs;
1005    else {
1006        TARG = DEFSV;
1007        EXTEND(SP,1);
1008    }
1009    PUTBACK;                            /* EVAL blocks need stack_sp. */
1010    s = SvPV(TARG, len);
1011    strend = s + len;
1012    if (!s)
1013        DIE(aTHX_ "panic: pp_match");
1014    rxtainted = ((pm->op_pmdynflags & PMdf_TAINTED) ||
1015                 (PL_tainted && (pm->op_pmflags & PMf_RETAINT)));
1016    TAINT_NOT;
1017
1018    if (pm->op_pmdynflags & PMdf_USED) {
1019      failure:
1020        if (gimme == G_ARRAY)
1021            RETURN;
1022        RETPUSHNO;
1023    }
1024
1025    if (!rx->prelen && PL_curpm) {
1026        pm = PL_curpm;
1027        rx = pm->op_pmregexp;
1028    }
1029    if (rx->minlen > len) goto failure;
1030
1031    truebase = t = s;
1032
1033    /* XXXX What part of this is needed with true \G-support? */
1034    if ((global = pm->op_pmflags & PMf_GLOBAL)) {
1035        rx->startp[0] = -1;
1036        if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) {
1037            MAGIC* mg = mg_find(TARG, 'g');
1038            if (mg && mg->mg_len >= 0) {
1039                if (!(rx->reganch & ROPT_GPOS_SEEN))
1040                    rx->endp[0] = rx->startp[0] = mg->mg_len;
1041                else if (rx->reganch & ROPT_ANCH_GPOS) {
1042                    r_flags |= REXEC_IGNOREPOS;
1043                    rx->endp[0] = rx->startp[0] = mg->mg_len;
1044                }
1045                minmatch = (mg->mg_flags & MGf_MINMATCH);
1046                update_minmatch = 0;
1047            }
1048        }
1049    }
1050    if ((!global && rx->nparens)
1051            || SvTEMP(TARG) || PL_sawampersand)
1052        r_flags |= REXEC_COPY_STR;
1053    if (SvSCREAM(TARG))
1054        r_flags |= REXEC_SCREAM;
1055
1056    if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
1057        SAVEINT(PL_multiline);
1058        PL_multiline = pm->op_pmflags & PMf_MULTILINE;
1059    }
1060
1061play_it_again:
1062    if (global && rx->startp[0] != -1) {
1063        t = s = rx->endp[0] + truebase;
1064        if ((s + rx->minlen) > strend)
1065            goto nope;
1066        if (update_minmatch++)
1067            minmatch = had_zerolen;
1068    }
1069    if (rx->reganch & RE_USE_INTUIT &&
1070        DO_UTF8(TARG) == ((rx->reganch & ROPT_UTF8) != 0)) {
1071        s = CALLREG_INTUIT_START(aTHX_ rx, TARG, s, strend, r_flags, NULL);
1072
1073        if (!s)
1074            goto nope;
1075        if ( (rx->reganch & ROPT_CHECK_ALL)
1076             && !PL_sawampersand
1077             && ((rx->reganch & ROPT_NOSCAN)
1078                 || !((rx->reganch & RE_INTUIT_TAIL)
1079                      && (r_flags & REXEC_SCREAM)))
1080             && !SvROK(TARG))   /* Cannot trust since INTUIT cannot guess ^ */
1081            goto yup;
1082    }
1083    if (CALLREGEXEC(aTHX_ rx, s, strend, truebase, minmatch, TARG, NULL, r_flags))
1084    {
1085        PL_curpm = pm;
1086        if (pm->op_pmflags & PMf_ONCE)
1087            pm->op_pmdynflags |= PMdf_USED;
1088        goto gotcha;
1089    }
1090    else
1091        goto ret_no;
1092    /*NOTREACHED*/
1093
1094  gotcha:
1095    if (rxtainted)
1096        RX_MATCH_TAINTED_on(rx);
1097    TAINT_IF(RX_MATCH_TAINTED(rx));
1098    if (gimme == G_ARRAY) {
1099        I32 iters, i, len;
1100
1101        iters = rx->nparens;
1102        if (global && !iters)
1103            i = 1;
1104        else
1105            i = 0;
1106        SPAGAIN;                        /* EVAL blocks could move the stack. */
1107        EXTEND(SP, iters + i);
1108        EXTEND_MORTAL(iters + i);
1109        for (i = !i; i <= iters; i++) {
1110            PUSHs(sv_newmortal());
1111            /*SUPPRESS 560*/
1112            if ((rx->startp[i] != -1) && rx->endp[i] != -1 ) {
1113                len = rx->endp[i] - rx->startp[i];
1114                s = rx->startp[i] + truebase;
1115                sv_setpvn(*SP, s, len);
1116                if ((pm->op_pmdynflags & PMdf_UTF8) && !IN_BYTE) {
1117                    SvUTF8_on(*SP);
1118                    sv_utf8_downgrade(*SP, TRUE);
1119                }
1120            }
1121        }
1122        if (global) {
1123            had_zerolen = (rx->startp[0] != -1
1124                           && rx->startp[0] == rx->endp[0]);
1125            PUTBACK;                    /* EVAL blocks may use stack */
1126            r_flags |= REXEC_IGNOREPOS | REXEC_NOT_FIRST;
1127            goto play_it_again;
1128        }
1129        else if (!iters)
1130            XPUSHs(&PL_sv_yes);
1131        LEAVE_SCOPE(oldsave);
1132        RETURN;
1133    }
1134    else {
1135        if (global) {
1136            MAGIC* mg = 0;
1137            if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG))
1138                mg = mg_find(TARG, 'g');
1139            if (!mg) {
1140                sv_magic(TARG, (SV*)0, 'g', Nullch, 0);
1141                mg = mg_find(TARG, 'g');
1142            }
1143            if (rx->startp[0] != -1) {
1144                mg->mg_len = rx->endp[0];
1145                if (rx->startp[0] == rx->endp[0])
1146                    mg->mg_flags |= MGf_MINMATCH;
1147                else
1148                    mg->mg_flags &= ~MGf_MINMATCH;
1149            }
1150        }
1151        LEAVE_SCOPE(oldsave);
1152        RETPUSHYES;
1153    }
1154
1155yup:                                    /* Confirmed by INTUIT */
1156    if (rxtainted)
1157        RX_MATCH_TAINTED_on(rx);
1158    TAINT_IF(RX_MATCH_TAINTED(rx));
1159    PL_curpm = pm;
1160    if (pm->op_pmflags & PMf_ONCE)
1161        pm->op_pmdynflags |= PMdf_USED;
1162    if (RX_MATCH_COPIED(rx))
1163        Safefree(rx->subbeg);
1164    RX_MATCH_COPIED_off(rx);
1165    rx->subbeg = Nullch;
1166    if (global) {
1167        rx->subbeg = truebase;
1168        rx->startp[0] = s - truebase;
1169        rx->endp[0] = s - truebase + rx->minlen;
1170        rx->sublen = strend - truebase;
1171        goto gotcha;
1172    }
1173    if (PL_sawampersand) {
1174        I32 off;
1175
1176        rx->subbeg = savepvn(t, strend - t);
1177        rx->sublen = strend - t;
1178        RX_MATCH_COPIED_on(rx);
1179        off = rx->startp[0] = s - t;
1180        rx->endp[0] = off + rx->minlen;
1181    }
1182    else {                      /* startp/endp are used by @- @+. */
1183        rx->startp[0] = s - truebase;
1184        rx->endp[0] = s - truebase + rx->minlen;
1185    }
1186    rx->nparens = rx->lastparen = 0;    /* used by @- and @+ */
1187    LEAVE_SCOPE(oldsave);
1188    RETPUSHYES;
1189
1190nope:
1191ret_no:
1192    if (global && !(pm->op_pmflags & PMf_CONTINUE)) {
1193        if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) {
1194            MAGIC* mg = mg_find(TARG, 'g');
1195            if (mg)
1196                mg->mg_len = -1;
1197        }
1198    }
1199    LEAVE_SCOPE(oldsave);
1200    if (gimme == G_ARRAY)
1201        RETURN;
1202    RETPUSHNO;
1203}
1204
1205OP *
1206Perl_do_readline(pTHX)
1207{
1208    dSP; dTARGETSTACKED;
1209    register SV *sv;
1210    STRLEN tmplen = 0;
1211    STRLEN offset;
1212    PerlIO *fp;
1213    register IO *io = GvIO(PL_last_in_gv);
1214    register I32 type = PL_op->op_type;
1215    I32 gimme = GIMME_V;
1216    MAGIC *mg;
1217
1218    if ((mg = SvTIED_mg((SV*)PL_last_in_gv, 'q'))) {
1219        PUSHMARK(SP);
1220        XPUSHs(SvTIED_obj((SV*)PL_last_in_gv, mg));
1221        PUTBACK;
1222        ENTER;
1223        call_method("READLINE", gimme);
1224        LEAVE;
1225        SPAGAIN;
1226        if (gimme == G_SCALAR)
1227            SvSetMagicSV_nosteal(TARG, TOPs);
1228        RETURN;
1229    }
1230    fp = Nullfp;
1231    if (io) {
1232        fp = IoIFP(io);
1233        if (!fp) {
1234            if (IoFLAGS(io) & IOf_ARGV) {
1235                if (IoFLAGS(io) & IOf_START) {
1236                    IoLINES(io) = 0;
1237                    if (av_len(GvAVn(PL_last_in_gv)) < 0) {
1238                        IoFLAGS(io) &= ~IOf_START;
1239                        do_open(PL_last_in_gv,"-",1,FALSE,O_RDONLY,0,Nullfp);
1240                        sv_setpvn(GvSV(PL_last_in_gv), "-", 1);
1241                        SvSETMAGIC(GvSV(PL_last_in_gv));
1242                        fp = IoIFP(io);
1243                        goto have_fp;
1244                    }
1245                }
1246                fp = nextargv(PL_last_in_gv);
1247                if (!fp) { /* Note: fp != IoIFP(io) */
1248                    (void)do_close(PL_last_in_gv, FALSE); /* now it does*/
1249                }
1250            }
1251            else if (type == OP_GLOB) {
1252                SV *tmpcmd = NEWSV(55, 0);
1253                SV *tmpglob = POPs;
1254                ENTER;
1255                SAVEFREESV(tmpcmd);
1256#ifdef VMS /* expand the wildcards right here, rather than opening a pipe, */
1257           /* since spawning off a process is a real performance hit */
1258                {
1259#include <descrip.h>
1260#include <lib$routines.h>
1261#include <nam.h>
1262#include <rmsdef.h>
1263                    char rslt[NAM$C_MAXRSS+1+sizeof(unsigned short int)] = {'\0','\0'};
1264                    char vmsspec[NAM$C_MAXRSS+1];
1265                    char *rstr = rslt + sizeof(unsigned short int), *begin, *end, *cp;
1266                    char tmpfnam[L_tmpnam] = "SYS$SCRATCH:";
1267                    $DESCRIPTOR(dfltdsc,"SYS$DISK:[]*.*;");
1268                    PerlIO *tmpfp;
1269                    STRLEN i;
1270                    struct dsc$descriptor_s wilddsc
1271                       = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};
1272                    struct dsc$descriptor_vs rsdsc
1273                       = {sizeof rslt, DSC$K_DTYPE_VT, DSC$K_CLASS_VS, rslt};
1274                    unsigned long int cxt = 0, sts = 0, ok = 1, hasdir = 0, hasver = 0, isunix = 0;
1275
1276                    /* We could find out if there's an explicit dev/dir or version
1277                       by peeking into lib$find_file's internal context at
1278                       ((struct NAM *)((struct FAB *)cxt)->fab$l_nam)->nam$l_fnb
1279                       but that's unsupported, so I don't want to do it now and
1280                       have it bite someone in the future. */
1281                    strcat(tmpfnam,PerlLIO_tmpnam(NULL));
1282                    cp = SvPV(tmpglob,i);
1283                    for (; i; i--) {
1284                       if (cp[i] == ';') hasver = 1;
1285                       if (cp[i] == '.') {
1286                           if (sts) hasver = 1;
1287                           else sts = 1;
1288                       }
1289                       if (cp[i] == '/') {
1290                          hasdir = isunix = 1;
1291                          break;
1292                       }
1293                       if (cp[i] == ']' || cp[i] == '>' || cp[i] == ':') {
1294                           hasdir = 1;
1295                           break;
1296                       }
1297                    }
1298                    if ((tmpfp = PerlIO_open(tmpfnam,"w+","fop=dlt")) != NULL) {
1299                        Stat_t st;
1300                        if (!PerlLIO_stat(SvPVX(tmpglob),&st) && S_ISDIR(st.st_mode))
1301                          ok = ((wilddsc.dsc$a_pointer = tovmspath(SvPVX(tmpglob),vmsspec)) != NULL);
1302                        else ok = ((wilddsc.dsc$a_pointer = tovmsspec(SvPVX(tmpglob),vmsspec)) != NULL);
1303                        if (ok) wilddsc.dsc$w_length = (unsigned short int) strlen(wilddsc.dsc$a_pointer);
1304                        while (ok && ((sts = lib$find_file(&wilddsc,&rsdsc,&cxt,
1305                                                    &dfltdsc,NULL,NULL,NULL))&1)) {
1306                            end = rstr + (unsigned long int) *rslt;
1307                            if (!hasver) while (*end != ';') end--;
1308                            *(end++) = '\n';  *end = '\0';
1309                            for (cp = rstr; *cp; cp++) *cp = _tolower(*cp);
1310                            if (hasdir) {
1311                              if (isunix) trim_unixpath(rstr,SvPVX(tmpglob),1);
1312                              begin = rstr;
1313                            }
1314                            else {
1315                                begin = end;
1316                                while (*(--begin) != ']' && *begin != '>') ;
1317                                ++begin;
1318                            }
1319                            ok = (PerlIO_puts(tmpfp,begin) != EOF);
1320                        }
1321                        if (cxt) (void)lib$find_file_end(&cxt);
1322                        if (ok && sts != RMS$_NMF &&
1323                            sts != RMS$_DNF && sts != RMS$_FNF) ok = 0;
1324                        if (!ok) {
1325                            if (!(sts & 1)) {
1326                              SETERRNO((sts == RMS$_SYN ? EINVAL : EVMSERR),sts);
1327                            }
1328                            PerlIO_close(tmpfp);
1329                            fp = NULL;
1330                        }
1331                        else {
1332                           PerlIO_rewind(tmpfp);
1333                           IoTYPE(io) = IoTYPE_RDONLY;
1334                           IoIFP(io) = fp = tmpfp;
1335                           IoFLAGS(io) &= ~IOf_UNTAINT;  /* maybe redundant */
1336                        }
1337                    }
1338                }
1339#else /* !VMS */
1340#ifdef MACOS_TRADITIONAL
1341                sv_setpv(tmpcmd, "glob ");
1342                sv_catsv(tmpcmd, tmpglob);
1343                sv_catpv(tmpcmd, " |");
1344#else
1345#ifdef DOSISH
1346#ifdef OS2
1347                sv_setpv(tmpcmd, "for a in ");
1348                sv_catsv(tmpcmd, tmpglob);
1349                sv_catpv(tmpcmd, "; do echo \"$a\\0\\c\"; done |");
1350#else
1351#ifdef DJGPP
1352                sv_setpv(tmpcmd, "/dev/dosglob/"); /* File System Extension */
1353                sv_catsv(tmpcmd, tmpglob);
1354#else
1355                sv_setpv(tmpcmd, "perlglob ");
1356                sv_catsv(tmpcmd, tmpglob);
1357                sv_catpv(tmpcmd, " |");
1358#endif /* !DJGPP */
1359#endif /* !OS2 */
1360#else /* !DOSISH */
1361#if defined(CSH)
1362                sv_setpvn(tmpcmd, PL_cshname, PL_cshlen);
1363                sv_catpv(tmpcmd, " -cf 'set nonomatch; glob ");
1364                sv_catsv(tmpcmd, tmpglob);
1365                sv_catpv(tmpcmd, "' 2>/dev/null |");
1366#else
1367                sv_setpv(tmpcmd, "echo ");
1368                sv_catsv(tmpcmd, tmpglob);
1369#if 'z' - 'a' == 25
1370                sv_catpv(tmpcmd, "|tr -s ' \t\f\r' '\\012\\012\\012\\012'|");
1371#else
1372                sv_catpv(tmpcmd, "|tr -s ' \t\f\r' '\\n\\n\\n\\n'|");
1373#endif
1374#endif /* !CSH */
1375#endif /* !DOSISH */
1376#endif /* MACOS_TRADITIONAL */
1377                (void)do_open(PL_last_in_gv, SvPVX(tmpcmd), SvCUR(tmpcmd),
1378                              FALSE, O_RDONLY, 0, Nullfp);
1379                fp = IoIFP(io);
1380#endif /* !VMS */
1381                LEAVE;
1382            }
1383        }
1384        else if (type == OP_GLOB)
1385            SP--;
1386        else if (ckWARN(WARN_IO)        /* stdout/stderr or other write fh */
1387                 && (IoTYPE(io) == IoTYPE_WRONLY || fp == PerlIO_stdout()
1388                     || fp == PerlIO_stderr()))
1389        {
1390            /* integrate with report_evil_fh()? */
1391            char *name = NULL;
1392            if (isGV(PL_last_in_gv)) { /* can this ever fail? */
1393                SV* sv = sv_newmortal();
1394                gv_efullname4(sv, PL_last_in_gv, Nullch, FALSE);
1395                name = SvPV_nolen(sv);
1396            }
1397            if (name && *name)
1398                Perl_warner(aTHX_ WARN_IO,
1399                            "Filehandle %s opened only for output", name);
1400            else
1401                Perl_warner(aTHX_ WARN_IO,
1402                            "Filehandle opened only for output");
1403        }
1404    }
1405    if (!fp) {
1406        if (ckWARN2(WARN_GLOB, WARN_CLOSED)
1407                && (!io || !(IoFLAGS(io) & IOf_START))) {
1408            if (type == OP_GLOB)
1409                Perl_warner(aTHX_ WARN_GLOB,
1410                            "glob failed (can't start child: %s)",
1411                            Strerror(errno));
1412            else
1413                report_evil_fh(PL_last_in_gv, io, PL_op->op_type);
1414        }
1415        if (gimme == G_SCALAR) {
1416            (void)SvOK_off(TARG);
1417            PUSHTARG;
1418        }
1419        RETURN;
1420    }
1421  have_fp:
1422    if (gimme == G_SCALAR) {
1423        sv = TARG;
1424        if (SvROK(sv))
1425            sv_unref(sv);
1426        (void)SvUPGRADE(sv, SVt_PV);
1427        tmplen = SvLEN(sv);     /* remember if already alloced */
1428        if (!tmplen)
1429            Sv_Grow(sv, 80);    /* try short-buffering it */
1430        if (type == OP_RCATLINE)
1431            offset = SvCUR(sv);
1432        else
1433            offset = 0;
1434    }
1435    else {
1436        sv = sv_2mortal(NEWSV(57, 80));
1437        offset = 0;
1438    }
1439
1440    /* This should not be marked tainted if the fp is marked clean */
1441#define MAYBE_TAINT_LINE(io, sv) \
1442    if (!(IoFLAGS(io) & IOf_UNTAINT)) { \
1443        TAINT;                          \
1444        SvTAINTED_on(sv);               \
1445    }
1446
1447/* delay EOF state for a snarfed empty file */
1448#define SNARF_EOF(gimme,rs,io,sv) \
1449    (gimme != G_SCALAR || SvCUR(sv)                                     \
1450     || (IoFLAGS(io) & IOf_NOLINE) || !RsSNARF(rs))
1451
1452    for (;;) {
1453        if (!sv_gets(sv, fp, offset)
1454            && (type == OP_GLOB || SNARF_EOF(gimme, PL_rs, io, sv)))
1455        {
1456            PerlIO_clearerr(fp);
1457            if (IoFLAGS(io) & IOf_ARGV) {
1458                fp = nextargv(PL_last_in_gv);
1459                if (fp)
1460                    continue;
1461                (void)do_close(PL_last_in_gv, FALSE);
1462            }
1463            else if (type == OP_GLOB) {
1464                if (!do_close(PL_last_in_gv, FALSE) && ckWARN(WARN_GLOB)) {
1465                    Perl_warner(aTHX_ WARN_GLOB,
1466                           "glob failed (child exited with status %d%s)",
1467                           (int)(STATUS_CURRENT >> 8),
1468                           (STATUS_CURRENT & 0x80) ? ", core dumped" : "");
1469                }
1470            }
1471            if (gimme == G_SCALAR) {
1472                (void)SvOK_off(TARG);
1473                PUSHTARG;
1474            }
1475            MAYBE_TAINT_LINE(io, sv);
1476            RETURN;
1477        }
1478        MAYBE_TAINT_LINE(io, sv);
1479        IoLINES(io)++;
1480        IoFLAGS(io) |= IOf_NOLINE;
1481        SvSETMAGIC(sv);
1482        XPUSHs(sv);
1483        if (type == OP_GLOB) {
1484            char *tmps;
1485
1486            if (SvCUR(sv) > 0 && SvCUR(PL_rs) > 0) {
1487                tmps = SvEND(sv) - 1;
1488                if (*tmps == *SvPVX(PL_rs)) {
1489                    *tmps = '\0';
1490                    SvCUR(sv)--;
1491                }
1492            }
1493            for (tmps = SvPVX(sv); *tmps; tmps++)
1494                if (!isALPHA(*tmps) && !isDIGIT(*tmps) &&
1495                    strchr("$&*(){}[]'\";\\|?<>~`", *tmps))
1496                        break;
1497            if (*tmps && PerlLIO_lstat(SvPVX(sv), &PL_statbuf) < 0) {
1498                (void)POPs;             /* Unmatched wildcard?  Chuck it... */
1499                continue;
1500            }
1501        }
1502        if (gimme == G_ARRAY) {
1503            if (SvLEN(sv) - SvCUR(sv) > 20) {
1504                SvLEN_set(sv, SvCUR(sv)+1);
1505                Renew(SvPVX(sv), SvLEN(sv), char);
1506            }
1507            sv = sv_2mortal(NEWSV(58, 80));
1508            continue;
1509        }
1510        else if (gimme == G_SCALAR && !tmplen && SvLEN(sv) - SvCUR(sv) > 80) {
1511            /* try to reclaim a bit of scalar space (only on 1st alloc) */
1512            if (SvCUR(sv) < 60)
1513                SvLEN_set(sv, 80);
1514            else
1515                SvLEN_set(sv, SvCUR(sv)+40);    /* allow some slop */
1516            Renew(SvPVX(sv), SvLEN(sv), char);
1517        }
1518        RETURN;
1519    }
1520}
1521
1522PP(pp_enter)
1523{
1524    dSP;
1525    register PERL_CONTEXT *cx;
1526    I32 gimme = OP_GIMME(PL_op, -1);
1527
1528    if (gimme == -1) {
1529        if (cxstack_ix >= 0)
1530            gimme = cxstack[cxstack_ix].blk_gimme;
1531        else
1532            gimme = G_SCALAR;
1533    }
1534
1535    ENTER;
1536
1537    SAVETMPS;
1538    PUSHBLOCK(cx, CXt_BLOCK, SP);
1539
1540    RETURN;
1541}
1542
1543PP(pp_helem)
1544{
1545    dSP;
1546    HE* he;
1547    SV **svp;
1548    SV *keysv = POPs;
1549    HV *hv = (HV*)POPs;
1550    U32 lval = PL_op->op_flags & OPf_MOD || LVRET;
1551    U32 defer = PL_op->op_private & OPpLVAL_DEFER;
1552    SV *sv;
1553
1554    if (SvTYPE(hv) == SVt_PVHV) {
1555        he = hv_fetch_ent(hv, keysv, lval && !defer, 0);
1556        svp = he ? &HeVAL(he) : 0;
1557    }
1558    else if (SvTYPE(hv) == SVt_PVAV) {
1559        if (PL_op->op_private & OPpLVAL_INTRO)
1560            DIE(aTHX_ "Can't localize pseudo-hash element");
1561        svp = avhv_fetch_ent((AV*)hv, keysv, lval && !defer, 0);
1562    }
1563    else {
1564        RETPUSHUNDEF;
1565    }
1566    if (lval) {
1567        if (!svp || *svp == &PL_sv_undef) {
1568            SV* lv;
1569            SV* key2;
1570            if (!defer) {
1571                STRLEN n_a;
1572                DIE(aTHX_ PL_no_helem, SvPV(keysv, n_a));
1573            }
1574            lv = sv_newmortal();
1575            sv_upgrade(lv, SVt_PVLV);
1576            LvTYPE(lv) = 'y';
1577            sv_magic(lv, key2 = newSVsv(keysv), 'y', Nullch, 0);
1578            SvREFCNT_dec(key2); /* sv_magic() increments refcount */
1579            LvTARG(lv) = SvREFCNT_inc(hv);
1580            LvTARGLEN(lv) = 1;
1581            PUSHs(lv);
1582            RETURN;
1583        }
1584        if (PL_op->op_private & OPpLVAL_INTRO) {
1585            if (HvNAME(hv) && isGV(*svp))
1586                save_gp((GV*)*svp, !(PL_op->op_flags & OPf_SPECIAL));
1587            else
1588                save_helem(hv, keysv, svp);
1589        }
1590        else if (PL_op->op_private & OPpDEREF)
1591            vivify_ref(*svp, PL_op->op_private & OPpDEREF);
1592    }
1593    sv = (svp ? *svp : &PL_sv_undef);
1594    /* This makes C<local $tied{foo} = $tied{foo}> possible.
1595     * Pushing the magical RHS on to the stack is useless, since
1596     * that magic is soon destined to be misled by the local(),
1597     * and thus the later pp_sassign() will fail to mg_get() the
1598     * old value.  This should also cure problems with delayed
1599     * mg_get()s.  GSAR 98-07-03 */
1600    if (!lval && SvGMAGICAL(sv))
1601        sv = sv_mortalcopy(sv);
1602    PUSHs(sv);
1603    RETURN;
1604}
1605
1606PP(pp_leave)
1607{
1608    dSP;
1609    register PERL_CONTEXT *cx;
1610    register SV **mark;
1611    SV **newsp;
1612    PMOP *newpm;
1613    I32 gimme;
1614
1615    if (PL_op->op_flags & OPf_SPECIAL) {
1616        cx = &cxstack[cxstack_ix];
1617        cx->blk_oldpm = PL_curpm;       /* fake block should preserve $1 et al */
1618    }
1619
1620    POPBLOCK(cx,newpm);
1621
1622    gimme = OP_GIMME(PL_op, -1);
1623    if (gimme == -1) {
1624        if (cxstack_ix >= 0)
1625            gimme = cxstack[cxstack_ix].blk_gimme;
1626        else
1627            gimme = G_SCALAR;
1628    }
1629
1630    TAINT_NOT;
1631    if (gimme == G_VOID)
1632        SP = newsp;
1633    else if (gimme == G_SCALAR) {
1634        MARK = newsp + 1;
1635        if (MARK <= SP)
1636            if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
1637                *MARK = TOPs;
1638            else
1639                *MARK = sv_mortalcopy(TOPs);
1640        else {
1641            MEXTEND(mark,0);
1642            *MARK = &PL_sv_undef;
1643        }
1644        SP = MARK;
1645    }
1646    else if (gimme == G_ARRAY) {
1647        /* in case LEAVE wipes old return values */
1648        for (mark = newsp + 1; mark <= SP; mark++) {
1649            if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP))) {
1650                *mark = sv_mortalcopy(*mark);
1651                TAINT_NOT;      /* Each item is independent */
1652            }
1653        }
1654    }
1655    PL_curpm = newpm;   /* Don't pop $1 et al till now */
1656
1657    LEAVE;
1658
1659    RETURN;
1660}
1661
1662PP(pp_iter)
1663{
1664    dSP;
1665    register PERL_CONTEXT *cx;
1666    SV* sv;
1667    AV* av;
1668    SV **itersvp;
1669
1670    EXTEND(SP, 1);
1671    cx = &cxstack[cxstack_ix];
1672    if (CxTYPE(cx) != CXt_LOOP)
1673        DIE(aTHX_ "panic: pp_iter");
1674
1675    itersvp = CxITERVAR(cx);
1676    av = cx->blk_loop.iterary;
1677    if (SvTYPE(av) != SVt_PVAV) {
1678        /* iterate ($min .. $max) */
1679        if (cx->blk_loop.iterlval) {
1680            /* string increment */
1681            register SV* cur = cx->blk_loop.iterlval;
1682            STRLEN maxlen;
1683            char *max = SvPV((SV*)av, maxlen);
1684            if (!SvNIOK(cur) && SvCUR(cur) <= maxlen) {
1685#ifndef USE_THREADS                       /* don't risk potential race */
1686                if (SvREFCNT(*itersvp) == 1 && !SvMAGICAL(*itersvp)) {
1687                    /* safe to reuse old SV */
1688                    sv_setsv(*itersvp, cur);
1689                }
1690                else
1691#endif
1692                {
1693                    /* we need a fresh SV every time so that loop body sees a
1694                     * completely new SV for closures/references to work as
1695                     * they used to */
1696                    SvREFCNT_dec(*itersvp);
1697                    *itersvp = newSVsv(cur);
1698                }
1699                if (strEQ(SvPVX(cur), max))
1700                    sv_setiv(cur, 0); /* terminate next time */
1701                else
1702                    sv_inc(cur);
1703                RETPUSHYES;
1704            }
1705            RETPUSHNO;
1706        }
1707        /* integer increment */
1708        if (cx->blk_loop.iterix > cx->blk_loop.itermax)
1709            RETPUSHNO;
1710
1711#ifndef USE_THREADS                       /* don't risk potential race */
1712        if (SvREFCNT(*itersvp) == 1 && !SvMAGICAL(*itersvp)) {
1713            /* safe to reuse old SV */
1714            sv_setiv(*itersvp, cx->blk_loop.iterix++);
1715        }
1716        else
1717#endif
1718        {
1719            /* we need a fresh SV every time so that loop body sees a
1720             * completely new SV for closures/references to work as they
1721             * used to */
1722            SvREFCNT_dec(*itersvp);
1723            *itersvp = newSViv(cx->blk_loop.iterix++);
1724        }
1725        RETPUSHYES;
1726    }
1727
1728    /* iterate array */
1729    if (cx->blk_loop.iterix >= (av == PL_curstack ? cx->blk_oldsp : AvFILL(av)))
1730        RETPUSHNO;
1731
1732    SvREFCNT_dec(*itersvp);
1733
1734    if ((sv = SvMAGICAL(av)
1735              ? *av_fetch(av, ++cx->blk_loop.iterix, FALSE)
1736              : AvARRAY(av)[++cx->blk_loop.iterix]))
1737        SvTEMP_off(sv);
1738    else
1739        sv = &PL_sv_undef;
1740    if (av != PL_curstack && SvIMMORTAL(sv)) {
1741        SV *lv = cx->blk_loop.iterlval;
1742        if (lv && SvREFCNT(lv) > 1) {
1743            SvREFCNT_dec(lv);
1744            lv = Nullsv;
1745        }
1746        if (lv)
1747            SvREFCNT_dec(LvTARG(lv));
1748        else {
1749            lv = cx->blk_loop.iterlval = NEWSV(26, 0);
1750            sv_upgrade(lv, SVt_PVLV);
1751            LvTYPE(lv) = 'y';
1752            sv_magic(lv, Nullsv, 'y', Nullch, 0);
1753        }
1754        LvTARG(lv) = SvREFCNT_inc(av);
1755        LvTARGOFF(lv) = cx->blk_loop.iterix;
1756        LvTARGLEN(lv) = (STRLEN)UV_MAX;
1757        sv = (SV*)lv;
1758    }
1759
1760    *itersvp = SvREFCNT_inc(sv);
1761    RETPUSHYES;
1762}
1763
1764PP(pp_subst)
1765{
1766    dSP; dTARG;
1767    register PMOP *pm = cPMOP;
1768    PMOP *rpm = pm;
1769    register SV *dstr, *rstr;
1770    register char *s;
1771    char *strend;
1772    register char *m;
1773    char *c;
1774    register char *d;
1775    STRLEN clen;
1776    I32 iters = 0;
1777    I32 maxiters;
1778    register I32 i;
1779    bool once;
1780    bool rxtainted;
1781    char *orig;
1782    I32 r_flags;
1783    register REGEXP *rx = pm->op_pmregexp;
1784    STRLEN len;
1785    int force_on_match = 0;
1786    I32 oldsave = PL_savestack_ix;
1787    bool do_utf8;
1788    STRLEN slen;
1789
1790    /* known replacement string? */
1791    rstr = (pm->op_pmflags & PMf_CONST) ? POPs : Nullsv;
1792    if (PL_op->op_flags & OPf_STACKED)
1793        TARG = POPs;
1794    else {
1795        TARG = DEFSV;
1796        EXTEND(SP,1);
1797    }
1798    do_utf8 = DO_UTF8(TARG);
1799    if (SvFAKE(TARG) && SvREADONLY(TARG))
1800        sv_force_normal(TARG);
1801    if (SvREADONLY(TARG)
1802        || (SvTYPE(TARG) > SVt_PVLV
1803            && !(SvTYPE(TARG) == SVt_PVGV && SvFAKE(TARG))))
1804        DIE(aTHX_ PL_no_modify);
1805    PUTBACK;
1806
1807    s = SvPV(TARG, len);
1808    if (!SvPOKp(TARG) || SvTYPE(TARG) == SVt_PVGV)
1809        force_on_match = 1;
1810    rxtainted = ((pm->op_pmdynflags & PMdf_TAINTED) ||
1811                 (PL_tainted && (pm->op_pmflags & PMf_RETAINT)));
1812    if (PL_tainted)
1813        rxtainted |= 2;
1814    TAINT_NOT;
1815
1816  force_it:
1817    if (!pm || !s)
1818        DIE(aTHX_ "panic: pp_subst");
1819
1820    strend = s + len;
1821    slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : len;
1822    maxiters = 2 * slen + 10;   /* We can match twice at each
1823                                   position, once with zero-length,
1824                                   second time with non-zero. */
1825
1826    if (!rx->prelen && PL_curpm) {
1827        pm = PL_curpm;
1828        rx = pm->op_pmregexp;
1829    }
1830    r_flags = (rx->nparens || SvTEMP(TARG) || PL_sawampersand)
1831                ? REXEC_COPY_STR : 0;
1832    if (SvSCREAM(TARG))
1833        r_flags |= REXEC_SCREAM;
1834    if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
1835        SAVEINT(PL_multiline);
1836        PL_multiline = pm->op_pmflags & PMf_MULTILINE;
1837    }
1838    orig = m = s;
1839    if (rx->reganch & RE_USE_INTUIT) {
1840        s = CALLREG_INTUIT_START(aTHX_ rx, TARG, s, strend, r_flags, NULL);
1841
1842        if (!s)
1843            goto nope;
1844        /* How to do it in subst? */
1845/*      if ( (rx->reganch & ROPT_CHECK_ALL)
1846             && !PL_sawampersand
1847             && ((rx->reganch & ROPT_NOSCAN)
1848                 || !((rx->reganch & RE_INTUIT_TAIL)
1849                      && (r_flags & REXEC_SCREAM))))
1850            goto yup;
1851*/
1852    }
1853
1854    /* only replace once? */
1855    once = !(rpm->op_pmflags & PMf_GLOBAL);
1856
1857    /* known replacement string? */
1858    c = rstr ? SvPV(rstr, clen) : Nullch;
1859
1860    /* can do inplace substitution? */
1861    if (c && clen <= rx->minlen && (once || !(r_flags & REXEC_COPY_STR))
1862        && do_utf8 == DO_UTF8(rstr)
1863        && !(rx->reganch & ROPT_LOOKBEHIND_SEEN)) {
1864        if (!CALLREGEXEC(aTHX_ rx, s, strend, orig, 0, TARG, NULL,
1865                         r_flags | REXEC_CHECKED))
1866        {
1867            SPAGAIN;
1868            PUSHs(&PL_sv_no);
1869            LEAVE_SCOPE(oldsave);
1870            RETURN;
1871        }
1872        if (force_on_match) {
1873            force_on_match = 0;
1874            s = SvPV_force(TARG, len);
1875            goto force_it;
1876        }
1877        d = s;
1878        PL_curpm = pm;
1879        SvSCREAM_off(TARG);     /* disable possible screamer */
1880        if (once) {
1881            rxtainted |= RX_MATCH_TAINTED(rx);
1882            m = orig + rx->startp[0];
1883            d = orig + rx->endp[0];
1884            s = orig;
1885            if (m - s > strend - d) {  /* faster to shorten from end */
1886                if (clen) {
1887                    Copy(c, m, clen, char);
1888                    m += clen;
1889                }
1890                i = strend - d;
1891                if (i > 0) {
1892                    Move(d, m, i, char);
1893                    m += i;
1894                }
1895                *m = '\0';
1896                SvCUR_set(TARG, m - s);
1897            }
1898            /*SUPPRESS 560*/
1899            else if ((i = m - s)) {     /* faster from front */
1900                d -= clen;
1901                m = d;
1902                sv_chop(TARG, d-i);
1903                s += i;
1904                while (i--)
1905                    *--d = *--s;
1906                if (clen)
1907                    Copy(c, m, clen, char);
1908            }
1909            else if (clen) {
1910                d -= clen;
1911                sv_chop(TARG, d);
1912                Copy(c, d, clen, char);
1913            }
1914            else {
1915                sv_chop(TARG, d);
1916            }
1917            TAINT_IF(rxtainted & 1);
1918            SPAGAIN;
1919            PUSHs(&PL_sv_yes);
1920        }
1921        else {
1922            do {
1923                if (iters++ > maxiters)
1924                    DIE(aTHX_ "Substitution loop");
1925                rxtainted |= RX_MATCH_TAINTED(rx);
1926                m = rx->startp[0] + orig;
1927                /*SUPPRESS 560*/
1928                if ((i = m - s)) {
1929                    if (s != d)
1930                        Move(s, d, i, char);
1931                    d += i;
1932                }
1933                if (clen) {
1934                    Copy(c, d, clen, char);
1935                    d += clen;
1936                }
1937                s = rx->endp[0] + orig;
1938            } while (CALLREGEXEC(aTHX_ rx, s, strend, orig, s == m,
1939                                 TARG, NULL,
1940                                 /* don't match same null twice */
1941                                 REXEC_NOT_FIRST|REXEC_IGNOREPOS));
1942            if (s != d) {
1943                i = strend - s;
1944                SvCUR_set(TARG, d - SvPVX(TARG) + i);
1945                Move(s, d, i+1, char);          /* include the NUL */
1946            }
1947            TAINT_IF(rxtainted & 1);
1948            SPAGAIN;
1949            PUSHs(sv_2mortal(newSViv((I32)iters)));
1950        }
1951        (void)SvPOK_only_UTF8(TARG);
1952        TAINT_IF(rxtainted);
1953        if (SvSMAGICAL(TARG)) {
1954            PUTBACK;
1955            mg_set(TARG);
1956            SPAGAIN;
1957        }
1958        SvTAINT(TARG);
1959        LEAVE_SCOPE(oldsave);
1960        RETURN;
1961    }
1962
1963    if (CALLREGEXEC(aTHX_ rx, s, strend, orig, 0, TARG, NULL,
1964                    r_flags | REXEC_CHECKED))
1965    {
1966        bool isutf8;
1967
1968        if (force_on_match) {
1969            force_on_match = 0;
1970            s = SvPV_force(TARG, len);
1971            goto force_it;
1972        }
1973        rxtainted |= RX_MATCH_TAINTED(rx);
1974        dstr = NEWSV(25, len);
1975        sv_setpvn(dstr, m, s-m);
1976        if (do_utf8)
1977            SvUTF8_on(dstr);
1978        PL_curpm = pm;
1979        if (!c) {
1980            register PERL_CONTEXT *cx;
1981            SPAGAIN;
1982            PUSHSUBST(cx);
1983            RETURNOP(cPMOP->op_pmreplroot);
1984        }
1985        r_flags |= REXEC_IGNOREPOS | REXEC_NOT_FIRST;
1986        do {
1987            if (iters++ > maxiters)
1988                DIE(aTHX_ "Substitution loop");
1989            rxtainted |= RX_MATCH_TAINTED(rx);
1990            if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
1991                m = s;
1992                s = orig;
1993                orig = rx->subbeg;
1994                s = orig + (m - s);
1995                strend = s + (strend - m);
1996            }
1997            m = rx->startp[0] + orig;
1998            sv_catpvn(dstr, s, m-s);
1999            s = rx->endp[0] + orig;
2000            if (clen)
2001                sv_catsv(dstr, rstr);
2002            if (once)
2003                break;
2004        } while (CALLREGEXEC(aTHX_ rx, s, strend, orig, s == m, TARG, NULL, r_flags));
2005        sv_catpvn(dstr, s, strend - s);
2006
2007        (void)SvOOK_off(TARG);
2008        Safefree(SvPVX(TARG));
2009        SvPVX(TARG) = SvPVX(dstr);
2010        SvCUR_set(TARG, SvCUR(dstr));
2011        SvLEN_set(TARG, SvLEN(dstr));
2012        isutf8 = DO_UTF8(dstr);
2013        SvPVX(dstr) = 0;
2014        sv_free(dstr);
2015
2016        TAINT_IF(rxtainted & 1);
2017        SPAGAIN;
2018        PUSHs(sv_2mortal(newSViv((I32)iters)));
2019
2020        (void)SvPOK_only(TARG);
2021        if (isutf8)
2022            SvUTF8_on(TARG);
2023        TAINT_IF(rxtainted);
2024        SvSETMAGIC(TARG);
2025        SvTAINT(TARG);
2026        LEAVE_SCOPE(oldsave);
2027        RETURN;
2028    }
2029    goto ret_no;
2030
2031nope:
2032ret_no:         
2033    SPAGAIN;
2034    PUSHs(&PL_sv_no);
2035    LEAVE_SCOPE(oldsave);
2036    RETURN;
2037}
2038
2039PP(pp_grepwhile)
2040{
2041    dSP;
2042
2043    if (SvTRUEx(POPs))
2044        PL_stack_base[PL_markstack_ptr[-1]++] = PL_stack_base[*PL_markstack_ptr];
2045    ++*PL_markstack_ptr;
2046    LEAVE;                                      /* exit inner scope */
2047
2048    /* All done yet? */
2049    if (PL_stack_base + *PL_markstack_ptr > SP) {
2050        I32 items;
2051        I32 gimme = GIMME_V;
2052
2053        LEAVE;                                  /* exit outer scope */
2054        (void)POPMARK;                          /* pop src */
2055        items = --*PL_markstack_ptr - PL_markstack_ptr[-1];
2056        (void)POPMARK;                          /* pop dst */
2057        SP = PL_stack_base + POPMARK;           /* pop original mark */
2058        if (gimme == G_SCALAR) {
2059            dTARGET;
2060            XPUSHi(items);
2061        }
2062        else if (gimme == G_ARRAY)
2063            SP += items;
2064        RETURN;
2065    }
2066    else {
2067        SV *src;
2068
2069        ENTER;                                  /* enter inner scope */
2070        SAVEVPTR(PL_curpm);
2071
2072        src = PL_stack_base[*PL_markstack_ptr];
2073        SvTEMP_off(src);
2074        DEFSV = src;
2075
2076        RETURNOP(cLOGOP->op_other);
2077    }
2078}
2079
2080PP(pp_leavesub)
2081{
2082    dSP;
2083    SV **mark;
2084    SV **newsp;
2085    PMOP *newpm;
2086    I32 gimme;
2087    register PERL_CONTEXT *cx;
2088    SV *sv;
2089
2090    POPBLOCK(cx,newpm);
2091 
2092    TAINT_NOT;
2093    if (gimme == G_SCALAR) {
2094        MARK = newsp + 1;
2095        if (MARK <= SP) {
2096            if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
2097                if (SvTEMP(TOPs)) {
2098                    *MARK = SvREFCNT_inc(TOPs);
2099                    FREETMPS;
2100                    sv_2mortal(*MARK);
2101                }
2102                else {
2103                    sv = SvREFCNT_inc(TOPs);    /* FREETMPS could clobber it */
2104                    FREETMPS;
2105                    *MARK = sv_mortalcopy(sv);
2106                    SvREFCNT_dec(sv);
2107                }
2108            }
2109            else
2110                *MARK = SvTEMP(TOPs) ? TOPs : sv_mortalcopy(TOPs);
2111        }
2112        else {
2113            MEXTEND(MARK, 0);
2114            *MARK = &PL_sv_undef;
2115        }
2116        SP = MARK;
2117    }
2118    else if (gimme == G_ARRAY) {
2119        for (MARK = newsp + 1; MARK <= SP; MARK++) {
2120            if (!SvTEMP(*MARK)) {
2121                *MARK = sv_mortalcopy(*MARK);
2122                TAINT_NOT;      /* Each item is independent */
2123            }
2124        }
2125    }
2126    PUTBACK;
2127   
2128    POPSUB(cx,sv);      /* Stack values are safe: release CV and @_ ... */
2129    PL_curpm = newpm;   /* ... and pop $1 et al */
2130
2131    LEAVE;
2132    LEAVESUB(sv);
2133    return pop_return();
2134}
2135
2136/* This duplicates the above code because the above code must not
2137 * get any slower by more conditions */
2138PP(pp_leavesublv)
2139{
2140    dSP;
2141    SV **mark;
2142    SV **newsp;
2143    PMOP *newpm;
2144    I32 gimme;
2145    register PERL_CONTEXT *cx;
2146    SV *sv;
2147
2148    POPBLOCK(cx,newpm);
2149 
2150    TAINT_NOT;
2151
2152    if (cx->blk_sub.lval & OPpENTERSUB_INARGS) {
2153        /* We are an argument to a function or grep().
2154         * This kind of lvalueness was legal before lvalue
2155         * subroutines too, so be backward compatible:
2156         * cannot report errors.  */
2157
2158        /* Scalar context *is* possible, on the LHS of -> only,
2159         * as in f()->meth().  But this is not an lvalue. */
2160        if (gimme == G_SCALAR)
2161            goto temporise;
2162        if (gimme == G_ARRAY) {
2163            if (!CvLVALUE(cx->blk_sub.cv))
2164                goto temporise_array;
2165            EXTEND_MORTAL(SP - newsp);
2166            for (mark = newsp + 1; mark <= SP; mark++) {
2167                if (SvTEMP(*mark))
2168                    /* empty */ ;
2169                else if (SvFLAGS(*mark) & (SVs_PADTMP | SVf_READONLY))
2170                    *mark = sv_mortalcopy(*mark);
2171                else {
2172                    /* Can be a localized value subject to deletion. */
2173                    PL_tmps_stack[++PL_tmps_ix] = *mark;
2174                    (void)SvREFCNT_inc(*mark);
2175                }
2176            }
2177        }
2178    }
2179    else if (cx->blk_sub.lval) {     /* Leave it as it is if we can. */
2180        /* Here we go for robustness, not for speed, so we change all
2181         * the refcounts so the caller gets a live guy. Cannot set
2182         * TEMP, so sv_2mortal is out of question. */
2183        if (!CvLVALUE(cx->blk_sub.cv)) {
2184            POPSUB(cx,sv);
2185            PL_curpm = newpm;
2186            LEAVE;
2187            LEAVESUB(sv);
2188            DIE(aTHX_ "Can't modify non-lvalue subroutine call");
2189        }
2190        if (gimme == G_SCALAR) {
2191            MARK = newsp + 1;
2192            EXTEND_MORTAL(1);
2193            if (MARK == SP) {
2194                if (SvFLAGS(TOPs) & (SVs_TEMP | SVs_PADTMP | SVf_READONLY)) {
2195                    POPSUB(cx,sv);
2196                    PL_curpm = newpm;
2197                    LEAVE;
2198                    LEAVESUB(sv);
2199                    DIE(aTHX_ "Can't return a %s from lvalue subroutine",
2200                        SvREADONLY(TOPs) ? "readonly value" : "temporary");
2201                }
2202                else {                  /* Can be a localized value
2203                                         * subject to deletion. */
2204                    PL_tmps_stack[++PL_tmps_ix] = *mark;
2205                    (void)SvREFCNT_inc(*mark);
2206                }
2207            }
2208            else {                      /* Should not happen? */
2209                POPSUB(cx,sv);
2210                PL_curpm = newpm;
2211                LEAVE;
2212                LEAVESUB(sv);
2213                DIE(aTHX_ "%s returned from lvalue subroutine in scalar context",
2214                    (MARK > SP ? "Empty array" : "Array"));
2215            }
2216            SP = MARK;
2217        }
2218        else if (gimme == G_ARRAY) {
2219            EXTEND_MORTAL(SP - newsp);
2220            for (mark = newsp + 1; mark <= SP; mark++) {
2221                if (SvFLAGS(*mark) & (SVs_TEMP | SVs_PADTMP | SVf_READONLY)) {
2222                    /* Might be flattened array after $#array =  */
2223                    PUTBACK;
2224                    POPSUB(cx,sv);
2225                    PL_curpm = newpm;
2226                    LEAVE;
2227                    LEAVESUB(sv);
2228                    DIE(aTHX_ "Can't return %s from lvalue subroutine",
2229                        (*mark != &PL_sv_undef)
2230                        ? (SvREADONLY(TOPs)
2231                            ? "a readonly value" : "a temporary")
2232                        : "an uninitialized value");
2233                }
2234                else {
2235                    /* Can be a localized value subject to deletion. */
2236                    PL_tmps_stack[++PL_tmps_ix] = *mark;
2237                    (void)SvREFCNT_inc(*mark);
2238                }
2239            }
2240        }
2241    }
2242    else {
2243        if (gimme == G_SCALAR) {
2244          temporise:
2245            MARK = newsp + 1;
2246            if (MARK <= SP) {
2247                if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
2248                    if (SvTEMP(TOPs)) {
2249                        *MARK = SvREFCNT_inc(TOPs);
2250                        FREETMPS;
2251                        sv_2mortal(*MARK);
2252                    }
2253                    else {
2254                        sv = SvREFCNT_inc(TOPs); /* FREETMPS could clobber it */
2255                        FREETMPS;
2256                        *MARK = sv_mortalcopy(sv);
2257                        SvREFCNT_dec(sv);
2258                    }
2259                }
2260                else
2261                    *MARK = SvTEMP(TOPs) ? TOPs : sv_mortalcopy(TOPs);
2262            }
2263            else {
2264                MEXTEND(MARK, 0);
2265                *MARK = &PL_sv_undef;
2266            }
2267            SP = MARK;
2268        }
2269        else if (gimme == G_ARRAY) {
2270          temporise_array:
2271            for (MARK = newsp + 1; MARK <= SP; MARK++) {
2272                if (!SvTEMP(*MARK)) {
2273                    *MARK = sv_mortalcopy(*MARK);
2274                    TAINT_NOT;  /* Each item is independent */
2275                }
2276            }
2277        }
2278    }
2279    PUTBACK;
2280   
2281    POPSUB(cx,sv);      /* Stack values are safe: release CV and @_ ... */
2282    PL_curpm = newpm;   /* ... and pop $1 et al */
2283
2284    LEAVE;
2285    LEAVESUB(sv);
2286    return pop_return();
2287}
2288
2289
2290STATIC CV *
2291S_get_db_sub(pTHX_ SV **svp, CV *cv)
2292{
2293    SV *dbsv = GvSV(PL_DBsub);
2294
2295    if (!PERLDB_SUB_NN) {
2296        GV *gv = CvGV(cv);
2297
2298        save_item(dbsv);
2299        if ( (CvFLAGS(cv) & (CVf_ANON | CVf_CLONED))
2300             || strEQ(GvNAME(gv), "END")
2301             || ((GvCV(gv) != cv) && /* Could be imported, and old sub redefined. */
2302                 !( (SvTYPE(*svp) == SVt_PVGV) && (GvCV((GV*)*svp) == cv)
2303                    && (gv = (GV*)*svp) ))) {
2304            /* Use GV from the stack as a fallback. */
2305            /* GV is potentially non-unique, or contain different CV. */
2306            SV *tmp = newRV((SV*)cv);
2307            sv_setsv(dbsv, tmp);
2308            SvREFCNT_dec(tmp);
2309        }
2310        else {
2311            gv_efullname3(dbsv, gv, Nullch);
2312        }
2313    }
2314    else {
2315        (void)SvUPGRADE(dbsv, SVt_PVIV);
2316        (void)SvIOK_on(dbsv);
2317        SAVEIV(SvIVX(dbsv));
2318        SvIVX(dbsv) = PTR2IV(cv);       /* Do it the quickest way  */
2319    }
2320
2321    if (CvXSUB(cv))
2322        PL_curcopdb = PL_curcop;
2323    cv = GvCV(PL_DBsub);
2324    return cv;
2325}
2326
2327PP(pp_entersub)
2328{
2329    dSP; dPOPss;
2330    GV *gv;
2331    HV *stash;
2332    register CV *cv;
2333    register PERL_CONTEXT *cx;
2334    I32 gimme;
2335    bool hasargs = (PL_op->op_flags & OPf_STACKED) != 0;
2336
2337    if (!sv)
2338        DIE(aTHX_ "Not a CODE reference");
2339    switch (SvTYPE(sv)) {
2340    default:
2341        if (!SvROK(sv)) {
2342            char *sym;
2343            STRLEN n_a;
2344
2345            if (sv == &PL_sv_yes) {             /* unfound import, ignore */
2346                if (hasargs)
2347                    SP = PL_stack_base + POPMARK;
2348                RETURN;
2349            }
2350            if (SvGMAGICAL(sv)) {
2351                mg_get(sv);
2352                sym = SvPOKp(sv) ? SvPVX(sv) : Nullch;
2353            }
2354            else
2355                sym = SvPV(sv, n_a);
2356            if (!sym)
2357                DIE(aTHX_ PL_no_usym, "a subroutine");
2358            if (PL_op->op_private & HINT_STRICT_REFS)
2359                DIE(aTHX_ PL_no_symref, sym, "a subroutine");
2360            cv = get_cv(sym, TRUE);
2361            break;
2362        }
2363        {
2364            SV **sp = &sv;              /* Used in tryAMAGICunDEREF macro. */
2365            tryAMAGICunDEREF(to_cv);
2366        }       
2367        cv = (CV*)SvRV(sv);
2368        if (SvTYPE(cv) == SVt_PVCV)
2369            break;
2370        /* FALL THROUGH */
2371    case SVt_PVHV:
2372    case SVt_PVAV:
2373        DIE(aTHX_ "Not a CODE reference");
2374    case SVt_PVCV:
2375        cv = (CV*)sv;
2376        break;
2377    case SVt_PVGV:
2378        if (!(cv = GvCVu((GV*)sv)))
2379            cv = sv_2cv(sv, &stash, &gv, FALSE);
2380        if (!cv) {
2381            ENTER;
2382            SAVETMPS;
2383            goto try_autoload;
2384        }
2385        break;
2386    }
2387
2388    ENTER;
2389    SAVETMPS;
2390
2391  retry:
2392    if (!CvROOT(cv) && !CvXSUB(cv)) {
2393        GV* autogv;
2394        SV* sub_name;
2395
2396        /* anonymous or undef'd function leaves us no recourse */
2397        if (CvANON(cv) || !(gv = CvGV(cv)))
2398            DIE(aTHX_ "Undefined subroutine called");
2399
2400        /* autoloaded stub? */
2401        if (cv != GvCV(gv)) {
2402            cv = GvCV(gv);
2403        }
2404        /* should call AUTOLOAD now? */
2405        else {
2406try_autoload:
2407            if ((autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv),
2408                                   FALSE)))
2409            {
2410                cv = GvCV(autogv);
2411            }
2412            /* sorry */
2413            else {
2414                sub_name = sv_newmortal();
2415                gv_efullname3(sub_name, gv, Nullch);
2416                DIE(aTHX_ "Undefined subroutine &%s called", SvPVX(sub_name));
2417            }
2418        }
2419        if (!cv)
2420            DIE(aTHX_ "Not a CODE reference");
2421        goto retry;
2422    }
2423
2424    gimme = GIMME_V;
2425    if ((PL_op->op_private & OPpENTERSUB_DB) && GvCV(PL_DBsub) && !CvNODEBUG(cv)) {
2426        cv = get_db_sub(&sv, cv);
2427        if (!cv)
2428            DIE(aTHX_ "No DBsub routine");
2429    }
2430
2431#ifdef USE_THREADS
2432    /*
2433     * First we need to check if the sub or method requires locking.
2434     * If so, we gain a lock on the CV, the first argument or the
2435     * stash (for static methods), as appropriate. This has to be
2436     * inline because for FAKE_THREADS, COND_WAIT inlines code to
2437     * reschedule by returning a new op.
2438     */
2439    MUTEX_LOCK(CvMUTEXP(cv));
2440    if (CvFLAGS(cv) & CVf_LOCKED) {
2441        MAGIC *mg;     
2442        if (CvFLAGS(cv) & CVf_METHOD) {
2443            if (SP > PL_stack_base + TOPMARK)
2444                sv = *(PL_stack_base + TOPMARK + 1);
2445            else {
2446                AV *av = (AV*)PL_curpad[0];
2447                if (hasargs || !av || AvFILLp(av) < 0
2448                    || !(sv = AvARRAY(av)[0]))
2449                {
2450                    MUTEX_UNLOCK(CvMUTEXP(cv));
2451                    DIE(aTHX_ "no argument for locked method call");
2452                }
2453            }
2454            if (SvROK(sv))
2455                sv = SvRV(sv);
2456            else {             
2457                STRLEN len;
2458                char *stashname = SvPV(sv, len);
2459                sv = (SV*)gv_stashpvn(stashname, len, TRUE);
2460            }
2461        }
2462        else {
2463            sv = (SV*)cv;
2464        }
2465        MUTEX_UNLOCK(CvMUTEXP(cv));
2466        mg = condpair_magic(sv);
2467        MUTEX_LOCK(MgMUTEXP(mg));
2468        if (MgOWNER(mg) == thr)
2469            MUTEX_UNLOCK(MgMUTEXP(mg));
2470        else {
2471            while (MgOWNER(mg))
2472                COND_WAIT(MgOWNERCONDP(mg), MgMUTEXP(mg));
2473            MgOWNER(mg) = thr;
2474            DEBUG_S(PerlIO_printf(Perl_debug_log, "%p: pp_entersub lock %p\n",
2475                                  thr, sv);)
2476            MUTEX_UNLOCK(MgMUTEXP(mg));
2477            SAVEDESTRUCTOR_X(Perl_unlock_condpair, sv);
2478        }
2479        MUTEX_LOCK(CvMUTEXP(cv));
2480    }
2481    /*
2482     * Now we have permission to enter the sub, we must distinguish
2483     * four cases. (0) It's an XSUB (in which case we don't care
2484     * about ownership); (1) it's ours already (and we're recursing);
2485     * (2) it's free (but we may already be using a cached clone);
2486     * (3) another thread owns it. Case (1) is easy: we just use it.
2487     * Case (2) means we look for a clone--if we have one, use it
2488     * otherwise grab ownership of cv. Case (3) means we look for a
2489     * clone (for non-XSUBs) and have to create one if we don't
2490     * already have one.
2491     * Why look for a clone in case (2) when we could just grab
2492     * ownership of cv straight away? Well, we could be recursing,
2493     * i.e. we originally tried to enter cv while another thread
2494     * owned it (hence we used a clone) but it has been freed up
2495     * and we're now recursing into it. It may or may not be "better"
2496     * to use the clone but at least CvDEPTH can be trusted.
2497     */
2498    if (CvOWNER(cv) == thr || CvXSUB(cv))
2499        MUTEX_UNLOCK(CvMUTEXP(cv));
2500    else {
2501        /* Case (2) or (3) */
2502        SV **svp;
2503       
2504        /*
2505         * XXX Might it be better to release CvMUTEXP(cv) while we
2506         * do the hv_fetch? We might find someone has pinched it
2507         * when we look again, in which case we would be in case
2508         * (3) instead of (2) so we'd have to clone. Would the fact
2509         * that we released the mutex more quickly make up for this?
2510         */
2511        if ((svp = hv_fetch(thr->cvcache, (char *)cv, sizeof(cv), FALSE)))
2512        {
2513            /* We already have a clone to use */
2514            MUTEX_UNLOCK(CvMUTEXP(cv));
2515            cv = *(CV**)svp;
2516            DEBUG_S(PerlIO_printf(Perl_debug_log,
2517                                  "entersub: %p already has clone %p:%s\n",
2518                                  thr, cv, SvPEEK((SV*)cv)));
2519            CvOWNER(cv) = thr;
2520            SvREFCNT_inc(cv);
2521            if (CvDEPTH(cv) == 0)
2522                SAVEDESTRUCTOR_X(unset_cvowner, (void*) cv);
2523        }
2524        else {
2525            /* (2) => grab ownership of cv. (3) => make clone */
2526            if (!CvOWNER(cv)) {
2527                CvOWNER(cv) = thr;
2528                SvREFCNT_inc(cv);
2529                MUTEX_UNLOCK(CvMUTEXP(cv));
2530                DEBUG_S(PerlIO_printf(Perl_debug_log,
2531                            "entersub: %p grabbing %p:%s in stash %s\n",
2532                            thr, cv, SvPEEK((SV*)cv), CvSTASH(cv) ?
2533                                HvNAME(CvSTASH(cv)) : "(none)"));
2534            }
2535            else {
2536                /* Make a new clone. */
2537                CV *clonecv;
2538                SvREFCNT_inc(cv); /* don't let it vanish from under us */
2539                MUTEX_UNLOCK(CvMUTEXP(cv));
2540                DEBUG_S((PerlIO_printf(Perl_debug_log,
2541                                       "entersub: %p cloning %p:%s\n",
2542                                       thr, cv, SvPEEK((SV*)cv))));
2543                /*
2544                 * We're creating a new clone so there's no race
2545                 * between the original MUTEX_UNLOCK and the
2546                 * SvREFCNT_inc since no one will be trying to undef
2547                 * it out from underneath us. At least, I don't think
2548                 * there's a race...
2549                 */
2550                clonecv = cv_clone(cv);
2551                SvREFCNT_dec(cv); /* finished with this */
2552                hv_store(thr->cvcache, (char*)cv, sizeof(cv), (SV*)clonecv,0);
2553                CvOWNER(clonecv) = thr;
2554                cv = clonecv;
2555                SvREFCNT_inc(cv);
2556            }
2557            DEBUG_S(if (CvDEPTH(cv) != 0)
2558                        PerlIO_printf(Perl_debug_log, "depth %ld != 0\n",
2559                                      CvDEPTH(cv)););
2560            SAVEDESTRUCTOR_X(unset_cvowner, (void*) cv);
2561        }
2562    }
2563#endif /* USE_THREADS */
2564
2565    if (CvXSUB(cv)) {
2566#ifdef PERL_XSUB_OLDSTYLE
2567        if (CvOLDSTYLE(cv)) {
2568            I32 (*fp3)(int,int,int);
2569            dMARK;
2570            register I32 items = SP - MARK;
2571                                        /* We dont worry to copy from @_. */
2572            while (SP > mark) {
2573                SP[1] = SP[0];
2574                SP--;
2575            }
2576            PL_stack_sp = mark + 1;
2577            fp3 = (I32(*)(int,int,int))CvXSUB(cv);
2578            items = (*fp3)(CvXSUBANY(cv).any_i32,
2579                           MARK - PL_stack_base + 1,
2580                           items);
2581            PL_stack_sp = PL_stack_base + items;
2582        }
2583        else
2584#endif /* PERL_XSUB_OLDSTYLE */
2585        {
2586            I32 markix = TOPMARK;
2587
2588            PUTBACK;
2589
2590            if (!hasargs) {
2591                /* Need to copy @_ to stack. Alternative may be to
2592                 * switch stack to @_, and copy return values
2593                 * back. This would allow popping @_ in XSUB, e.g.. XXXX */
2594                AV* av;
2595                I32 items;
2596#ifdef USE_THREADS
2597                av = (AV*)PL_curpad[0];
2598#else
2599                av = GvAV(PL_defgv);
2600#endif /* USE_THREADS */               
2601                items = AvFILLp(av) + 1;   /* @_ is not tieable */
2602
2603                if (items) {
2604                    /* Mark is at the end of the stack. */
2605                    EXTEND(SP, items);
2606                    Copy(AvARRAY(av), SP + 1, items, SV*);
2607                    SP += items;
2608                    PUTBACK ;               
2609                }
2610            }
2611            /* We assume first XSUB in &DB::sub is the called one. */
2612            if (PL_curcopdb) {
2613                SAVEVPTR(PL_curcop);
2614                PL_curcop = PL_curcopdb;
2615                PL_curcopdb = NULL;
2616            }
2617            /* Do we need to open block here? XXXX */
2618            (void)(*CvXSUB(cv))(aTHXo_ cv);
2619
2620            /* Enforce some sanity in scalar context. */
2621            if (gimme == G_SCALAR && ++markix != PL_stack_sp - PL_stack_base ) {
2622                if (markix > PL_stack_sp - PL_stack_base)
2623                    *(PL_stack_base + markix) = &PL_sv_undef;
2624                else
2625                    *(PL_stack_base + markix) = *PL_stack_sp;
2626                PL_stack_sp = PL_stack_base + markix;
2627            }
2628        }
2629        LEAVE;
2630        return NORMAL;
2631    }
2632    else {
2633        dMARK;
2634        register I32 items = SP - MARK;
2635        AV* padlist = CvPADLIST(cv);
2636        SV** svp = AvARRAY(padlist);
2637        push_return(PL_op->op_next);
2638        PUSHBLOCK(cx, CXt_SUB, MARK);
2639        PUSHSUB(cx);
2640        CvDEPTH(cv)++;
2641        /* XXX This would be a natural place to set C<PL_compcv = cv> so
2642         * that eval'' ops within this sub know the correct lexical space.
2643         * Owing the speed considerations, we choose to search for the cv
2644         * in doeval() instead.
2645         */
2646        if (CvDEPTH(cv) < 2)
2647            (void)SvREFCNT_inc(cv);
2648        else {  /* save temporaries on recursion? */
2649            PERL_STACK_OVERFLOW_CHECK();
2650            if (CvDEPTH(cv) > AvFILLp(padlist)) {
2651                AV *av;
2652                AV *newpad = newAV();
2653                SV **oldpad = AvARRAY(svp[CvDEPTH(cv)-1]);
2654                I32 ix = AvFILLp((AV*)svp[1]);
2655                I32 names_fill = AvFILLp((AV*)svp[0]);
2656                svp = AvARRAY(svp[0]);
2657                for ( ;ix > 0; ix--) {
2658                    if (names_fill >= ix && svp[ix] != &PL_sv_undef) {
2659                        char *name = SvPVX(svp[ix]);
2660                        if ((SvFLAGS(svp[ix]) & SVf_FAKE) /* outer lexical? */
2661                            || *name == '&')              /* anonymous code? */
2662                        {
2663                            av_store(newpad, ix, SvREFCNT_inc(oldpad[ix]));
2664                        }
2665                        else {                          /* our own lexical */
2666                            if (*name == '@')
2667                                av_store(newpad, ix, sv = (SV*)newAV());
2668                            else if (*name == '%')
2669                                av_store(newpad, ix, sv = (SV*)newHV());
2670                            else
2671                                av_store(newpad, ix, sv = NEWSV(0,0));
2672                            SvPADMY_on(sv);
2673                        }
2674                    }
2675                    else if (IS_PADGV(oldpad[ix]) || IS_PADCONST(oldpad[ix])) {
2676                        av_store(newpad, ix, sv = SvREFCNT_inc(oldpad[ix]));
2677                    }
2678                    else {
2679                        av_store(newpad, ix, sv = NEWSV(0,0));
2680                        SvPADTMP_on(sv);
2681                    }
2682                }
2683                av = newAV();           /* will be @_ */
2684                av_extend(av, 0);
2685                av_store(newpad, 0, (SV*)av);
2686                AvFLAGS(av) = AVf_REIFY;
2687                av_store(padlist, CvDEPTH(cv), (SV*)newpad);
2688                AvFILLp(padlist) = CvDEPTH(cv);
2689                svp = AvARRAY(padlist);
2690            }
2691        }
2692#ifdef USE_THREADS
2693        if (!hasargs) {
2694            AV* av = (AV*)PL_curpad[0];
2695
2696            items = AvFILLp(av) + 1;
2697            if (items) {
2698                /* Mark is at the end of the stack. */
2699                EXTEND(SP, items);
2700                Copy(AvARRAY(av), SP + 1, items, SV*);
2701                SP += items;
2702                PUTBACK ;                   
2703            }
2704        }
2705#endif /* USE_THREADS */               
2706        SAVEVPTR(PL_curpad);
2707        PL_curpad = AvARRAY((AV*)svp[CvDEPTH(cv)]);
2708#ifndef USE_THREADS
2709        if (hasargs)
2710#endif /* USE_THREADS */
2711        {
2712            AV* av;
2713            SV** ary;
2714
2715#if 0
2716            DEBUG_S(PerlIO_printf(Perl_debug_log,
2717                                  "%p entersub preparing @_\n", thr));
2718#endif
2719            av = (AV*)PL_curpad[0];
2720            if (AvREAL(av)) {
2721                /* @_ is normally not REAL--this should only ever
2722                 * happen when DB::sub() calls things that modify @_ */
2723                av_clear(av);
2724                AvREAL_off(av);
2725                AvREIFY_on(av);
2726            }
2727#ifndef USE_THREADS
2728            cx->blk_sub.savearray = GvAV(PL_defgv);
2729            GvAV(PL_defgv) = (AV*)SvREFCNT_inc(av);
2730#endif /* USE_THREADS */
2731            cx->blk_sub.oldcurpad = PL_curpad;
2732            cx->blk_sub.argarray = av;
2733            ++MARK;
2734
2735            if (items > AvMAX(av) + 1) {
2736                ary = AvALLOC(av);
2737                if (AvARRAY(av) != ary) {
2738                    AvMAX(av) += AvARRAY(av) - AvALLOC(av);
2739                    SvPVX(av) = (char*)ary;
2740                }
2741                if (items > AvMAX(av) + 1) {
2742                    AvMAX(av) = items - 1;
2743                    Renew(ary,items,SV*);
2744                    AvALLOC(av) = ary;
2745                    SvPVX(av) = (char*)ary;
2746                }
2747            }
2748            Copy(MARK,AvARRAY(av),items,SV*);
2749            AvFILLp(av) = items - 1;
2750           
2751            while (items--) {
2752                if (*MARK)
2753                    SvTEMP_off(*MARK);
2754                MARK++;
2755            }
2756        }
2757        /* warning must come *after* we fully set up the context
2758         * stuff so that __WARN__ handlers can safely dounwind()
2759         * if they want to
2760         */
2761        if (CvDEPTH(cv) == 100 && ckWARN(WARN_RECURSION)
2762            && !(PERLDB_SUB && cv == GvCV(PL_DBsub)))
2763            sub_crush_depth(cv);
2764#if 0
2765        DEBUG_S(PerlIO_printf(Perl_debug_log,
2766                              "%p entersub returning %p\n", thr, CvSTART(cv)));
2767#endif
2768        RETURNOP(CvSTART(cv));
2769    }
2770}
2771
2772void
2773Perl_sub_crush_depth(pTHX_ CV *cv)
2774{
2775    if (CvANON(cv))
2776        Perl_warner(aTHX_ WARN_RECURSION, "Deep recursion on anonymous subroutine");
2777    else {
2778        SV* tmpstr = sv_newmortal();
2779        gv_efullname3(tmpstr, CvGV(cv), Nullch);
2780        Perl_warner(aTHX_ WARN_RECURSION, "Deep recursion on subroutine \"%s\"",
2781                SvPVX(tmpstr));
2782    }
2783}
2784
2785PP(pp_aelem)
2786{
2787    dSP;
2788    SV** svp;
2789    IV elem = POPi;
2790    AV* av = (AV*)POPs;
2791    U32 lval = PL_op->op_flags & OPf_MOD || LVRET;
2792    U32 defer = (PL_op->op_private & OPpLVAL_DEFER) && (elem > AvFILL(av));
2793    SV *sv;
2794
2795    if (elem > 0)
2796        elem -= PL_curcop->cop_arybase;
2797    if (SvTYPE(av) != SVt_PVAV)
2798        RETPUSHUNDEF;
2799    svp = av_fetch(av, elem, lval && !defer);
2800    if (lval) {
2801        if (!svp || *svp == &PL_sv_undef) {
2802            SV* lv;
2803            if (!defer)
2804                DIE(aTHX_ PL_no_aelem, elem);
2805            lv = sv_newmortal();
2806            sv_upgrade(lv, SVt_PVLV);
2807            LvTYPE(lv) = 'y';
2808            sv_magic(lv, Nullsv, 'y', Nullch, 0);
2809            LvTARG(lv) = SvREFCNT_inc(av);
2810            LvTARGOFF(lv) = elem;
2811            LvTARGLEN(lv) = 1;
2812            PUSHs(lv);
2813            RETURN;
2814        }
2815        if (PL_op->op_private & OPpLVAL_INTRO)
2816            save_aelem(av, elem, svp);
2817        else if (PL_op->op_private & OPpDEREF)
2818            vivify_ref(*svp, PL_op->op_private & OPpDEREF);
2819    }
2820    sv = (svp ? *svp : &PL_sv_undef);
2821    if (!lval && SvGMAGICAL(sv))        /* see note in pp_helem() */
2822        sv = sv_mortalcopy(sv);
2823    PUSHs(sv);
2824    RETURN;
2825}
2826
2827void
2828Perl_vivify_ref(pTHX_ SV *sv, U32 to_what)
2829{
2830    if (SvGMAGICAL(sv))
2831        mg_get(sv);
2832    if (!SvOK(sv)) {
2833        if (SvREADONLY(sv))
2834            Perl_croak(aTHX_ PL_no_modify);
2835        if (SvTYPE(sv) < SVt_RV)
2836            sv_upgrade(sv, SVt_RV);
2837        else if (SvTYPE(sv) >= SVt_PV) {
2838            (void)SvOOK_off(sv);
2839            Safefree(SvPVX(sv));
2840            SvLEN(sv) = SvCUR(sv) = 0;
2841        }
2842        switch (to_what) {
2843        case OPpDEREF_SV:
2844            SvRV(sv) = NEWSV(355,0);
2845            break;
2846        case OPpDEREF_AV:
2847            SvRV(sv) = (SV*)newAV();
2848            break;
2849        case OPpDEREF_HV:
2850            SvRV(sv) = (SV*)newHV();
2851            break;
2852        }
2853        SvROK_on(sv);
2854        SvSETMAGIC(sv);
2855    }
2856}
2857
2858PP(pp_method)
2859{
2860    dSP;
2861    SV* sv = TOPs;
2862
2863    if (SvROK(sv)) {
2864        SV* rsv = SvRV(sv);
2865        if (SvTYPE(rsv) == SVt_PVCV) {
2866            SETs(rsv);
2867            RETURN;
2868        }
2869    }
2870
2871    SETs(method_common(sv, Null(U32*)));
2872    RETURN;
2873}
2874
2875PP(pp_method_named)
2876{
2877    dSP;
2878    SV* sv = cSVOP->op_sv;
2879    U32 hash = SvUVX(sv);
2880
2881    XPUSHs(method_common(sv, &hash));
2882    RETURN;
2883}
2884
2885STATIC SV *
2886S_method_common(pTHX_ SV* meth, U32* hashp)
2887{
2888    SV* sv;
2889    SV* ob;
2890    GV* gv;
2891    HV* stash;
2892    char* name;
2893    STRLEN namelen;
2894    char* packname;
2895    STRLEN packlen;
2896
2897    name = SvPV(meth, namelen);
2898    sv = *(PL_stack_base + TOPMARK + 1);
2899
2900    if (!sv)
2901        Perl_croak(aTHX_ "Can't call method \"%s\" on an undefined value", name);
2902
2903    if (SvGMAGICAL(sv))
2904        mg_get(sv);
2905    if (SvROK(sv))
2906        ob = (SV*)SvRV(sv);
2907    else {
2908        GV* iogv;
2909
2910        packname = Nullch;
2911        if (!SvOK(sv) ||
2912            !(packname = SvPV(sv, packlen)) ||
2913            !(iogv = gv_fetchpv(packname, FALSE, SVt_PVIO)) ||
2914            !(ob=(SV*)GvIO(iogv)))
2915        {
2916            if (!packname ||
2917                ((UTF8_IS_START(*packname) && DO_UTF8(sv))
2918                    ? !isIDFIRST_utf8((U8*)packname)
2919                    : !isIDFIRST(*packname)
2920                ))
2921            {
2922                Perl_croak(aTHX_ "Can't call method \"%s\" %s", name,
2923                           SvOK(sv) ? "without a package or object reference"
2924                                    : "on an undefined value");
2925            }
2926            stash = gv_stashpvn(packname, packlen, TRUE);
2927            goto fetch;
2928        }
2929        *(PL_stack_base + TOPMARK + 1) = sv_2mortal(newRV((SV*)iogv));
2930    }
2931
2932    if (!ob || !(SvOBJECT(ob)
2933                 || (SvTYPE(ob) == SVt_PVGV && (ob = (SV*)GvIO((GV*)ob))
2934                     && SvOBJECT(ob))))
2935    {
2936        Perl_croak(aTHX_ "Can't call method \"%s\" on unblessed reference",
2937                   name);
2938    }
2939
2940    stash = SvSTASH(ob);
2941
2942  fetch:
2943    /* shortcut for simple names */
2944    if (hashp) {
2945        HE* he = hv_fetch_ent(stash, meth, 0, *hashp);
2946        if (he) {
2947            gv = (GV*)HeVAL(he);
2948            if (isGV(gv) && GvCV(gv) &&
2949                (!GvCVGEN(gv) || GvCVGEN(gv) == PL_sub_generation))
2950                return (SV*)GvCV(gv);
2951        }
2952    }
2953
2954    gv = gv_fetchmethod(stash, name);
2955    if (!gv) {
2956        char* leaf = name;
2957        char* sep = Nullch;
2958        char* p;
2959        GV* gv;
2960
2961        for (p = name; *p; p++) {
2962            if (*p == '\'')
2963                sep = p, leaf = p + 1;
2964            else if (*p == ':' && *(p + 1) == ':')
2965                sep = p, leaf = p + 2;
2966        }
2967        if (!sep || ((sep - name) == 5 && strnEQ(name, "SUPER", 5))) {
2968            packname = sep ? CopSTASHPV(PL_curcop) : HvNAME(stash);
2969            packlen = strlen(packname);
2970        }
2971        else {
2972            packname = name;
2973            packlen = sep - name;
2974        }
2975        gv = gv_fetchpv(packname, 0, SVt_PVHV);
2976        if (gv && isGV(gv)) {
2977            Perl_croak(aTHX_
2978                       "Can't locate object method \"%s\" via package \"%s\"",
2979                       leaf, packname);
2980        }
2981        else {
2982            Perl_croak(aTHX_
2983                       "Can't locate object method \"%s\" via package \"%s\""
2984                       " (perhaps you forgot to load \"%s\"?)",
2985                       leaf, packname, packname);
2986        }
2987    }
2988    return isGV(gv) ? (SV*)GvCV(gv) : (SV*)gv;
2989}
2990
2991#ifdef USE_THREADS
2992static void
2993unset_cvowner(pTHXo_ void *cvarg)
2994{
2995    register CV* cv = (CV *) cvarg;
2996
2997    DEBUG_S((PerlIO_printf(Perl_debug_log, "%p unsetting CvOWNER of %p:%s\n",
2998                           thr, cv, SvPEEK((SV*)cv))));
2999    MUTEX_LOCK(CvMUTEXP(cv));
3000    DEBUG_S(if (CvDEPTH(cv) != 0)
3001                PerlIO_printf(Perl_debug_log, "depth %ld != 0\n",
3002                              CvDEPTH(cv)););
3003    assert(thr == CvOWNER(cv));
3004    CvOWNER(cv) = 0;
3005    MUTEX_UNLOCK(CvMUTEXP(cv));
3006    SvREFCNT_dec(cv);
3007}
3008#endif /* USE_THREADS */
Note: See TracBrowser for help on using the repository browser.