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