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