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