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