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