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