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