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