Half way through moving per-thread magicals into per-thread fields
[p5sagit/p5-mst-13.2.git] / op.c
1 /*    op.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  * "You see: Mr. Drogo, he married poor Miss Primula Brandybuck.  She was
12  * our Mr. Bilbo's first cousin on the mother's side (her mother being the
13  * youngest of the Old Took's daughters); and Mr. Drogo was his second
14  * cousin.  So Mr. Frodo is his first *and* second cousin, once removed
15  * either way, as the saying is, if you follow me."  --the Gaffer
16  */
17
18 #include "EXTERN.h"
19 #include "perl.h"
20
21 /*
22  * In the following definition, the ", Nullop" is just to make the compiler
23  * think the expression is of the right type: croak actually does a Siglongjmp.
24  */
25 #define CHECKOP(type,o) \
26     ((op_mask && op_mask[type])                                 \
27      ? ( op_free((OP*)o),                                       \
28          croak("%s trapped by operation mask", op_desc[type]),  \
29          Nullop )                                               \
30      : (*check[type])((OP*)o))
31
32 static I32 list_assignment _((OP *o));
33 static void bad_type _((I32 n, char *t, char *name, OP *kid));
34 static OP *modkids _((OP *o, I32 type));
35 static OP *no_fh_allowed _((OP *o));
36 static bool scalar_mod_type _((OP *o, I32 type));
37 static OP *scalarboolean _((OP *o));
38 static OP *too_few_arguments _((OP *o, char* name));
39 static OP *too_many_arguments _((OP *o, char* name));
40 static void null _((OP* o));
41 static PADOFFSET pad_findlex _((char* name, PADOFFSET newoff, U32 seq,
42         CV* startcv, I32 cx_ix));
43
44 static char*
45 gv_ename(gv)
46 GV* gv;
47 {
48     SV* tmpsv = sv_newmortal();
49     gv_efullname3(tmpsv, gv, Nullch);
50     return SvPV(tmpsv,na);
51 }
52
53 static OP *
54 no_fh_allowed(o)
55 OP *o;
56 {
57     yyerror(form("Missing comma after first argument to %s function",
58                  op_desc[o->op_type]));
59     return o;
60 }
61
62 static OP *
63 too_few_arguments(o, name)
64 OP* o;
65 char* name;
66 {
67     yyerror(form("Not enough arguments for %s", name));
68     return o;
69 }
70
71 static OP *
72 too_many_arguments(o, name)
73 OP *o;
74 char* name;
75 {
76     yyerror(form("Too many arguments for %s", name));
77     return o;
78 }
79
80 static void
81 bad_type(n, t, name, kid)
82 I32 n;
83 char *t;
84 char *name;
85 OP *kid;
86 {
87     yyerror(form("Type of arg %d to %s must be %s (not %s)",
88                  (int)n, name, t, op_desc[kid->op_type]));
89 }
90
91 void
92 assertref(o)
93 OP *o;
94 {
95     int type = o->op_type;
96     if (type != OP_AELEM && type != OP_HELEM) {
97         yyerror(form("Can't use subscript on %s", op_desc[type]));
98         if (type == OP_ENTERSUB || type == OP_RV2HV || type == OP_PADHV)
99             warn("(Did you mean $ or @ instead of %c?)\n",
100                  type == OP_ENTERSUB ? '&' : '%');
101     }
102 }
103
104 /* "register" allocation */
105
106 PADOFFSET
107 pad_allocmy(name)
108 char *name;
109 {
110     dTHR;
111     PADOFFSET off;
112     SV *sv;
113
114     if (!(isALPHA(name[1]) || name[1] == '_' && (int)strlen(name) > 2)) {
115         if (!isPRINT(name[1])) {
116             name[3] = '\0';
117             name[2] = toCTRL(name[1]);
118             name[1] = '^';
119         }
120         croak("Can't use global %s in \"my\"",name);
121     }
122     if (dowarn && AvFILL(comppad_name) >= 0) {
123         SV **svp = AvARRAY(comppad_name);
124         for (off = AvFILL(comppad_name); off > comppad_name_floor; off--) {
125             if ((sv = svp[off])
126                 && sv != &sv_undef
127                 && SvIVX(sv) == 999999999       /* var is in open scope */
128                 && strEQ(name, SvPVX(sv)))
129             {
130                 warn("\"my\" variable %s masks earlier declaration in same scope", name);
131                 break;
132             }
133         }
134     }
135     off = pad_alloc(OP_PADSV, SVs_PADMY);
136     sv = NEWSV(1102,0);
137     sv_upgrade(sv, SVt_PVNV);
138     sv_setpv(sv, name);
139     if (in_my_stash) {
140         if (*name != '$')
141             croak("Can't declare class for non-scalar %s in \"my\"",name);
142         SvOBJECT_on(sv);
143         (void)SvUPGRADE(sv, SVt_PVMG);
144         SvSTASH(sv) = (HV*)SvREFCNT_inc(in_my_stash);
145         sv_objcount++;
146     }
147     av_store(comppad_name, off, sv);
148     SvNVX(sv) = (double)999999999;
149     SvIVX(sv) = 0;                      /* Not yet introduced--see newSTATEOP */
150     if (!min_intro_pending)
151         min_intro_pending = off;
152     max_intro_pending = off;
153     if (*name == '@')
154         av_store(comppad, off, (SV*)newAV());
155     else if (*name == '%')
156         av_store(comppad, off, (SV*)newHV());
157     SvPADMY_on(curpad[off]);
158     return off;
159 }
160
161 static PADOFFSET
162 #ifndef CAN_PROTOTYPE
163 pad_findlex(name, newoff, seq, startcv, cx_ix)
164 char *name;
165 PADOFFSET newoff;
166 U32 seq;
167 CV* startcv;
168 I32 cx_ix;
169 #else
170 pad_findlex(char *name, PADOFFSET newoff, U32 seq, CV* startcv, I32 cx_ix)
171 #endif
172 {
173     dTHR;
174     CV *cv;
175     I32 off;
176     SV *sv;
177     register I32 i;
178     register CONTEXT *cx;
179     int saweval;
180
181     for (cv = startcv; cv; cv = CvOUTSIDE(cv)) {
182         AV *curlist = CvPADLIST(cv);
183         SV **svp = av_fetch(curlist, 0, FALSE);
184         AV *curname;
185
186         if (!svp || *svp == &sv_undef)
187             continue;
188         curname = (AV*)*svp;
189         svp = AvARRAY(curname);
190         for (off = AvFILL(curname); off > 0; off--) {
191             if ((sv = svp[off]) &&
192                 sv != &sv_undef &&
193                 seq <= SvIVX(sv) &&
194                 seq > I_32(SvNVX(sv)) &&
195                 strEQ(SvPVX(sv), name))
196             {
197                 I32 depth;
198                 AV *oldpad;
199                 SV *oldsv;
200
201                 depth = CvDEPTH(cv);
202                 if (!depth) {
203                     if (newoff) {
204                         if (SvFAKE(sv))
205                             continue;
206                         return 0; /* don't clone from inactive stack frame */
207                     }
208                     depth = 1;
209                 }
210                 oldpad = (AV*)*av_fetch(curlist, depth, FALSE);
211                 oldsv = *av_fetch(oldpad, off, TRUE);
212                 if (!newoff) {          /* Not a mere clone operation. */
213                     SV *namesv = NEWSV(1103,0);
214                     newoff = pad_alloc(OP_PADSV, SVs_PADMY);
215                     sv_upgrade(namesv, SVt_PVNV);
216                     sv_setpv(namesv, name);
217                     av_store(comppad_name, newoff, namesv);
218                     SvNVX(namesv) = (double)curcop->cop_seq;
219                     SvIVX(namesv) = 999999999;  /* A ref, intro immediately */
220                     SvFAKE_on(namesv);          /* A ref, not a real var */
221                     if (CvANON(compcv) || SvTYPE(compcv) == SVt_PVFM) {
222                         /* "It's closures all the way down." */
223                         CvCLONE_on(compcv);
224                         if (cv == startcv) {
225                             if (CvANON(compcv))
226                                 oldsv = Nullsv; /* no need to keep ref */
227                         }
228                         else {
229                             CV *bcv;
230                             for (bcv = startcv;
231                                  bcv && bcv != cv && !CvCLONE(bcv);
232                                  bcv = CvOUTSIDE(bcv)) {
233                                 if (CvANON(bcv))
234                                     CvCLONE_on(bcv);
235                                 else {
236                                     if (dowarn && !CvUNIQUE(cv))
237                                         warn(
238                                           "Variable \"%s\" may be unavailable",
239                                              name);
240                                     break;
241                                 }
242                             }
243                         }
244                     }
245                     else if (!CvUNIQUE(compcv)) {
246                         if (dowarn && !SvFAKE(sv) && !CvUNIQUE(cv))
247                             warn("Variable \"%s\" will not stay shared", name);
248                     }
249                 }
250                 av_store(comppad, newoff, oldsv ? SvREFCNT_inc(oldsv) : 0);
251                 return newoff;
252             }
253         }
254     }
255
256     /* Nothing in current lexical context--try eval's context, if any.
257      * This is necessary to let the perldb get at lexically scoped variables.
258      * XXX This will also probably interact badly with eval tree caching.
259      */
260
261     saweval = 0;
262     for (i = cx_ix; i >= 0; i--) {
263         cx = &cxstack[i];
264         switch (cx->cx_type) {
265         default:
266             if (i == 0 && saweval) {
267                 seq = cxstack[saweval].blk_oldcop->cop_seq;
268                 return pad_findlex(name, newoff, seq, main_cv, 0);
269             }
270             break;
271         case CXt_EVAL:
272             switch (cx->blk_eval.old_op_type) {
273             case OP_ENTEREVAL:
274                 saweval = i;
275                 break;
276             case OP_REQUIRE:
277                 /* require must have its own scope */
278                 return 0;
279             }
280             break;
281         case CXt_SUB:
282             if (!saweval)
283                 return 0;
284             cv = cx->blk_sub.cv;
285             if (debstash && CvSTASH(cv) == debstash) {  /* ignore DB'* scope */
286                 saweval = i;    /* so we know where we were called from */
287                 continue;
288             }
289             seq = cxstack[saweval].blk_oldcop->cop_seq;
290             return pad_findlex(name, newoff, seq, cv, i-1);
291         }
292     }
293
294     return 0;
295 }
296
297 PADOFFSET
298 pad_findmy(name)
299 char *name;
300 {
301     dTHR;
302     I32 off;
303     I32 pendoff = 0;
304     SV *sv;
305     SV **svp = AvARRAY(comppad_name);
306     U32 seq = cop_seqmax;
307
308 #ifdef USE_THREADS
309     /*
310      * Special case to get lexical (and hence per-thread) @_.
311      * XXX I need to find out how to tell at parse-time whether use
312      * of @_ should refer to a lexical (from a sub) or defgv (global
313      * scope and maybe weird sub-ish things like formats). See
314      * startsub in perly.y.  It's possible that @_ could be lexical
315      * (at least from subs) even in non-threaded perl.
316      */
317     if (strEQ(name, "@_"))
318         return 0;               /* success. (NOT_IN_PAD indicates failure) */
319 #endif /* USE_THREADS */
320
321     /* The one we're looking for is probably just before comppad_name_fill. */
322     for (off = AvFILL(comppad_name); off > 0; off--) {
323         if ((sv = svp[off]) &&
324             sv != &sv_undef &&
325             (!SvIVX(sv) ||
326              (seq <= SvIVX(sv) &&
327               seq > I_32(SvNVX(sv)))) &&
328             strEQ(SvPVX(sv), name))
329         {
330             if (SvIVX(sv))
331                 return (PADOFFSET)off;
332             pendoff = off;      /* this pending def. will override import */
333         }
334     }
335
336     /* See if it's in a nested scope */
337     off = pad_findlex(name, 0, seq, CvOUTSIDE(compcv), cxstack_ix);
338     if (off) {
339         /* If there is a pending local definition, this new alias must die */
340         if (pendoff)
341             SvIVX(AvARRAY(comppad_name)[off]) = seq;
342         return off;             /* pad_findlex returns 0 for failure...*/
343     }
344     return NOT_IN_PAD;          /* ...but we return NOT_IN_PAD for failure */
345 }
346
347 void
348 pad_leavemy(fill)
349 I32 fill;
350 {
351     I32 off;
352     SV **svp = AvARRAY(comppad_name);
353     SV *sv;
354     if (min_intro_pending && fill < min_intro_pending) {
355         for (off = max_intro_pending; off >= min_intro_pending; off--) {
356             if ((sv = svp[off]) && sv != &sv_undef)
357                 warn("%s never introduced", SvPVX(sv));
358         }
359     }
360     /* "Deintroduce" my variables that are leaving with this scope. */
361     for (off = AvFILL(comppad_name); off > fill; off--) {
362         if ((sv = svp[off]) && sv != &sv_undef && SvIVX(sv) == 999999999)
363             SvIVX(sv) = cop_seqmax;
364     }
365 }
366
367 PADOFFSET
368 pad_alloc(optype,tmptype)       
369 I32 optype;
370 U32 tmptype;
371 {
372     dTHR;
373     SV *sv;
374     I32 retval;
375
376     if (AvARRAY(comppad) != curpad)
377         croak("panic: pad_alloc");
378     if (pad_reset_pending)
379         pad_reset();
380     if (tmptype & SVs_PADMY) {
381         do {
382             sv = *av_fetch(comppad, AvFILL(comppad) + 1, TRUE);
383         } while (SvPADBUSY(sv));                /* need a fresh one */
384         retval = AvFILL(comppad);
385     }
386     else {
387         SV **names = AvARRAY(comppad_name);
388         SSize_t names_fill = AvFILL(comppad_name);
389         for (;;) {
390             /*
391              * "foreach" index vars temporarily become aliases to non-"my"
392              * values.  Thus we must skip, not just pad values that are
393              * marked as current pad values, but also those with names.
394              */
395             if (++padix <= names_fill &&
396                    (sv = names[padix]) && sv != &sv_undef)
397                 continue;
398             sv = *av_fetch(comppad, padix, TRUE);
399             if (!(SvFLAGS(sv) & (SVs_PADTMP|SVs_PADMY)))
400                 break;
401         }
402         retval = padix;
403     }
404     SvFLAGS(sv) |= tmptype;
405     curpad = AvARRAY(comppad);
406 #ifdef USE_THREADS
407     DEBUG_X(PerlIO_printf(Perl_debug_log, "0x%lx Pad 0x%lx alloc %ld for %s\n",
408                           (unsigned long) thr, (unsigned long) curpad,
409                           (long) retval, op_name[optype]));
410 #else
411     DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad alloc %ld for %s\n",
412                           (long) retval, op_name[optype]));
413 #endif /* USE_THREADS */
414     return (PADOFFSET)retval;
415 }
416
417 SV *
418 #ifndef CAN_PROTOTYPE
419 pad_sv(po)
420 PADOFFSET po;
421 #else
422 pad_sv(PADOFFSET po)
423 #endif /* CAN_PROTOTYPE */
424 {
425     dTHR;
426 #ifdef USE_THREADS
427     DEBUG_X(PerlIO_printf(Perl_debug_log, "0x%lx Pad 0x%lx sv %d\n",
428                           (unsigned long) thr, (unsigned long) curpad, po));
429 #else
430     if (!po)
431         croak("panic: pad_sv po");
432     DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad sv %d\n", po));
433 #endif /* USE_THREADS */
434     return curpad[po];          /* eventually we'll turn this into a macro */
435 }
436
437 void
438 #ifndef CAN_PROTOTYPE
439 pad_free(po)
440 PADOFFSET po;
441 #else
442 pad_free(PADOFFSET po)
443 #endif /* CAN_PROTOTYPE */
444 {
445     dTHR;
446     if (!curpad)
447         return;
448     if (AvARRAY(comppad) != curpad)
449         croak("panic: pad_free curpad");
450     if (!po)
451         croak("panic: pad_free po");
452 #ifdef USE_THREADS
453     DEBUG_X(PerlIO_printf(Perl_debug_log, "0x%lx Pad 0x%lx free %d\n",
454                           (unsigned long) thr, (unsigned long) curpad, po));
455 #else
456     DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad free %d\n", po));
457 #endif /* USE_THREADS */
458     if (curpad[po] && curpad[po] != &sv_undef)
459         SvPADTMP_off(curpad[po]);
460     if ((I32)po < padix)
461         padix = po - 1;
462 }
463
464 void
465 #ifndef CAN_PROTOTYPE
466 pad_swipe(po)
467 PADOFFSET po;
468 #else
469 pad_swipe(PADOFFSET po)
470 #endif /* CAN_PROTOTYPE */
471 {
472     dTHR;
473     if (AvARRAY(comppad) != curpad)
474         croak("panic: pad_swipe curpad");
475     if (!po)
476         croak("panic: pad_swipe po");
477 #ifdef USE_THREADS
478     DEBUG_X(PerlIO_printf(Perl_debug_log, "0x%lx Pad 0x%lx swipe %d\n",
479                           (unsigned long) thr, (unsigned long) curpad, po));
480 #else
481     DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad swipe %d\n", po));
482 #endif /* USE_THREADS */
483     SvPADTMP_off(curpad[po]);
484     curpad[po] = NEWSV(1107,0);
485     SvPADTMP_on(curpad[po]);
486     if ((I32)po < padix)
487         padix = po - 1;
488 }
489
490 void
491 pad_reset()
492 {
493     dTHR;
494     register I32 po;
495
496     if (AvARRAY(comppad) != curpad)
497         croak("panic: pad_reset curpad");
498 #ifdef USE_THREADS
499     DEBUG_X(PerlIO_printf(Perl_debug_log, "0x%lx Pad 0x%lx reset\n",
500                           (unsigned long) thr, (unsigned long) curpad));
501 #else
502     DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad reset\n"));
503 #endif /* USE_THREADS */
504     if (!tainting) {    /* Can't mix tainted and non-tainted temporaries. */
505         for (po = AvMAX(comppad); po > padix_floor; po--) {
506             if (curpad[po] && !SvIMMORTAL(curpad[po]))
507                 SvPADTMP_off(curpad[po]);
508         }
509         padix = padix_floor;
510     }
511     pad_reset_pending = FALSE;
512 }
513
514 #ifdef USE_THREADS
515 PADOFFSET
516 find_thread_magical(name)
517 char *name;
518 {
519     dTHR;
520     char *p;
521     PADOFFSET key;
522     /* We currently only handle single character magicals */
523     p = strchr(per_thread_magicals, *name);
524     if (!p)
525         return NOT_IN_PAD;
526     key = magical_keys[p - per_thread_magicals];
527     if (key == NOT_IN_PAD) {
528         SV *sv;
529         key = magical_keys[p - per_thread_magicals] = key_create();
530         sv = NEWSV(0, 0);
531         av_store(thr->specific, key, sv);
532         sv_magic(sv, 0, 0, name, 1); 
533         DEBUG_L(PerlIO_printf(PerlIO_stderr(),
534                               "find_thread_magical: key %d new SV %p for %d\n",
535                               (int)key, sv, (int)*name));
536     }
537     return key;
538 }
539 #endif /* USE_THREADS */
540
541 /* Destructor */
542
543 void
544 op_free(o)
545 OP *o;
546 {
547     register OP *kid, *nextkid;
548
549     if (!o || o->op_seq == (U16)-1)
550         return;
551
552     if (o->op_flags & OPf_KIDS) {
553         for (kid = cUNOPo->op_first; kid; kid = nextkid) {
554             nextkid = kid->op_sibling; /* Get before next freeing kid */
555             op_free(kid);
556         }
557     }
558
559     switch (o->op_type) {
560     case OP_NULL:
561         o->op_targ = 0; /* Was holding old type, if any. */
562         break;
563     case OP_ENTEREVAL:
564         o->op_targ = 0; /* Was holding hints. */
565         break;
566     default:
567         if (!(o->op_flags & OPf_REF) || (check[o->op_type] != ck_ftst))
568             break;
569         /* FALL THROUGH */
570     case OP_GVSV:
571     case OP_GV:
572     case OP_AELEMFAST:
573         SvREFCNT_dec(cGVOPo->op_gv);
574         break;
575     case OP_NEXTSTATE:
576     case OP_DBSTATE:
577         Safefree(cCOPo->cop_label);
578         SvREFCNT_dec(cCOPo->cop_filegv);
579         break;
580     case OP_CONST:
581         SvREFCNT_dec(cSVOPo->op_sv);
582         break;
583     case OP_GOTO:
584     case OP_NEXT:
585     case OP_LAST:
586     case OP_REDO:
587         if (o->op_flags & (OPf_SPECIAL|OPf_STACKED|OPf_KIDS))
588             break;
589         /* FALL THROUGH */
590     case OP_TRANS:
591         Safefree(cPVOPo->op_pv);
592         break;
593     case OP_SUBST:
594         op_free(cPMOPo->op_pmreplroot);
595         /* FALL THROUGH */
596     case OP_PUSHRE:
597     case OP_MATCH:
598         pregfree(cPMOPo->op_pmregexp);
599         SvREFCNT_dec(cPMOPo->op_pmshort);
600         break;
601     }
602
603     if (o->op_targ > 0)
604         pad_free(o->op_targ);
605
606     Safefree(o);
607 }
608
609 static void
610 null(o)
611 OP* o;
612 {
613     if (o->op_type != OP_NULL && o->op_targ > 0)
614         pad_free(o->op_targ);
615     o->op_targ = o->op_type;
616     o->op_type = OP_NULL;
617     o->op_ppaddr = ppaddr[OP_NULL];
618 }
619
620 /* Contextualizers */
621
622 #define LINKLIST(o) ((o)->op_next ? (o)->op_next : linklist((OP*)o))
623
624 OP *
625 linklist(o)
626 OP *o;
627 {
628     register OP *kid;
629
630     if (o->op_next)
631         return o->op_next;
632
633     /* establish postfix order */
634     if (cUNOPo->op_first) {
635         o->op_next = LINKLIST(cUNOPo->op_first);
636         for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
637             if (kid->op_sibling)
638                 kid->op_next = LINKLIST(kid->op_sibling);
639             else
640                 kid->op_next = o;
641         }
642     }
643     else
644         o->op_next = o;
645
646     return o->op_next;
647 }
648
649 OP *
650 scalarkids(o)
651 OP *o;
652 {
653     OP *kid;
654     if (o && o->op_flags & OPf_KIDS) {
655         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
656             scalar(kid);
657     }
658     return o;
659 }
660
661 static OP *
662 scalarboolean(o)
663 OP *o;
664 {
665     if (dowarn &&
666         o->op_type == OP_SASSIGN && cBINOPo->op_first->op_type == OP_CONST) {
667         dTHR;
668         line_t oldline = curcop->cop_line;
669
670         if (copline != NOLINE)
671             curcop->cop_line = copline;
672         warn("Found = in conditional, should be ==");
673         curcop->cop_line = oldline;
674     }
675     return scalar(o);
676 }
677
678 OP *
679 scalar(o)
680 OP *o;
681 {
682     OP *kid;
683
684     /* assumes no premature commitment */
685     if (!o || (o->op_flags & OPf_WANT) || error_count
686          || o->op_type == OP_RETURN)
687         return o;
688
689     o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_SCALAR;
690
691     switch (o->op_type) {
692     case OP_REPEAT:
693         if (o->op_private & OPpREPEAT_DOLIST)
694             null(((LISTOP*)cBINOPo->op_first)->op_first);
695         scalar(cBINOPo->op_first);
696         break;
697     case OP_OR:
698     case OP_AND:
699     case OP_COND_EXPR:
700         for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
701             scalar(kid);
702         break;
703     case OP_SPLIT:
704         if ((kid = cLISTOPo->op_first) && kid->op_type == OP_PUSHRE) {
705             if (!kPMOP->op_pmreplroot)
706                 deprecate("implicit split to @_");
707         }
708         /* FALL THROUGH */
709     case OP_MATCH:
710     case OP_SUBST:
711     case OP_NULL:
712     default:
713         if (o->op_flags & OPf_KIDS) {
714             for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
715                 scalar(kid);
716         }
717         break;
718     case OP_LEAVE:
719     case OP_LEAVETRY:
720         kid = cLISTOPo->op_first;
721         scalar(kid);
722         while (kid = kid->op_sibling) {
723             if (kid->op_sibling)
724                 scalarvoid(kid);
725             else
726                 scalar(kid);
727         }
728         WITH_THR(curcop = &compiling);
729         break;
730     case OP_SCOPE:
731     case OP_LINESEQ:
732     case OP_LIST:
733         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling) {
734             if (kid->op_sibling)
735                 scalarvoid(kid);
736             else
737                 scalar(kid);
738         }
739         WITH_THR(curcop = &compiling);
740         break;
741     }
742     return o;
743 }
744
745 OP *
746 scalarvoid(o)
747 OP *o;
748 {
749     OP *kid;
750     char* useless = 0;
751     SV* sv;
752
753     /* assumes no premature commitment */
754     if (!o || (o->op_flags & OPf_WANT) == OPf_WANT_LIST || error_count
755          || o->op_type == OP_RETURN)
756         return o;
757
758     o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_VOID;
759
760     switch (o->op_type) {
761     default:
762         if (!(opargs[o->op_type] & OA_FOLDCONST))
763             break;
764         /* FALL THROUGH */
765     case OP_REPEAT:
766         if (o->op_flags & OPf_STACKED)
767             break;
768         /* FALL THROUGH */
769     case OP_GVSV:
770     case OP_WANTARRAY:
771     case OP_GV:
772     case OP_PADSV:
773     case OP_PADAV:
774     case OP_PADHV:
775     case OP_PADANY:
776     case OP_AV2ARYLEN:
777     case OP_REF:
778     case OP_REFGEN:
779     case OP_SREFGEN:
780     case OP_DEFINED:
781     case OP_HEX:
782     case OP_OCT:
783     case OP_LENGTH:
784     case OP_SUBSTR:
785     case OP_VEC:
786     case OP_INDEX:
787     case OP_RINDEX:
788     case OP_SPRINTF:
789     case OP_AELEM:
790     case OP_AELEMFAST:
791     case OP_ASLICE:
792     case OP_HELEM:
793     case OP_HSLICE:
794     case OP_UNPACK:
795     case OP_PACK:
796     case OP_JOIN:
797     case OP_LSLICE:
798     case OP_ANONLIST:
799     case OP_ANONHASH:
800     case OP_SORT:
801     case OP_REVERSE:
802     case OP_RANGE:
803     case OP_FLIP:
804     case OP_FLOP:
805     case OP_CALLER:
806     case OP_FILENO:
807     case OP_EOF:
808     case OP_TELL:
809     case OP_GETSOCKNAME:
810     case OP_GETPEERNAME:
811     case OP_READLINK:
812     case OP_TELLDIR:
813     case OP_GETPPID:
814     case OP_GETPGRP:
815     case OP_GETPRIORITY:
816     case OP_TIME:
817     case OP_TMS:
818     case OP_LOCALTIME:
819     case OP_GMTIME:
820     case OP_GHBYNAME:
821     case OP_GHBYADDR:
822     case OP_GHOSTENT:
823     case OP_GNBYNAME:
824     case OP_GNBYADDR:
825     case OP_GNETENT:
826     case OP_GPBYNAME:
827     case OP_GPBYNUMBER:
828     case OP_GPROTOENT:
829     case OP_GSBYNAME:
830     case OP_GSBYPORT:
831     case OP_GSERVENT:
832     case OP_GPWNAM:
833     case OP_GPWUID:
834     case OP_GGRNAM:
835     case OP_GGRGID:
836     case OP_GETLOGIN:
837         if (!(o->op_private & OPpLVAL_INTRO))
838             useless = op_desc[o->op_type];
839         break;
840
841     case OP_RV2GV:
842     case OP_RV2SV:
843     case OP_RV2AV:
844     case OP_RV2HV:
845         if (!(o->op_private & OPpLVAL_INTRO) &&
846                 (!o->op_sibling || o->op_sibling->op_type != OP_READLINE))
847             useless = "a variable";
848         break;
849
850     case OP_NEXTSTATE:
851     case OP_DBSTATE:
852         WITH_THR(curcop = ((COP*)o));           /* for warning below */
853         break;
854
855     case OP_CONST:
856         sv = cSVOPo->op_sv;
857         if (dowarn) {
858             useless = "a constant";
859             if (SvNIOK(sv) && (SvNV(sv) == 0.0 || SvNV(sv) == 1.0))
860                 useless = 0;
861             else if (SvPOK(sv)) {
862                 if (strnEQ(SvPVX(sv), "di", 2) ||
863                     strnEQ(SvPVX(sv), "ds", 2) ||
864                     strnEQ(SvPVX(sv), "ig", 2))
865                         useless = 0;
866             }
867         }
868         null(o);                /* don't execute a constant */
869         SvREFCNT_dec(sv);       /* don't even remember it */
870         break;
871
872     case OP_POSTINC:
873         o->op_type = OP_PREINC;         /* pre-increment is faster */
874         o->op_ppaddr = ppaddr[OP_PREINC];
875         break;
876
877     case OP_POSTDEC:
878         o->op_type = OP_PREDEC;         /* pre-decrement is faster */
879         o->op_ppaddr = ppaddr[OP_PREDEC];
880         break;
881
882     case OP_OR:
883     case OP_AND:
884     case OP_COND_EXPR:
885         for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
886             scalarvoid(kid);
887         break;
888
889     case OP_NULL:
890         if (o->op_targ == OP_NEXTSTATE || o->op_targ == OP_DBSTATE)
891             WITH_THR(curcop = ((COP*)o));       /* for warning below */
892         if (o->op_flags & OPf_STACKED)
893             break;
894         /* FALL THROUGH */
895     case OP_ENTERTRY:
896     case OP_ENTER:
897     case OP_SCALAR:
898         if (!(o->op_flags & OPf_KIDS))
899             break;
900         /* FALL THROUGH */
901     case OP_SCOPE:
902     case OP_LEAVE:
903     case OP_LEAVETRY:
904     case OP_LEAVELOOP:
905     case OP_LINESEQ:
906     case OP_LIST:
907         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
908             scalarvoid(kid);
909         break;
910     case OP_ENTEREVAL:
911         scalarkids(o);
912         break;
913     case OP_REQUIRE:
914         /* all requires must return a boolean value */
915         o->op_flags &= ~OPf_WANT;
916         return scalar(o);
917     case OP_SPLIT:
918         if ((kid = cLISTOPo->op_first) && kid->op_type == OP_PUSHRE) {
919             if (!kPMOP->op_pmreplroot)
920                 deprecate("implicit split to @_");
921         }
922         break;
923     }
924     if (useless && dowarn)
925         warn("Useless use of %s in void context", useless);
926     return o;
927 }
928
929 OP *
930 listkids(o)
931 OP *o;
932 {
933     OP *kid;
934     if (o && o->op_flags & OPf_KIDS) {
935         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
936             list(kid);
937     }
938     return o;
939 }
940
941 OP *
942 list(o)
943 OP *o;
944 {
945     OP *kid;
946
947     /* assumes no premature commitment */
948     if (!o || (o->op_flags & OPf_WANT) || error_count
949          || o->op_type == OP_RETURN)
950         return o;
951
952     o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_LIST;
953
954     switch (o->op_type) {
955     case OP_FLOP:
956     case OP_REPEAT:
957         list(cBINOPo->op_first);
958         break;
959     case OP_OR:
960     case OP_AND:
961     case OP_COND_EXPR:
962         for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
963             list(kid);
964         break;
965     default:
966     case OP_MATCH:
967     case OP_SUBST:
968     case OP_NULL:
969         if (!(o->op_flags & OPf_KIDS))
970             break;
971         if (!o->op_next && cUNOPo->op_first->op_type == OP_FLOP) {
972             list(cBINOPo->op_first);
973             return gen_constant_list(o);
974         }
975     case OP_LIST:
976         listkids(o);
977         break;
978     case OP_LEAVE:
979     case OP_LEAVETRY:
980         kid = cLISTOPo->op_first;
981         list(kid);
982         while (kid = kid->op_sibling) {
983             if (kid->op_sibling)
984                 scalarvoid(kid);
985             else
986                 list(kid);
987         }
988         WITH_THR(curcop = &compiling);
989         break;
990     case OP_SCOPE:
991     case OP_LINESEQ:
992         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling) {
993             if (kid->op_sibling)
994                 scalarvoid(kid);
995             else
996                 list(kid);
997         }
998         WITH_THR(curcop = &compiling);
999         break;
1000     case OP_REQUIRE:
1001         /* all requires must return a boolean value */
1002         o->op_flags &= ~OPf_WANT;
1003         return scalar(o);
1004     }
1005     return o;
1006 }
1007
1008 OP *
1009 scalarseq(o)
1010 OP *o;
1011 {
1012     OP *kid;
1013
1014     if (o) {
1015         if (o->op_type == OP_LINESEQ ||
1016              o->op_type == OP_SCOPE ||
1017              o->op_type == OP_LEAVE ||
1018              o->op_type == OP_LEAVETRY)
1019         {
1020             dTHR;
1021             for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling) {
1022                 if (kid->op_sibling) {
1023                     scalarvoid(kid);
1024                 }
1025             }
1026             curcop = &compiling;
1027         }
1028         o->op_flags &= ~OPf_PARENS;
1029         if (hints & HINT_BLOCK_SCOPE)
1030             o->op_flags |= OPf_PARENS;
1031     }
1032     else
1033         o = newOP(OP_STUB, 0);
1034     return o;
1035 }
1036
1037 static OP *
1038 modkids(o, type)
1039 OP *o;
1040 I32 type;
1041 {
1042     OP *kid;
1043     if (o && o->op_flags & OPf_KIDS) {
1044         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
1045             mod(kid, type);
1046     }
1047     return o;
1048 }
1049
1050 static I32 modcount;
1051
1052 OP *
1053 mod(o, type)
1054 OP *o;
1055 I32 type;
1056 {
1057     dTHR;
1058     OP *kid;
1059     SV *sv;
1060
1061     if (!o || error_count)
1062         return o;
1063
1064     switch (o->op_type) {
1065     case OP_UNDEF:
1066         modcount++;
1067         return o;
1068     case OP_CONST:
1069         if (!(o->op_private & (OPpCONST_ARYBASE)))
1070             goto nomod;
1071         if (eval_start && eval_start->op_type == OP_CONST) {
1072             compiling.cop_arybase = (I32)SvIV(((SVOP*)eval_start)->op_sv);
1073             eval_start = 0;
1074         }
1075         else if (!type) {
1076             SAVEI32(compiling.cop_arybase);
1077             compiling.cop_arybase = 0;
1078         }
1079         else if (type == OP_REFGEN)
1080             goto nomod;
1081         else
1082             croak("That use of $[ is unsupported");
1083         break;
1084     case OP_STUB:
1085         if (o->op_flags & OPf_PARENS)
1086             break;
1087         goto nomod;
1088     case OP_ENTERSUB:
1089         if ((type == OP_UNDEF || type == OP_REFGEN) &&
1090             !(o->op_flags & OPf_STACKED)) {
1091             o->op_type = OP_RV2CV;              /* entersub => rv2cv */
1092             o->op_ppaddr = ppaddr[OP_RV2CV];
1093             assert(cUNOPo->op_first->op_type == OP_NULL);
1094             null(((LISTOP*)cUNOPo->op_first)->op_first);/* disable pushmark */
1095             break;
1096         }
1097         /* FALL THROUGH */
1098     default:
1099       nomod:
1100         /* grep, foreach, subcalls, refgen */
1101         if (type == OP_GREPSTART || type == OP_ENTERSUB || type == OP_REFGEN)
1102             break;
1103         yyerror(form("Can't modify %s in %s",
1104                      op_desc[o->op_type],
1105                      type ? op_desc[type] : "local"));
1106         return o;
1107
1108     case OP_PREINC:
1109     case OP_PREDEC:
1110     case OP_POW:
1111     case OP_MULTIPLY:
1112     case OP_DIVIDE:
1113     case OP_MODULO:
1114     case OP_REPEAT:
1115     case OP_ADD:
1116     case OP_SUBTRACT:
1117     case OP_CONCAT:
1118     case OP_LEFT_SHIFT:
1119     case OP_RIGHT_SHIFT:
1120     case OP_BIT_AND:
1121     case OP_BIT_XOR:
1122     case OP_BIT_OR:
1123     case OP_I_MULTIPLY:
1124     case OP_I_DIVIDE:
1125     case OP_I_MODULO:
1126     case OP_I_ADD:
1127     case OP_I_SUBTRACT:
1128         if (!(o->op_flags & OPf_STACKED))
1129             goto nomod;
1130         modcount++;
1131         break;
1132         
1133     case OP_COND_EXPR:
1134         for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
1135             mod(kid, type);
1136         break;
1137
1138     case OP_RV2AV:
1139     case OP_RV2HV:
1140         if (!type && cUNOPo->op_first->op_type != OP_GV)
1141             croak("Can't localize through a reference");
1142         if (type == OP_REFGEN && o->op_flags & OPf_PARENS) {
1143             modcount = 10000;
1144             return o;           /* Treat \(@foo) like ordinary list. */
1145         }
1146         /* FALL THROUGH */
1147     case OP_RV2GV:
1148         if (scalar_mod_type(o, type))
1149             goto nomod;
1150         ref(cUNOPo->op_first, o->op_type);
1151         /* FALL THROUGH */
1152     case OP_AASSIGN:
1153     case OP_ASLICE:
1154     case OP_HSLICE:
1155     case OP_NEXTSTATE:
1156     case OP_DBSTATE:
1157     case OP_REFGEN:
1158     case OP_CHOMP:
1159         modcount = 10000;
1160         break;
1161     case OP_RV2SV:
1162         if (!type && cUNOPo->op_first->op_type != OP_GV)
1163             croak("Can't localize through a reference");
1164         ref(cUNOPo->op_first, o->op_type); 
1165         /* FALL THROUGH */
1166     case OP_GV:
1167     case OP_AV2ARYLEN:
1168     case OP_SASSIGN:
1169     case OP_AELEMFAST:
1170         modcount++;
1171         break;
1172
1173     case OP_PADAV:
1174     case OP_PADHV:
1175         modcount = 10000;
1176         if (type == OP_REFGEN && o->op_flags & OPf_PARENS)
1177             return o;           /* Treat \(@foo) like ordinary list. */
1178         if (scalar_mod_type(o, type))
1179             goto nomod;
1180         /* FALL THROUGH */
1181     case OP_PADSV:
1182     case OP_SPECIFIC:
1183         modcount++;
1184         if (!type)
1185             croak("Can't localize lexical variable %s",
1186                 SvPV(*av_fetch(comppad_name, o->op_targ, 4), na));
1187         break;
1188
1189     case OP_PUSHMARK:
1190         break;
1191         
1192     case OP_KEYS:
1193         if (type != OP_SASSIGN)
1194             goto nomod;
1195         /* FALL THROUGH */
1196     case OP_POS:
1197     case OP_VEC:
1198     case OP_SUBSTR:
1199         pad_free(o->op_targ);
1200         o->op_targ = pad_alloc(o->op_type, SVs_PADMY);
1201         assert(SvTYPE(PAD_SV(o->op_targ)) == SVt_NULL);
1202         if (o->op_flags & OPf_KIDS)
1203             mod(cBINOPo->op_first->op_sibling, type);
1204         break;
1205
1206     case OP_AELEM:
1207     case OP_HELEM:
1208         ref(cBINOPo->op_first, o->op_type);
1209         if (type == OP_ENTERSUB &&
1210              !(o->op_private & (OPpLVAL_INTRO | OPpDEREF)))
1211             o->op_private |= OPpLVAL_DEFER;
1212         modcount++;
1213         break;
1214
1215     case OP_SCOPE:
1216     case OP_LEAVE:
1217     case OP_ENTER:
1218         if (o->op_flags & OPf_KIDS)
1219             mod(cLISTOPo->op_last, type);
1220         break;
1221
1222     case OP_NULL:
1223         if (!(o->op_flags & OPf_KIDS))
1224             break;
1225         if (o->op_targ != OP_LIST) {
1226             mod(cBINOPo->op_first, type);
1227             break;
1228         }
1229         /* FALL THROUGH */
1230     case OP_LIST:
1231         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
1232             mod(kid, type);
1233         break;
1234     }
1235     o->op_flags |= OPf_MOD;
1236
1237     if (type == OP_AASSIGN || type == OP_SASSIGN)
1238         o->op_flags |= OPf_SPECIAL|OPf_REF;
1239     else if (!type) {
1240         o->op_private |= OPpLVAL_INTRO;
1241         o->op_flags &= ~OPf_SPECIAL;
1242     }
1243     else if (type != OP_GREPSTART && type != OP_ENTERSUB)
1244         o->op_flags |= OPf_REF;
1245     return o;
1246 }
1247
1248 static bool
1249 scalar_mod_type(o, type)
1250 OP *o;
1251 I32 type;
1252 {
1253     switch (type) {
1254     case OP_SASSIGN:
1255         if (o->op_type == OP_RV2GV)
1256             return FALSE;
1257         /* FALL THROUGH */
1258     case OP_PREINC:
1259     case OP_PREDEC:
1260     case OP_POSTINC:
1261     case OP_POSTDEC:
1262     case OP_I_PREINC:
1263     case OP_I_PREDEC:
1264     case OP_I_POSTINC:
1265     case OP_I_POSTDEC:
1266     case OP_POW:
1267     case OP_MULTIPLY:
1268     case OP_DIVIDE:
1269     case OP_MODULO:
1270     case OP_REPEAT:
1271     case OP_ADD:
1272     case OP_SUBTRACT:
1273     case OP_I_MULTIPLY:
1274     case OP_I_DIVIDE:
1275     case OP_I_MODULO:
1276     case OP_I_ADD:
1277     case OP_I_SUBTRACT:
1278     case OP_LEFT_SHIFT:
1279     case OP_RIGHT_SHIFT:
1280     case OP_BIT_AND:
1281     case OP_BIT_XOR:
1282     case OP_BIT_OR:
1283     case OP_CONCAT:
1284     case OP_SUBST:
1285     case OP_TRANS:
1286     case OP_ANDASSIGN:  /* may work later */
1287     case OP_ORASSIGN:   /* may work later */
1288         return TRUE;
1289     default:
1290         return FALSE;
1291     }
1292 }
1293
1294 OP *
1295 refkids(o, type)
1296 OP *o;
1297 I32 type;
1298 {
1299     OP *kid;
1300     if (o && o->op_flags & OPf_KIDS) {
1301         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
1302             ref(kid, type);
1303     }
1304     return o;
1305 }
1306
1307 OP *
1308 ref(o, type)
1309 OP *o;
1310 I32 type;
1311 {
1312     OP *kid;
1313
1314     if (!o || error_count)
1315         return o;
1316
1317     switch (o->op_type) {
1318     case OP_ENTERSUB:
1319         if ((type == OP_DEFINED || type == OP_LOCK) &&
1320             !(o->op_flags & OPf_STACKED)) {
1321             o->op_type = OP_RV2CV;             /* entersub => rv2cv */
1322             o->op_ppaddr = ppaddr[OP_RV2CV];
1323             assert(cUNOPo->op_first->op_type == OP_NULL);
1324             null(((LISTOP*)cUNOPo->op_first)->op_first);        /* disable pushmark */
1325             o->op_flags |= OPf_SPECIAL;
1326         }
1327         break;
1328       
1329     case OP_COND_EXPR:
1330         for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
1331             ref(kid, type);
1332         break;
1333     case OP_RV2SV:
1334         ref(cUNOPo->op_first, o->op_type);
1335         /* FALL THROUGH */
1336     case OP_PADSV:
1337         if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV) {
1338             o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV
1339                               : type == OP_RV2HV ? OPpDEREF_HV
1340                               : OPpDEREF_SV);
1341             o->op_flags |= OPf_MOD;
1342         }
1343         break;
1344       
1345     case OP_SPECIFIC:
1346         o->op_flags |= OPf_MOD;         /* XXX ??? */
1347         break;
1348
1349     case OP_RV2AV:
1350     case OP_RV2HV:
1351         o->op_flags |= OPf_REF; 
1352         /* FALL THROUGH */
1353     case OP_RV2GV:
1354         ref(cUNOPo->op_first, o->op_type);
1355         break;
1356
1357     case OP_PADAV:
1358     case OP_PADHV:
1359         o->op_flags |= OPf_REF; 
1360         break;
1361       
1362     case OP_SCALAR:
1363     case OP_NULL:
1364         if (!(o->op_flags & OPf_KIDS))
1365             break;
1366         ref(cBINOPo->op_first, type);
1367         break;
1368     case OP_AELEM:
1369     case OP_HELEM:
1370         ref(cBINOPo->op_first, o->op_type);
1371         if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV) {
1372             o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV
1373                               : type == OP_RV2HV ? OPpDEREF_HV
1374                               : OPpDEREF_SV);
1375             o->op_flags |= OPf_MOD;
1376         }
1377         break;
1378
1379     case OP_SCOPE:
1380     case OP_LEAVE:
1381     case OP_ENTER:
1382     case OP_LIST:
1383         if (!(o->op_flags & OPf_KIDS))
1384             break;
1385         ref(cLISTOPo->op_last, type);
1386         break;
1387     default:
1388         break;
1389     }
1390     return scalar(o);
1391
1392 }
1393
1394 OP *
1395 my(o)
1396 OP *o;
1397 {
1398     OP *kid;
1399     I32 type;
1400
1401     if (!o || error_count)
1402         return o;
1403
1404     type = o->op_type;
1405     if (type == OP_LIST) {
1406         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
1407             my(kid);
1408     }
1409     else if (type != OP_PADSV &&
1410              type != OP_PADAV &&
1411              type != OP_PADHV &&
1412              type != OP_PUSHMARK)
1413     {
1414         yyerror(form("Can't declare %s in my", op_desc[o->op_type]));
1415         return o;
1416     }
1417     o->op_flags |= OPf_MOD;
1418     o->op_private |= OPpLVAL_INTRO;
1419     return o;
1420 }
1421
1422 OP *
1423 sawparens(o)
1424 OP *o;
1425 {
1426     if (o)
1427         o->op_flags |= OPf_PARENS;
1428     return o;
1429 }
1430
1431 OP *
1432 bind_match(type, left, right)
1433 I32 type;
1434 OP *left;
1435 OP *right;
1436 {
1437     OP *o;
1438
1439     if (dowarn &&
1440         (left->op_type == OP_RV2AV ||
1441          left->op_type == OP_RV2HV ||
1442          left->op_type == OP_PADAV ||
1443          left->op_type == OP_PADHV)) {
1444         char *desc = op_desc[(right->op_type == OP_SUBST ||
1445                               right->op_type == OP_TRANS)
1446                              ? right->op_type : OP_MATCH];
1447         char *sample = ((left->op_type == OP_RV2AV ||
1448                          left->op_type == OP_PADAV)
1449                         ? "@array" : "%hash");
1450         warn("Applying %s to %s will act on scalar(%s)", desc, sample, sample);
1451     }
1452
1453     if (right->op_type == OP_MATCH ||
1454         right->op_type == OP_SUBST ||
1455         right->op_type == OP_TRANS) {
1456         right->op_flags |= OPf_STACKED;
1457         if (right->op_type != OP_MATCH)
1458             left = mod(left, right->op_type);
1459         if (right->op_type == OP_TRANS)
1460             o = newBINOP(OP_NULL, OPf_STACKED, scalar(left), right);
1461         else
1462             o = prepend_elem(right->op_type, scalar(left), right);
1463         if (type == OP_NOT)
1464             return newUNOP(OP_NOT, 0, scalar(o));
1465         return o;
1466     }
1467     else
1468         return bind_match(type, left,
1469                 pmruntime(newPMOP(OP_MATCH, 0), right, Nullop));
1470 }
1471
1472 OP *
1473 invert(o)
1474 OP *o;
1475 {
1476     if (!o)
1477         return o;
1478     /* XXX need to optimize away NOT NOT here?  Or do we let optimizer do it? */
1479     return newUNOP(OP_NOT, OPf_SPECIAL, scalar(o));
1480 }
1481
1482 OP *
1483 scope(o)
1484 OP *o;
1485 {
1486     if (o) {
1487         if (o->op_flags & OPf_PARENS || PERLDB_NOOPT || tainting) {
1488             o = prepend_elem(OP_LINESEQ, newOP(OP_ENTER, 0), o);
1489             o->op_type = OP_LEAVE;
1490             o->op_ppaddr = ppaddr[OP_LEAVE];
1491         }
1492         else {
1493             if (o->op_type == OP_LINESEQ) {
1494                 OP *kid;
1495                 o->op_type = OP_SCOPE;
1496                 o->op_ppaddr = ppaddr[OP_SCOPE];
1497                 kid = ((LISTOP*)o)->op_first;
1498                 if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE){
1499                     SvREFCNT_dec(((COP*)kid)->cop_filegv);
1500                     null(kid);
1501                 }
1502             }
1503             else
1504                 o = newLISTOP(OP_SCOPE, 0, o, Nullop);
1505         }
1506     }
1507     return o;
1508 }
1509
1510 int
1511 block_start(full)
1512 int full;
1513 {
1514     dTHR;
1515     int retval = savestack_ix;
1516     SAVEI32(comppad_name_floor);
1517     if (full) {
1518         if ((comppad_name_fill = AvFILL(comppad_name)) > 0)
1519             comppad_name_floor = comppad_name_fill;
1520         else
1521             comppad_name_floor = 0;
1522     }
1523     SAVEI32(min_intro_pending);
1524     SAVEI32(max_intro_pending);
1525     min_intro_pending = 0;
1526     SAVEI32(comppad_name_fill);
1527     SAVEI32(padix_floor);
1528     padix_floor = padix;
1529     pad_reset_pending = FALSE;
1530     SAVEI32(hints);
1531     hints &= ~HINT_BLOCK_SCOPE;
1532     return retval;
1533 }
1534
1535 OP*
1536 block_end(floor, seq)
1537 I32 floor;
1538 OP* seq;
1539 {
1540     dTHR;
1541     int needblockscope = hints & HINT_BLOCK_SCOPE;
1542     OP* retval = scalarseq(seq);
1543     LEAVE_SCOPE(floor);
1544     pad_reset_pending = FALSE;
1545     if (needblockscope)
1546         hints |= HINT_BLOCK_SCOPE; /* propagate out */
1547     pad_leavemy(comppad_name_fill);
1548     cop_seqmax++;
1549     return retval;
1550 }
1551
1552 void
1553 newPROG(o)
1554 OP *o;
1555 {
1556     dTHR;
1557     if (in_eval) {
1558         eval_root = newUNOP(OP_LEAVEEVAL, ((in_eval & 4) ? OPf_SPECIAL : 0), o);
1559         eval_start = linklist(eval_root);
1560         eval_root->op_next = 0;
1561         peep(eval_start);
1562     }
1563     else {
1564         if (!o)
1565             return;
1566         main_root = scope(sawparens(scalarvoid(o)));
1567         curcop = &compiling;
1568         main_start = LINKLIST(main_root);
1569         main_root->op_next = 0;
1570         peep(main_start);
1571         compcv = 0;
1572
1573         /* Register with debugger */
1574         if (PERLDB_INTER) {
1575             CV *cv = perl_get_cv("DB::postponed", FALSE);
1576             if (cv) {
1577                 dSP;
1578                 PUSHMARK(sp);
1579                 XPUSHs((SV*)compiling.cop_filegv);
1580                 PUTBACK;
1581                 perl_call_sv((SV*)cv, G_DISCARD);
1582             }
1583         }
1584     }
1585 }
1586
1587 OP *
1588 localize(o, lex)
1589 OP *o;
1590 I32 lex;
1591 {
1592     if (o->op_flags & OPf_PARENS)
1593         list(o);
1594     else {
1595         scalar(o);
1596         if (dowarn && bufptr > oldbufptr && bufptr[-1] == ',') {
1597             char *s;
1598             for (s = bufptr; *s && (isALNUM(*s) || strchr("@$%, ",*s)); s++) ;
1599             if (*s == ';' || *s == '=')
1600                 warn("Parens missing around \"%s\" list", lex ? "my" : "local");
1601         }
1602     }
1603     in_my = FALSE;
1604     in_my_stash = Nullhv;
1605     if (lex)
1606         return my(o);
1607     else
1608         return mod(o, OP_NULL);         /* a bit kludgey */
1609 }
1610
1611 OP *
1612 jmaybe(o)
1613 OP *o;
1614 {
1615     if (o->op_type == OP_LIST) {
1616         o = convert(OP_JOIN, 0,
1617                 prepend_elem(OP_LIST,
1618                     newSVREF(newGVOP(OP_GV, 0, gv_fetchpv(";", TRUE, SVt_PV))),
1619                     o));
1620     }
1621     return o;
1622 }
1623
1624 OP *
1625 fold_constants(o)
1626 register OP *o;
1627 {
1628     dTHR;
1629     register OP *curop;
1630     I32 type = o->op_type;
1631     SV *sv;
1632
1633     if (opargs[type] & OA_RETSCALAR)
1634         scalar(o);
1635     if (opargs[type] & OA_TARGET)
1636         o->op_targ = pad_alloc(type, SVs_PADTMP);
1637
1638     if ((opargs[type] & OA_OTHERINT) && (hints & HINT_INTEGER))
1639         o->op_ppaddr = ppaddr[type = ++(o->op_type)];
1640
1641     if (!(opargs[type] & OA_FOLDCONST))
1642         goto nope;
1643
1644     switch (type) {
1645     case OP_SPRINTF:
1646     case OP_UCFIRST:
1647     case OP_LCFIRST:
1648     case OP_UC:
1649     case OP_LC:
1650         if (o->op_private & OPpLOCALE)
1651             goto nope;
1652     }
1653
1654     if (error_count)
1655         goto nope;              /* Don't try to run w/ errors */
1656
1657     for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
1658         if (curop->op_type != OP_CONST &&
1659                 curop->op_type != OP_LIST &&
1660                 curop->op_type != OP_SCALAR &&
1661                 curop->op_type != OP_NULL &&
1662                 curop->op_type != OP_PUSHMARK) {
1663             goto nope;
1664         }
1665     }
1666
1667     curop = LINKLIST(o);
1668     o->op_next = 0;
1669     op = curop;
1670     runops();
1671     sv = *(stack_sp--);
1672     if (o->op_targ && sv == PAD_SV(o->op_targ)) /* grab pad temp? */
1673         pad_swipe(o->op_targ);
1674     else if (SvTEMP(sv)) {                      /* grab mortal temp? */
1675         (void)SvREFCNT_inc(sv);
1676         SvTEMP_off(sv);
1677     }
1678     op_free(o);
1679     if (type == OP_RV2GV)
1680         return newGVOP(OP_GV, 0, (GV*)sv);
1681     else {
1682         if ((SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK)) == SVf_NOK) {
1683             IV iv = SvIV(sv);
1684             if ((double)iv == SvNV(sv)) {       /* can we smush double to int */
1685                 SvREFCNT_dec(sv);
1686                 sv = newSViv(iv);
1687             }
1688             else
1689                 SvIOK_off(sv);                  /* undo SvIV() damage */
1690         }
1691         return newSVOP(OP_CONST, 0, sv);
1692     }
1693     
1694   nope:
1695     if (!(opargs[type] & OA_OTHERINT))
1696         return o;
1697
1698     if (!(hints & HINT_INTEGER)) {
1699         if (type == OP_DIVIDE || !(o->op_flags & OPf_KIDS))
1700             return o;
1701
1702         for (curop = ((UNOP*)o)->op_first; curop; curop = curop->op_sibling) {
1703             if (curop->op_type == OP_CONST) {
1704                 if (SvIOK(((SVOP*)curop)->op_sv))
1705                     continue;
1706                 return o;
1707             }
1708             if (opargs[curop->op_type] & OA_RETINTEGER)
1709                 continue;
1710             return o;
1711         }
1712         o->op_ppaddr = ppaddr[++(o->op_type)];
1713     }
1714
1715     return o;
1716 }
1717
1718 OP *
1719 gen_constant_list(o)
1720 register OP *o;
1721 {
1722     dTHR;
1723     register OP *curop;
1724     I32 oldtmps_floor = tmps_floor;
1725
1726     list(o);
1727     if (error_count)
1728         return o;               /* Don't attempt to run with errors */
1729
1730     op = curop = LINKLIST(o);
1731     o->op_next = 0;
1732     pp_pushmark(ARGS);
1733     runops();
1734     op = curop;
1735     pp_anonlist(ARGS);
1736     tmps_floor = oldtmps_floor;
1737
1738     o->op_type = OP_RV2AV;
1739     o->op_ppaddr = ppaddr[OP_RV2AV];
1740     curop = ((UNOP*)o)->op_first;
1741     ((UNOP*)o)->op_first = newSVOP(OP_CONST, 0, SvREFCNT_inc(*stack_sp--));
1742     op_free(curop);
1743     linklist(o);
1744     return list(o);
1745 }
1746
1747 OP *
1748 convert(type, flags, o)
1749 I32 type;
1750 I32 flags;
1751 OP* o;
1752 {
1753     OP *kid;
1754     OP *last = 0;
1755
1756     if (!o || o->op_type != OP_LIST)
1757         o = newLISTOP(OP_LIST, 0, o, Nullop);
1758     else
1759         o->op_flags &= ~OPf_WANT;
1760
1761     if (!(opargs[type] & OA_MARK))
1762         null(cLISTOPo->op_first);
1763
1764     o->op_type = type;
1765     o->op_ppaddr = ppaddr[type];
1766     o->op_flags |= flags;
1767
1768     o = CHECKOP(type, o);
1769     if (o->op_type != type)
1770         return o;
1771
1772     if (cLISTOPo->op_children < 7) {
1773         /* XXX do we really need to do this if we're done appending?? */
1774         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
1775             last = kid;
1776         cLISTOPo->op_last = last;       /* in case check substituted last arg */
1777     }
1778
1779     return fold_constants(o);
1780 }
1781
1782 /* List constructors */
1783
1784 OP *
1785 append_elem(type, first, last)
1786 I32 type;
1787 OP* first;
1788 OP* last;
1789 {
1790     if (!first)
1791         return last;
1792
1793     if (!last)
1794         return first;
1795
1796     if (first->op_type != type || type==OP_LIST && first->op_flags & OPf_PARENS)
1797             return newLISTOP(type, 0, first, last);
1798
1799     if (first->op_flags & OPf_KIDS)
1800         ((LISTOP*)first)->op_last->op_sibling = last;
1801     else {
1802         first->op_flags |= OPf_KIDS;
1803         ((LISTOP*)first)->op_first = last;
1804     }
1805     ((LISTOP*)first)->op_last = last;
1806     ((LISTOP*)first)->op_children++;
1807     return first;
1808 }
1809
1810 OP *
1811 append_list(type, first, last)
1812 I32 type;
1813 LISTOP* first;
1814 LISTOP* last;
1815 {
1816     if (!first)
1817         return (OP*)last;
1818
1819     if (!last)
1820         return (OP*)first;
1821
1822     if (first->op_type != type)
1823         return prepend_elem(type, (OP*)first, (OP*)last);
1824
1825     if (last->op_type != type)
1826         return append_elem(type, (OP*)first, (OP*)last);
1827
1828     first->op_last->op_sibling = last->op_first;
1829     first->op_last = last->op_last;
1830     first->op_children += last->op_children;
1831     if (first->op_children)
1832         last->op_flags |= OPf_KIDS;
1833
1834     Safefree(last);
1835     return (OP*)first;
1836 }
1837
1838 OP *
1839 prepend_elem(type, first, last)
1840 I32 type;
1841 OP* first;
1842 OP* last;
1843 {
1844     if (!first)
1845         return last;
1846
1847     if (!last)
1848         return first;
1849
1850     if (last->op_type == type) {
1851         if (type == OP_LIST) {  /* already a PUSHMARK there */
1852             first->op_sibling = ((LISTOP*)last)->op_first->op_sibling;
1853             ((LISTOP*)last)->op_first->op_sibling = first;
1854         }
1855         else {
1856             if (!(last->op_flags & OPf_KIDS)) {
1857                 ((LISTOP*)last)->op_last = first;
1858                 last->op_flags |= OPf_KIDS;
1859             }
1860             first->op_sibling = ((LISTOP*)last)->op_first;
1861             ((LISTOP*)last)->op_first = first;
1862         }
1863         ((LISTOP*)last)->op_children++;
1864         return last;
1865     }
1866
1867     return newLISTOP(type, 0, first, last);
1868 }
1869
1870 /* Constructors */
1871
1872 OP *
1873 newNULLLIST()
1874 {
1875     return newOP(OP_STUB, 0);
1876 }
1877
1878 OP *
1879 force_list(o)
1880 OP *o;
1881 {
1882     if (!o || o->op_type != OP_LIST)
1883         o = newLISTOP(OP_LIST, 0, o, Nullop);
1884     null(o);
1885     return o;
1886 }
1887
1888 OP *
1889 newLISTOP(type, flags, first, last)
1890 I32 type;
1891 I32 flags;
1892 OP* first;
1893 OP* last;
1894 {
1895     LISTOP *listop;
1896
1897     Newz(1101, listop, 1, LISTOP);
1898
1899     listop->op_type = type;
1900     listop->op_ppaddr = ppaddr[type];
1901     listop->op_children = (first != 0) + (last != 0);
1902     listop->op_flags = flags;
1903
1904     if (!last && first)
1905         last = first;
1906     else if (!first && last)
1907         first = last;
1908     else if (first)
1909         first->op_sibling = last;
1910     listop->op_first = first;
1911     listop->op_last = last;
1912     if (type == OP_LIST) {
1913         OP* pushop;
1914         pushop = newOP(OP_PUSHMARK, 0);
1915         pushop->op_sibling = first;
1916         listop->op_first = pushop;
1917         listop->op_flags |= OPf_KIDS;
1918         if (!last)
1919             listop->op_last = pushop;
1920     }
1921     else if (listop->op_children)
1922         listop->op_flags |= OPf_KIDS;
1923
1924     return (OP*)listop;
1925 }
1926
1927 OP *
1928 newOP(type, flags)
1929 I32 type;
1930 I32 flags;
1931 {
1932     OP *o;
1933     Newz(1101, o, 1, OP);
1934     o->op_type = type;
1935     o->op_ppaddr = ppaddr[type];
1936     o->op_flags = flags;
1937
1938     o->op_next = o;
1939     o->op_private = 0 + (flags >> 8);
1940     if (opargs[type] & OA_RETSCALAR)
1941         scalar(o);
1942     if (opargs[type] & OA_TARGET)
1943         o->op_targ = pad_alloc(type, SVs_PADTMP);
1944     return CHECKOP(type, o);
1945 }
1946
1947 OP *
1948 newUNOP(type, flags, first)
1949 I32 type;
1950 I32 flags;
1951 OP* first;
1952 {
1953     UNOP *unop;
1954
1955     if (!first)
1956         first = newOP(OP_STUB, 0); 
1957     if (opargs[type] & OA_MARK)
1958         first = force_list(first);
1959
1960     Newz(1101, unop, 1, UNOP);
1961     unop->op_type = type;
1962     unop->op_ppaddr = ppaddr[type];
1963     unop->op_first = first;
1964     unop->op_flags = flags | OPf_KIDS;
1965     unop->op_private = 1 | (flags >> 8);
1966
1967     unop = (UNOP*) CHECKOP(type, unop);
1968     if (unop->op_next)
1969         return (OP*)unop;
1970
1971     return fold_constants((OP *) unop);
1972 }
1973
1974 OP *
1975 newBINOP(type, flags, first, last)
1976 I32 type;
1977 I32 flags;
1978 OP* first;
1979 OP* last;
1980 {
1981     BINOP *binop;
1982     Newz(1101, binop, 1, BINOP);
1983
1984     if (!first)
1985         first = newOP(OP_NULL, 0);
1986
1987     binop->op_type = type;
1988     binop->op_ppaddr = ppaddr[type];
1989     binop->op_first = first;
1990     binop->op_flags = flags | OPf_KIDS;
1991     if (!last) {
1992         last = first;
1993         binop->op_private = 1 | (flags >> 8);
1994     }
1995     else {
1996         binop->op_private = 2 | (flags >> 8);
1997         first->op_sibling = last;
1998     }
1999
2000     binop = (BINOP*)CHECKOP(type, binop);
2001     if (binop->op_next)
2002         return (OP*)binop;
2003
2004     binop->op_last = last = binop->op_first->op_sibling;
2005
2006     return fold_constants((OP *)binop);
2007 }
2008
2009 OP *
2010 pmtrans(o, expr, repl)
2011 OP *o;
2012 OP *expr;
2013 OP *repl;
2014 {
2015     SV *tstr = ((SVOP*)expr)->op_sv;
2016     SV *rstr = ((SVOP*)repl)->op_sv;
2017     STRLEN tlen;
2018     STRLEN rlen;
2019     register U8 *t = (U8*)SvPV(tstr, tlen);
2020     register U8 *r = (U8*)SvPV(rstr, rlen);
2021     register I32 i;
2022     register I32 j;
2023     I32 delete;
2024     I32 complement;
2025     register short *tbl;
2026
2027     tbl = (short*)cPVOPo->op_pv;
2028     complement  = o->op_private & OPpTRANS_COMPLEMENT;
2029     delete      = o->op_private & OPpTRANS_DELETE;
2030     /* squash   = o->op_private & OPpTRANS_SQUASH; */
2031
2032     if (complement) {
2033         Zero(tbl, 256, short);
2034         for (i = 0; i < tlen; i++)
2035             tbl[t[i]] = -1;
2036         for (i = 0, j = 0; i < 256; i++) {
2037             if (!tbl[i]) {
2038                 if (j >= rlen) {
2039                     if (delete)
2040                         tbl[i] = -2;
2041                     else if (rlen)
2042                         tbl[i] = r[j-1];
2043                     else
2044                         tbl[i] = i;
2045                 }
2046                 else
2047                     tbl[i] = r[j++];
2048             }
2049         }
2050     }
2051     else {
2052         if (!rlen && !delete) {
2053             r = t; rlen = tlen;
2054         }
2055         for (i = 0; i < 256; i++)
2056             tbl[i] = -1;
2057         for (i = 0, j = 0; i < tlen; i++,j++) {
2058             if (j >= rlen) {
2059                 if (delete) {
2060                     if (tbl[t[i]] == -1)
2061                         tbl[t[i]] = -2;
2062                     continue;
2063                 }
2064                 --j;
2065             }
2066             if (tbl[t[i]] == -1)
2067                 tbl[t[i]] = r[j];
2068         }
2069     }
2070     op_free(expr);
2071     op_free(repl);
2072
2073     return o;
2074 }
2075
2076 OP *
2077 newPMOP(type, flags)
2078 I32 type;
2079 I32 flags;
2080 {
2081     dTHR;
2082     PMOP *pmop;
2083
2084     Newz(1101, pmop, 1, PMOP);
2085     pmop->op_type = type;
2086     pmop->op_ppaddr = ppaddr[type];
2087     pmop->op_flags = flags;
2088     pmop->op_private = 0 | (flags >> 8);
2089
2090     if (hints & HINT_LOCALE)
2091         pmop->op_pmpermflags = (pmop->op_pmflags |= PMf_LOCALE);
2092
2093     /* link into pm list */
2094     if (type != OP_TRANS && curstash) {
2095         pmop->op_pmnext = HvPMROOT(curstash);
2096         HvPMROOT(curstash) = pmop;
2097     }
2098
2099     return (OP*)pmop;
2100 }
2101
2102 OP *
2103 pmruntime(o, expr, repl)
2104 OP *o;
2105 OP *expr;
2106 OP *repl;
2107 {
2108     PMOP *pm;
2109     LOGOP *rcop;
2110
2111     if (o->op_type == OP_TRANS)
2112         return pmtrans(o, expr, repl);
2113
2114     hints |= HINT_BLOCK_SCOPE;
2115     pm = (PMOP*)o;
2116
2117     if (expr->op_type == OP_CONST) {
2118         STRLEN plen;
2119         SV *pat = ((SVOP*)expr)->op_sv;
2120         char *p = SvPV(pat, plen);
2121         if ((o->op_flags & OPf_SPECIAL) && strEQ(p, " ")) {
2122             sv_setpvn(pat, "\\s+", 3);
2123             p = SvPV(pat, plen);
2124             pm->op_pmflags |= PMf_SKIPWHITE;
2125         }
2126         pm->op_pmregexp = pregcomp(p, p + plen, pm);
2127         if (strEQ("\\s+", pm->op_pmregexp->precomp)) 
2128             pm->op_pmflags |= PMf_WHITE;
2129         hoistmust(pm);
2130         op_free(expr);
2131     }
2132     else {
2133         if (pm->op_pmflags & PMf_KEEP)
2134             expr = newUNOP(OP_REGCMAYBE,0,expr);
2135
2136         Newz(1101, rcop, 1, LOGOP);
2137         rcop->op_type = OP_REGCOMP;
2138         rcop->op_ppaddr = ppaddr[OP_REGCOMP];
2139         rcop->op_first = scalar(expr);
2140         rcop->op_flags |= OPf_KIDS;
2141         rcop->op_private = 1;
2142         rcop->op_other = o;
2143
2144         /* establish postfix order */
2145         if (pm->op_pmflags & PMf_KEEP) {
2146             LINKLIST(expr);
2147             rcop->op_next = expr;
2148             ((UNOP*)expr)->op_first->op_next = (OP*)rcop;
2149         }
2150         else {
2151             rcop->op_next = LINKLIST(expr);
2152             expr->op_next = (OP*)rcop;
2153         }
2154
2155         prepend_elem(o->op_type, scalar((OP*)rcop), o);
2156     }
2157
2158     if (repl) {
2159         OP *curop;
2160         if (pm->op_pmflags & PMf_EVAL)
2161             curop = 0;
2162         else if (repl->op_type == OP_CONST)
2163             curop = repl;
2164         else {
2165             OP *lastop = 0;
2166             for (curop = LINKLIST(repl); curop!=repl; curop = LINKLIST(curop)) {
2167                 if (opargs[curop->op_type] & OA_DANGEROUS) {
2168                     if (curop->op_type == OP_GV) {
2169                         GV *gv = ((GVOP*)curop)->op_gv;
2170                         if (strchr("&`'123456789+", *GvENAME(gv)))
2171                             break;
2172                     }
2173                     else if (curop->op_type == OP_RV2CV)
2174                         break;
2175                     else if (curop->op_type == OP_RV2SV ||
2176                              curop->op_type == OP_RV2AV ||
2177                              curop->op_type == OP_RV2HV ||
2178                              curop->op_type == OP_RV2GV) {
2179                         if (lastop && lastop->op_type != OP_GV) /*funny deref?*/
2180                             break;
2181                     }
2182                     else if (curop->op_type == OP_PADSV ||
2183                              curop->op_type == OP_PADAV ||
2184                              curop->op_type == OP_PADHV ||
2185                              curop->op_type == OP_PADANY ||
2186                              curop->op_type == OP_SPECIFIC) {
2187                              /* is okay */
2188                     }
2189                     else
2190                         break;
2191                 }
2192                 lastop = curop;
2193             }
2194         }
2195         if (curop == repl) {
2196             pm->op_pmflags |= PMf_CONST;        /* const for long enough */
2197             pm->op_pmpermflags |= PMf_CONST;    /* const for long enough */
2198             prepend_elem(o->op_type, scalar(repl), o);
2199         }
2200         else {
2201             Newz(1101, rcop, 1, LOGOP);
2202             rcop->op_type = OP_SUBSTCONT;
2203             rcop->op_ppaddr = ppaddr[OP_SUBSTCONT];
2204             rcop->op_first = scalar(repl);
2205             rcop->op_flags |= OPf_KIDS;
2206             rcop->op_private = 1;
2207             rcop->op_other = o;
2208
2209             /* establish postfix order */
2210             rcop->op_next = LINKLIST(repl);
2211             repl->op_next = (OP*)rcop;
2212
2213             pm->op_pmreplroot = scalar((OP*)rcop);
2214             pm->op_pmreplstart = LINKLIST(rcop);
2215             rcop->op_next = 0;
2216         }
2217     }
2218
2219     return (OP*)pm;
2220 }
2221
2222 OP *
2223 newSVOP(type, flags, sv)
2224 I32 type;
2225 I32 flags;
2226 SV *sv;
2227 {
2228     SVOP *svop;
2229     Newz(1101, svop, 1, SVOP);
2230     svop->op_type = type;
2231     svop->op_ppaddr = ppaddr[type];
2232     svop->op_sv = sv;
2233     svop->op_next = (OP*)svop;
2234     svop->op_flags = flags;
2235     if (opargs[type] & OA_RETSCALAR)
2236         scalar((OP*)svop);
2237     if (opargs[type] & OA_TARGET)
2238         svop->op_targ = pad_alloc(type, SVs_PADTMP);
2239     return CHECKOP(type, svop);
2240 }
2241
2242 OP *
2243 newGVOP(type, flags, gv)
2244 I32 type;
2245 I32 flags;
2246 GV *gv;
2247 {
2248     dTHR;
2249     GVOP *gvop;
2250     Newz(1101, gvop, 1, GVOP);
2251     gvop->op_type = type;
2252     gvop->op_ppaddr = ppaddr[type];
2253     gvop->op_gv = (GV*)SvREFCNT_inc(gv);
2254     gvop->op_next = (OP*)gvop;
2255     gvop->op_flags = flags;
2256     if (opargs[type] & OA_RETSCALAR)
2257         scalar((OP*)gvop);
2258     if (opargs[type] & OA_TARGET)
2259         gvop->op_targ = pad_alloc(type, SVs_PADTMP);
2260     return CHECKOP(type, gvop);
2261 }
2262
2263 OP *
2264 newPVOP(type, flags, pv)
2265 I32 type;
2266 I32 flags;
2267 char *pv;
2268 {
2269     PVOP *pvop;
2270     Newz(1101, pvop, 1, PVOP);
2271     pvop->op_type = type;
2272     pvop->op_ppaddr = ppaddr[type];
2273     pvop->op_pv = pv;
2274     pvop->op_next = (OP*)pvop;
2275     pvop->op_flags = flags;
2276     if (opargs[type] & OA_RETSCALAR)
2277         scalar((OP*)pvop);
2278     if (opargs[type] & OA_TARGET)
2279         pvop->op_targ = pad_alloc(type, SVs_PADTMP);
2280     return CHECKOP(type, pvop);
2281 }
2282
2283 void
2284 package(o)
2285 OP *o;
2286 {
2287     dTHR;
2288     SV *sv;
2289
2290     save_hptr(&curstash);
2291     save_item(curstname);
2292     if (o) {
2293         STRLEN len;
2294         char *name;
2295         sv = cSVOPo->op_sv;
2296         name = SvPV(sv, len);
2297         curstash = gv_stashpvn(name,len,TRUE);
2298         sv_setpvn(curstname, name, len);
2299         op_free(o);
2300     }
2301     else {
2302         sv_setpv(curstname,"<none>");
2303         curstash = Nullhv;
2304     }
2305     copline = NOLINE;
2306     expect = XSTATE;
2307 }
2308
2309 void
2310 utilize(aver, floor, version, id, arg)
2311 int aver;
2312 I32 floor;
2313 OP *version;
2314 OP *id;
2315 OP *arg;
2316 {
2317     OP *pack;
2318     OP *meth;
2319     OP *rqop;
2320     OP *imop;
2321     OP *veop;
2322
2323     if (id->op_type != OP_CONST)
2324         croak("Module name must be constant");
2325
2326     veop = Nullop;
2327
2328     if(version != Nullop) {
2329         SV *vesv = ((SVOP*)version)->op_sv;
2330
2331         if (arg == Nullop && !SvNIOK(vesv)) {
2332             arg = version;
2333         }
2334         else {
2335             OP *pack;
2336             OP *meth;
2337
2338             if (version->op_type != OP_CONST || !SvNIOK(vesv))
2339                 croak("Version number must be constant number");
2340
2341             /* Make copy of id so we don't free it twice */
2342             pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)id)->op_sv));
2343
2344             /* Fake up a method call to VERSION */
2345             meth = newSVOP(OP_CONST, 0, newSVpv("VERSION", 7));
2346             veop = convert(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL,
2347                             append_elem(OP_LIST,
2348                             prepend_elem(OP_LIST, pack, list(version)),
2349                             newUNOP(OP_METHOD, 0, meth)));
2350         }
2351     }
2352      
2353     /* Fake up an import/unimport */
2354     if (arg && arg->op_type == OP_STUB)
2355         imop = arg;             /* no import on explicit () */
2356     else if(SvNIOK(((SVOP*)id)->op_sv)) {
2357         imop = Nullop;          /* use 5.0; */
2358     }
2359     else {
2360         /* Make copy of id so we don't free it twice */
2361         pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)id)->op_sv));
2362         meth = newSVOP(OP_CONST, 0,
2363             aver
2364                 ? newSVpv("import", 6)
2365                 : newSVpv("unimport", 8)
2366             );
2367         imop = convert(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL,
2368                     append_elem(OP_LIST,
2369                         prepend_elem(OP_LIST, pack, list(arg)),
2370                         newUNOP(OP_METHOD, 0, meth)));
2371     }
2372
2373     /* Fake up a require */
2374     rqop = newUNOP(OP_REQUIRE, 0, id);
2375
2376     /* Fake up the BEGIN {}, which does its thing immediately. */
2377     newSUB(floor,
2378         newSVOP(OP_CONST, 0, newSVpv("BEGIN", 5)),
2379         Nullop,
2380         append_elem(OP_LINESEQ,
2381             append_elem(OP_LINESEQ,
2382                 newSTATEOP(0, Nullch, rqop),
2383                 newSTATEOP(0, Nullch, veop)),
2384             newSTATEOP(0, Nullch, imop) ));
2385
2386     copline = NOLINE;
2387     expect = XSTATE;
2388 }
2389
2390 OP *
2391 newSLICEOP(flags, subscript, listval)
2392 I32 flags;
2393 OP *subscript;
2394 OP *listval;
2395 {
2396     return newBINOP(OP_LSLICE, flags,
2397             list(force_list(subscript)),
2398             list(force_list(listval)) );
2399 }
2400
2401 static I32
2402 list_assignment(o)
2403 register OP *o;
2404 {
2405     if (!o)
2406         return TRUE;
2407
2408     if (o->op_type == OP_NULL && o->op_flags & OPf_KIDS)
2409         o = cUNOPo->op_first;
2410
2411     if (o->op_type == OP_COND_EXPR) {
2412         I32 t = list_assignment(cCONDOPo->op_first->op_sibling);
2413         I32 f = list_assignment(cCONDOPo->op_first->op_sibling->op_sibling);
2414
2415         if (t && f)
2416             return TRUE;
2417         if (t || f)
2418             yyerror("Assignment to both a list and a scalar");
2419         return FALSE;
2420     }
2421
2422     if (o->op_type == OP_LIST || o->op_flags & OPf_PARENS ||
2423         o->op_type == OP_RV2AV || o->op_type == OP_RV2HV ||
2424         o->op_type == OP_ASLICE || o->op_type == OP_HSLICE)
2425         return TRUE;
2426
2427     if (o->op_type == OP_PADAV || o->op_type == OP_PADHV)
2428         return TRUE;
2429
2430     if (o->op_type == OP_RV2SV)
2431         return FALSE;
2432
2433     return FALSE;
2434 }
2435
2436 OP *
2437 newASSIGNOP(flags, left, optype, right)
2438 I32 flags;
2439 OP *left;
2440 I32 optype;
2441 OP *right;
2442 {
2443     OP *o;
2444
2445     if (optype) {
2446         if (optype == OP_ANDASSIGN || optype == OP_ORASSIGN) {
2447             return newLOGOP(optype, 0,
2448                 mod(scalar(left), optype),
2449                 newUNOP(OP_SASSIGN, 0, scalar(right)));
2450         }
2451         else {
2452             return newBINOP(optype, OPf_STACKED,
2453                 mod(scalar(left), optype), scalar(right));
2454         }
2455     }
2456
2457     if (list_assignment(left)) {
2458         modcount = 0;
2459         eval_start = right;     /* Grandfathering $[ assignment here.  Bletch.*/
2460         left = mod(left, OP_AASSIGN);
2461         if (eval_start)
2462             eval_start = 0;
2463         else {
2464             op_free(left);
2465             op_free(right);
2466             return Nullop;
2467         }
2468         o = newBINOP(OP_AASSIGN, flags,
2469                 list(force_list(right)),
2470                 list(force_list(left)) );
2471         o->op_private = 0 | (flags >> 8);
2472         if (!(left->op_private & OPpLVAL_INTRO)) {
2473             static int generation = 100;
2474             OP *curop;
2475             OP *lastop = o;
2476             generation++;
2477             for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
2478                 if (opargs[curop->op_type] & OA_DANGEROUS) {
2479                     if (curop->op_type == OP_GV) {
2480                         GV *gv = ((GVOP*)curop)->op_gv;
2481                         if (gv == defgv || SvCUR(gv) == generation)
2482                             break;
2483                         SvCUR(gv) = generation;
2484                     }
2485                     else if (curop->op_type == OP_PADSV ||
2486                              curop->op_type == OP_PADAV ||
2487                              curop->op_type == OP_PADHV ||
2488                              curop->op_type == OP_PADANY) {
2489                         SV **svp = AvARRAY(comppad_name);
2490                         SV *sv = svp[curop->op_targ];
2491                         if (SvCUR(sv) == generation)
2492                             break;
2493                         SvCUR(sv) = generation; /* (SvCUR not used any more) */
2494                     }
2495                     else if (curop->op_type == OP_RV2CV)
2496                         break;
2497                     else if (curop->op_type == OP_RV2SV ||
2498                              curop->op_type == OP_RV2AV ||
2499                              curop->op_type == OP_RV2HV ||
2500                              curop->op_type == OP_RV2GV) {
2501                         if (lastop->op_type != OP_GV)   /* funny deref? */
2502                             break;
2503                     }
2504                     else
2505                         break;
2506                 }
2507                 lastop = curop;
2508             }
2509             if (curop != o)
2510                 o->op_private = OPpASSIGN_COMMON;
2511         }
2512         if (right && right->op_type == OP_SPLIT) {
2513             OP* tmpop;
2514             if ((tmpop = ((LISTOP*)right)->op_first) &&
2515                 tmpop->op_type == OP_PUSHRE)
2516             {
2517                 PMOP *pm = (PMOP*)tmpop;
2518                 if (left->op_type == OP_RV2AV &&
2519                     !(left->op_private & OPpLVAL_INTRO) &&
2520                     !(o->op_private & OPpASSIGN_COMMON) )
2521                 {
2522                     tmpop = ((UNOP*)left)->op_first;
2523                     if (tmpop->op_type == OP_GV && !pm->op_pmreplroot) {
2524                         pm->op_pmreplroot = (OP*)((GVOP*)tmpop)->op_gv;
2525                         pm->op_pmflags |= PMf_ONCE;
2526                         tmpop = cUNOPo->op_first;       /* to list (nulled) */
2527                         tmpop = ((UNOP*)tmpop)->op_first; /* to pushmark */
2528                         tmpop->op_sibling = Nullop;     /* don't free split */
2529                         right->op_next = tmpop->op_next;  /* fix starting loc */
2530                         op_free(o);                     /* blow off assign */
2531                         right->op_flags &= ~OPf_WANT;
2532                                 /* "I don't know and I don't care." */
2533                         return right;
2534                     }
2535                 }
2536                 else {
2537                     if (modcount < 10000 &&
2538                       ((LISTOP*)right)->op_last->op_type == OP_CONST)
2539                     {
2540                         SV *sv = ((SVOP*)((LISTOP*)right)->op_last)->op_sv;
2541                         if (SvIVX(sv) == 0)
2542                             sv_setiv(sv, modcount+1);
2543                     }
2544                 }
2545             }
2546         }
2547         return o;
2548     }
2549     if (!right)
2550         right = newOP(OP_UNDEF, 0);
2551     if (right->op_type == OP_READLINE) {
2552         right->op_flags |= OPf_STACKED;
2553         return newBINOP(OP_NULL, flags, mod(scalar(left), OP_SASSIGN), scalar(right));
2554     }
2555     else {
2556         eval_start = right;     /* Grandfathering $[ assignment here.  Bletch.*/
2557         o = newBINOP(OP_SASSIGN, flags,
2558             scalar(right), mod(scalar(left), OP_SASSIGN) );
2559         if (eval_start)
2560             eval_start = 0;
2561         else {
2562             op_free(o);
2563             return Nullop;
2564         }
2565     }
2566     return o;
2567 }
2568
2569 OP *
2570 newSTATEOP(flags, label, o)
2571 I32 flags;
2572 char *label;
2573 OP *o;
2574 {
2575     dTHR;
2576     U32 seq = intro_my();
2577     register COP *cop;
2578
2579     Newz(1101, cop, 1, COP);
2580     if (PERLDB_LINE && curcop->cop_line && curstash != debstash) {
2581         cop->op_type = OP_DBSTATE;
2582         cop->op_ppaddr = ppaddr[ OP_DBSTATE ];
2583     }
2584     else {
2585         cop->op_type = OP_NEXTSTATE;
2586         cop->op_ppaddr = ppaddr[ OP_NEXTSTATE ];
2587     }
2588     cop->op_flags = flags;
2589     cop->op_private = 0 | (flags >> 8);
2590 #ifdef NATIVE_HINTS
2591     cop->op_private |= NATIVE_HINTS;
2592 #endif
2593     cop->op_next = (OP*)cop;
2594
2595     if (label) {
2596         cop->cop_label = label;
2597         hints |= HINT_BLOCK_SCOPE;
2598     }
2599     cop->cop_seq = seq;
2600     cop->cop_arybase = curcop->cop_arybase;
2601
2602     if (copline == NOLINE)
2603         cop->cop_line = curcop->cop_line;
2604     else {
2605         cop->cop_line = copline;
2606         copline = NOLINE;
2607     }
2608     cop->cop_filegv = (GV*)SvREFCNT_inc(curcop->cop_filegv);
2609     cop->cop_stash = curstash;
2610
2611     if (PERLDB_LINE && curstash != debstash) {
2612         SV **svp = av_fetch(GvAV(curcop->cop_filegv),(I32)cop->cop_line, FALSE);
2613         if (svp && *svp != &sv_undef && !SvIOK(*svp)) {
2614             (void)SvIOK_on(*svp);
2615             SvIVX(*svp) = 1;
2616             SvSTASH(*svp) = (HV*)cop;
2617         }
2618     }
2619
2620     return prepend_elem(OP_LINESEQ, (OP*)cop, o);
2621 }
2622
2623 /* "Introduce" my variables to visible status. */
2624 U32
2625 intro_my()
2626 {
2627     SV **svp;
2628     SV *sv;
2629     I32 i;
2630
2631     if (! min_intro_pending)
2632         return cop_seqmax;
2633
2634     svp = AvARRAY(comppad_name);
2635     for (i = min_intro_pending; i <= max_intro_pending; i++) {
2636         if ((sv = svp[i]) && sv != &sv_undef && !SvIVX(sv)) {
2637             SvIVX(sv) = 999999999;      /* Don't know scope end yet. */
2638             SvNVX(sv) = (double)cop_seqmax;
2639         }
2640     }
2641     min_intro_pending = 0;
2642     comppad_name_fill = max_intro_pending;      /* Needn't search higher */
2643     return cop_seqmax++;
2644 }
2645
2646 OP *
2647 newLOGOP(type, flags, first, other)
2648 I32 type;
2649 I32 flags;
2650 OP* first;
2651 OP* other;
2652 {
2653     dTHR;
2654     LOGOP *logop;
2655     OP *o;
2656
2657     if (type == OP_XOR)         /* Not short circuit, but here by precedence. */
2658         return newBINOP(type, flags, scalar(first), scalar(other));
2659
2660     scalarboolean(first);
2661     /* optimize "!a && b" to "a || b", and "!a || b" to "a && b" */
2662     if (first->op_type == OP_NOT && (first->op_flags & OPf_SPECIAL)) {
2663         if (type == OP_AND || type == OP_OR) {
2664             if (type == OP_AND)
2665                 type = OP_OR;
2666             else
2667                 type = OP_AND;
2668             o = first;
2669             first = cUNOPo->op_first;
2670             if (o->op_next)
2671                 first->op_next = o->op_next;
2672             cUNOPo->op_first = Nullop;
2673             op_free(o);
2674         }
2675     }
2676     if (first->op_type == OP_CONST) {
2677         if (dowarn && (first->op_private & OPpCONST_BARE))
2678             warn("Probable precedence problem on %s", op_desc[type]);
2679         if ((type == OP_AND) == (SvTRUE(((SVOP*)first)->op_sv))) {
2680             op_free(first);
2681             return other;
2682         }
2683         else {
2684             op_free(other);
2685             return first;
2686         }
2687     }
2688     else if (first->op_type == OP_WANTARRAY) {
2689         if (type == OP_AND)
2690             list(other);
2691         else
2692             scalar(other);
2693     }
2694     else if (dowarn && (first->op_flags & OPf_KIDS)) {
2695         OP *k1 = ((UNOP*)first)->op_first;
2696         OP *k2 = k1->op_sibling;
2697         OPCODE warnop = 0;
2698         switch (first->op_type)
2699         {
2700         case OP_NULL:
2701             if (k2 && k2->op_type == OP_READLINE
2702                   && (k2->op_flags & OPf_STACKED)
2703                   && (k1->op_type == OP_RV2SV || k1->op_type == OP_PADSV))
2704                 warnop = k2->op_type;
2705             break;
2706
2707         case OP_SASSIGN:
2708             if (k1->op_type == OP_READDIR
2709                   || k1->op_type == OP_GLOB
2710                   || k1->op_type == OP_EACH)
2711                 warnop = k1->op_type;
2712             break;
2713         }
2714         if (warnop) {
2715             line_t oldline = curcop->cop_line;
2716             curcop->cop_line = copline;
2717             warn("Value of %s%s can be \"0\"; test with defined()",
2718                  op_desc[warnop],
2719                  ((warnop == OP_READLINE || warnop == OP_GLOB)
2720                   ? " construct" : "() operator"));
2721             curcop->cop_line = oldline;
2722         }
2723     }
2724
2725     if (!other)
2726         return first;
2727
2728     if (type == OP_ANDASSIGN || type == OP_ORASSIGN)
2729         other->op_private |= OPpASSIGN_BACKWARDS;  /* other is an OP_SASSIGN */
2730
2731     Newz(1101, logop, 1, LOGOP);
2732
2733     logop->op_type = type;
2734     logop->op_ppaddr = ppaddr[type];
2735     logop->op_first = first;
2736     logop->op_flags = flags | OPf_KIDS;
2737     logop->op_other = LINKLIST(other);
2738     logop->op_private = 1 | (flags >> 8);
2739
2740     /* establish postfix order */
2741     logop->op_next = LINKLIST(first);
2742     first->op_next = (OP*)logop;
2743     first->op_sibling = other;
2744
2745     o = newUNOP(OP_NULL, 0, (OP*)logop);
2746     other->op_next = o;
2747
2748     return o;
2749 }
2750
2751 OP *
2752 newCONDOP(flags, first, trueop, falseop)
2753 I32 flags;
2754 OP* first;
2755 OP* trueop;
2756 OP* falseop;
2757 {
2758     dTHR;
2759     CONDOP *condop;
2760     OP *o;
2761
2762     if (!falseop)
2763         return newLOGOP(OP_AND, 0, first, trueop);
2764     if (!trueop)
2765         return newLOGOP(OP_OR, 0, first, falseop);
2766
2767     scalarboolean(first);
2768     if (first->op_type == OP_CONST) {
2769         if (SvTRUE(((SVOP*)first)->op_sv)) {
2770             op_free(first);
2771             op_free(falseop);
2772             return trueop;
2773         }
2774         else {
2775             op_free(first);
2776             op_free(trueop);
2777             return falseop;
2778         }
2779     }
2780     else if (first->op_type == OP_WANTARRAY) {
2781         list(trueop);
2782         scalar(falseop);
2783     }
2784     Newz(1101, condop, 1, CONDOP);
2785
2786     condop->op_type = OP_COND_EXPR;
2787     condop->op_ppaddr = ppaddr[OP_COND_EXPR];
2788     condop->op_first = first;
2789     condop->op_flags = flags | OPf_KIDS;
2790     condop->op_true = LINKLIST(trueop);
2791     condop->op_false = LINKLIST(falseop);
2792     condop->op_private = 1 | (flags >> 8);
2793
2794     /* establish postfix order */
2795     condop->op_next = LINKLIST(first);
2796     first->op_next = (OP*)condop;
2797
2798     first->op_sibling = trueop;
2799     trueop->op_sibling = falseop;
2800     o = newUNOP(OP_NULL, 0, (OP*)condop);
2801
2802     trueop->op_next = o;
2803     falseop->op_next = o;
2804
2805     return o;
2806 }
2807
2808 OP *
2809 newRANGE(flags, left, right)
2810 I32 flags;
2811 OP *left;
2812 OP *right;
2813 {
2814     dTHR;
2815     CONDOP *condop;
2816     OP *flip;
2817     OP *flop;
2818     OP *o;
2819
2820     Newz(1101, condop, 1, CONDOP);
2821
2822     condop->op_type = OP_RANGE;
2823     condop->op_ppaddr = ppaddr[OP_RANGE];
2824     condop->op_first = left;
2825     condop->op_flags = OPf_KIDS;
2826     condop->op_true = LINKLIST(left);
2827     condop->op_false = LINKLIST(right);
2828     condop->op_private = 1 | (flags >> 8);
2829
2830     left->op_sibling = right;
2831
2832     condop->op_next = (OP*)condop;
2833     flip = newUNOP(OP_FLIP, flags, (OP*)condop);
2834     flop = newUNOP(OP_FLOP, 0, flip);
2835     o = newUNOP(OP_NULL, 0, flop);
2836     linklist(flop);
2837
2838     left->op_next = flip;
2839     right->op_next = flop;
2840
2841     condop->op_targ = pad_alloc(OP_RANGE, SVs_PADMY);
2842     sv_upgrade(PAD_SV(condop->op_targ), SVt_PVNV);
2843     flip->op_targ = pad_alloc(OP_RANGE, SVs_PADMY);
2844     sv_upgrade(PAD_SV(flip->op_targ), SVt_PVNV);
2845
2846     flip->op_private =  left->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
2847     flop->op_private = right->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
2848
2849     flip->op_next = o;
2850     if (!flip->op_private || !flop->op_private)
2851         linklist(o);            /* blow off optimizer unless constant */
2852
2853     return o;
2854 }
2855
2856 OP *
2857 newLOOPOP(flags, debuggable, expr, block)
2858 I32 flags;
2859 I32 debuggable;
2860 OP *expr;
2861 OP *block;
2862 {
2863     dTHR;
2864     OP* listop;
2865     OP* o;
2866     int once = block && block->op_flags & OPf_SPECIAL &&
2867       (block->op_type == OP_ENTERSUB || block->op_type == OP_NULL);
2868
2869     if (expr) {
2870         if (once && expr->op_type == OP_CONST && !SvTRUE(((SVOP*)expr)->op_sv))
2871             return block;       /* do {} while 0 does once */
2872         if (expr->op_type == OP_READLINE || expr->op_type == OP_GLOB
2873             || (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB)) {
2874             expr = newUNOP(OP_DEFINED, 0,
2875                 newASSIGNOP(0, newSVREF(newGVOP(OP_GV, 0, defgv)), 0, expr) );
2876         }
2877     }
2878
2879     listop = append_elem(OP_LINESEQ, block, newOP(OP_UNSTACK, 0));
2880     o = newLOGOP(OP_AND, 0, expr, listop);
2881
2882     ((LISTOP*)listop)->op_last->op_next = LINKLIST(o);
2883
2884     if (once && o != listop)
2885         o->op_next = ((LOGOP*)cUNOPo->op_first)->op_other;
2886
2887     if (o == listop)
2888         o = newUNOP(OP_NULL, 0, o);     /* or do {} while 1 loses outer block */
2889
2890     o->op_flags |= flags;
2891     o = scope(o);
2892     o->op_flags |= OPf_SPECIAL; /* suppress POPBLOCK curpm restoration*/
2893     return o;
2894 }
2895
2896 OP *
2897 newWHILEOP(flags, debuggable, loop, whileline, expr, block, cont)
2898 I32 flags;
2899 I32 debuggable;
2900 LOOP *loop;
2901 I32 whileline;
2902 OP *expr;
2903 OP *block;
2904 OP *cont;
2905 {
2906     dTHR;
2907     OP *redo;
2908     OP *next = 0;
2909     OP *listop;
2910     OP *o;
2911     OP *condop;
2912
2913     if (expr && (expr->op_type == OP_READLINE || expr->op_type == OP_GLOB
2914                  || (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB))) {
2915         expr = newUNOP(OP_DEFINED, 0,
2916             newASSIGNOP(0, newSVREF(newGVOP(OP_GV, 0, defgv)), 0, expr) );
2917     }
2918
2919     if (!block)
2920         block = newOP(OP_NULL, 0);
2921
2922     if (cont)
2923         next = LINKLIST(cont);
2924     if (expr) {
2925         cont = append_elem(OP_LINESEQ, cont, newOP(OP_UNSTACK, 0));
2926         if ((line_t)whileline != NOLINE) {
2927             copline = whileline;
2928             cont = append_elem(OP_LINESEQ, cont,
2929                                newSTATEOP(0, Nullch, Nullop));
2930         }
2931     }
2932
2933     listop = append_list(OP_LINESEQ, (LISTOP*)block, (LISTOP*)cont);
2934     redo = LINKLIST(listop);
2935
2936     if (expr) {
2937         o = newLOGOP(OP_AND, 0, expr, scalar(listop));
2938         if (o == expr && o->op_type == OP_CONST && !SvTRUE(cSVOPo->op_sv)) {
2939             op_free(expr);              /* oops, it's a while (0) */
2940             op_free((OP*)loop);
2941             return Nullop;              /* (listop already freed by newLOGOP) */
2942         }
2943         ((LISTOP*)listop)->op_last->op_next = condop = 
2944             (o == listop ? redo : LINKLIST(o));
2945         if (!next)
2946             next = condop;
2947     }
2948     else
2949         o = listop;
2950
2951     if (!loop) {
2952         Newz(1101,loop,1,LOOP);
2953         loop->op_type = OP_ENTERLOOP;
2954         loop->op_ppaddr = ppaddr[OP_ENTERLOOP];
2955         loop->op_private = 0;
2956         loop->op_next = (OP*)loop;
2957     }
2958
2959     o = newBINOP(OP_LEAVELOOP, 0, (OP*)loop, o);
2960
2961     loop->op_redoop = redo;
2962     loop->op_lastop = o;
2963
2964     if (next)
2965         loop->op_nextop = next;
2966     else
2967         loop->op_nextop = o;
2968
2969     o->op_flags |= flags;
2970     o->op_private |= (flags >> 8);
2971     return o;
2972 }
2973
2974 OP *
2975 #ifndef CAN_PROTOTYPE
2976 newFOROP(flags,label,forline,sv,expr,block,cont)
2977 I32 flags;
2978 char *label;
2979 line_t forline;
2980 OP* sv;
2981 OP* expr;
2982 OP*block;
2983 OP*cont;
2984 #else
2985 newFOROP(I32 flags,char *label,line_t forline,OP *sv,OP *expr,OP *block,OP *cont)
2986 #endif /* CAN_PROTOTYPE */
2987 {
2988     LOOP *loop;
2989     OP *wop;
2990     int padoff = 0;
2991     I32 iterflags = 0;
2992
2993     if (sv) {
2994         if (sv->op_type == OP_RV2SV) {  /* symbol table variable */
2995             sv->op_type = OP_RV2GV;
2996             sv->op_ppaddr = ppaddr[OP_RV2GV];
2997         }
2998         else if (sv->op_type == OP_PADSV) { /* private variable */
2999             padoff = sv->op_targ;
3000             op_free(sv);
3001             sv = Nullop;
3002         }
3003         else
3004             croak("Can't use %s for loop variable", op_desc[sv->op_type]);
3005     }
3006     else {
3007         sv = newGVOP(OP_GV, 0, defgv);
3008     }
3009     if (expr->op_type == OP_RV2AV || expr->op_type == OP_PADAV) {
3010         expr = scalar(ref(expr, OP_ITER));
3011         iterflags |= OPf_STACKED;
3012     }
3013     loop = (LOOP*)list(convert(OP_ENTERITER, iterflags,
3014         append_elem(OP_LIST, mod(force_list(expr), OP_GREPSTART),
3015                     scalar(sv))));
3016     assert(!loop->op_next);
3017     Renew(loop, 1, LOOP);
3018     loop->op_targ = padoff;
3019     wop = newWHILEOP(flags, 1, loop, forline, newOP(OP_ITER, 0), block, cont);
3020     copline = forline;
3021     return newSTATEOP(0, label, wop);
3022 }
3023
3024 OP*
3025 newLOOPEX(type, label)
3026 I32 type;
3027 OP* label;
3028 {
3029     dTHR;
3030     OP *o;
3031     if (type != OP_GOTO || label->op_type == OP_CONST) {
3032         o = newPVOP(type, 0, savepv(
3033                 label->op_type == OP_CONST
3034                     ? SvPVx(((SVOP*)label)->op_sv, na)
3035                     : "" ));
3036         op_free(label);
3037     }
3038     else {
3039         if (label->op_type == OP_ENTERSUB)
3040             label = newUNOP(OP_REFGEN, 0, mod(label, OP_REFGEN));
3041         o = newUNOP(type, OPf_STACKED, label);
3042     }
3043     hints |= HINT_BLOCK_SCOPE;
3044     return o;
3045 }
3046
3047 void
3048 cv_undef(cv)
3049 CV *cv;
3050 {
3051     dTHR;
3052 #ifdef USE_THREADS
3053     if (CvMUTEXP(cv)) {
3054         MUTEX_DESTROY(CvMUTEXP(cv));
3055         Safefree(CvMUTEXP(cv));
3056         CvMUTEXP(cv) = 0;
3057     }
3058 #endif /* USE_THREADS */
3059
3060     if (!CvXSUB(cv) && CvROOT(cv)) {
3061 #ifdef USE_THREADS
3062         if (CvDEPTH(cv) || (CvOWNER(cv) && CvOWNER(cv) != thr))
3063             croak("Can't undef active subroutine");
3064 #else
3065         if (CvDEPTH(cv))
3066             croak("Can't undef active subroutine");
3067 #endif /* USE_THREADS */
3068         ENTER;
3069
3070         SAVESPTR(curpad);
3071         curpad = 0;
3072
3073         if (!CvCLONED(cv))
3074             op_free(CvROOT(cv));
3075         CvROOT(cv) = Nullop;
3076         LEAVE;
3077     }
3078     SvPOK_off((SV*)cv);         /* forget prototype */
3079     CvFLAGS(cv) = 0;
3080     SvREFCNT_dec(CvGV(cv));
3081     CvGV(cv) = Nullgv;
3082     SvREFCNT_dec(CvOUTSIDE(cv));
3083     CvOUTSIDE(cv) = Nullcv;
3084     if (CvPADLIST(cv)) {
3085         /* may be during global destruction */
3086         if (SvREFCNT(CvPADLIST(cv))) {
3087             I32 i = AvFILL(CvPADLIST(cv));
3088             while (i >= 0) {
3089                 SV** svp = av_fetch(CvPADLIST(cv), i--, FALSE);
3090                 SV* sv = svp ? *svp : Nullsv;
3091                 if (!sv)
3092                     continue;
3093                 if (sv == (SV*)comppad_name)
3094                     comppad_name = Nullav;
3095                 else if (sv == (SV*)comppad) {
3096                     comppad = Nullav;
3097                     curpad = Null(SV**);
3098                 }
3099                 SvREFCNT_dec(sv);
3100             }
3101             SvREFCNT_dec((SV*)CvPADLIST(cv));
3102         }
3103         CvPADLIST(cv) = Nullav;
3104     }
3105 }
3106
3107 #ifdef DEBUG_CLOSURES
3108 static void
3109 cv_dump(cv)
3110 CV* cv;
3111 {
3112     CV *outside = CvOUTSIDE(cv);
3113     AV* padlist = CvPADLIST(cv);
3114     AV* pad_name;
3115     AV* pad;
3116     SV** pname;
3117     SV** ppad;
3118     I32 ix;
3119
3120     PerlIO_printf(Perl_debug_log, "\tCV=0x%lx (%s), OUTSIDE=0x%lx (%s)\n",
3121                   cv,
3122                   (CvANON(cv) ? "ANON"
3123                    : (cv == main_cv) ? "MAIN"
3124                    : CvUNIQUE(outside) ? "UNIQUE"
3125                    : CvGV(cv) ? GvNAME(CvGV(cv)) : "UNDEFINED"),
3126                   outside,
3127                   (!outside ? "null"
3128                    : CvANON(outside) ? "ANON"
3129                    : (outside == main_cv) ? "MAIN"
3130                    : CvUNIQUE(outside) ? "UNIQUE"
3131                    : CvGV(outside) ? GvNAME(CvGV(outside)) : "UNDEFINED"));
3132
3133     if (!padlist)
3134         return;
3135
3136     pad_name = (AV*)*av_fetch(padlist, 0, FALSE);
3137     pad = (AV*)*av_fetch(padlist, 1, FALSE);
3138     pname = AvARRAY(pad_name);
3139     ppad = AvARRAY(pad);
3140
3141     for (ix = 1; ix <= AvFILL(pad_name); ix++) {
3142         if (SvPOK(pname[ix]))
3143             PerlIO_printf(Perl_debug_log, "\t%4d. 0x%lx (%s\"%s\" %ld-%ld)\n",
3144                           ix, ppad[ix],
3145                           SvFAKE(pname[ix]) ? "FAKE " : "",
3146                           SvPVX(pname[ix]),
3147                           (long)I_32(SvNVX(pname[ix])),
3148                           (long)SvIVX(pname[ix]));
3149     }
3150 }
3151 #endif /* DEBUG_CLOSURES */
3152
3153 static CV *
3154 cv_clone2(proto, outside)
3155 CV* proto;
3156 CV* outside;
3157 {
3158     dTHR;
3159     AV* av;
3160     I32 ix;
3161     AV* protopadlist = CvPADLIST(proto);
3162     AV* protopad_name = (AV*)*av_fetch(protopadlist, 0, FALSE);
3163     AV* protopad = (AV*)*av_fetch(protopadlist, 1, FALSE);
3164     SV** pname = AvARRAY(protopad_name);
3165     SV** ppad = AvARRAY(protopad);
3166     I32 fname = AvFILL(protopad_name);
3167     I32 fpad = AvFILL(protopad);
3168     AV* comppadlist;
3169     CV* cv;
3170
3171     assert(!CvUNIQUE(proto));
3172
3173     ENTER;
3174     SAVESPTR(curpad);
3175     SAVESPTR(comppad);
3176     SAVESPTR(comppad_name);
3177     SAVESPTR(compcv);
3178
3179     cv = compcv = (CV*)NEWSV(1104,0);
3180     sv_upgrade((SV *)cv, SvTYPE(proto));
3181     CvCLONED_on(cv);
3182     if (CvANON(proto))
3183         CvANON_on(cv);
3184
3185 #ifdef USE_THREADS
3186     New(666, CvMUTEXP(cv), 1, perl_mutex);
3187     MUTEX_INIT(CvMUTEXP(cv));
3188     CvOWNER(cv)         = 0;
3189 #endif /* USE_THREADS */
3190     CvFILEGV(cv)        = CvFILEGV(proto);
3191     CvGV(cv)            = (GV*)SvREFCNT_inc(CvGV(proto));
3192     CvSTASH(cv)         = CvSTASH(proto);
3193     CvROOT(cv)          = CvROOT(proto);
3194     CvSTART(cv)         = CvSTART(proto);
3195     if (outside)
3196         CvOUTSIDE(cv)   = (CV*)SvREFCNT_inc(outside);
3197
3198     if (SvPOK(proto))
3199         sv_setpvn((SV*)cv, SvPVX(proto), SvCUR(proto));
3200
3201     comppad_name = newAV();
3202     for (ix = fname; ix >= 0; ix--)
3203         av_store(comppad_name, ix, SvREFCNT_inc(pname[ix]));
3204
3205     comppad = newAV();
3206
3207     comppadlist = newAV();
3208     AvREAL_off(comppadlist);
3209     av_store(comppadlist, 0, (SV*)comppad_name);
3210     av_store(comppadlist, 1, (SV*)comppad);
3211     CvPADLIST(cv) = comppadlist;
3212     av_fill(comppad, AvFILL(protopad));
3213     curpad = AvARRAY(comppad);
3214
3215     av = newAV();           /* will be @_ */
3216     av_extend(av, 0);
3217     av_store(comppad, 0, (SV*)av);
3218     AvFLAGS(av) = AVf_REIFY;
3219
3220     for (ix = fpad; ix > 0; ix--) {
3221         SV* namesv = (ix <= fname) ? pname[ix] : Nullsv;
3222         if (namesv && namesv != &sv_undef) {
3223             char *name = SvPVX(namesv);    /* XXX */
3224             if (SvFLAGS(namesv) & SVf_FAKE) {   /* lexical from outside? */
3225                 I32 off = pad_findlex(name, ix, SvIVX(namesv),
3226                                       CvOUTSIDE(cv), cxstack_ix);
3227                 if (!off)
3228                     curpad[ix] = SvREFCNT_inc(ppad[ix]);
3229                 else if (off != ix)
3230                     croak("panic: cv_clone: %s", name);
3231             }
3232             else {                              /* our own lexical */
3233                 SV* sv;
3234                 if (*name == '&') {
3235                     /* anon code -- we'll come back for it */
3236                     sv = SvREFCNT_inc(ppad[ix]);
3237                 }
3238                 else if (*name == '@')
3239                     sv = (SV*)newAV();
3240                 else if (*name == '%')
3241                     sv = (SV*)newHV();
3242                 else
3243                     sv = NEWSV(0,0);
3244                 if (!SvPADBUSY(sv))
3245                     SvPADMY_on(sv);
3246                 curpad[ix] = sv;
3247             }
3248         }
3249         else {
3250             SV* sv = NEWSV(0,0);
3251             SvPADTMP_on(sv);
3252             curpad[ix] = sv;
3253         }
3254     }
3255
3256     /* Now that vars are all in place, clone nested closures. */
3257
3258     for (ix = fpad; ix > 0; ix--) {
3259         SV* namesv = (ix <= fname) ? pname[ix] : Nullsv;
3260         if (namesv
3261             && namesv != &sv_undef
3262             && !(SvFLAGS(namesv) & SVf_FAKE)
3263             && *SvPVX(namesv) == '&'
3264             && CvCLONE(ppad[ix]))
3265         {
3266             CV *kid = cv_clone2((CV*)ppad[ix], cv);
3267             SvREFCNT_dec(ppad[ix]);
3268             CvCLONE_on(kid);
3269             SvPADMY_on(kid);
3270             curpad[ix] = (SV*)kid;
3271         }
3272     }
3273
3274 #ifdef DEBUG_CLOSURES
3275     PerlIO_printf(Perl_debug_log, "Cloned inside:\n");
3276     cv_dump(outside);
3277     PerlIO_printf(Perl_debug_log, "  from:\n");
3278     cv_dump(proto);
3279     PerlIO_printf(Perl_debug_log, "   to:\n");
3280     cv_dump(cv);
3281 #endif
3282
3283     LEAVE;
3284     return cv;
3285 }
3286
3287 CV *
3288 cv_clone(proto)
3289 CV* proto;
3290 {
3291     return cv_clone2(proto, CvOUTSIDE(proto));
3292 }
3293
3294 void
3295 cv_ckproto(cv, gv, p)
3296 CV* cv;
3297 GV* gv;
3298 char* p;
3299 {
3300     if ((!p != !SvPOK(cv)) || (p && strNE(p, SvPVX(cv)))) {
3301         SV* msg = sv_newmortal();
3302         SV* name = Nullsv;
3303
3304         if (gv)
3305             gv_efullname3(name = sv_newmortal(), gv, Nullch);
3306         sv_setpv(msg, "Prototype mismatch:");
3307         if (name)
3308             sv_catpvf(msg, " sub %_", name);
3309         if (SvPOK(cv))
3310             sv_catpvf(msg, " (%s)", SvPVX(cv));
3311         sv_catpv(msg, " vs ");
3312         if (p)
3313             sv_catpvf(msg, "(%s)", p);
3314         else
3315             sv_catpv(msg, "none");
3316         warn("%_", msg);
3317     }
3318 }
3319
3320 SV *
3321 cv_const_sv(cv)
3322 CV* cv;
3323 {
3324     OP *o;
3325     SV *sv;
3326     
3327     if (!cv || !SvPOK(cv) || SvCUR(cv))
3328         return Nullsv;
3329
3330     sv = Nullsv;
3331     for (o = CvSTART(cv); o; o = o->op_next) {
3332         OPCODE type = o->op_type;
3333         
3334         if (type == OP_NEXTSTATE || type == OP_NULL || type == OP_PUSHMARK)
3335             continue;
3336         if (type == OP_LEAVESUB || type == OP_RETURN)
3337             break;
3338         if (sv)
3339             return Nullsv;
3340         if (type == OP_CONST)
3341             sv = cSVOPo->op_sv;
3342         else if (type == OP_PADSV) {
3343             AV* padav = (AV*)(AvARRAY(CvPADLIST(cv))[1]);
3344             sv = padav ? AvARRAY(padav)[o->op_targ] : Nullsv;
3345             if (!sv || (!SvREADONLY(sv) && SvREFCNT(sv) > 1))
3346                 return Nullsv;
3347         }
3348         else
3349             return Nullsv;
3350     }
3351     if (sv)
3352         SvREADONLY_on(sv);
3353     return sv;
3354 }
3355
3356 CV *
3357 newSUB(floor,o,proto,block)
3358 I32 floor;
3359 OP *o;
3360 OP *proto;
3361 OP *block;
3362 {
3363     dTHR;
3364     char *name = o ? SvPVx(cSVOPo->op_sv, na) : Nullch;
3365     GV *gv = gv_fetchpv(name ? name : "__ANON__", GV_ADDMULTI, SVt_PVCV);
3366     char *ps = proto ? SvPVx(((SVOP*)proto)->op_sv, na) : Nullch;
3367     register CV *cv;
3368     I32 ix;
3369
3370     if (o)
3371         SAVEFREEOP(o);
3372     if (proto)
3373         SAVEFREEOP(proto);
3374
3375     if (!name || GvCVGEN(gv))
3376         cv = Nullcv;
3377     else if (cv = GvCV(gv)) {
3378         cv_ckproto(cv, gv, ps);
3379         /* already defined (or promised)? */
3380         if (CvROOT(cv) || CvXSUB(cv) || GvASSUMECV(gv)) {
3381             SV* const_sv;
3382             if (!block) {
3383                 /* just a "sub foo;" when &foo is already defined */
3384                 SAVEFREESV(compcv);
3385                 goto done;
3386             }
3387             /* ahem, death to those who redefine active sort subs */
3388             if (curstack == sortstack && sortcop == CvSTART(cv))
3389                 croak("Can't redefine active sort subroutine %s", name);
3390             const_sv = cv_const_sv(cv);
3391             if (const_sv || dowarn) {
3392                 line_t oldline = curcop->cop_line;
3393                 curcop->cop_line = copline;
3394                 warn(const_sv ? "Constant subroutine %s redefined"
3395                      : "Subroutine %s redefined", name);
3396                 curcop->cop_line = oldline;
3397             }
3398             SvREFCNT_dec(cv);
3399             cv = Nullcv;
3400         }
3401     }
3402     if (cv) {                           /* must reuse cv if autoloaded */
3403         cv_undef(cv);
3404         CvFLAGS(cv) = CvFLAGS(compcv);
3405         CvOUTSIDE(cv) = CvOUTSIDE(compcv);
3406         CvOUTSIDE(compcv) = 0;
3407         CvPADLIST(cv) = CvPADLIST(compcv);
3408         CvPADLIST(compcv) = 0;
3409         if (SvREFCNT(compcv) > 1) /* XXX Make closures transit through stub. */
3410             CvOUTSIDE(compcv) = (CV*)SvREFCNT_inc((SV*)cv);
3411         SvREFCNT_dec(compcv);
3412     }
3413     else {
3414         cv = compcv;
3415         if (name) {
3416             GvCV(gv) = cv;
3417             GvCVGEN(gv) = 0;
3418             sub_generation++;
3419         }
3420     }
3421     CvGV(cv) = (GV*)SvREFCNT_inc(gv);
3422     CvFILEGV(cv) = curcop->cop_filegv;
3423     CvSTASH(cv) = curstash;
3424 #ifdef USE_THREADS
3425     CvOWNER(cv) = 0;
3426     New(666, CvMUTEXP(cv), 1, perl_mutex);
3427     MUTEX_INIT(CvMUTEXP(cv));
3428 #endif /* USE_THREADS */
3429
3430     if (ps)
3431         sv_setpv((SV*)cv, ps);
3432
3433     if (error_count) {
3434         op_free(block);
3435         block = Nullop;
3436         if (name) {
3437             char *s = strrchr(name, ':');
3438             s = s ? s+1 : name;
3439             if (strEQ(s, "BEGIN")) {
3440                 char *not_safe =
3441                     "BEGIN not safe after errors--compilation aborted";
3442                 if (in_eval & 4)
3443                     croak(not_safe);
3444                 else {
3445                     /* force display of errors found but not reported */
3446                     sv_catpv(errsv, not_safe);
3447                     croak("%s", SvPV(errsv, na));
3448                 }
3449             }
3450         }
3451     }
3452     if (!block) {
3453         copline = NOLINE;
3454         LEAVE_SCOPE(floor);
3455         return cv;
3456     }
3457
3458     if (AvFILL(comppad_name) < AvFILL(comppad))
3459         av_store(comppad_name, AvFILL(comppad), Nullsv);
3460
3461     if (CvCLONE(cv)) {
3462         SV **namep = AvARRAY(comppad_name);
3463         for (ix = AvFILL(comppad); ix > 0; ix--) {
3464             SV *namesv;
3465
3466             if (SvIMMORTAL(curpad[ix]))
3467                 continue;
3468             /*
3469              * The only things that a clonable function needs in its
3470              * pad are references to outer lexicals and anonymous subs.
3471              * The rest are created anew during cloning.
3472              */
3473             if (!((namesv = namep[ix]) != Nullsv &&
3474                   namesv != &sv_undef &&
3475                   (SvFAKE(namesv) ||
3476                    *SvPVX(namesv) == '&')))
3477             {
3478                 SvREFCNT_dec(curpad[ix]);
3479                 curpad[ix] = Nullsv;
3480             }
3481         }
3482     }
3483     else {
3484         AV *av = newAV();                       /* Will be @_ */
3485         av_extend(av, 0);
3486         av_store(comppad, 0, (SV*)av);
3487         AvFLAGS(av) = AVf_REIFY;
3488
3489         for (ix = AvFILL(comppad); ix > 0; ix--) {
3490             if (SvIMMORTAL(curpad[ix]))
3491                 continue;
3492             if (!SvPADMY(curpad[ix]))
3493                 SvPADTMP_on(curpad[ix]);
3494         }
3495     }
3496
3497     CvROOT(cv) = newUNOP(OP_LEAVESUB, 0, scalarseq(block));
3498     CvSTART(cv) = LINKLIST(CvROOT(cv));
3499     CvROOT(cv)->op_next = 0;
3500     peep(CvSTART(cv));
3501
3502     if (name) {
3503         char *s;
3504
3505         if (PERLDB_SUBLINE && curstash != debstash) {
3506             SV *sv = NEWSV(0,0);
3507             SV *tmpstr = sv_newmortal();
3508             static GV *db_postponed;
3509             CV *cv;
3510             HV *hv;
3511
3512             sv_setpvf(sv, "%_:%ld-%ld",
3513                     GvSV(curcop->cop_filegv),
3514                     (long)subline, (long)curcop->cop_line);
3515             gv_efullname3(tmpstr, gv, Nullch);
3516             hv_store(GvHV(DBsub), SvPVX(tmpstr), SvCUR(tmpstr), sv, 0);
3517             if (!db_postponed) {
3518                 db_postponed = gv_fetchpv("DB::postponed", GV_ADDMULTI, SVt_PVHV);
3519             }
3520             hv = GvHVn(db_postponed);
3521             if (HvFILL(hv) > 0 && hv_exists(hv, SvPVX(tmpstr), SvCUR(tmpstr))
3522                   && (cv = GvCV(db_postponed))) {
3523                 dSP;
3524                 PUSHMARK(sp);
3525                 XPUSHs(tmpstr);
3526                 PUTBACK;
3527                 perl_call_sv((SV*)cv, G_DISCARD);
3528             }
3529         }
3530
3531         if ((s = strrchr(name,':')))
3532             s++;
3533         else
3534             s = name;
3535         if (strEQ(s, "BEGIN")) {
3536             I32 oldscope = scopestack_ix;
3537             ENTER;
3538             SAVESPTR(compiling.cop_filegv);
3539             SAVEI16(compiling.cop_line);
3540             SAVEI32(perldb);
3541             save_svref(&rs);
3542             sv_setsv(rs, nrs);
3543
3544             if (!beginav)
3545                 beginav = newAV();
3546             DEBUG_x( dump_sub(gv) );
3547             av_push(beginav, (SV *)cv);
3548             GvCV(gv) = 0;
3549             call_list(oldscope, beginav);
3550
3551             curcop = &compiling;
3552             LEAVE;
3553         }
3554         else if (strEQ(s, "END") && !error_count) {
3555             if (!endav)
3556                 endav = newAV();
3557             av_unshift(endav, 1);
3558             av_store(endav, 0, (SV *)cv);
3559             GvCV(gv) = 0;
3560         }
3561         else if (strEQ(s, "INIT") && !error_count) {
3562             if (!initav)
3563                 initav = newAV();
3564             av_push(initav, SvREFCNT_inc(cv));
3565         }
3566     }
3567
3568   done:
3569     copline = NOLINE;
3570     LEAVE_SCOPE(floor);
3571     return cv;
3572 }
3573
3574 #ifdef DEPRECATED
3575 CV *
3576 newXSUB(name, ix, subaddr, filename)
3577 char *name;
3578 I32 ix;
3579 I32 (*subaddr)();
3580 char *filename;
3581 {
3582     CV* cv = newXS(name, (void(*)())subaddr, filename);
3583     CvOLDSTYLE_on(cv);
3584     CvXSUBANY(cv).any_i32 = ix;
3585     return cv;
3586 }
3587 #endif
3588
3589 CV *
3590 newXS(name, subaddr, filename)
3591 char *name;
3592 void (*subaddr) _((CV*));
3593 char *filename;
3594 {
3595     dTHR;
3596     GV *gv = gv_fetchpv(name ? name : "__ANON__", GV_ADDMULTI, SVt_PVCV);
3597     register CV *cv;
3598
3599     if (cv = (name ? GvCV(gv) : Nullcv)) {
3600         if (GvCVGEN(gv)) {
3601             /* just a cached method */
3602             SvREFCNT_dec(cv);
3603             cv = 0;
3604         }
3605         else if (CvROOT(cv) || CvXSUB(cv) || GvASSUMECV(gv)) {
3606             /* already defined (or promised) */
3607             if (dowarn) {
3608                 line_t oldline = curcop->cop_line;
3609                 curcop->cop_line = copline;
3610                 warn("Subroutine %s redefined",name);
3611                 curcop->cop_line = oldline;
3612             }
3613             SvREFCNT_dec(cv);
3614             cv = 0;
3615         }
3616     }
3617
3618     if (cv)                             /* must reuse cv if autoloaded */
3619         cv_undef(cv);
3620     else {
3621         cv = (CV*)NEWSV(1105,0);
3622         sv_upgrade((SV *)cv, SVt_PVCV);
3623         if (name) {
3624             GvCV(gv) = cv;
3625             GvCVGEN(gv) = 0;
3626             sub_generation++;
3627         }
3628     }
3629     CvGV(cv) = (GV*)SvREFCNT_inc(gv);
3630 #ifdef USE_THREADS
3631     New(666, CvMUTEXP(cv), 1, perl_mutex);
3632     MUTEX_INIT(CvMUTEXP(cv));
3633     CvOWNER(cv) = 0;
3634 #endif /* USE_THREADS */
3635     CvFILEGV(cv) = gv_fetchfile(filename);
3636     CvXSUB(cv) = subaddr;
3637
3638     if (name) {
3639         char *s = strrchr(name,':');
3640         if (s)
3641             s++;
3642         else
3643             s = name;
3644         if (strEQ(s, "BEGIN")) {
3645             if (!beginav)
3646                 beginav = newAV();
3647             av_push(beginav, (SV *)cv);
3648             GvCV(gv) = 0;
3649         }
3650         else if (strEQ(s, "END")) {
3651             if (!endav)
3652                 endav = newAV();
3653             av_unshift(endav, 1);
3654             av_store(endav, 0, (SV *)cv);
3655             GvCV(gv) = 0;
3656         }
3657         else if (strEQ(s, "INIT")) {
3658             if (!initav)
3659                 initav = newAV();
3660             av_push(initav, (SV *)cv);
3661         }
3662     }
3663     else
3664         CvANON_on(cv);
3665
3666     return cv;
3667 }
3668
3669 void
3670 newFORM(floor,o,block)
3671 I32 floor;
3672 OP *o;
3673 OP *block;
3674 {
3675     dTHR;
3676     register CV *cv;
3677     char *name;
3678     GV *gv;
3679     I32 ix;
3680
3681     if (o)
3682         name = SvPVx(cSVOPo->op_sv, na);
3683     else
3684         name = "STDOUT";
3685     gv = gv_fetchpv(name,TRUE, SVt_PVFM);
3686     GvMULTI_on(gv);
3687     if (cv = GvFORM(gv)) {
3688         if (dowarn) {
3689             line_t oldline = curcop->cop_line;
3690
3691             curcop->cop_line = copline;
3692             warn("Format %s redefined",name);
3693             curcop->cop_line = oldline;
3694         }
3695         SvREFCNT_dec(cv);
3696     }
3697     cv = compcv;
3698     GvFORM(gv) = cv;
3699     CvGV(cv) = (GV*)SvREFCNT_inc(gv);
3700     CvFILEGV(cv) = curcop->cop_filegv;
3701
3702     for (ix = AvFILL(comppad); ix > 0; ix--) {
3703         if (!SvPADMY(curpad[ix]) && !SvIMMORTAL(curpad[ix]))
3704             SvPADTMP_on(curpad[ix]);
3705     }
3706
3707     CvROOT(cv) = newUNOP(OP_LEAVEWRITE, 0, scalarseq(block));
3708     CvSTART(cv) = LINKLIST(CvROOT(cv));
3709     CvROOT(cv)->op_next = 0;
3710     peep(CvSTART(cv));
3711     op_free(o);
3712     copline = NOLINE;
3713     LEAVE_SCOPE(floor);
3714 }
3715
3716 OP *
3717 newANONLIST(o)
3718 OP* o;
3719 {
3720     return newUNOP(OP_REFGEN, 0,
3721         mod(list(convert(OP_ANONLIST, 0, o)), OP_REFGEN));
3722 }
3723
3724 OP *
3725 newANONHASH(o)
3726 OP* o;
3727 {
3728     return newUNOP(OP_REFGEN, 0,
3729         mod(list(convert(OP_ANONHASH, 0, o)), OP_REFGEN));
3730 }
3731
3732 OP *
3733 newANONSUB(floor, proto, block)
3734 I32 floor;
3735 OP *proto;
3736 OP *block;
3737 {
3738     return newUNOP(OP_REFGEN, 0,
3739         newSVOP(OP_ANONCODE, 0, (SV*)newSUB(floor, 0, proto, block)));
3740 }
3741
3742 OP *
3743 oopsAV(o)
3744 OP *o;
3745 {
3746     switch (o->op_type) {
3747     case OP_PADSV:
3748         o->op_type = OP_PADAV;
3749         o->op_ppaddr = ppaddr[OP_PADAV];
3750         return ref(newUNOP(OP_RV2AV, 0, scalar(o)), OP_RV2AV);
3751         
3752     case OP_RV2SV:
3753         o->op_type = OP_RV2AV;
3754         o->op_ppaddr = ppaddr[OP_RV2AV];
3755         ref(o, OP_RV2AV);
3756         break;
3757
3758     default:
3759         warn("oops: oopsAV");
3760         break;
3761     }
3762     return o;
3763 }
3764
3765 OP *
3766 oopsHV(o)
3767 OP *o;
3768 {
3769     switch (o->op_type) {
3770     case OP_PADSV:
3771     case OP_PADAV:
3772         o->op_type = OP_PADHV;
3773         o->op_ppaddr = ppaddr[OP_PADHV];
3774         return ref(newUNOP(OP_RV2HV, 0, scalar(o)), OP_RV2HV);
3775
3776     case OP_RV2SV:
3777     case OP_RV2AV:
3778         o->op_type = OP_RV2HV;
3779         o->op_ppaddr = ppaddr[OP_RV2HV];
3780         ref(o, OP_RV2HV);
3781         break;
3782
3783     default:
3784         warn("oops: oopsHV");
3785         break;
3786     }
3787     return o;
3788 }
3789
3790 OP *
3791 newAVREF(o)
3792 OP *o;
3793 {
3794     if (o->op_type == OP_PADANY) {
3795         o->op_type = OP_PADAV;
3796         o->op_ppaddr = ppaddr[OP_PADAV];
3797         return o;
3798     }
3799     return newUNOP(OP_RV2AV, 0, scalar(o));
3800 }
3801
3802 OP *
3803 newGVREF(type,o)
3804 I32 type;
3805 OP *o;
3806 {
3807     if (type == OP_MAPSTART)
3808         return newUNOP(OP_NULL, 0, o);
3809     return ref(newUNOP(OP_RV2GV, OPf_REF, o), type);
3810 }
3811
3812 OP *
3813 newHVREF(o)
3814 OP *o;
3815 {
3816     if (o->op_type == OP_PADANY) {
3817         o->op_type = OP_PADHV;
3818         o->op_ppaddr = ppaddr[OP_PADHV];
3819         return o;
3820     }
3821     return newUNOP(OP_RV2HV, 0, scalar(o));
3822 }
3823
3824 OP *
3825 oopsCV(o)
3826 OP *o;
3827 {
3828     croak("NOT IMPL LINE %d",__LINE__);
3829     /* STUB */
3830     return o;
3831 }
3832
3833 OP *
3834 newCVREF(flags, o)
3835 I32 flags;
3836 OP *o;
3837 {
3838     return newUNOP(OP_RV2CV, flags, scalar(o));
3839 }
3840
3841 OP *
3842 newSVREF(o)
3843 OP *o;
3844 {
3845     if (o->op_type == OP_PADANY) {
3846         o->op_type = OP_PADSV;
3847         o->op_ppaddr = ppaddr[OP_PADSV];
3848         return o;
3849     }
3850     else if (o->op_type == OP_SPECIFIC)
3851         return o;
3852     return newUNOP(OP_RV2SV, 0, scalar(o));
3853 }
3854
3855 /* Check routines. */
3856
3857 OP *
3858 ck_anoncode(o)
3859 OP *o;
3860 {
3861     PADOFFSET ix;
3862     SV* name;
3863
3864     name = NEWSV(1106,0);
3865     sv_upgrade(name, SVt_PVNV);
3866     sv_setpvn(name, "&", 1);
3867     SvIVX(name) = -1;
3868     SvNVX(name) = 1;
3869     ix = pad_alloc(o->op_type, SVs_PADMY);
3870     av_store(comppad_name, ix, name);
3871     av_store(comppad, ix, cSVOPo->op_sv);
3872     SvPADMY_on(cSVOPo->op_sv);
3873     cSVOPo->op_sv = Nullsv;
3874     cSVOPo->op_targ = ix;
3875     return o;
3876 }
3877
3878 OP *
3879 ck_bitop(o)
3880 OP *o;
3881 {
3882     o->op_private = hints;
3883     return o;
3884 }
3885
3886 OP *
3887 ck_concat(o)
3888 OP *o;
3889 {
3890     if (cUNOPo->op_first->op_type == OP_CONCAT)
3891         o->op_flags |= OPf_STACKED;
3892     return o;
3893 }
3894
3895 OP *
3896 ck_spair(o)
3897 OP *o;
3898 {
3899     if (o->op_flags & OPf_KIDS) {
3900         OP* newop;
3901         OP* kid;
3902         OPCODE type = o->op_type;
3903         o = modkids(ck_fun(o), type);
3904         kid = cUNOPo->op_first;
3905         newop = kUNOP->op_first->op_sibling;
3906         if (newop &&
3907             (newop->op_sibling ||
3908              !(opargs[newop->op_type] & OA_RETSCALAR) ||
3909              newop->op_type == OP_PADAV || newop->op_type == OP_PADHV ||
3910              newop->op_type == OP_RV2AV || newop->op_type == OP_RV2HV)) {
3911             
3912             return o;
3913         }
3914         op_free(kUNOP->op_first);
3915         kUNOP->op_first = newop;
3916     }
3917     o->op_ppaddr = ppaddr[++o->op_type];
3918     return ck_fun(o);
3919 }
3920
3921 OP *
3922 ck_delete(o)
3923 OP *o;
3924 {
3925     o = ck_fun(o);
3926     o->op_private = 0;
3927     if (o->op_flags & OPf_KIDS) {
3928         OP *kid = cUNOPo->op_first;
3929         if (kid->op_type == OP_HSLICE)
3930             o->op_private |= OPpSLICE;
3931         else if (kid->op_type != OP_HELEM)
3932             croak("%s argument is not a HASH element or slice",
3933                   op_desc[o->op_type]);
3934         null(kid);
3935     }
3936     return o;
3937 }
3938
3939 OP *
3940 ck_eof(o)
3941 OP *o;
3942 {
3943     I32 type = o->op_type;
3944
3945     if (o->op_flags & OPf_KIDS) {
3946         if (cLISTOPo->op_first->op_type == OP_STUB) {
3947             op_free(o);
3948             o = newUNOP(type, OPf_SPECIAL,
3949                 newGVOP(OP_GV, 0, gv_fetchpv("main::ARGV", TRUE, SVt_PVAV)));
3950         }
3951         return ck_fun(o);
3952     }
3953     return o;
3954 }
3955
3956 OP *
3957 ck_eval(o)
3958 OP *o;
3959 {
3960     hints |= HINT_BLOCK_SCOPE;
3961     if (o->op_flags & OPf_KIDS) {
3962         SVOP *kid = (SVOP*)cUNOPo->op_first;
3963
3964         if (!kid) {
3965             o->op_flags &= ~OPf_KIDS;
3966             null(o);
3967         }
3968         else if (kid->op_type == OP_LINESEQ) {
3969             LOGOP *enter;
3970
3971             kid->op_next = o->op_next;
3972             cUNOPo->op_first = 0;
3973             op_free(o);
3974
3975             Newz(1101, enter, 1, LOGOP);
3976             enter->op_type = OP_ENTERTRY;
3977             enter->op_ppaddr = ppaddr[OP_ENTERTRY];
3978             enter->op_private = 0;
3979
3980             /* establish postfix order */
3981             enter->op_next = (OP*)enter;
3982
3983             o = prepend_elem(OP_LINESEQ, (OP*)enter, (OP*)kid);
3984             o->op_type = OP_LEAVETRY;
3985             o->op_ppaddr = ppaddr[OP_LEAVETRY];
3986             enter->op_other = o;
3987             return o;
3988         }
3989     }
3990     else {
3991         op_free(o);
3992         o = newUNOP(OP_ENTEREVAL, 0, newSVREF(newGVOP(OP_GV, 0, defgv)));
3993     }
3994     o->op_targ = (PADOFFSET)hints;
3995     return o;
3996 }
3997
3998 OP *
3999 ck_exec(o)
4000 OP *o;
4001 {
4002     OP *kid;
4003     if (o->op_flags & OPf_STACKED) {
4004         o = ck_fun(o);
4005         kid = cUNOPo->op_first->op_sibling;
4006         if (kid->op_type == OP_RV2GV)
4007             null(kid);
4008     }
4009     else
4010         o = listkids(o);
4011     return o;
4012 }
4013
4014 OP *
4015 ck_exists(o)
4016 OP *o;
4017 {
4018     o = ck_fun(o);
4019     if (o->op_flags & OPf_KIDS) {
4020         OP *kid = cUNOPo->op_first;
4021         if (kid->op_type != OP_HELEM)
4022             croak("%s argument is not a HASH element", op_desc[o->op_type]);
4023         null(kid);
4024     }
4025     return o;
4026 }
4027
4028 OP *
4029 ck_gvconst(o)
4030 register OP *o;
4031 {
4032     o = fold_constants(o);
4033     if (o->op_type == OP_CONST)
4034         o->op_type = OP_GV;
4035     return o;
4036 }
4037
4038 OP *
4039 ck_rvconst(o)
4040 register OP *o;
4041 {
4042     dTHR;
4043     SVOP *kid = (SVOP*)cUNOPo->op_first;
4044
4045     o->op_private |= (hints & HINT_STRICT_REFS);
4046     if (kid->op_type == OP_CONST) {
4047         char *name;
4048         int iscv;
4049         GV *gv;
4050
4051         name = SvPV(kid->op_sv, na);
4052         if ((hints & HINT_STRICT_REFS) && (kid->op_private & OPpCONST_BARE)) {
4053             char *badthing = Nullch;
4054             switch (o->op_type) {
4055             case OP_RV2SV:
4056                 badthing = "a SCALAR";
4057                 break;
4058             case OP_RV2AV:
4059                 badthing = "an ARRAY";
4060                 break;
4061             case OP_RV2HV:
4062                 badthing = "a HASH";
4063                 break;
4064             }
4065             if (badthing)
4066                 croak(
4067           "Can't use bareword (\"%s\") as %s ref while \"strict refs\" in use",
4068                       name, badthing);
4069         }
4070         kid->op_type = OP_GV;
4071         iscv = (o->op_type == OP_RV2CV) * 2;
4072         for (gv = 0; !gv; iscv++) {
4073             /*
4074              * This is a little tricky.  We only want to add the symbol if we
4075              * didn't add it in the lexer.  Otherwise we get duplicate strict
4076              * warnings.  But if we didn't add it in the lexer, we must at
4077              * least pretend like we wanted to add it even if it existed before,
4078              * or we get possible typo warnings.  OPpCONST_ENTERED says
4079              * whether the lexer already added THIS instance of this symbol.
4080              */
4081             gv = gv_fetchpv(name,
4082                 iscv | !(kid->op_private & OPpCONST_ENTERED),
4083                 iscv
4084                     ? SVt_PVCV
4085                     : o->op_type == OP_RV2SV
4086                         ? SVt_PV
4087                         : o->op_type == OP_RV2AV
4088                             ? SVt_PVAV
4089                             : o->op_type == OP_RV2HV
4090                                 ? SVt_PVHV
4091                                 : SVt_PVGV);
4092         }
4093         SvREFCNT_dec(kid->op_sv);
4094         kid->op_sv = SvREFCNT_inc(gv);
4095     }
4096     return o;
4097 }
4098
4099 OP *
4100 ck_ftst(o)
4101 OP *o;
4102 {
4103     dTHR;
4104     I32 type = o->op_type;
4105
4106     if (o->op_flags & OPf_REF)
4107         return o;
4108
4109     if (o->op_flags & OPf_KIDS) {
4110         SVOP *kid = (SVOP*)cUNOPo->op_first;
4111
4112         if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) {
4113             OP *newop = newGVOP(type, OPf_REF,
4114                 gv_fetchpv(SvPVx(kid->op_sv, na), TRUE, SVt_PVIO));
4115             op_free(o);
4116             return newop;
4117         }
4118     }
4119     else {
4120         op_free(o);
4121         if (type == OP_FTTTY)
4122            return newGVOP(type, OPf_REF, gv_fetchpv("main::STDIN", TRUE,
4123                                 SVt_PVIO));
4124         else
4125             return newUNOP(type, 0, newSVREF(newGVOP(OP_GV, 0, defgv)));
4126     }
4127     return o;
4128 }
4129
4130 OP *
4131 ck_fun(o)
4132 OP *o;
4133 {
4134     dTHR;
4135     register OP *kid;
4136     OP **tokid;
4137     OP *sibl;
4138     I32 numargs = 0;
4139     int type = o->op_type;
4140     register I32 oa = opargs[type] >> OASHIFT;
4141     
4142     if (o->op_flags & OPf_STACKED) {
4143         if ((oa & OA_OPTIONAL) && (oa >> 4) && !((oa >> 4) & OA_OPTIONAL))
4144             oa &= ~OA_OPTIONAL;
4145         else
4146             return no_fh_allowed(o);
4147     }
4148
4149     if (o->op_flags & OPf_KIDS) {
4150         tokid = &cLISTOPo->op_first;
4151         kid = cLISTOPo->op_first;
4152         if (kid->op_type == OP_PUSHMARK ||
4153             kid->op_type == OP_NULL && kid->op_targ == OP_PUSHMARK)
4154         {
4155             tokid = &kid->op_sibling;
4156             kid = kid->op_sibling;
4157         }
4158         if (!kid && opargs[type] & OA_DEFGV)
4159             *tokid = kid = newSVREF(newGVOP(OP_GV, 0, defgv));
4160
4161         while (oa && kid) {
4162             numargs++;
4163             sibl = kid->op_sibling;
4164             switch (oa & 7) {
4165             case OA_SCALAR:
4166                 scalar(kid);
4167                 break;
4168             case OA_LIST:
4169                 if (oa < 16) {
4170                     kid = 0;
4171                     continue;
4172                 }
4173                 else
4174                     list(kid);
4175                 break;
4176             case OA_AVREF:
4177                 if (kid->op_type == OP_CONST &&
4178                   (kid->op_private & OPpCONST_BARE)) {
4179                     char *name = SvPVx(((SVOP*)kid)->op_sv, na);
4180                     OP *newop = newAVREF(newGVOP(OP_GV, 0,
4181                         gv_fetchpv(name, TRUE, SVt_PVAV) ));
4182                     if (dowarn)
4183                         warn("Array @%s missing the @ in argument %ld of %s()",
4184                             name, (long)numargs, op_desc[type]);
4185                     op_free(kid);
4186                     kid = newop;
4187                     kid->op_sibling = sibl;
4188                     *tokid = kid;
4189                 }
4190                 else if (kid->op_type != OP_RV2AV && kid->op_type != OP_PADAV)
4191                     bad_type(numargs, "array", op_desc[o->op_type], kid);
4192                 mod(kid, type);
4193                 break;
4194             case OA_HVREF:
4195                 if (kid->op_type == OP_CONST &&
4196                   (kid->op_private & OPpCONST_BARE)) {
4197                     char *name = SvPVx(((SVOP*)kid)->op_sv, na);
4198                     OP *newop = newHVREF(newGVOP(OP_GV, 0,
4199                         gv_fetchpv(name, TRUE, SVt_PVHV) ));
4200                     if (dowarn)
4201                         warn("Hash %%%s missing the %% in argument %ld of %s()",
4202                             name, (long)numargs, op_desc[type]);
4203                     op_free(kid);
4204                     kid = newop;
4205                     kid->op_sibling = sibl;
4206                     *tokid = kid;
4207                 }
4208                 else if (kid->op_type != OP_RV2HV && kid->op_type != OP_PADHV)
4209                     bad_type(numargs, "hash", op_desc[o->op_type], kid);
4210                 mod(kid, type);
4211                 break;
4212             case OA_CVREF:
4213                 {
4214                     OP *newop = newUNOP(OP_NULL, 0, kid);
4215                     kid->op_sibling = 0;
4216                     linklist(kid);
4217                     newop->op_next = newop;
4218                     kid = newop;
4219                     kid->op_sibling = sibl;
4220                     *tokid = kid;
4221                 }
4222                 break;
4223             case OA_FILEREF:
4224                 if (kid->op_type != OP_GV) {
4225                     if (kid->op_type == OP_CONST &&
4226                       (kid->op_private & OPpCONST_BARE)) {
4227                         OP *newop = newGVOP(OP_GV, 0,
4228                             gv_fetchpv(SvPVx(((SVOP*)kid)->op_sv, na), TRUE,
4229                                         SVt_PVIO) );
4230                         op_free(kid);
4231                         kid = newop;
4232                     }
4233                     else {
4234                         kid->op_sibling = 0;
4235                         kid = newUNOP(OP_RV2GV, 0, scalar(kid));
4236                     }
4237                     kid->op_sibling = sibl;
4238                     *tokid = kid;
4239                 }
4240                 scalar(kid);
4241                 break;
4242             case OA_SCALARREF:
4243                 mod(scalar(kid), type);
4244                 break;
4245             }
4246             oa >>= 4;
4247             tokid = &kid->op_sibling;
4248             kid = kid->op_sibling;
4249         }
4250         o->op_private |= numargs;
4251         if (kid)
4252             return too_many_arguments(o,op_desc[o->op_type]);
4253         listkids(o);
4254     }
4255     else if (opargs[type] & OA_DEFGV) {
4256         op_free(o);
4257         return newUNOP(type, 0, newSVREF(newGVOP(OP_GV, 0, defgv)));
4258     }
4259
4260     if (oa) {
4261         while (oa & OA_OPTIONAL)
4262             oa >>= 4;
4263         if (oa && oa != OA_LIST)
4264             return too_few_arguments(o,op_desc[o->op_type]);
4265     }
4266     return o;
4267 }
4268
4269 OP *
4270 ck_glob(o)
4271 OP *o;
4272 {
4273     GV *gv;
4274
4275     if ((o->op_flags & OPf_KIDS) && !cLISTOPo->op_first->op_sibling)
4276         append_elem(OP_GLOB, o, newSVREF(newGVOP(OP_GV, 0, defgv)));
4277
4278     if (!((gv = gv_fetchpv("glob", FALSE, SVt_PVCV)) && GvIMPORTED_CV(gv)))
4279         gv = gv_fetchpv("CORE::GLOBAL::glob", FALSE, SVt_PVCV);
4280
4281     if (gv && GvIMPORTED_CV(gv)) {
4282         static int glob_index;
4283
4284         append_elem(OP_GLOB, o,
4285                     newSVOP(OP_CONST, 0, newSViv(glob_index++)));
4286         o->op_type = OP_LIST;
4287         o->op_ppaddr = ppaddr[OP_LIST];
4288         cLISTOPo->op_first->op_type = OP_PUSHMARK;
4289         cLISTOPo->op_first->op_ppaddr = ppaddr[OP_PUSHMARK];
4290         o = newUNOP(OP_ENTERSUB, OPf_STACKED,
4291                     append_elem(OP_LIST, o, 
4292                                 scalar(newUNOP(OP_RV2CV, 0,
4293                                                newGVOP(OP_GV, 0, gv)))));
4294         o = newUNOP(OP_NULL, 0, ck_subr(o));
4295         o->op_targ = OP_GLOB;           /* hint at what it used to be */
4296         return o;
4297     }
4298     gv = newGVgen("main");
4299     gv_IOadd(gv);
4300     append_elem(OP_GLOB, o, newGVOP(OP_GV, 0, gv));
4301     scalarkids(o);
4302     return ck_fun(o);
4303 }
4304
4305 OP *
4306 ck_grep(o)
4307 OP *o;
4308 {
4309     LOGOP *gwop;
4310     OP *kid;
4311     OPCODE type = o->op_type == OP_GREPSTART ? OP_GREPWHILE : OP_MAPWHILE;
4312
4313     o->op_ppaddr = ppaddr[OP_GREPSTART];
4314     Newz(1101, gwop, 1, LOGOP);
4315     
4316     if (o->op_flags & OPf_STACKED) {
4317         OP* k;
4318         o = ck_sort(o);
4319         kid = cLISTOPo->op_first->op_sibling;
4320         for (k = cLISTOPo->op_first->op_sibling->op_next; k; k = k->op_next) {
4321             kid = k;
4322         }
4323         kid->op_next = (OP*)gwop;
4324         o->op_flags &= ~OPf_STACKED;
4325     }
4326     kid = cLISTOPo->op_first->op_sibling;
4327     if (type == OP_MAPWHILE)
4328         list(kid);
4329     else
4330         scalar(kid);
4331     o = ck_fun(o);
4332     if (error_count)
4333         return o;
4334     kid = cLISTOPo->op_first->op_sibling; 
4335     if (kid->op_type != OP_NULL)
4336         croak("panic: ck_grep");
4337     kid = kUNOP->op_first;
4338
4339     gwop->op_type = type;
4340     gwop->op_ppaddr = ppaddr[type];
4341     gwop->op_first = listkids(o);
4342     gwop->op_flags |= OPf_KIDS;
4343     gwop->op_private = 1;
4344     gwop->op_other = LINKLIST(kid);
4345     gwop->op_targ = pad_alloc(type, SVs_PADTMP);
4346     kid->op_next = (OP*)gwop;
4347
4348     kid = cLISTOPo->op_first->op_sibling;
4349     if (!kid || !kid->op_sibling)
4350         return too_few_arguments(o,op_desc[o->op_type]);
4351     for (kid = kid->op_sibling; kid; kid = kid->op_sibling)
4352         mod(kid, OP_GREPSTART);
4353
4354     return (OP*)gwop;
4355 }
4356
4357 OP *
4358 ck_index(o)
4359 OP *o;
4360 {
4361     if (o->op_flags & OPf_KIDS) {
4362         OP *kid = cLISTOPo->op_first->op_sibling;       /* get past pushmark */
4363         if (kid && kid->op_type == OP_CONST)
4364             fbm_compile(((SVOP*)kid)->op_sv);
4365     }
4366     return ck_fun(o);
4367 }
4368
4369 OP *
4370 ck_lengthconst(o)
4371 OP *o;
4372 {
4373     /* XXX length optimization goes here */
4374     return ck_fun(o);
4375 }
4376
4377 OP *
4378 ck_lfun(o)
4379 OP *o;
4380 {
4381     OPCODE type = o->op_type;
4382     return modkids(ck_fun(o), type);
4383 }
4384
4385 OP *
4386 ck_rfun(o)
4387 OP *o;
4388 {
4389     OPCODE type = o->op_type;
4390     return refkids(ck_fun(o), type);
4391 }
4392
4393 OP *
4394 ck_listiob(o)
4395 OP *o;
4396 {
4397     register OP *kid;
4398     
4399     kid = cLISTOPo->op_first;
4400     if (!kid) {
4401         o = force_list(o);
4402         kid = cLISTOPo->op_first;
4403     }
4404     if (kid->op_type == OP_PUSHMARK)
4405         kid = kid->op_sibling;
4406     if (kid && o->op_flags & OPf_STACKED)
4407         kid = kid->op_sibling;
4408     else if (kid && !kid->op_sibling) {         /* print HANDLE; */
4409         if (kid->op_type == OP_CONST && kid->op_private & OPpCONST_BARE) {
4410             o->op_flags |= OPf_STACKED; /* make it a filehandle */
4411             kid = newUNOP(OP_RV2GV, OPf_REF, scalar(kid));
4412             cLISTOPo->op_first->op_sibling = kid;
4413             cLISTOPo->op_last = kid;
4414             kid = kid->op_sibling;
4415         }
4416     }
4417         
4418     if (!kid)
4419         append_elem(o->op_type, o, newSVREF(newGVOP(OP_GV, 0, defgv)) );
4420
4421     o = listkids(o);
4422
4423     o->op_private = 0;
4424 #ifdef USE_LOCALE
4425     if (hints & HINT_LOCALE)
4426         o->op_private |= OPpLOCALE;
4427 #endif
4428
4429     return o;
4430 }
4431
4432 OP *
4433 ck_fun_locale(o)
4434 OP *o;
4435 {
4436     o = ck_fun(o);
4437
4438     o->op_private = 0;
4439 #ifdef USE_LOCALE
4440     if (hints & HINT_LOCALE)
4441         o->op_private |= OPpLOCALE;
4442 #endif
4443
4444     return o;
4445 }
4446
4447 OP *
4448 ck_scmp(o)
4449 OP *o;
4450 {
4451     o->op_private = 0;
4452 #ifdef USE_LOCALE
4453     if (hints & HINT_LOCALE)
4454         o->op_private |= OPpLOCALE;
4455 #endif
4456
4457     return o;
4458 }
4459
4460 OP *
4461 ck_match(o)
4462 OP *o;
4463 {
4464     o->op_private |= OPpRUNTIME;
4465     return o;
4466 }
4467
4468 OP *
4469 ck_null(o)
4470 OP *o;
4471 {
4472     return o;
4473 }
4474
4475 OP *
4476 ck_repeat(o)
4477 OP *o;
4478 {
4479     if (cBINOPo->op_first->op_flags & OPf_PARENS) {
4480         o->op_private |= OPpREPEAT_DOLIST;
4481         cBINOPo->op_first = force_list(cBINOPo->op_first);
4482     }
4483     else
4484         scalar(o);
4485     return o;
4486 }
4487
4488 OP *
4489 ck_require(o)
4490 OP *o;
4491 {
4492     if (o->op_flags & OPf_KIDS) {       /* Shall we supply missing .pm? */
4493         SVOP *kid = (SVOP*)cUNOPo->op_first;
4494
4495         if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) {
4496             char *s;
4497             for (s = SvPVX(kid->op_sv); *s; s++) {
4498                 if (*s == ':' && s[1] == ':') {
4499                     *s = '/';
4500                     Move(s+2, s+1, strlen(s+2)+1, char);
4501                     --SvCUR(kid->op_sv);
4502                 }
4503             }
4504             sv_catpvn(kid->op_sv, ".pm", 3);
4505         }
4506     }
4507     return ck_fun(o);
4508 }
4509
4510 OP *
4511 ck_retarget(o)
4512 OP *o;
4513 {
4514     croak("NOT IMPL LINE %d",__LINE__);
4515     /* STUB */
4516     return o;
4517 }
4518
4519 OP *
4520 ck_select(o)
4521 OP *o;
4522 {
4523     OP* kid;
4524     if (o->op_flags & OPf_KIDS) {
4525         kid = cLISTOPo->op_first->op_sibling;   /* get past pushmark */
4526         if (kid && kid->op_sibling) {
4527             o->op_type = OP_SSELECT;
4528             o->op_ppaddr = ppaddr[OP_SSELECT];
4529             o = ck_fun(o);
4530             return fold_constants(o);
4531         }
4532     }
4533     o = ck_fun(o);
4534     kid = cLISTOPo->op_first->op_sibling;    /* get past pushmark */
4535     if (kid && kid->op_type == OP_RV2GV)
4536         kid->op_private &= ~HINT_STRICT_REFS;
4537     return o;
4538 }
4539
4540 OP *
4541 ck_shift(o)
4542 OP *o;
4543 {
4544     I32 type = o->op_type;
4545
4546     if (!(o->op_flags & OPf_KIDS)) {
4547         OP *argop;
4548         
4549         op_free(o);
4550 #ifdef USE_THREADS
4551         if (subline) {
4552             argop = newOP(OP_PADAV, OPf_REF);
4553             argop->op_targ = 0;         /* curpad[0] is @_ */
4554         }
4555         else {
4556             argop = newUNOP(OP_RV2AV, 0,
4557                 scalar(newGVOP(OP_GV, 0,
4558                     gv_fetchpv("ARGV", TRUE, SVt_PVAV))));
4559         }
4560 #else
4561         argop = newUNOP(OP_RV2AV, 0,
4562             scalar(newGVOP(OP_GV, 0, subline ?
4563                            defgv : gv_fetchpv("ARGV", TRUE, SVt_PVAV))));
4564 #endif /* USE_THREADS */
4565         return newUNOP(type, 0, scalar(argop));
4566     }
4567     return scalar(modkids(ck_fun(o), type));
4568 }
4569
4570 OP *
4571 ck_sort(o)
4572 OP *o;
4573 {
4574     o->op_private = 0;
4575 #ifdef USE_LOCALE
4576     if (hints & HINT_LOCALE)
4577         o->op_private |= OPpLOCALE;
4578 #endif
4579
4580     if (o->op_flags & OPf_STACKED) {
4581         OP *kid = cLISTOPo->op_first->op_sibling;       /* get past pushmark */
4582         OP *k;
4583         kid = kUNOP->op_first;                          /* get past rv2gv */
4584
4585         if (kid->op_type == OP_SCOPE || kid->op_type == OP_LEAVE) {
4586             linklist(kid);
4587             if (kid->op_type == OP_SCOPE) {
4588                 k = kid->op_next;
4589                 kid->op_next = 0;
4590             }
4591             else if (kid->op_type == OP_LEAVE) {
4592                 if (o->op_type == OP_SORT) {
4593                     null(kid);                  /* wipe out leave */
4594                     kid->op_next = kid;
4595
4596                     for (k = kLISTOP->op_first->op_next; k; k = k->op_next) {
4597                         if (k->op_next == kid)
4598                             k->op_next = 0;
4599                     }
4600                 }
4601                 else
4602                     kid->op_next = 0;           /* just disconnect the leave */
4603                 k = kLISTOP->op_first;
4604             }
4605             peep(k);
4606
4607             kid = cLISTOPo->op_first->op_sibling;       /* get past pushmark */
4608             null(kid);                                  /* wipe out rv2gv */
4609             if (o->op_type == OP_SORT)
4610                 kid->op_next = kid;
4611             else
4612                 kid->op_next = k;
4613             o->op_flags |= OPf_SPECIAL;
4614         }
4615     }
4616
4617     return o;
4618 }
4619
4620 OP *
4621 ck_split(o)
4622 OP *o;
4623 {
4624     register OP *kid;
4625     PMOP* pm;
4626     
4627     if (o->op_flags & OPf_STACKED)
4628         return no_fh_allowed(o);
4629
4630     kid = cLISTOPo->op_first;
4631     if (kid->op_type != OP_NULL)
4632         croak("panic: ck_split");
4633     kid = kid->op_sibling;
4634     op_free(cLISTOPo->op_first);
4635     cLISTOPo->op_first = kid;
4636     if (!kid) {
4637         cLISTOPo->op_first = kid = newSVOP(OP_CONST, 0, newSVpv(" ", 1));
4638         cLISTOPo->op_last = kid; /* There was only one element previously */
4639     }
4640
4641     if (kid->op_type != OP_MATCH) {
4642         OP *sibl = kid->op_sibling;
4643         kid->op_sibling = 0;
4644         kid = pmruntime( newPMOP(OP_MATCH, OPf_SPECIAL), kid, Nullop);
4645         if (cLISTOPo->op_first == cLISTOPo->op_last)
4646             cLISTOPo->op_last = kid;
4647         cLISTOPo->op_first = kid;
4648         kid->op_sibling = sibl;
4649     }
4650     pm = (PMOP*)kid;
4651     if (pm->op_pmshort && !(pm->op_pmflags & PMf_ALL)) {
4652         SvREFCNT_dec(pm->op_pmshort);   /* can't use substring to optimize */
4653         pm->op_pmshort = 0;
4654     }
4655
4656     kid->op_type = OP_PUSHRE;
4657     kid->op_ppaddr = ppaddr[OP_PUSHRE];
4658     scalar(kid);
4659
4660     if (!kid->op_sibling)
4661         append_elem(OP_SPLIT, o, newSVREF(newGVOP(OP_GV, 0, defgv)) );
4662
4663     kid = kid->op_sibling;
4664     scalar(kid);
4665
4666     if (!kid->op_sibling)
4667         append_elem(OP_SPLIT, o, newSVOP(OP_CONST, 0, newSViv(0)));
4668
4669     kid = kid->op_sibling;
4670     scalar(kid);
4671
4672     if (kid->op_sibling)
4673         return too_many_arguments(o,op_desc[o->op_type]);
4674
4675     return o;
4676 }
4677
4678 OP *
4679 ck_subr(o)
4680 OP *o;
4681 {
4682     dTHR;
4683     OP *prev = ((cUNOPo->op_first->op_sibling)
4684              ? cUNOPo : ((UNOP*)cUNOPo->op_first))->op_first;
4685     OP *o2 = prev->op_sibling;
4686     OP *cvop;
4687     char *proto = 0;
4688     CV *cv = 0;
4689     GV *namegv = 0;
4690     int optional = 0;
4691     I32 arg = 0;
4692
4693     for (cvop = o2; cvop->op_sibling; cvop = cvop->op_sibling) ;
4694     if (cvop->op_type == OP_RV2CV) {
4695         SVOP* tmpop;
4696         o->op_private |= (cvop->op_private & OPpENTERSUB_AMPER);
4697         null(cvop);             /* disable rv2cv */
4698         tmpop = (SVOP*)((UNOP*)cvop)->op_first;
4699         if (tmpop->op_type == OP_GV) {
4700             cv = GvCVu(tmpop->op_sv);
4701             if (cv && SvPOK(cv) && !(o->op_private & OPpENTERSUB_AMPER)) {
4702                 namegv = CvANON(cv) ? (GV*)tmpop->op_sv : CvGV(cv);
4703                 proto = SvPV((SV*)cv, na);
4704             }
4705         }
4706     }
4707     o->op_private |= (hints & HINT_STRICT_REFS);
4708     if (PERLDB_SUB && curstash != debstash)
4709         o->op_private |= OPpENTERSUB_DB;
4710     while (o2 != cvop) {
4711         if (proto) {
4712             switch (*proto) {
4713             case '\0':
4714                 return too_many_arguments(o, gv_ename(namegv));
4715             case ';':
4716                 optional = 1;
4717                 proto++;
4718                 continue;
4719             case '$':
4720                 proto++;
4721                 arg++;
4722                 scalar(o2);
4723                 break;
4724             case '%':
4725             case '@':
4726                 list(o2);
4727                 arg++;
4728                 break;
4729             case '&':
4730                 proto++;
4731                 arg++;
4732                 if (o2->op_type != OP_REFGEN && o2->op_type != OP_UNDEF)
4733                     bad_type(arg, "block", gv_ename(namegv), o2);
4734                 break;
4735             case '*':
4736                 proto++;
4737                 arg++;
4738                 if (o2->op_type == OP_RV2GV)
4739                     goto wrapref;
4740                 {
4741                     OP* kid = o2;
4742                     o2 = newUNOP(OP_RV2GV, 0, kid);
4743                     o2->op_sibling = kid->op_sibling;
4744                     kid->op_sibling = 0;
4745                     prev->op_sibling = o;
4746                 }
4747                 goto wrapref;
4748             case '\\':
4749                 proto++;
4750                 arg++;
4751                 switch (*proto++) {
4752                 case '*':
4753                     if (o2->op_type != OP_RV2GV)
4754                         bad_type(arg, "symbol", gv_ename(namegv), o2);
4755                     goto wrapref;
4756                 case '&':
4757                     if (o2->op_type != OP_RV2CV)
4758                         bad_type(arg, "sub", gv_ename(namegv), o2);
4759                     goto wrapref;
4760                 case '$':
4761                     if (o2->op_type != OP_RV2SV && o2->op_type != OP_PADSV)
4762                         bad_type(arg, "scalar", gv_ename(namegv), o2);
4763                     goto wrapref;
4764                 case '@':
4765                     if (o2->op_type != OP_RV2AV && o2->op_type != OP_PADAV)
4766                         bad_type(arg, "array", gv_ename(namegv), o2);
4767                     goto wrapref;
4768                 case '%':
4769                     if (o2->op_type != OP_RV2HV && o2->op_type != OP_PADHV)
4770                         bad_type(arg, "hash", gv_ename(namegv), o2);
4771                   wrapref:
4772                     {
4773                         OP* kid = o2;
4774                         o2 = newUNOP(OP_REFGEN, 0, kid);
4775                         o2->op_sibling = kid->op_sibling;
4776                         kid->op_sibling = 0;
4777                         prev->op_sibling = o2;
4778                     }
4779                     break;
4780                 default: goto oops;
4781                 }
4782                 break;
4783             case ' ':
4784                 proto++;
4785                 continue;
4786             default:
4787               oops:
4788                 croak("Malformed prototype for %s: %s",
4789                         gv_ename(namegv), SvPV((SV*)cv, na));
4790             }
4791         }
4792         else
4793             list(o2);
4794         mod(o2, OP_ENTERSUB);
4795         prev = o2;
4796         o2 = o2->op_sibling;
4797     }
4798     if (proto && !optional &&
4799           (*proto && *proto != '@' && *proto != '%' && *proto != ';'))
4800         return too_few_arguments(o, gv_ename(namegv));
4801     return o;
4802 }
4803
4804 OP *
4805 ck_svconst(o)
4806 OP *o;
4807 {
4808     SvREADONLY_on(cSVOPo->op_sv);
4809     return o;
4810 }
4811
4812 OP *
4813 ck_trunc(o)
4814 OP *o;
4815 {
4816     if (o->op_flags & OPf_KIDS) {
4817         SVOP *kid = (SVOP*)cUNOPo->op_first;
4818
4819         if (kid->op_type == OP_NULL)
4820             kid = (SVOP*)kid->op_sibling;
4821         if (kid &&
4822           kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE))
4823             o->op_flags |= OPf_SPECIAL;
4824     }
4825     return ck_fun(o);
4826 }
4827
4828 /* A peephole optimizer.  We visit the ops in the order they're to execute. */
4829
4830 void
4831 peep(o)
4832 register OP* o;
4833 {
4834     dTHR;
4835     register OP* oldop = 0;
4836     if (!o || o->op_seq)
4837         return;
4838     ENTER;
4839     SAVEOP();
4840     SAVESPTR(curcop);
4841     for (; o; o = o->op_next) {
4842         if (o->op_seq)
4843             break;
4844         if (!op_seqmax)
4845             op_seqmax++;
4846         op = o;
4847         switch (o->op_type) {
4848         case OP_NEXTSTATE:
4849         case OP_DBSTATE:
4850             curcop = ((COP*)o);         /* for warnings */
4851             o->op_seq = op_seqmax++;
4852             break;
4853
4854         case OP_CONCAT:
4855         case OP_CONST:
4856         case OP_JOIN:
4857         case OP_UC:
4858         case OP_UCFIRST:
4859         case OP_LC:
4860         case OP_LCFIRST:
4861         case OP_QUOTEMETA:
4862             if (o->op_next->op_type == OP_STRINGIFY)
4863                 null(o->op_next);
4864             o->op_seq = op_seqmax++;
4865             break;
4866         case OP_STUB:
4867             if ((o->op_flags & OPf_WANT) != OPf_WANT_LIST) {
4868                 o->op_seq = op_seqmax++;
4869                 break; /* Scalar stub must produce undef.  List stub is noop */
4870             }
4871             goto nothin;
4872         case OP_NULL:
4873             if (o->op_targ == OP_NEXTSTATE || o->op_targ == OP_DBSTATE)
4874                 curcop = ((COP*)op);
4875             goto nothin;
4876         case OP_SCALAR:
4877         case OP_LINESEQ:
4878         case OP_SCOPE:
4879           nothin:
4880             if (oldop && o->op_next) {
4881                 oldop->op_next = o->op_next;
4882                 continue;
4883             }
4884             o->op_seq = op_seqmax++;
4885             break;
4886
4887         case OP_GV:
4888             if (o->op_next->op_type == OP_RV2SV) {
4889                 if (!(o->op_next->op_private & OPpDEREF)) {
4890                     null(o->op_next);
4891                     o->op_private |= o->op_next->op_private & OPpLVAL_INTRO;
4892                     o->op_next = o->op_next->op_next;
4893                     o->op_type = OP_GVSV;
4894                     o->op_ppaddr = ppaddr[OP_GVSV];
4895                 }
4896             }
4897             else if (o->op_next->op_type == OP_RV2AV) {
4898                 OP* pop = o->op_next->op_next;
4899                 IV i;
4900                 if (pop->op_type == OP_CONST &&
4901                     (op = pop->op_next) &&
4902                     pop->op_next->op_type == OP_AELEM &&
4903                     !(pop->op_next->op_private &
4904                       (OPpLVAL_INTRO|OPpLVAL_DEFER|OPpDEREF)) &&
4905                     (i = SvIV(((SVOP*)pop)->op_sv) - compiling.cop_arybase)
4906                                 <= 255 &&
4907                     i >= 0)
4908                 {
4909                     SvREFCNT_dec(((SVOP*)pop)->op_sv);
4910                     null(o->op_next);
4911                     null(pop->op_next);
4912                     null(pop);
4913                     o->op_flags |= pop->op_next->op_flags & OPf_MOD;
4914                     o->op_next = pop->op_next->op_next;
4915                     o->op_type = OP_AELEMFAST;
4916                     o->op_ppaddr = ppaddr[OP_AELEMFAST];
4917                     o->op_private = (U8)i;
4918                     GvAVn(((GVOP*)o)->op_gv);
4919                 }
4920             }
4921             o->op_seq = op_seqmax++;
4922             break;
4923
4924         case OP_PADAV:
4925             if (o->op_next->op_type == OP_RV2AV
4926                 && (o->op_next->op_flags && OPf_REF))
4927             {
4928                 null(o->op_next);
4929                 o->op_next = o->op_next->op_next;
4930             }
4931             break;
4932             
4933         case OP_PADHV:
4934             if (o->op_next->op_type == OP_RV2HV
4935                 && (o->op_next->op_flags && OPf_REF))
4936             {
4937                 null(o->op_next);
4938                 o->op_next = o->op_next->op_next;
4939             }
4940             break;
4941
4942         case OP_MAPWHILE:
4943         case OP_GREPWHILE:
4944         case OP_AND:
4945         case OP_OR:
4946             o->op_seq = op_seqmax++;
4947             peep(cLOGOP->op_other);
4948             break;
4949
4950         case OP_COND_EXPR:
4951             o->op_seq = op_seqmax++;
4952             peep(cCONDOP->op_true);
4953             peep(cCONDOP->op_false);
4954             break;
4955
4956         case OP_ENTERLOOP:
4957             o->op_seq = op_seqmax++;
4958             peep(cLOOP->op_redoop);
4959             peep(cLOOP->op_nextop);
4960             peep(cLOOP->op_lastop);
4961             break;
4962
4963         case OP_MATCH:
4964         case OP_SUBST:
4965             o->op_seq = op_seqmax++;
4966             peep(cPMOP->op_pmreplstart);
4967             break;
4968
4969         case OP_EXEC:
4970             o->op_seq = op_seqmax++;
4971             if (dowarn && o->op_next && o->op_next->op_type == OP_NEXTSTATE) {
4972                 if (o->op_next->op_sibling &&
4973                         o->op_next->op_sibling->op_type != OP_DIE) {
4974                     line_t oldline = curcop->cop_line;
4975
4976                     curcop->cop_line = ((COP*)o->op_next)->cop_line;
4977                     warn("Statement unlikely to be reached");
4978                     warn("(Maybe you meant system() when you said exec()?)\n");
4979                     curcop->cop_line = oldline;
4980                 }
4981             }
4982             break;
4983             
4984         case OP_HELEM: {
4985             UNOP *rop;
4986             SV *lexname;
4987             GV **fields;
4988             SV **svp, **indsvp;
4989             I32 ind;
4990             char *key;
4991             STRLEN keylen;
4992             
4993             if (o->op_private & (OPpDEREF_HV|OPpDEREF_AV|OPpLVAL_INTRO)
4994                 || ((BINOP*)o)->op_last->op_type != OP_CONST)
4995                 break;
4996             rop = (UNOP*)((BINOP*)o)->op_first;
4997             if (rop->op_type != OP_RV2HV || rop->op_first->op_type != OP_PADSV)
4998                 break;
4999             lexname = *av_fetch(comppad_name, rop->op_first->op_targ, TRUE);
5000             if (!SvOBJECT(lexname))
5001                 break;
5002             fields = (GV**)hv_fetch(SvSTASH(lexname), "FIELDS", 6, FALSE);
5003             if (!fields || !GvHV(*fields))
5004                 break;
5005             svp = &((SVOP*)((BINOP*)o)->op_last)->op_sv;
5006             key = SvPV(*svp, keylen);
5007             indsvp = hv_fetch(GvHV(*fields), key, keylen, FALSE);
5008             if (!indsvp) {
5009                 croak("No such field \"%s\" in variable %s of type %s",
5010                       key, SvPV(lexname, na), HvNAME(SvSTASH(lexname)));
5011             }
5012             ind = SvIV(*indsvp);
5013             if (ind < 1)
5014                 croak("Bad index while coercing array into hash");
5015             rop->op_type = OP_RV2AV;
5016             rop->op_ppaddr = ppaddr[OP_RV2AV];
5017             o->op_type = OP_AELEM;
5018             o->op_ppaddr = ppaddr[OP_AELEM];
5019             SvREFCNT_dec(*svp);
5020             *svp = newSViv(ind);
5021             break;
5022         }
5023
5024         default:
5025             o->op_seq = op_seqmax++;
5026             break;
5027         }
5028         oldop = o;
5029     }
5030     LEAVE;
5031 }