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