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