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