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