First stab at 5.003 -> 5.004 integration.
[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 /* Hot code. */
22
23 PP(pp_const)
24 {
25     dSP;
26     XPUSHs(cSVOP->op_sv);
27     RETURN;
28 }
29
30 PP(pp_nextstate)
31 {
32     curcop = (COP*)op;
33     TAINT_NOT;          /* Each statement is presumed innocent */
34     stack_sp = stack_base + cxstack[cxstack_ix].blk_oldsp;
35     FREETMPS;
36     return NORMAL;
37 }
38
39 PP(pp_gvsv)
40 {
41     dSP;
42     EXTEND(sp,1);
43     if (op->op_private & OPpLVAL_INTRO)
44         PUSHs(save_scalar(cGVOP->op_gv));
45     else
46         PUSHs(GvSV(cGVOP->op_gv));
47     RETURN;
48 }
49
50 PP(pp_null)
51 {
52     return NORMAL;
53 }
54
55 PP(pp_pushmark)
56 {
57     PUSHMARK(stack_sp);
58     return NORMAL;
59 }
60
61 PP(pp_stringify)
62 {
63     dSP; dTARGET;
64     STRLEN len;
65     char *s;
66     s = SvPV(TOPs,len);
67     sv_setpvn(TARG,s,len);
68     SETTARG;
69     RETURN;
70 }
71
72 PP(pp_gv)
73 {
74     dSP;
75     XPUSHs((SV*)cGVOP->op_gv);
76     RETURN;
77 }
78
79 PP(pp_gelem)
80 {
81     GV *gv;
82     SV *sv;
83     SV *ref;
84     char *elem;
85     dSP;
86
87     sv = POPs;
88     elem = SvPV(sv, na);
89     gv = (GV*)POPs;
90     ref = Nullsv;
91     sv = Nullsv;
92     switch (elem ? *elem : '\0')
93     {
94     case 'A':
95         if (strEQ(elem, "ARRAY"))
96             ref = (SV*)GvAV(gv);
97         break;
98     case 'C':
99         if (strEQ(elem, "CODE"))
100             ref = (SV*)GvCVu(gv);
101         break;
102     case 'F':
103         if (strEQ(elem, "FILEHANDLE")) /* XXX deprecate in 5.005 */
104             ref = (SV*)GvIOp(gv);
105         break;
106     case 'G':
107         if (strEQ(elem, "GLOB"))
108             ref = (SV*)gv;
109         break;
110     case 'H':
111         if (strEQ(elem, "HASH"))
112             ref = (SV*)GvHV(gv);
113         break;
114     case 'I':
115         if (strEQ(elem, "IO"))
116             ref = (SV*)GvIOp(gv);
117         break;
118     case 'N':
119         if (strEQ(elem, "NAME"))
120             sv = newSVpv(GvNAME(gv), GvNAMELEN(gv));
121         break;
122     case 'P':
123         if (strEQ(elem, "PACKAGE"))
124             sv = newSVpv(HvNAME(GvSTASH(gv)), 0);
125         break;
126     case 'S':
127         if (strEQ(elem, "SCALAR"))
128             ref = GvSV(gv);
129         break;
130     }
131     if (ref)
132         sv = newRV(ref);
133     if (sv)
134         sv_2mortal(sv);
135     else
136         sv = &sv_undef;
137     XPUSHs(sv);
138     RETURN;
139 }
140
141 PP(pp_and)
142 {
143     dSP;
144     if (!SvTRUE(TOPs))
145         RETURN;
146     else {
147         --SP;
148         RETURNOP(cLOGOP->op_other);
149     }
150 }
151
152 PP(pp_sassign)
153 {
154     dSP; dPOPTOPssrl;
155     MAGIC *mg;
156
157     if (op->op_private & OPpASSIGN_BACKWARDS) {
158         SV *temp;
159         temp = left; left = right; right = temp;
160     }
161     if (tainting && tainted && !SvTAINTED(left))
162         TAINT_NOT;
163     SvSetMagicSV(right, left);
164     SETs(right);
165     RETURN;
166 }
167
168 PP(pp_cond_expr)
169 {
170     dSP;
171     if (SvTRUEx(POPs))
172         RETURNOP(cCONDOP->op_true);
173     else
174         RETURNOP(cCONDOP->op_false);
175 }
176
177 PP(pp_unstack)
178 {
179     I32 oldsave;
180     TAINT_NOT;          /* Each statement is presumed innocent */
181     stack_sp = stack_base + cxstack[cxstack_ix].blk_oldsp;
182     FREETMPS;
183     oldsave = scopestack[scopestack_ix - 1];
184     LEAVE_SCOPE(oldsave);
185     return NORMAL;
186 }
187
188 PP(pp_concat)
189 {
190   dSP; dATARGET; tryAMAGICbin(concat,opASSIGN);
191   {
192     dPOPTOPssrl;
193     STRLEN len;
194     char *s;
195     if (TARG != left) {
196         s = SvPV(left,len);
197         sv_setpvn(TARG,s,len);
198     }
199     else if (SvGMAGICAL(TARG))
200         mg_get(TARG);
201     else if (!SvOK(TARG) && SvTYPE(TARG) <= SVt_PVMG) {
202         sv_setpv(TARG, "");     /* Suppress warning. */
203         s = SvPV_force(TARG, len);
204     }
205     s = SvPV(right,len);
206     if (SvOK(TARG))
207         sv_catpvn(TARG,s,len);
208     else
209         sv_setpvn(TARG,s,len);  /* suppress warning */
210     SETTARG;
211     RETURN;
212   }
213 }
214
215 PP(pp_padsv)
216 {
217     dSP; dTARGET;
218     XPUSHs(TARG);
219     if (op->op_flags & OPf_MOD) {
220         if (op->op_private & OPpLVAL_INTRO)
221             SAVECLEARSV(curpad[op->op_targ]);
222         else if (op->op_private & OPpDEREF)
223             vivify_ref(curpad[op->op_targ], op->op_private & OPpDEREF);
224     }
225     RETURN;
226 }
227
228 PP(pp_readline)
229 {
230     last_in_gv = (GV*)(*stack_sp--);
231     return do_readline();
232 }
233
234 PP(pp_eq)
235 {
236     dSP; tryAMAGICbinSET(eq,0); 
237     {
238       dPOPnv;
239       SETs(boolSV(TOPn == value));
240       RETURN;
241     }
242 }
243
244 PP(pp_preinc)
245 {
246     dSP;
247     if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
248         croak(no_modify);
249     if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
250         SvIVX(TOPs) != IV_MAX)
251     {
252         ++SvIVX(TOPs);
253         SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
254     }
255     else
256         sv_inc(TOPs);
257     SvSETMAGIC(TOPs);
258     return NORMAL;
259 }
260
261 PP(pp_or)
262 {
263     dSP;
264     if (SvTRUE(TOPs))
265         RETURN;
266     else {
267         --SP;
268         RETURNOP(cLOGOP->op_other);
269     }
270 }
271
272 PP(pp_add)
273 {
274     dSP; dATARGET; tryAMAGICbin(add,opASSIGN); 
275     {
276       dPOPTOPnnrl_ul;
277       SETn( left + right );
278       RETURN;
279     }
280 }
281
282 PP(pp_aelemfast)
283 {
284     dSP;
285     AV *av = GvAV((GV*)cSVOP->op_sv);
286     SV** svp = av_fetch(av, op->op_private, op->op_flags & OPf_MOD);
287     PUSHs(svp ? *svp : &sv_undef);
288     RETURN;
289 }
290
291 PP(pp_join)
292 {
293     dSP; dMARK; dTARGET;
294     MARK++;
295     do_join(TARG, *MARK, MARK, SP);
296     SP = MARK;
297     SETs(TARG);
298     RETURN;
299 }
300
301 PP(pp_pushre)
302 {
303     dSP;
304 #ifdef DEBUGGING
305     /*
306      * We ass_u_me that LvTARGOFF() comes first, and that two STRLENs
307      * will be enough to hold an OP*.
308      */
309     SV* sv = sv_newmortal();
310     sv_upgrade(sv, SVt_PVLV);
311     LvTYPE(sv) = '/';
312     Copy(&op, &LvTARGOFF(sv), 1, OP*);
313     XPUSHs(sv);
314 #else
315     XPUSHs((SV*)op);
316 #endif
317     RETURN;
318 }
319
320 /* Oversized hot code. */
321
322 PP(pp_print)
323 {
324     dSP; dMARK; dORIGMARK;
325     GV *gv;
326     IO *io;
327     register PerlIO *fp;
328     MAGIC *mg;
329
330     if (op->op_flags & OPf_STACKED)
331         gv = (GV*)*++MARK;
332     else
333         gv = defoutgv;
334     if (SvMAGICAL(gv) && (mg = mg_find((SV*)gv, 'q'))) {
335         if (MARK == ORIGMARK) {
336             EXTEND(SP, 1);
337             ++MARK;
338             Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
339             ++SP;
340         }
341         PUSHMARK(MARK - 1);
342         *MARK = mg->mg_obj;
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 (dowarn) {
355             SV* sv = sv_newmortal();
356             gv_fullname3(sv, gv, Nullch);
357             warn("Filehandle %s never opened", SvPV(sv,na));
358         }
359
360         SETERRNO(EBADF,RMS$_IFI);
361         goto just_say_no;
362     }
363     else if (!(fp = IoOFP(io))) {
364         if (dowarn)  {
365             SV* sv = sv_newmortal();
366             gv_fullname3(sv, gv, Nullch);
367             if (IoIFP(io))
368                 warn("Filehandle %s opened only for input", SvPV(sv,na));
369             else
370                 warn("print on closed filehandle %s", SvPV(sv,na));
371         }
372         SETERRNO(EBADF,IoIFP(io)?RMS$_FAC:RMS$_IFI);
373         goto just_say_no;
374     }
375     else {
376         MARK++;
377         if (ofslen) {
378             while (MARK <= SP) {
379                 if (!do_print(*MARK, fp))
380                     break;
381                 MARK++;
382                 if (MARK <= SP) {
383                     if (PerlIO_write(fp, ofs, ofslen) == 0 || PerlIO_error(fp)) {
384                         MARK--;
385                         break;
386                     }
387                 }
388             }
389         }
390         else {
391             while (MARK <= SP) {
392                 if (!do_print(*MARK, fp))
393                     break;
394                 MARK++;
395             }
396         }
397         if (MARK <= SP)
398             goto just_say_no;
399         else {
400             if (orslen)
401                 if (PerlIO_write(fp, ors, orslen) == 0 || PerlIO_error(fp))
402                     goto just_say_no;
403
404             if (IoFLAGS(io) & IOf_FLUSH)
405                 if (PerlIO_flush(fp) == EOF)
406                     goto just_say_no;
407         }
408     }
409     SP = ORIGMARK;
410     PUSHs(&sv_yes);
411     RETURN;
412
413   just_say_no:
414     SP = ORIGMARK;
415     PUSHs(&sv_undef);
416     RETURN;
417 }
418
419 PP(pp_rv2av)
420 {
421     dSP; dPOPss;
422     AV *av;
423
424     if (SvROK(sv)) {
425       wasref:
426         av = (AV*)SvRV(sv);
427         if (SvTYPE(av) != SVt_PVAV)
428             DIE("Not an ARRAY reference");
429         if (op->op_private & OPpLVAL_INTRO)
430             av = (AV*)save_svref((SV**)sv);
431         if (op->op_flags & OPf_REF) {
432             PUSHs((SV*)av);
433             RETURN;
434         }
435     }
436     else {
437         if (SvTYPE(sv) == SVt_PVAV) {
438             av = (AV*)sv;
439             if (op->op_flags & OPf_REF) {
440                 PUSHs((SV*)av);
441                 RETURN;
442             }
443         }
444         else {
445             GV *gv;
446             
447             if (SvTYPE(sv) != SVt_PVGV) {
448                 char *sym;
449
450                 if (SvGMAGICAL(sv)) {
451                     mg_get(sv);
452                     if (SvROK(sv))
453                         goto wasref;
454                 }
455                 if (!SvOK(sv)) {
456                     if (op->op_flags & OPf_REF ||
457                       op->op_private & HINT_STRICT_REFS)
458                         DIE(no_usym, "an ARRAY");
459                     if (dowarn)
460                         warn(warn_uninit);
461                     if (GIMME == G_ARRAY)
462                         RETURN;
463                     RETPUSHUNDEF;
464                 }
465                 sym = SvPV(sv,na);
466                 if (op->op_private & HINT_STRICT_REFS)
467                     DIE(no_symref, sym, "an ARRAY");
468                 gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVAV);
469             } else {
470                 gv = (GV*)sv;
471             }
472             av = GvAVn(gv);
473             if (op->op_private & OPpLVAL_INTRO)
474                 av = save_ary(gv);
475             if (op->op_flags & OPf_REF) {
476                 PUSHs((SV*)av);
477                 RETURN;
478             }
479         }
480     }
481
482     if (GIMME == G_ARRAY) {
483         I32 maxarg = AvFILL(av) + 1;
484         EXTEND(SP, maxarg);
485         Copy(AvARRAY(av), SP+1, maxarg, SV*);
486         SP += maxarg;
487     }
488     else {
489         dTARGET;
490         I32 maxarg = AvFILL(av) + 1;
491         PUSHi(maxarg);
492     }
493     RETURN;
494 }
495
496 PP(pp_rv2hv)
497 {
498     dSP; dTOPss;
499     HV *hv;
500
501     if (SvROK(sv)) {
502       wasref:
503         hv = (HV*)SvRV(sv);
504         if (SvTYPE(hv) != SVt_PVHV && SvTYPE(hv) != SVt_PVAV)
505             DIE("Not a HASH reference");
506         if (op->op_private & OPpLVAL_INTRO)
507             hv = (HV*)save_svref((SV**)sv);
508         if (op->op_flags & OPf_REF) {
509             SETs((SV*)hv);
510             RETURN;
511         }
512     }
513     else {
514         if (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV) {
515             hv = (HV*)sv;
516             if (op->op_flags & OPf_REF) {
517                 SETs((SV*)hv);
518                 RETURN;
519             }
520         }
521         else {
522             GV *gv;
523             
524             if (SvTYPE(sv) != SVt_PVGV) {
525                 char *sym;
526
527                 if (SvGMAGICAL(sv)) {
528                     mg_get(sv);
529                     if (SvROK(sv))
530                         goto wasref;
531                 }
532                 if (!SvOK(sv)) {
533                     if (op->op_flags & OPf_REF ||
534                       op->op_private & HINT_STRICT_REFS)
535                         DIE(no_usym, "a HASH");
536                     if (dowarn)
537                         warn(warn_uninit);
538                     if (GIMME == G_ARRAY) {
539                         SP--;
540                         RETURN;
541                     }
542                     RETSETUNDEF;
543                 }
544                 sym = SvPV(sv,na);
545                 if (op->op_private & HINT_STRICT_REFS)
546                     DIE(no_symref, sym, "a HASH");
547                 gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVHV);
548             } else {
549                 gv = (GV*)sv;
550             }
551             hv = GvHVn(gv);
552             if (op->op_private & OPpLVAL_INTRO)
553                 hv = save_hash(gv);
554             if (op->op_flags & OPf_REF) {
555                 SETs((SV*)hv);
556                 RETURN;
557             }
558         }
559     }
560
561     if (GIMME == G_ARRAY) { /* array wanted */
562         *stack_sp = (SV*)hv;
563         return do_kv(ARGS);
564     }
565     else {
566         dTARGET;
567         /* This bit is OK even when hv is really an AV */
568         if (HvFILL(hv))
569             sv_setpvf(TARG, "%ld/%ld",
570                       (long)HvFILL(hv), (long)HvMAX(hv) + 1);
571         else
572             sv_setiv(TARG, 0);
573         
574         SETTARG;
575         RETURN;
576     }
577 }
578
579 PP(pp_aassign)
580 {
581     dSP;
582     SV **lastlelem = stack_sp;
583     SV **lastrelem = stack_base + POPMARK;
584     SV **firstrelem = stack_base + POPMARK + 1;
585     SV **firstlelem = lastrelem + 1;
586
587     register SV **relem;
588     register SV **lelem;
589
590     register SV *sv;
591     register AV *ary;
592
593     I32 gimme;
594     HV *hash;
595     I32 i;
596     int magic;
597
598     delaymagic = DM_DELAY;              /* catch simultaneous items */
599
600     /* If there's a common identifier on both sides we have to take
601      * special care that assigning the identifier on the left doesn't
602      * clobber a value on the right that's used later in the list.
603      */
604     if (op->op_private & OPpASSIGN_COMMON) {
605         for (relem = firstrelem; relem <= lastrelem; relem++) {
606             /*SUPPRESS 560*/
607             if (sv = *relem) {
608                 TAINT_NOT;      /* Each item is independent */
609                 *relem = sv_mortalcopy(sv);
610             }
611         }
612     }
613
614     relem = firstrelem;
615     lelem = firstlelem;
616     ary = Null(AV*);
617     hash = Null(HV*);
618     while (lelem <= lastlelem) {
619         TAINT_NOT;              /* Each item stands on its own, taintwise. */
620         sv = *lelem++;
621         switch (SvTYPE(sv)) {
622         case SVt_PVAV:
623             ary = (AV*)sv;
624             magic = SvMAGICAL(ary) != 0;
625             
626             av_clear(ary);
627             av_extend(ary, lastrelem - relem);
628             i = 0;
629             while (relem <= lastrelem) {        /* gobble up all the rest */
630                 sv = NEWSV(28,0);
631                 assert(*relem);
632                 sv_setsv(sv,*relem);
633                 *(relem++) = sv;
634                 (void)av_store(ary,i++,sv);
635                 if (magic)
636                     mg_set(sv);
637                 TAINT_NOT;
638             }
639             break;
640         case SVt_PVHV: {
641                 SV *tmpstr;
642
643                 hash = (HV*)sv;
644                 magic = SvMAGICAL(hash) != 0;
645                 hv_clear(hash);
646
647                 while (relem < lastrelem) {     /* gobble up all the rest */
648                     STRLEN len;
649                     if (*relem)
650                         sv = *(relem++);
651                     else
652                         sv = &sv_no, relem++;
653                     tmpstr = NEWSV(29,0);
654                     if (*relem)
655                         sv_setsv(tmpstr,*relem);        /* value */
656                     *(relem++) = tmpstr;
657                     (void)hv_store_ent(hash,sv,tmpstr,0);
658                     if (magic)
659                         mg_set(tmpstr);
660                     TAINT_NOT;
661                 }
662                 if (relem == lastrelem)
663                     warn("Odd number of elements in hash list");
664             }
665             break;
666         default:
667             if (SvTHINKFIRST(sv)) {
668                 if (SvREADONLY(sv) && curcop != &compiling) {
669                     if (sv != &sv_undef && sv != &sv_yes && sv != &sv_no)
670                         DIE(no_modify);
671                     if (relem <= lastrelem)
672                         relem++;
673                     break;
674                 }
675                 if (SvROK(sv))
676                     sv_unref(sv);
677             }
678             if (relem <= lastrelem) {
679                 sv_setsv(sv, *relem);
680                 *(relem++) = sv;
681             }
682             else
683                 sv_setsv(sv, &sv_undef);
684             SvSETMAGIC(sv);
685             break;
686         }
687     }
688     if (delaymagic & ~DM_DELAY) {
689         if (delaymagic & DM_UID) {
690 #ifdef HAS_SETRESUID
691             (void)setresuid(uid,euid,(Uid_t)-1);
692 #else
693 #  ifdef HAS_SETREUID
694             (void)setreuid(uid,euid);
695 #  else
696 #    ifdef HAS_SETRUID
697             if ((delaymagic & DM_UID) == DM_RUID) {
698                 (void)setruid(uid);
699                 delaymagic &= ~DM_RUID;
700             }
701 #    endif /* HAS_SETRUID */
702 #    ifdef HAS_SETEUID
703             if ((delaymagic & DM_UID) == DM_EUID) {
704                 (void)seteuid(uid);
705                 delaymagic &= ~DM_EUID;
706             }
707 #    endif /* HAS_SETEUID */
708             if (delaymagic & DM_UID) {
709                 if (uid != euid)
710                     DIE("No setreuid available");
711                 (void)setuid(uid);
712             }
713 #  endif /* HAS_SETREUID */
714 #endif /* HAS_SETRESUID */
715             uid = (int)getuid();
716             euid = (int)geteuid();
717         }
718         if (delaymagic & DM_GID) {
719 #ifdef HAS_SETRESGID
720             (void)setresgid(gid,egid,(Gid_t)-1);
721 #else
722 #  ifdef HAS_SETREGID
723             (void)setregid(gid,egid);
724 #  else
725 #    ifdef HAS_SETRGID
726             if ((delaymagic & DM_GID) == DM_RGID) {
727                 (void)setrgid(gid);
728                 delaymagic &= ~DM_RGID;
729             }
730 #    endif /* HAS_SETRGID */
731 #    ifdef HAS_SETEGID
732             if ((delaymagic & DM_GID) == DM_EGID) {
733                 (void)setegid(gid);
734                 delaymagic &= ~DM_EGID;
735             }
736 #    endif /* HAS_SETEGID */
737             if (delaymagic & DM_GID) {
738                 if (gid != egid)
739                     DIE("No setregid available");
740                 (void)setgid(gid);
741             }
742 #  endif /* HAS_SETREGID */
743 #endif /* HAS_SETRESGID */
744             gid = (int)getgid();
745             egid = (int)getegid();
746         }
747         tainting |= (uid && (euid != uid || egid != gid));
748     }
749     delaymagic = 0;
750
751     gimme = GIMME_V;
752     if (gimme == G_VOID)
753         SP = firstrelem - 1;
754     else if (gimme == G_SCALAR) {
755         dTARGET;
756         SP = firstrelem;
757         SETi(lastrelem - firstrelem + 1);
758     }
759     else {
760         if (ary || hash)
761             SP = lastrelem;
762         else
763             SP = firstrelem + (lastlelem - firstlelem);
764         lelem = firstlelem + (relem - firstrelem);
765         while (relem <= SP)
766             *relem++ = (lelem <= lastlelem) ? *lelem++ : &sv_undef;
767     }
768     RETURN;
769 }
770
771 PP(pp_match)
772 {
773     dSP; dTARG;
774     register PMOP *pm = cPMOP;
775     register char *t;
776     register char *s;
777     char *strend;
778     I32 global;
779     I32 safebase;
780     char *truebase;
781     register REGEXP *rx = pm->op_pmregexp;
782     I32 gimme = GIMME;
783     STRLEN len;
784     I32 minmatch = 0;
785     I32 oldsave = savestack_ix;
786     I32 update_minmatch = 1;
787
788     if (op->op_flags & OPf_STACKED)
789         TARG = POPs;
790     else {
791         TARG = GvSV(defgv);
792         EXTEND(SP,1);
793     }
794     s = SvPV(TARG, len);
795     strend = s + len;
796     if (!s)
797         DIE("panic: do_match");
798     TAINT_NOT;
799
800     if (pm->op_pmflags & PMf_USED) {
801         if (gimme == G_ARRAY)
802             RETURN;
803         RETPUSHNO;
804     }
805
806     if (!rx->prelen && curpm) {
807         pm = curpm;
808         rx = pm->op_pmregexp;
809     }
810     truebase = t = s;
811     if (global = pm->op_pmflags & PMf_GLOBAL) {
812         rx->startp[0] = 0;
813         if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) {
814             MAGIC* mg = mg_find(TARG, 'g');
815             if (mg && mg->mg_len >= 0) {
816                 rx->endp[0] = rx->startp[0] = s + mg->mg_len; 
817                 minmatch = (mg->mg_flags & MGf_MINMATCH);
818                 update_minmatch = 0;
819             }
820         }
821     }
822     if (!rx->nparens && !global)
823         gimme = G_SCALAR;                       /* accidental array context? */
824     safebase = (((gimme == G_ARRAY) || global || !rx->nparens)
825                 && !sawampersand);
826     if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
827         SAVEINT(multiline);
828         multiline = pm->op_pmflags & PMf_MULTILINE;
829     }
830
831 play_it_again:
832     if (global && rx->startp[0]) {
833         t = s = rx->endp[0];
834         if ((s + rx->minlen) > strend)
835             goto nope;
836         if (update_minmatch++)
837             minmatch = (s == rx->startp[0]);
838     }
839     if (pm->op_pmshort) {
840         if (pm->op_pmflags & PMf_SCANFIRST) {
841             if (SvSCREAM(TARG)) {
842                 if (screamfirst[BmRARE(pm->op_pmshort)] < 0)
843                     goto nope;
844                 else if (!(s = screaminstr(TARG, pm->op_pmshort)))
845                     goto nope;
846                 else if (pm->op_pmflags & PMf_ALL)
847                     goto yup;
848             }
849             else if (!(s = fbm_instr((unsigned char*)s,
850               (unsigned char*)strend, pm->op_pmshort)))
851                 goto nope;
852             else if (pm->op_pmflags & PMf_ALL)
853                 goto yup;
854             if (s && rx->regback >= 0) {
855                 ++BmUSEFUL(pm->op_pmshort);
856                 s -= rx->regback;
857                 if (s < t)
858                     s = t;
859             }
860             else
861                 s = t;
862         }
863         else if (!multiline) {
864             if (*SvPVX(pm->op_pmshort) != *s
865                 || (pm->op_pmslen > 1
866                     && memNE(SvPVX(pm->op_pmshort), s, pm->op_pmslen)))
867                 goto nope;
868         }
869         if (!rx->naughty && --BmUSEFUL(pm->op_pmshort) < 0) {
870             SvREFCNT_dec(pm->op_pmshort);
871             pm->op_pmshort = Nullsv;    /* opt is being useless */
872         }
873     }
874     if (pregexec(rx, s, strend, truebase, minmatch,
875                  SvSCREAM(TARG) ? TARG : Nullsv, safebase))
876     {
877         curpm = pm;
878         if (pm->op_pmflags & PMf_ONCE)
879             pm->op_pmflags |= PMf_USED;
880         goto gotcha;
881     }
882     else
883         goto ret_no;
884     /*NOTREACHED*/
885
886   gotcha:
887     TAINT_IF(rx->exec_tainted);
888     if (gimme == G_ARRAY) {
889         I32 iters, i, len;
890
891         iters = rx->nparens;
892         if (global && !iters)
893             i = 1;
894         else
895             i = 0;
896         EXTEND(SP, iters + i);
897         EXTEND_MORTAL(iters + i);
898         for (i = !i; i <= iters; i++) {
899             PUSHs(sv_newmortal());
900             /*SUPPRESS 560*/
901             if ((s = rx->startp[i]) && rx->endp[i] ) {
902                 len = rx->endp[i] - s;
903                 sv_setpvn(*SP, s, len);
904             }
905         }
906         if (global) {
907             truebase = rx->subbeg;
908             strend = rx->subend;
909             if (rx->startp[0] && rx->startp[0] == rx->endp[0])
910                 ++rx->endp[0];
911             goto play_it_again;
912         }
913         LEAVE_SCOPE(oldsave);
914         RETURN;
915     }
916     else {
917         if (global) {
918             MAGIC* mg = 0;
919             if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG))
920                 mg = mg_find(TARG, 'g');
921             if (!mg) {
922                 sv_magic(TARG, (SV*)0, 'g', Nullch, 0);
923                 mg = mg_find(TARG, 'g');
924             }
925             if (rx->startp[0]) {
926                 mg->mg_len = rx->endp[0] - rx->subbeg;
927                 if (rx->startp[0] == rx->endp[0])
928                     mg->mg_flags |= MGf_MINMATCH;
929                 else
930                     mg->mg_flags &= ~MGf_MINMATCH;
931             }
932         }
933         LEAVE_SCOPE(oldsave);
934         RETPUSHYES;
935     }
936
937 yup:
938     TAINT_IF(rx->exec_tainted);
939     ++BmUSEFUL(pm->op_pmshort);
940     curpm = pm;
941     if (pm->op_pmflags & PMf_ONCE)
942         pm->op_pmflags |= PMf_USED;
943     Safefree(rx->subbase);
944     rx->subbase = Nullch;
945     if (global) {
946         rx->subbeg = truebase;
947         rx->subend = strend;
948         rx->startp[0] = s;
949         rx->endp[0] = s + SvCUR(pm->op_pmshort);
950         goto gotcha;
951     }
952     if (sawampersand) {
953         char *tmps;
954
955         tmps = rx->subbase = savepvn(t, strend-t);
956         rx->subbeg = tmps;
957         rx->subend = tmps + (strend-t);
958         tmps = rx->startp[0] = tmps + (s - t);
959         rx->endp[0] = tmps + SvCUR(pm->op_pmshort);
960     }
961     LEAVE_SCOPE(oldsave);
962     RETPUSHYES;
963
964 nope:
965     if (pm->op_pmshort)
966         ++BmUSEFUL(pm->op_pmshort);
967
968 ret_no:
969     if (global && !(pm->op_pmflags & PMf_CONTINUE)) {
970         if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) {
971             MAGIC* mg = mg_find(TARG, 'g');
972             if (mg)
973                 mg->mg_len = -1;
974         }
975     }
976     LEAVE_SCOPE(oldsave);
977     if (gimme == G_ARRAY)
978         RETURN;
979     RETPUSHNO;
980 }
981
982 OP *
983 do_readline()
984 {
985     dSP; dTARGETSTACKED;
986     register SV *sv;
987     STRLEN tmplen = 0;
988     STRLEN offset;
989     PerlIO *fp;
990     register IO *io = GvIO(last_in_gv);
991     register I32 type = op->op_type;
992     I32 gimme = GIMME_V;
993     MAGIC *mg;
994
995     if (SvMAGICAL(last_in_gv) && (mg = mg_find((SV*)last_in_gv, 'q'))) {
996         PUSHMARK(SP);
997         XPUSHs(mg->mg_obj);
998         PUTBACK;
999         ENTER;
1000         perl_call_method("READLINE", gimme);
1001         LEAVE;
1002         SPAGAIN;
1003         if (gimme == G_SCALAR)
1004             SvSetMagicSV_nosteal(TARG, TOPs);
1005         RETURN;
1006     }
1007     fp = Nullfp;
1008     if (io) {
1009         fp = IoIFP(io);
1010         if (!fp) {
1011             if (IoFLAGS(io) & IOf_ARGV) {
1012                 if (IoFLAGS(io) & IOf_START) {
1013                     IoFLAGS(io) &= ~IOf_START;
1014                     IoLINES(io) = 0;
1015                     if (av_len(GvAVn(last_in_gv)) < 0) {
1016                         SV *tmpstr = newSVpv("-", 1); /* assume stdin */
1017                         av_push(GvAVn(last_in_gv), tmpstr);
1018                     }
1019                 }
1020                 fp = nextargv(last_in_gv);
1021                 if (!fp) { /* Note: fp != IoIFP(io) */
1022                     (void)do_close(last_in_gv, FALSE); /* now it does*/
1023                     IoFLAGS(io) |= IOf_START;
1024                 }
1025             }
1026             else if (type == OP_GLOB) {
1027                 SV *tmpcmd = NEWSV(55, 0);
1028                 SV *tmpglob = POPs;
1029                 ENTER;
1030                 SAVEFREESV(tmpcmd);
1031 #ifdef VMS /* expand the wildcards right here, rather than opening a pipe, */
1032            /* since spawning off a process is a real performance hit */
1033                 {
1034 #include <descrip.h>
1035 #include <lib$routines.h>
1036 #include <nam.h>
1037 #include <rmsdef.h>
1038                     char rslt[NAM$C_MAXRSS+1+sizeof(unsigned short int)] = {'\0','\0'};
1039                     char vmsspec[NAM$C_MAXRSS+1];
1040                     char *rstr = rslt + sizeof(unsigned short int), *begin, *end, *cp;
1041                     char tmpfnam[L_tmpnam] = "SYS$SCRATCH:";
1042                     $DESCRIPTOR(dfltdsc,"SYS$DISK:[]*.*;");
1043                     PerlIO *tmpfp;
1044                     STRLEN i;
1045                     struct dsc$descriptor_s wilddsc
1046                        = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};
1047                     struct dsc$descriptor_vs rsdsc
1048                        = {sizeof rslt, DSC$K_DTYPE_VT, DSC$K_CLASS_VS, rslt};
1049                     unsigned long int cxt = 0, sts = 0, ok = 1, hasdir = 0, hasver = 0, isunix = 0;
1050
1051                     /* We could find out if there's an explicit dev/dir or version
1052                        by peeking into lib$find_file's internal context at
1053                        ((struct NAM *)((struct FAB *)cxt)->fab$l_nam)->nam$l_fnb
1054                        but that's unsupported, so I don't want to do it now and
1055                        have it bite someone in the future. */
1056                     strcat(tmpfnam,tmpnam(NULL));
1057                     cp = SvPV(tmpglob,i);
1058                     for (; i; i--) {
1059                        if (cp[i] == ';') hasver = 1;
1060                        if (cp[i] == '.') {
1061                            if (sts) hasver = 1;
1062                            else sts = 1;
1063                        }
1064                        if (cp[i] == '/') {
1065                           hasdir = isunix = 1;
1066                           break;
1067                        }
1068                        if (cp[i] == ']' || cp[i] == '>' || cp[i] == ':') {
1069                            hasdir = 1;
1070                            break;
1071                        }
1072                     }
1073                     if ((tmpfp = PerlIO_open(tmpfnam,"w+","fop=dlt")) != NULL) {
1074                         ok = ((wilddsc.dsc$a_pointer = tovmsspec(SvPVX(tmpglob),vmsspec)) != NULL);
1075                         if (ok) wilddsc.dsc$w_length = (unsigned short int) strlen(wilddsc.dsc$a_pointer);
1076                         while (ok && ((sts = lib$find_file(&wilddsc,&rsdsc,&cxt,
1077                                                     &dfltdsc,NULL,NULL,NULL))&1)) {
1078                             end = rstr + (unsigned long int) *rslt;
1079                             if (!hasver) while (*end != ';') end--;
1080                             *(end++) = '\n';  *end = '\0';
1081                             for (cp = rstr; *cp; cp++) *cp = _tolower(*cp);
1082                             if (hasdir) {
1083                               if (isunix) trim_unixpath(rstr,SvPVX(tmpglob),1);
1084                               begin = rstr;
1085                             }
1086                             else {
1087                                 begin = end;
1088                                 while (*(--begin) != ']' && *begin != '>') ;
1089                                 ++begin;
1090                             }
1091                             ok = (PerlIO_puts(tmpfp,begin) != EOF);
1092                         }
1093                         if (cxt) (void)lib$find_file_end(&cxt);
1094                         if (ok && sts != RMS$_NMF &&
1095                             sts != RMS$_DNF && sts != RMS$_FNF) ok = 0;
1096                         if (!ok) {
1097                             if (!(sts & 1)) {
1098                               SETERRNO((sts == RMS$_SYN ? EINVAL : EVMSERR),sts);
1099                             }
1100                             PerlIO_close(tmpfp);
1101                             fp = NULL;
1102                         }
1103                         else {
1104                            PerlIO_rewind(tmpfp);
1105                            IoTYPE(io) = '<';
1106                            IoIFP(io) = fp = tmpfp;
1107                            IoFLAGS(io) &= ~IOf_UNTAINT;  /* maybe redundant */
1108                         }
1109                     }
1110                 }
1111 #else /* !VMS */
1112 #ifdef DOSISH
1113 #ifdef OS2
1114                 sv_setpv(tmpcmd, "for a in ");
1115                 sv_catsv(tmpcmd, tmpglob);
1116                 sv_catpv(tmpcmd, "; do echo \"$a\\0\\c\"; done |");
1117 #else
1118                 sv_setpv(tmpcmd, "perlglob ");
1119                 sv_catsv(tmpcmd, tmpglob);
1120                 sv_catpv(tmpcmd, " |");
1121 #endif /* !OS2 */
1122 #else /* !DOSISH */
1123 #if defined(CSH)
1124                 sv_setpvn(tmpcmd, cshname, cshlen);
1125                 sv_catpv(tmpcmd, " -cf 'set nonomatch; glob ");
1126                 sv_catsv(tmpcmd, tmpglob);
1127                 sv_catpv(tmpcmd, "' 2>/dev/null |");
1128 #else
1129                 sv_setpv(tmpcmd, "echo ");
1130                 sv_catsv(tmpcmd, tmpglob);
1131 #if 'z' - 'a' == 25
1132                 sv_catpv(tmpcmd, "|tr -s ' \t\f\r' '\\012\\012\\012\\012'|");
1133 #else
1134                 sv_catpv(tmpcmd, "|tr -s ' \t\f\r' '\\n\\n\\n\\n'|");
1135 #endif
1136 #endif /* !CSH */
1137 #endif /* !DOSISH */
1138                 (void)do_open(last_in_gv, SvPVX(tmpcmd), SvCUR(tmpcmd),
1139                               FALSE, 0, 0, Nullfp);
1140                 fp = IoIFP(io);
1141 #endif /* !VMS */
1142                 LEAVE;
1143             }
1144         }
1145         else if (type == OP_GLOB)
1146             SP--;
1147     }
1148     if (!fp) {
1149         if (dowarn && io && !(IoFLAGS(io) & IOf_START))
1150             warn("Read on closed filehandle <%s>", GvENAME(last_in_gv));
1151         if (gimme == G_SCALAR) {
1152             (void)SvOK_off(TARG);
1153             PUSHTARG;
1154         }
1155         RETURN;
1156     }
1157     if (gimme == G_SCALAR) {
1158         sv = TARG;
1159         if (SvROK(sv))
1160             sv_unref(sv);
1161         (void)SvUPGRADE(sv, SVt_PV);
1162         tmplen = SvLEN(sv);     /* remember if already alloced */
1163         if (!tmplen)
1164             Sv_Grow(sv, 80);    /* try short-buffering it */
1165         if (type == OP_RCATLINE)
1166             offset = SvCUR(sv);
1167         else
1168             offset = 0;
1169     }
1170     else {
1171         sv = sv_2mortal(NEWSV(57, 80));
1172         offset = 0;
1173     }
1174     for (;;) {
1175         if (!sv_gets(sv, fp, offset)) {
1176             PerlIO_clearerr(fp);
1177             if (IoFLAGS(io) & IOf_ARGV) {
1178                 fp = nextargv(last_in_gv);
1179                 if (fp)
1180                     continue;
1181                 (void)do_close(last_in_gv, FALSE);
1182                 IoFLAGS(io) |= IOf_START;
1183             }
1184             else if (type == OP_GLOB) {
1185                 if (do_close(last_in_gv, FALSE) & ~0xFF)
1186                     warn("internal error: glob failed");
1187             }
1188             if (gimme == G_SCALAR) {
1189                 (void)SvOK_off(TARG);
1190                 PUSHTARG;
1191             }
1192             RETURN;
1193         }
1194         /* This should not be marked tainted if the fp is marked clean */
1195         if (!(IoFLAGS(io) & IOf_UNTAINT)) {
1196             TAINT;
1197             SvTAINTED_on(sv);
1198         }
1199         IoLINES(io)++;
1200         SvSETMAGIC(sv);
1201         XPUSHs(sv);
1202         if (type == OP_GLOB) {
1203             char *tmps;
1204
1205             if (SvCUR(sv) > 0 && SvCUR(rs) > 0) {
1206                 tmps = SvEND(sv) - 1;
1207                 if (*tmps == *SvPVX(rs)) {
1208                     *tmps = '\0';
1209                     SvCUR(sv)--;
1210                 }
1211             }
1212             for (tmps = SvPVX(sv); *tmps; tmps++)
1213                 if (!isALPHA(*tmps) && !isDIGIT(*tmps) &&
1214                     strchr("$&*(){}[]'\";\\|?<>~`", *tmps))
1215                         break;
1216             if (*tmps && Stat(SvPVX(sv), &statbuf) < 0) {
1217                 (void)POPs;             /* Unmatched wildcard?  Chuck it... */
1218                 continue;
1219             }
1220         }
1221         if (gimme == G_ARRAY) {
1222             if (SvLEN(sv) - SvCUR(sv) > 20) {
1223                 SvLEN_set(sv, SvCUR(sv)+1);
1224                 Renew(SvPVX(sv), SvLEN(sv), char);
1225             }
1226             sv = sv_2mortal(NEWSV(58, 80));
1227             continue;
1228         }
1229         else if (gimme == G_SCALAR && !tmplen && SvLEN(sv) - SvCUR(sv) > 80) {
1230             /* try to reclaim a bit of scalar space (only on 1st alloc) */
1231             if (SvCUR(sv) < 60)
1232                 SvLEN_set(sv, 80);
1233             else
1234                 SvLEN_set(sv, SvCUR(sv)+40);    /* allow some slop */
1235             Renew(SvPVX(sv), SvLEN(sv), char);
1236         }
1237         RETURN;
1238     }
1239 }
1240
1241 PP(pp_enter)
1242 {
1243     dSP;
1244     register CONTEXT *cx;
1245     I32 gimme = OP_GIMME(op, -1);
1246
1247     if (gimme == -1) {
1248         if (cxstack_ix >= 0)
1249             gimme = cxstack[cxstack_ix].blk_gimme;
1250         else
1251             gimme = G_SCALAR;
1252     }
1253
1254     ENTER;
1255
1256     SAVETMPS;
1257     PUSHBLOCK(cx, CXt_BLOCK, sp);
1258
1259     RETURN;
1260 }
1261
1262 PP(pp_helem)
1263 {
1264     dSP;
1265     HE* he;
1266     SV **svp;
1267     SV *keysv = POPs;
1268     HV *hv = (HV*)POPs;
1269     U32 lval = op->op_flags & OPf_MOD;
1270     U32 defer = op->op_private & OPpLVAL_DEFER;
1271
1272     if (SvTYPE(hv) == SVt_PVHV) {
1273         he = hv_fetch_ent(hv, keysv, lval && !defer, 0);
1274         svp = he ? &Heval(he) : 0;
1275     }
1276     else if (SvTYPE(hv) == SVt_PVAV) {
1277         svp = avhv_fetch_ent((AV*)hv, keysv, lval);
1278     }
1279     else {
1280         RETPUSHUNDEF;
1281     }
1282 <<<<
1283     if (lval) {
1284         if (svp || *svp == &sv_undef) {
1285             SV* lv;
1286             SV* key2;
1287             if (!defer)
1288                 DIE(no_helem, SvPV(keysv, na));
1289             lv = sv_newmortal();
1290             sv_upgrade(lv, SVt_PVLV);
1291             LvTYPE(lv) = 'y';
1292             sv_magic(lv, key2 = newSVsv(keysv), 'y', Nullch, 0);
1293             SvREFCNT_dec(key2); /* sv_magic() increments refcount */
1294             LvTARG(lv) = SvREFCNT_inc(hv);
1295             LvTARGLEN(lv) = 1;
1296             PUSHs(lv);
1297             RETURN;
1298         }
1299         if (op->op_private & OPpLVAL_INTRO) {
1300             if (HvNAME(hv) && isGV(*svp))
1301                 save_gp((GV*)*svp, !(op->op_flags & OPf_SPECIAL));
1302             else
1303                 save_svref(svp);
1304         }
1305         else if (op->op_private & OPpDEREF)
1306             vivify_ref(*svp, op->op_private & OPpDEREF);
1307     }
1308     PUSHs(svp ? *svp : &sv_undef);
1309     RETURN;
1310 }
1311
1312 PP(pp_leave)
1313 {
1314     dSP;
1315     register CONTEXT *cx;
1316     register SV **mark;
1317     SV **newsp;
1318     PMOP *newpm;
1319     I32 gimme;
1320
1321     if (op->op_flags & OPf_SPECIAL) {
1322         cx = &cxstack[cxstack_ix];
1323         cx->blk_oldpm = curpm;  /* fake block should preserve $1 et al */
1324     }
1325
1326     POPBLOCK(cx,newpm);
1327
1328     gimme = OP_GIMME(op, -1);
1329     if (gimme == -1) {
1330         if (cxstack_ix >= 0)
1331             gimme = cxstack[cxstack_ix].blk_gimme;
1332         else
1333             gimme = G_SCALAR;
1334     }
1335
1336     TAINT_NOT;
1337     if (gimme == G_VOID)
1338         SP = newsp;
1339     else if (gimme == G_SCALAR) {
1340         MARK = newsp + 1;
1341         if (MARK <= SP)
1342             if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
1343                 *MARK = TOPs;
1344             else
1345                 *MARK = sv_mortalcopy(TOPs);
1346         else {
1347             MEXTEND(mark,0);
1348             *MARK = &sv_undef;
1349         }
1350         SP = MARK;
1351     }
1352     else if (gimme == G_ARRAY) {
1353         /* in case LEAVE wipes old return values */
1354         for (mark = newsp + 1; mark <= SP; mark++) {
1355             if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP))) {
1356                 *mark = sv_mortalcopy(*mark);
1357                 TAINT_NOT;      /* Each item is independent */
1358             }
1359         }
1360     }
1361     curpm = newpm;      /* Don't pop $1 et al till now */
1362
1363     LEAVE;
1364
1365     RETURN;
1366 }
1367
1368 PP(pp_iter)
1369 {
1370     dSP;
1371     register CONTEXT *cx;
1372     SV* sv;
1373     AV* av;
1374
1375     EXTEND(sp, 1);
1376     cx = &cxstack[cxstack_ix];
1377     if (cx->cx_type != CXt_LOOP)
1378         DIE("panic: pp_iter");
1379
1380     av = cx->blk_loop.iterary;
1381     if (cx->blk_loop.iterix >= (av == curstack ? cx->blk_oldsp : AvFILL(av)))
1382         RETPUSHNO;
1383
1384     SvREFCNT_dec(*cx->blk_loop.itervar);
1385
1386     if (sv = AvARRAY(av)[++cx->blk_loop.iterix])
1387         SvTEMP_off(sv);
1388     else
1389         sv = &sv_undef;
1390     if (av != curstack && SvIMMORTAL(sv)) {
1391         SV *lv = cx->blk_loop.iterlval;
1392         if (lv && SvREFCNT(lv) > 1) {
1393             SvREFCNT_dec(lv);
1394             lv = Nullsv;
1395         }
1396         if (lv)
1397             SvREFCNT_dec(LvTARG(lv));
1398         else {
1399             lv = cx->blk_loop.iterlval = NEWSV(26, 0);
1400             sv_upgrade(lv, SVt_PVLV);
1401             LvTYPE(lv) = 'y';
1402             sv_magic(lv, Nullsv, 'y', Nullch, 0);
1403         }
1404         LvTARG(lv) = SvREFCNT_inc(av);
1405         LvTARGOFF(lv) = cx->blk_loop.iterix;
1406         LvTARGLEN(lv) = -1;
1407         sv = (SV*)lv;
1408     }
1409
1410     *cx->blk_loop.itervar = SvREFCNT_inc(sv);
1411     RETPUSHYES;
1412 }
1413
1414 PP(pp_subst)
1415 {
1416     dSP; dTARG;
1417     register PMOP *pm = cPMOP;
1418     PMOP *rpm = pm;
1419     register SV *dstr;
1420     register char *s;
1421     char *strend;
1422     register char *m;
1423     char *c;
1424     register char *d;
1425     STRLEN clen;
1426     I32 iters = 0;
1427     I32 maxiters;
1428     register I32 i;
1429     bool once;
1430     bool rxtainted;
1431     char *orig;
1432     I32 safebase;
1433     register REGEXP *rx = pm->op_pmregexp;
1434     STRLEN len;
1435     int force_on_match = 0;
1436     I32 oldsave = savestack_ix;
1437
1438     /* known replacement string? */
1439     dstr = (pm->op_pmflags & PMf_CONST) ? POPs : Nullsv;
1440     if (op->op_flags & OPf_STACKED)
1441         TARG = POPs;
1442     else {
1443         TARG = GvSV(defgv);
1444         EXTEND(SP,1);
1445     }
1446     if (SvREADONLY(TARG)
1447         || (SvTYPE(TARG) > SVt_PVLV
1448             && !(SvTYPE(TARG) == SVt_PVGV && SvFAKE(TARG))))
1449         croak(no_modify);
1450     s = SvPV(TARG, len);
1451     if (!SvPOKp(TARG) || SvTYPE(TARG) == SVt_PVGV)
1452         force_on_match = 1;
1453     TAINT_NOT;
1454
1455   force_it:
1456     if (!pm || !s)
1457         DIE("panic: do_subst");
1458
1459     strend = s + len;
1460     maxiters = (strend - s) + 10;
1461
1462     if (!rx->prelen && curpm) {
1463         pm = curpm;
1464         rx = pm->op_pmregexp;
1465     }
1466     safebase = (!rx->nparens && !sawampersand);
1467     if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
1468         SAVEINT(multiline);
1469         multiline = pm->op_pmflags & PMf_MULTILINE;
1470     }
1471     orig = m = s;
1472     if (pm->op_pmshort) {
1473         if (pm->op_pmflags & PMf_SCANFIRST) {
1474             if (SvSCREAM(TARG)) {
1475                 if (screamfirst[BmRARE(pm->op_pmshort)] < 0)
1476                     goto nope;
1477                 else if (!(s = screaminstr(TARG, pm->op_pmshort)))
1478                     goto nope;
1479             }
1480             else if (!(s = fbm_instr((unsigned char*)s, (unsigned char*)strend,
1481               pm->op_pmshort)))
1482                 goto nope;
1483             if (s && rx->regback >= 0) {
1484                 ++BmUSEFUL(pm->op_pmshort);
1485                 s -= rx->regback;
1486                 if (s < m)
1487                     s = m;
1488             }
1489             else
1490                 s = m;
1491         }
1492         else if (!multiline) {
1493             if (*SvPVX(pm->op_pmshort) != *s
1494                 || (pm->op_pmslen > 1
1495                     && memNE(SvPVX(pm->op_pmshort), s, pm->op_pmslen)))
1496                 goto nope;
1497         }
1498         if (!rx->naughty && --BmUSEFUL(pm->op_pmshort) < 0) {
1499             SvREFCNT_dec(pm->op_pmshort);
1500             pm->op_pmshort = Nullsv;    /* opt is being useless */
1501         }
1502     }
1503
1504     /* only replace once? */
1505     once = !(rpm->op_pmflags & PMf_GLOBAL);
1506
1507     /* known replacement string? */
1508     c = dstr ? SvPV(dstr, clen) : Nullch;
1509
1510     /* can do inplace substitution? */
1511     if (c && clen <= rx->minlen && safebase) {
1512         if (! pregexec(rx, s, strend, orig, 0,
1513                        SvSCREAM(TARG) ? TARG : Nullsv, safebase)) {
1514             PUSHs(&sv_no);
1515             LEAVE_SCOPE(oldsave);
1516             RETURN;
1517         }
1518         if (force_on_match) {
1519             force_on_match = 0;
1520             s = SvPV_force(TARG, len);
1521             goto force_it;
1522         }
1523         d = s;
1524         curpm = pm;
1525         SvSCREAM_off(TARG);     /* disable possible screamer */
1526         if (once) {
1527             rxtainted = rx->exec_tainted;
1528             m = rx->startp[0];
1529             d = rx->endp[0];
1530             s = orig;
1531             if (m - s > strend - d) {  /* faster to shorten from end */
1532                 if (clen) {
1533                     Copy(c, m, clen, char);
1534                     m += clen;
1535                 }
1536                 i = strend - d;
1537                 if (i > 0) {
1538                     Move(d, m, i, char);
1539                     m += i;
1540                 }
1541                 *m = '\0';
1542                 SvCUR_set(TARG, m - s);
1543             }
1544             /*SUPPRESS 560*/
1545             else if (i = m - s) {       /* faster from front */
1546                 d -= clen;
1547                 m = d;
1548                 sv_chop(TARG, d-i);
1549                 s += i;
1550                 while (i--)
1551                     *--d = *--s;
1552                 if (clen)
1553                     Copy(c, m, clen, char);
1554             }
1555             else if (clen) {
1556                 d -= clen;
1557                 sv_chop(TARG, d);
1558                 Copy(c, d, clen, char);
1559             }
1560             else {
1561                 sv_chop(TARG, d);
1562             }
1563             TAINT_IF(rxtainted);
1564             PUSHs(&sv_yes);
1565         }
1566         else {
1567             rxtainted = 0;
1568             do {
1569                 if (iters++ > maxiters)
1570                     DIE("Substitution loop");
1571                 rxtainted |= rx->exec_tainted;
1572                 m = rx->startp[0];
1573                 /*SUPPRESS 560*/
1574                 if (i = m - s) {
1575                     if (s != d)
1576                         Move(s, d, i, char);
1577                     d += i;
1578                 }
1579                 if (clen) {
1580                     Copy(c, d, clen, char);
1581                     d += clen;
1582                 }
1583                 s = rx->endp[0];
1584             } while (pregexec(rx, s, strend, orig, s == m,
1585                               Nullsv, TRUE)); /* don't match same null twice */
1586             if (s != d) {
1587                 i = strend - s;
1588                 SvCUR_set(TARG, d - SvPVX(TARG) + i);
1589                 Move(s, d, i+1, char);          /* include the NUL */
1590             }
1591             TAINT_IF(rxtainted);
1592             PUSHs(sv_2mortal(newSViv((I32)iters)));
1593         }
1594         (void)SvPOK_only(TARG);
1595         SvSETMAGIC(TARG);
1596         SvTAINT(TARG);
1597         LEAVE_SCOPE(oldsave);
1598         RETURN;
1599     }
1600
1601     if (pregexec(rx, s, strend, orig, 0,
1602                  SvSCREAM(TARG) ? TARG : Nullsv, safebase)) {
1603         if (force_on_match) {
1604             force_on_match = 0;
1605             s = SvPV_force(TARG, len);
1606             goto force_it;
1607         }
1608         rxtainted = rx->exec_tainted;
1609         dstr = NEWSV(25, sv_len(TARG));
1610         sv_setpvn(dstr, m, s-m);
1611         curpm = pm;
1612         if (!c) {
1613             register CONTEXT *cx;
1614             PUSHSUBST(cx);
1615             RETURNOP(cPMOP->op_pmreplroot);
1616         }
1617         do {
1618             if (iters++ > maxiters)
1619                 DIE("Substitution loop");
1620             rxtainted |= rx->exec_tainted;
1621             if (rx->subbase && rx->subbase != orig) {
1622                 m = s;
1623                 s = orig;
1624                 orig = rx->subbase;
1625                 s = orig + (m - s);
1626                 strend = s + (strend - m);
1627             }
1628             m = rx->startp[0];
1629             sv_catpvn(dstr, s, m-s);
1630             s = rx->endp[0];
1631             if (clen)
1632                 sv_catpvn(dstr, c, clen);
1633             if (once)
1634                 break;
1635         } while (pregexec(rx, s, strend, orig, s == m, Nullsv, safebase));
1636         sv_catpvn(dstr, s, strend - s);
1637
1638         TAINT_IF(rxtainted);
1639
1640         (void)SvOOK_off(TARG);
1641         Safefree(SvPVX(TARG));
1642         SvPVX(TARG) = SvPVX(dstr);
1643         SvCUR_set(TARG, SvCUR(dstr));
1644         SvLEN_set(TARG, SvLEN(dstr));
1645         SvPVX(dstr) = 0;
1646         sv_free(dstr);
1647
1648         (void)SvPOK_only(TARG);
1649         SvSETMAGIC(TARG);
1650         SvTAINT(TARG);
1651         PUSHs(sv_2mortal(newSViv((I32)iters)));
1652         LEAVE_SCOPE(oldsave);
1653         RETURN;
1654     }
1655     goto ret_no;
1656
1657 nope:
1658     ++BmUSEFUL(pm->op_pmshort);
1659
1660 ret_no:
1661     PUSHs(&sv_no);
1662     LEAVE_SCOPE(oldsave);
1663     RETURN;
1664 }
1665
1666 PP(pp_grepwhile)
1667 {
1668     dSP;
1669
1670     if (SvTRUEx(POPs))
1671         stack_base[markstack_ptr[-1]++] = stack_base[*markstack_ptr];
1672     ++*markstack_ptr;
1673     LEAVE;                                      /* exit inner scope */
1674
1675     /* All done yet? */
1676     if (stack_base + *markstack_ptr > sp) {
1677         I32 items;
1678         I32 gimme = GIMME_V;
1679
1680         LEAVE;                                  /* exit outer scope */
1681         (void)POPMARK;                          /* pop src */
1682         items = --*markstack_ptr - markstack_ptr[-1];
1683         (void)POPMARK;                          /* pop dst */
1684         SP = stack_base + POPMARK;              /* pop original mark */
1685         if (gimme == G_SCALAR) {
1686             dTARGET;
1687             XPUSHi(items);
1688         }
1689         else if (gimme == G_ARRAY)
1690             SP += items;
1691         RETURN;
1692     }
1693     else {
1694         SV *src;
1695
1696         ENTER;                                  /* enter inner scope */
1697         SAVESPTR(curpm);
1698
1699         src = stack_base[*markstack_ptr];
1700         SvTEMP_off(src);
1701         GvSV(defgv) = src;
1702
1703         RETURNOP(cLOGOP->op_other);
1704     }
1705 }
1706
1707 PP(pp_leavesub)
1708 {
1709     dSP;
1710     SV **mark;
1711     SV **newsp;
1712     PMOP *newpm;
1713     I32 gimme;
1714     register CONTEXT *cx;
1715     struct block_sub cxsub;
1716
1717     POPBLOCK(cx,newpm);
1718     POPSUB1(cx);        /* Delay POPSUB2 until stack values are safe */
1719  
1720     TAINT_NOT;
1721     if (gimme == G_SCALAR) {
1722         MARK = newsp + 1;
1723         if (MARK <= SP)
1724             *MARK = SvTEMP(TOPs) ? TOPs : sv_mortalcopy(TOPs);
1725         else {
1726             MEXTEND(MARK, 0);
1727             *MARK = &sv_undef;
1728         }
1729         SP = MARK;
1730     }
1731     else if (gimme == G_ARRAY) {
1732         for (MARK = newsp + 1; MARK <= SP; MARK++) {
1733             if (!SvTEMP(*MARK)) {
1734                 *MARK = sv_mortalcopy(*MARK);
1735                 TAINT_NOT;      /* Each item is independent */
1736             }
1737         }
1738     }
1739     PUTBACK;
1740     
1741     POPSUB2();          /* Stack values are safe: release CV and @_ ... */
1742     curpm = newpm;      /* ... and pop $1 et al */
1743
1744     LEAVE;
1745     return pop_return();
1746 }
1747
1748 PP(pp_entersub)
1749 {
1750     dSP; dPOPss;
1751     GV *gv;
1752     HV *stash;
1753     register CV *cv;
1754     register CONTEXT *cx;
1755     I32 gimme;
1756     bool hasargs = (op->op_flags & OPf_STACKED) != 0;
1757
1758     if (!sv)
1759         DIE("Not a CODE reference");
1760     switch (SvTYPE(sv)) {
1761     default:
1762         if (!SvROK(sv)) {
1763             char *sym;
1764
1765             if (sv == &sv_yes)          /* unfound import, ignore */
1766                 RETURN;
1767             if (SvGMAGICAL(sv)) {
1768                 mg_get(sv);
1769                 sym = SvPOKp(sv) ? SvPVX(sv) : Nullch;
1770             }
1771             else
1772                 sym = SvPV(sv, na);
1773             if (!sym)
1774                 DIE(no_usym, "a subroutine");
1775             if (op->op_private & HINT_STRICT_REFS)
1776                 DIE(no_symref, sym, "a subroutine");
1777             cv = perl_get_cv(sym, TRUE);
1778             break;
1779         }
1780         cv = (CV*)SvRV(sv);
1781         if (SvTYPE(cv) == SVt_PVCV)
1782             break;
1783         /* FALL THROUGH */
1784     case SVt_PVHV:
1785     case SVt_PVAV:
1786         DIE("Not a CODE reference");
1787     case SVt_PVCV:
1788         cv = (CV*)sv;
1789         break;
1790     case SVt_PVGV:
1791         if (!(cv = GvCVu((GV*)sv)))
1792             cv = sv_2cv(sv, &stash, &gv, TRUE);
1793         break;
1794     }
1795
1796     ENTER;
1797     SAVETMPS;
1798
1799   retry:
1800     if (!cv)
1801         DIE("Not a CODE reference");
1802
1803     if (!CvROOT(cv) && !CvXSUB(cv)) {
1804         GV* autogv;
1805         SV* subname;
1806
1807         /* anonymous or undef'd function leaves us no recourse */
1808         if (CvANON(cv) || !(gv = CvGV(cv)))
1809             DIE("Undefined subroutine called");
1810         /* autoloaded stub? */
1811         if (cv != GvCV(gv)) {
1812             cv = GvCV(gv);
1813             goto retry;
1814         }
1815         /* should call AUTOLOAD now? */
1816         if ((autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv),
1817                                    FALSE)))
1818         {
1819             cv = GvCV(autogv);
1820             goto retry;
1821         }
1822         /* sorry */
1823         subname = sv_newmortal();
1824         gv_efullname3(subname, gv, Nullch);
1825         DIE("Undefined subroutine &%s called", SvPVX(subname));
1826     }
1827
1828     gimme = GIMME_V;
1829     if ((op->op_private & OPpENTERSUB_DB) && GvCV(DBsub) && !CvNODEBUG(cv)) {
1830         SV *oldsv = sv;
1831         sv = GvSV(DBsub);
1832         save_item(sv);
1833         gv = CvGV(cv);
1834         if ( (CvFLAGS(cv) & (CVf_ANON | CVf_CLONED))
1835              || strEQ(GvNAME(gv), "END") 
1836              || ((GvCV(gv) != cv) && /* Could be imported, and old sub redefined. */
1837                  !( (SvTYPE(oldsv) == SVt_PVGV) && (GvCV((GV*)oldsv) == cv)
1838                     && (gv = (GV*)oldsv) ))) { /* Use GV from the stack as a fallback. */
1839             /* GV is potentially non-unique, or contain different CV. */
1840             sv_setsv(sv, newRV((SV*)cv));
1841         }
1842         else {
1843             gv_efullname3(sv, gv, Nullch);
1844         }
1845         cv = GvCV(DBsub);
1846         if (CvXSUB(cv)) curcopdb = curcop;
1847         if (!cv)
1848             DIE("No DBsub routine");
1849     }
1850
1851     if (CvXSUB(cv)) {
1852         if (CvOLDSTYLE(cv)) {
1853             I32 (*fp3)_((int,int,int));
1854             dMARK;
1855             register I32 items = SP - MARK;
1856                                         /* We dont worry to copy from @_. */
1857             while (sp > mark) {
1858                 sp[1] = sp[0];
1859                 sp--;
1860             }
1861             stack_sp = mark + 1;
1862             fp3 = (I32(*)_((int,int,int)))CvXSUB(cv);
1863             items = (*fp3)(CvXSUBANY(cv).any_i32, 
1864                            MARK - stack_base + 1,
1865                            items);
1866             stack_sp = stack_base + items;
1867         }
1868         else {
1869             I32 markix = TOPMARK;
1870
1871             PUTBACK;
1872
1873             if (!hasargs) {
1874                 /* Need to copy @_ to stack. Alternative may be to
1875                  * switch stack to @_, and copy return values
1876                  * back. This would allow popping @_ in XSUB, e.g.. XXXX */
1877                 AV* av = GvAV(defgv);
1878                 I32 items = AvFILL(av) + 1;
1879
1880                 if (items) {
1881                     /* Mark is at the end of the stack. */
1882                     EXTEND(sp, items);
1883                     Copy(AvARRAY(av), sp + 1, items, SV*);
1884                     sp += items;
1885                     PUTBACK ;               
1886                 }
1887             }
1888             if (curcopdb) {             /* We assume that the first
1889                                            XSUB in &DB::sub is the
1890                                            called one. */
1891                 SAVESPTR(curcop);
1892                 curcop = curcopdb;
1893                 curcopdb = NULL;
1894             }
1895             /* Do we need to open block here? XXXX */
1896             (void)(*CvXSUB(cv))(cv);
1897
1898             /* Enforce some sanity in scalar context. */
1899             if (gimme == G_SCALAR && ++markix != stack_sp - stack_base ) {
1900                 if (markix > stack_sp - stack_base)
1901                     *(stack_base + markix) = &sv_undef;
1902                 else
1903                     *(stack_base + markix) = *stack_sp;
1904                 stack_sp = stack_base + markix;
1905             }
1906         }
1907         LEAVE;
1908         return NORMAL;
1909     }
1910     else {
1911         dMARK;
1912         register I32 items = SP - MARK;
1913         AV* padlist = CvPADLIST(cv);
1914         SV** svp = AvARRAY(padlist);
1915         push_return(op->op_next);
1916         PUSHBLOCK(cx, CXt_SUB, MARK);
1917         PUSHSUB(cx);
1918         CvDEPTH(cv)++;
1919         if (CvDEPTH(cv) < 2)
1920             (void)SvREFCNT_inc(cv);
1921         else {  /* save temporaries on recursion? */
1922             if (CvDEPTH(cv) == 100 && dowarn 
1923                   && !(perldb && cv == GvCV(DBsub)))
1924                 sub_crush_depth(cv);
1925             if (CvDEPTH(cv) > AvFILL(padlist)) {
1926                 AV *av;
1927                 AV *newpad = newAV();
1928                 SV **oldpad = AvARRAY(svp[CvDEPTH(cv)-1]);
1929                 I32 ix = AvFILL((AV*)svp[1]);
1930                 svp = AvARRAY(svp[0]);
1931                 for ( ;ix > 0; ix--) {
1932                     if (svp[ix] != &sv_undef) {
1933                         char *name = SvPVX(svp[ix]);
1934                         if ((SvFLAGS(svp[ix]) & SVf_FAKE) /* outer lexical? */
1935                             || *name == '&')              /* anonymous code? */
1936                         {
1937                             av_store(newpad, ix, SvREFCNT_inc(oldpad[ix]));
1938                         }
1939                         else {                          /* our own lexical */
1940                             if (*name == '@')
1941                                 av_store(newpad, ix, sv = (SV*)newAV());
1942                             else if (*name == '%')
1943                                 av_store(newpad, ix, sv = (SV*)newHV());
1944                             else
1945                                 av_store(newpad, ix, sv = NEWSV(0,0));
1946                             SvPADMY_on(sv);
1947                         }
1948                     }
1949                     else {
1950                         av_store(newpad, ix, sv = NEWSV(0,0));
1951                         SvPADTMP_on(sv);
1952                     }
1953                 }
1954                 av = newAV();           /* will be @_ */
1955                 av_extend(av, 0);
1956                 av_store(newpad, 0, (SV*)av);
1957                 AvFLAGS(av) = AVf_REIFY;
1958                 av_store(padlist, CvDEPTH(cv), (SV*)newpad);
1959                 AvFILL(padlist) = CvDEPTH(cv);
1960                 svp = AvARRAY(padlist);
1961             }
1962         }
1963         SAVESPTR(curpad);
1964         curpad = AvARRAY((AV*)svp[CvDEPTH(cv)]);
1965         if (hasargs) {
1966             AV* av = (AV*)curpad[0];
1967             SV** ary;
1968
1969             if (AvREAL(av)) {
1970                 av_clear(av);
1971                 AvREAL_off(av);
1972             }
1973             cx->blk_sub.savearray = GvAV(defgv);
1974             cx->blk_sub.argarray = av;
1975             GvAV(defgv) = (AV*)SvREFCNT_inc(av);
1976             ++MARK;
1977
1978             if (items > AvMAX(av) + 1) {
1979                 ary = AvALLOC(av);
1980                 if (AvARRAY(av) != ary) {
1981                     AvMAX(av) += AvARRAY(av) - AvALLOC(av);
1982                     SvPVX(av) = (char*)ary;
1983                 }
1984                 if (items > AvMAX(av) + 1) {
1985                     AvMAX(av) = items - 1;
1986                     Renew(ary,items,SV*);
1987                     AvALLOC(av) = ary;
1988                     SvPVX(av) = (char*)ary;
1989                 }
1990             }
1991             Copy(MARK,AvARRAY(av),items,SV*);
1992             AvFILL(av) = items - 1;
1993             
1994             while (items--) {
1995                 if (*MARK)
1996                     SvTEMP_off(*MARK);
1997                 MARK++;
1998             }
1999         }
2000         RETURNOP(CvSTART(cv));
2001     }
2002 }
2003
2004 void
2005 sub_crush_depth(cv)
2006 CV* cv;
2007 {
2008     if (CvANON(cv))
2009         warn("Deep recursion on anonymous subroutine");
2010     else {
2011         SV* tmpstr = sv_newmortal();
2012         gv_efullname3(tmpstr, CvGV(cv), Nullch);
2013         warn("Deep recursion on subroutine \"%s\"", SvPVX(tmpstr));
2014     }
2015 }
2016
2017 PP(pp_aelem)
2018 {
2019     dSP;
2020     SV** svp;
2021     I32 elem = POPi;
2022     AV* av = (AV*)POPs;
2023     U32 lval = op->op_flags & OPf_MOD;
2024     U32 defer = (op->op_private & OPpLVAL_DEFER) && (elem > AvFILL(av));
2025
2026     if (elem > 0)
2027         elem -= curcop->cop_arybase;
2028     if (SvTYPE(av) != SVt_PVAV)
2029         RETPUSHUNDEF;
2030     svp = av_fetch(av, elem, lval && !defer);
2031     if (lval) {
2032         if (!svp || *svp == &sv_undef) {
2033             SV* lv;
2034             if (!defer)
2035                 DIE(no_aelem, elem);
2036             lv = sv_newmortal();
2037             sv_upgrade(lv, SVt_PVLV);
2038             LvTYPE(lv) = 'y';
2039             sv_magic(lv, Nullsv, 'y', Nullch, 0);
2040             LvTARG(lv) = SvREFCNT_inc(av);
2041             LvTARGOFF(lv) = elem;
2042             LvTARGLEN(lv) = 1;
2043             PUSHs(lv);
2044             RETURN;
2045         }
2046         if (op->op_private & OPpLVAL_INTRO)
2047             save_svref(svp);
2048         else if (op->op_private & OPpDEREF)
2049             vivify_ref(*svp, op->op_private & OPpDEREF);
2050     }
2051     PUSHs(svp ? *svp : &sv_undef);
2052     RETURN;
2053 }
2054
2055 void
2056 vivify_ref(sv, to_what)
2057 SV* sv;
2058 U32 to_what;
2059 {
2060     if (SvGMAGICAL(sv))
2061         mg_get(sv);
2062     if (!SvOK(sv)) {
2063         if (SvREADONLY(sv))
2064             croak(no_modify);
2065         if (SvTYPE(sv) < SVt_RV)
2066             sv_upgrade(sv, SVt_RV);
2067         else if (SvTYPE(sv) >= SVt_PV) {
2068             (void)SvOOK_off(sv);
2069             Safefree(SvPVX(sv));
2070             SvLEN(sv) = SvCUR(sv) = 0;
2071         }
2072         switch (to_what) {
2073         case OPpDEREF_SV:
2074             SvRV(sv) = newSV(0);
2075             break;
2076         case OPpDEREF_AV:
2077             SvRV(sv) = (SV*)newAV();
2078             break;
2079         case OPpDEREF_HV:
2080             SvRV(sv) = (SV*)newHV();
2081             break;
2082         }
2083         SvROK_on(sv);
2084         SvSETMAGIC(sv);
2085     }
2086 }
2087
2088 PP(pp_method)
2089 {
2090     dSP;
2091     SV* sv;
2092     SV* ob;
2093     GV* gv;
2094     HV* stash;
2095     char* name;
2096     char* packname;
2097     STRLEN packlen;
2098
2099     name = SvPV(TOPs, na);
2100     sv = *(stack_base + TOPMARK + 1);
2101     
2102     if (SvGMAGICAL(sv))
2103         mg_get(sv);
2104     if (SvROK(sv))
2105         ob = (SV*)SvRV(sv);
2106     else {
2107         GV* iogv;
2108
2109         packname = Nullch;
2110         if (!SvOK(sv) ||
2111             !(packname = SvPV(sv, packlen)) ||
2112             !(iogv = gv_fetchpv(packname, FALSE, SVt_PVIO)) ||
2113             !(ob=(SV*)GvIO(iogv)))
2114         {
2115             if (!packname || !isIDFIRST(*packname))
2116   DIE("Can't call method \"%s\" without a package or object reference", name);
2117             stash = gv_stashpvn(packname, packlen, TRUE);
2118             goto fetch;
2119         }
2120         *(stack_base + TOPMARK + 1) = sv_2mortal(newRV((SV*)iogv));
2121     }
2122
2123     if (!ob || !SvOBJECT(ob))
2124         DIE("Can't call method \"%s\" on unblessed reference", name);
2125
2126     stash = SvSTASH(ob);
2127
2128   fetch:
2129     gv = gv_fetchmethod(stash, name);
2130     if (!gv) {
2131         char* leaf = name;
2132         char* sep = Nullch;
2133         char* p;
2134
2135         for (p = name; *p; p++) {
2136             if (*p == '\'')
2137                 sep = p, leaf = p + 1;
2138             else if (*p == ':' && *(p + 1) == ':')
2139                 sep = p, leaf = p + 2;
2140         }
2141         if (!sep || ((sep - name) == 5 && strnEQ(name, "SUPER", 5))) {
2142             packname = HvNAME(sep ? curcop->cop_stash : stash);
2143             packlen = strlen(packname);
2144         }
2145         else {
2146             packname = name;
2147             packlen = sep - name;
2148         }
2149         DIE("Can't locate object method \"%s\" via package \"%.*s\"",
2150             leaf, (int)packlen, packname);
2151     }
2152     SETs(isGV(gv) ? (SV*)GvCV(gv) : (SV*)gv);
2153     RETURN;
2154 }