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