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