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