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