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