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