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