sub : attrlist
[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 STATIC OP *
1580 S_dup_attrlist(pTHX_ OP *o)
1581 {
1582     OP *rop = Nullop;
1583
1584     /* An attrlist is either a simple OP_CONST or an OP_LIST with kids,
1585      * where the first kid is OP_PUSHMARK and the remaining ones
1586      * are OP_CONST.  We need to push the OP_CONST values.
1587      */
1588     if (o->op_type == OP_CONST)
1589         rop = newSVOP(OP_CONST, o->op_flags, SvREFCNT_inc(cSVOPo->op_sv));
1590     else {
1591         assert((o->op_type == OP_LIST) && (o->op_flags & OPf_KIDS));
1592         for (o = cLISTOPo->op_first; o; o=o->op_sibling) {
1593             if (o->op_type == OP_CONST)
1594                 rop = append_elem(OP_LIST, rop,
1595                                   newSVOP(OP_CONST, o->op_flags,
1596                                           SvREFCNT_inc(cSVOPo->op_sv)));
1597         }
1598     }
1599     return rop;
1600 }
1601
1602 STATIC void
1603 S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs)
1604 {
1605     OP *modname;        /* for 'use' */
1606     SV *stashsv;
1607
1608     /* fake up C<use attributes $pkg,$rv,@attrs> */
1609     ENTER;              /* need to protect against side-effects of 'use' */
1610     SAVEINT(PL_expect);
1611     if (stash && HvNAME(stash))
1612         stashsv = newSVpv(HvNAME(stash), 0);
1613     else
1614         stashsv = &PL_sv_no;
1615 #define ATTRSMODULE "attributes"
1616     modname = newSVOP(OP_CONST, 0,
1617                       newSVpvn(ATTRSMODULE, sizeof(ATTRSMODULE)-1));
1618     modname->op_private |= OPpCONST_BARE;
1619     /* that flag is required to make 'use' work right */
1620     utilize(1, start_subparse(FALSE, 0),
1621             Nullop, /* version */
1622             modname,
1623             prepend_elem(OP_LIST,
1624                          newSVOP(OP_CONST, 0, stashsv),
1625                          prepend_elem(OP_LIST,
1626                                       newSVOP(OP_CONST, 0, newRV(target)),
1627                                       dup_attrlist(attrs))));
1628     LEAVE;
1629 }
1630
1631 STATIC OP *
1632 S_my_kid(pTHX_ OP *o, OP *attrs)
1633 {
1634     OP *kid;
1635     I32 type;
1636
1637     if (!o || PL_error_count)
1638         return o;
1639
1640     type = o->op_type;
1641     if (type == OP_LIST) {
1642         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
1643             my_kid(kid, attrs);
1644     } else if (type == OP_UNDEF) {
1645         return o;
1646     } else if (type != OP_PADSV &&
1647              type != OP_PADAV &&
1648              type != OP_PADHV &&
1649              type != OP_PUSHMARK)
1650     {
1651         yyerror(Perl_form(aTHX_ "Can't declare %s in my", PL_op_desc[o->op_type]));
1652         return o;
1653     }
1654     else if (attrs && type != OP_PUSHMARK) {
1655         HV *stash;
1656         SV *padsv;
1657         SV **namesvp;
1658
1659         /* check for C<my Dog $spot> when deciding package */
1660         namesvp = av_fetch(PL_comppad_name, o->op_targ, FALSE);
1661         if (namesvp && *namesvp && SvOBJECT(*namesvp) && HvNAME(SvSTASH(*namesvp)))
1662             stash = SvSTASH(*namesvp);
1663         else
1664             stash = PL_curstash;
1665         padsv = PAD_SV(o->op_targ);
1666         apply_attrs(stash, padsv, attrs);
1667     }
1668     o->op_flags |= OPf_MOD;
1669     o->op_private |= OPpLVAL_INTRO;
1670     return o;
1671 }
1672
1673 OP *
1674 Perl_my_attrs(pTHX_ OP *o, OP *attrs)
1675 {
1676     if (o->op_flags & OPf_PARENS)
1677         list(o);
1678     PL_in_my = FALSE;
1679     PL_in_my_stash = Nullhv;
1680     if (attrs)
1681         SAVEFREEOP(attrs);
1682     return my_kid(o, attrs);
1683 }
1684
1685 OP *
1686 Perl_my(pTHX_ OP *o)
1687 {
1688     return my_kid(o, Nullop);
1689 }
1690
1691 OP *
1692 Perl_sawparens(pTHX_ OP *o)
1693 {
1694     if (o)
1695         o->op_flags |= OPf_PARENS;
1696     return o;
1697 }
1698
1699 OP *
1700 Perl_bind_match(pTHX_ I32 type, OP *left, OP *right)
1701 {
1702     dTHR;
1703     OP *o;
1704
1705     if (ckWARN(WARN_UNSAFE) &&
1706       (left->op_type == OP_RV2AV ||
1707        left->op_type == OP_RV2HV ||
1708        left->op_type == OP_PADAV ||
1709        left->op_type == OP_PADHV)) {
1710       char *desc = PL_op_desc[(right->op_type == OP_SUBST ||
1711                             right->op_type == OP_TRANS)
1712                            ? right->op_type : OP_MATCH];
1713       char *sample = ((left->op_type == OP_RV2AV ||
1714                        left->op_type == OP_PADAV)
1715                       ? "@array" : "%hash");
1716       Perl_warner(aTHX_ WARN_UNSAFE,
1717              "Applying %s to %s will act on scalar(%s)", 
1718              desc, sample, sample);
1719     }
1720
1721     if (right->op_type == OP_MATCH ||
1722         right->op_type == OP_SUBST ||
1723         right->op_type == OP_TRANS) {
1724         right->op_flags |= OPf_STACKED;
1725         if (right->op_type != OP_MATCH)
1726             left = mod(left, right->op_type);
1727         if (right->op_type == OP_TRANS)
1728             o = newBINOP(OP_NULL, OPf_STACKED, scalar(left), right);
1729         else
1730             o = prepend_elem(right->op_type, scalar(left), right);
1731         if (type == OP_NOT)
1732             return newUNOP(OP_NOT, 0, scalar(o));
1733         return o;
1734     }
1735     else
1736         return bind_match(type, left,
1737                 pmruntime(newPMOP(OP_MATCH, 0), right, Nullop));
1738 }
1739
1740 OP *
1741 Perl_invert(pTHX_ OP *o)
1742 {
1743     if (!o)
1744         return o;
1745     /* XXX need to optimize away NOT NOT here?  Or do we let optimizer do it? */
1746     return newUNOP(OP_NOT, OPf_SPECIAL, scalar(o));
1747 }
1748
1749 OP *
1750 Perl_scope(pTHX_ OP *o)
1751 {
1752     if (o) {
1753         if (o->op_flags & OPf_PARENS || PERLDB_NOOPT || PL_tainting) {
1754             o = prepend_elem(OP_LINESEQ, newOP(OP_ENTER, 0), o);
1755             o->op_type = OP_LEAVE;
1756             o->op_ppaddr = PL_ppaddr[OP_LEAVE];
1757         }
1758         else {
1759             if (o->op_type == OP_LINESEQ) {
1760                 OP *kid;
1761                 o->op_type = OP_SCOPE;
1762                 o->op_ppaddr = PL_ppaddr[OP_SCOPE];
1763                 kid = ((LISTOP*)o)->op_first;
1764                 if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE){
1765                     kid->op_type = OP_SETSTATE;
1766                     kid->op_ppaddr = PL_ppaddr[OP_SETSTATE];
1767                 }
1768             }
1769             else
1770                 o = newLISTOP(OP_SCOPE, 0, o, Nullop);
1771         }
1772     }
1773     return o;
1774 }
1775
1776 void
1777 Perl_save_hints(pTHX)
1778 {
1779     SAVEI32(PL_hints);
1780     SAVESPTR(GvHV(PL_hintgv));
1781     GvHV(PL_hintgv) = newHVhv(GvHV(PL_hintgv));
1782     SAVEFREESV(GvHV(PL_hintgv));
1783 }
1784
1785 int
1786 Perl_block_start(pTHX_ int full)
1787 {
1788     dTHR;
1789     int retval = PL_savestack_ix;
1790
1791     SAVEI32(PL_comppad_name_floor);
1792     if (full) {
1793         if ((PL_comppad_name_fill = AvFILLp(PL_comppad_name)) > 0)
1794             PL_comppad_name_floor = PL_comppad_name_fill;
1795         else
1796             PL_comppad_name_floor = 0;
1797     }
1798     SAVEI32(PL_min_intro_pending);
1799     SAVEI32(PL_max_intro_pending);
1800     PL_min_intro_pending = 0;
1801     SAVEI32(PL_comppad_name_fill);
1802     SAVEI32(PL_padix_floor);
1803     PL_padix_floor = PL_padix;
1804     PL_pad_reset_pending = FALSE;
1805     SAVEHINTS();
1806     PL_hints &= ~HINT_BLOCK_SCOPE;
1807     SAVEPPTR(PL_compiling.cop_warnings); 
1808     if (! specialWARN(PL_compiling.cop_warnings)) {
1809         PL_compiling.cop_warnings = newSVsv(PL_compiling.cop_warnings) ;
1810         SAVEFREESV(PL_compiling.cop_warnings) ;
1811     }
1812
1813
1814     return retval;
1815 }
1816
1817 OP*
1818 Perl_block_end(pTHX_ I32 floor, OP *seq)
1819 {
1820     dTHR;
1821     int needblockscope = PL_hints & HINT_BLOCK_SCOPE;
1822     OP* retval = scalarseq(seq);
1823     LEAVE_SCOPE(floor);
1824     PL_pad_reset_pending = FALSE;
1825     PL_compiling.op_private = PL_hints;
1826     if (needblockscope)
1827         PL_hints |= HINT_BLOCK_SCOPE; /* propagate out */
1828     pad_leavemy(PL_comppad_name_fill);
1829     PL_cop_seqmax++;
1830     return retval;
1831 }
1832
1833 STATIC OP *
1834 S_newDEFSVOP(pTHX)
1835 {
1836 #ifdef USE_THREADS
1837     OP *o = newOP(OP_THREADSV, 0);
1838     o->op_targ = find_threadsv("_");
1839     return o;
1840 #else
1841     return newSVREF(newGVOP(OP_GV, 0, PL_defgv));
1842 #endif /* USE_THREADS */
1843 }
1844
1845 void
1846 Perl_newPROG(pTHX_ OP *o)
1847 {
1848     dTHR;
1849     if (PL_in_eval) {
1850         if (PL_eval_root)
1851                 return;
1852         PL_eval_root = newUNOP(OP_LEAVEEVAL,
1853                                ((PL_in_eval & EVAL_KEEPERR)
1854                                 ? OPf_SPECIAL : 0), o);
1855         PL_eval_start = linklist(PL_eval_root);
1856         PL_eval_root->op_next = 0;
1857         peep(PL_eval_start);
1858     }
1859     else {
1860         if (!o)
1861             return;
1862         PL_main_root = scope(sawparens(scalarvoid(o)));
1863         PL_curcop = &PL_compiling;
1864         PL_main_start = LINKLIST(PL_main_root);
1865         PL_main_root->op_next = 0;
1866         peep(PL_main_start);
1867         PL_compcv = 0;
1868
1869         /* Register with debugger */
1870         if (PERLDB_INTER) {
1871             CV *cv = get_cv("DB::postponed", FALSE);
1872             if (cv) {
1873                 dSP;
1874                 PUSHMARK(SP);
1875                 XPUSHs((SV*)PL_compiling.cop_filegv);
1876                 PUTBACK;
1877                 call_sv((SV*)cv, G_DISCARD);
1878             }
1879         }
1880     }
1881 }
1882
1883 OP *
1884 Perl_localize(pTHX_ OP *o, I32 lex)
1885 {
1886     if (o->op_flags & OPf_PARENS)
1887         list(o);
1888     else {
1889         dTHR;
1890         if (ckWARN(WARN_PARENTHESIS) && PL_bufptr > PL_oldbufptr && PL_bufptr[-1] == ',') {
1891             char *s;
1892             for (s = PL_bufptr; *s && (isALNUM(*s) || (*s & 0x80) || strchr("@$%, ",*s)); s++) ;
1893             if (*s == ';' || *s == '=')
1894                 Perl_warner(aTHX_ WARN_PARENTHESIS, "Parentheses missing around \"%s\" list",
1895                                 lex ? "my" : "local");
1896         }
1897     }
1898     PL_in_my = FALSE;
1899     PL_in_my_stash = Nullhv;
1900     if (lex)
1901         return my(o);
1902     else
1903         return mod(o, OP_NULL);         /* a bit kludgey */
1904 }
1905
1906 OP *
1907 Perl_jmaybe(pTHX_ OP *o)
1908 {
1909     if (o->op_type == OP_LIST) {
1910         OP *o2;
1911 #ifdef USE_THREADS
1912         o2 = newOP(OP_THREADSV, 0);
1913         o2->op_targ = find_threadsv(";");
1914 #else
1915         o2 = newSVREF(newGVOP(OP_GV, 0, gv_fetchpv(";", TRUE, SVt_PV))),
1916 #endif /* USE_THREADS */
1917         o = convert(OP_JOIN, 0, prepend_elem(OP_LIST, o2, o));
1918     }
1919     return o;
1920 }
1921
1922 OP *
1923 Perl_fold_constants(pTHX_ register OP *o)
1924 {
1925     dTHR;
1926     register OP *curop;
1927     I32 type = o->op_type;
1928     SV *sv;
1929
1930     if (PL_opargs[type] & OA_RETSCALAR)
1931         scalar(o);
1932     if (PL_opargs[type] & OA_TARGET && !o->op_targ)
1933         o->op_targ = pad_alloc(type, SVs_PADTMP);
1934
1935     /* integerize op, unless it happens to be C<-foo>.
1936      * XXX should pp_i_negate() do magic string negation instead? */
1937     if ((PL_opargs[type] & OA_OTHERINT) && (PL_hints & HINT_INTEGER)
1938         && !(type == OP_NEGATE && cUNOPo->op_first->op_type == OP_CONST
1939              && (cUNOPo->op_first->op_private & OPpCONST_BARE)))
1940     {
1941         o->op_ppaddr = PL_ppaddr[type = ++(o->op_type)];
1942     }
1943
1944     if (!(PL_opargs[type] & OA_FOLDCONST))
1945         goto nope;
1946
1947     switch (type) {
1948     case OP_NEGATE:
1949         /* XXX might want a ck_negate() for this */
1950         cUNOPo->op_first->op_private &= ~OPpCONST_STRICT;
1951         break;
1952     case OP_SPRINTF:
1953     case OP_UCFIRST:
1954     case OP_LCFIRST:
1955     case OP_UC:
1956     case OP_LC:
1957     case OP_SLT:
1958     case OP_SGT:
1959     case OP_SLE:
1960     case OP_SGE:
1961     case OP_SCMP:
1962
1963         if (o->op_private & OPpLOCALE)
1964             goto nope;
1965     }
1966
1967     if (PL_error_count)
1968         goto nope;              /* Don't try to run w/ errors */
1969
1970     for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
1971         if ((curop->op_type != OP_CONST ||
1972              (curop->op_private & OPpCONST_BARE)) &&
1973             curop->op_type != OP_LIST &&
1974             curop->op_type != OP_SCALAR &&
1975             curop->op_type != OP_NULL &&
1976             curop->op_type != OP_PUSHMARK)
1977         {
1978             goto nope;
1979         }
1980     }
1981
1982     curop = LINKLIST(o);
1983     o->op_next = 0;
1984     PL_op = curop;
1985     CALLRUNOPS(aTHX);
1986     sv = *(PL_stack_sp--);
1987     if (o->op_targ && sv == PAD_SV(o->op_targ)) /* grab pad temp? */
1988         pad_swipe(o->op_targ);
1989     else if (SvTEMP(sv)) {                      /* grab mortal temp? */
1990         (void)SvREFCNT_inc(sv);
1991         SvTEMP_off(sv);
1992     }
1993     op_free(o);
1994     if (type == OP_RV2GV)
1995         return newGVOP(OP_GV, 0, (GV*)sv);
1996     else {
1997         /* try to smush double to int, but don't smush -2.0 to -2 */
1998         if ((SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK)) == SVf_NOK &&
1999             type != OP_NEGATE)
2000         {
2001             IV iv = SvIV(sv);
2002             if ((NV)iv == SvNV(sv)) {
2003                 SvREFCNT_dec(sv);
2004                 sv = newSViv(iv);
2005             }
2006             else
2007                 SvIOK_off(sv);                  /* undo SvIV() damage */
2008         }
2009         return newSVOP(OP_CONST, 0, sv);
2010     }
2011
2012   nope:
2013     if (!(PL_opargs[type] & OA_OTHERINT))
2014         return o;
2015
2016     if (!(PL_hints & HINT_INTEGER)) {
2017         if (type == OP_DIVIDE || !(o->op_flags & OPf_KIDS))
2018             return o;
2019
2020         for (curop = ((UNOP*)o)->op_first; curop; curop = curop->op_sibling) {
2021             if (curop->op_type == OP_CONST) {
2022                 if (SvIOK(((SVOP*)curop)->op_sv))
2023                     continue;
2024                 return o;
2025             }
2026             if (PL_opargs[curop->op_type] & OA_RETINTEGER)
2027                 continue;
2028             return o;
2029         }
2030         o->op_ppaddr = PL_ppaddr[++(o->op_type)];
2031     }
2032
2033     return o;
2034 }
2035
2036 OP *
2037 Perl_gen_constant_list(pTHX_ register OP *o)
2038 {
2039     dTHR;
2040     register OP *curop;
2041     I32 oldtmps_floor = PL_tmps_floor;
2042
2043     list(o);
2044     if (PL_error_count)
2045         return o;               /* Don't attempt to run with errors */
2046
2047     PL_op = curop = LINKLIST(o);
2048     o->op_next = 0;
2049     pp_pushmark();
2050     CALLRUNOPS(aTHX);
2051     PL_op = curop;
2052     pp_anonlist();
2053     PL_tmps_floor = oldtmps_floor;
2054
2055     o->op_type = OP_RV2AV;
2056     o->op_ppaddr = PL_ppaddr[OP_RV2AV];
2057     curop = ((UNOP*)o)->op_first;
2058     ((UNOP*)o)->op_first = newSVOP(OP_CONST, 0, SvREFCNT_inc(*PL_stack_sp--));
2059     op_free(curop);
2060     linklist(o);
2061     return list(o);
2062 }
2063
2064 OP *
2065 Perl_convert(pTHX_ I32 type, I32 flags, OP *o)
2066 {
2067     OP *kid;
2068     OP *last = 0;
2069
2070     if (!o || o->op_type != OP_LIST)
2071         o = newLISTOP(OP_LIST, 0, o, Nullop);
2072     else
2073         o->op_flags &= ~OPf_WANT;
2074
2075     if (!(PL_opargs[type] & OA_MARK))
2076         null(cLISTOPo->op_first);
2077
2078     o->op_type = type;
2079     o->op_ppaddr = PL_ppaddr[type];
2080     o->op_flags |= flags;
2081
2082     o = CHECKOP(type, o);
2083     if (o->op_type != type)
2084         return o;
2085
2086     if (cLISTOPo->op_children < 7) {
2087         /* XXX do we really need to do this if we're done appending?? */
2088         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
2089             last = kid;
2090         cLISTOPo->op_last = last;       /* in case check substituted last arg */
2091     }
2092
2093     return fold_constants(o);
2094 }
2095
2096 /* List constructors */
2097
2098 OP *
2099 Perl_append_elem(pTHX_ I32 type, OP *first, OP *last)
2100 {
2101     if (!first)
2102         return last;
2103
2104     if (!last)
2105         return first;
2106
2107     if (first->op_type != type || type==OP_LIST && first->op_flags & OPf_PARENS)
2108             return newLISTOP(type, 0, first, last);
2109
2110     if (first->op_flags & OPf_KIDS)
2111         ((LISTOP*)first)->op_last->op_sibling = last;
2112     else {
2113         first->op_flags |= OPf_KIDS;
2114         ((LISTOP*)first)->op_first = last;
2115     }
2116     ((LISTOP*)first)->op_last = last;
2117     ((LISTOP*)first)->op_children++;
2118     return first;
2119 }
2120
2121 OP *
2122 Perl_append_list(pTHX_ I32 type, LISTOP *first, LISTOP *last)
2123 {
2124     if (!first)
2125         return (OP*)last;
2126
2127     if (!last)
2128         return (OP*)first;
2129
2130     if (first->op_type != type)
2131         return prepend_elem(type, (OP*)first, (OP*)last);
2132
2133     if (last->op_type != type)
2134         return append_elem(type, (OP*)first, (OP*)last);
2135
2136     first->op_last->op_sibling = last->op_first;
2137     first->op_last = last->op_last;
2138     first->op_children += last->op_children;
2139     if (first->op_children)
2140         first->op_flags |= OPf_KIDS;
2141     
2142 #ifdef PL_OP_SLAB_ALLOC
2143 #else
2144     Safefree(last);     
2145 #endif
2146     return (OP*)first;
2147 }
2148
2149 OP *
2150 Perl_prepend_elem(pTHX_ I32 type, OP *first, OP *last)
2151 {
2152     if (!first)
2153         return last;
2154
2155     if (!last)
2156         return first;
2157
2158     if (last->op_type == type) {
2159         if (type == OP_LIST) {  /* already a PUSHMARK there */
2160             first->op_sibling = ((LISTOP*)last)->op_first->op_sibling;
2161             ((LISTOP*)last)->op_first->op_sibling = first;
2162         }
2163         else {
2164             if (!(last->op_flags & OPf_KIDS)) {
2165                 ((LISTOP*)last)->op_last = first;
2166                 last->op_flags |= OPf_KIDS;
2167             }
2168             first->op_sibling = ((LISTOP*)last)->op_first;
2169             ((LISTOP*)last)->op_first = first;
2170         }
2171         ((LISTOP*)last)->op_children++;
2172         return last;
2173     }
2174
2175     return newLISTOP(type, 0, first, last);
2176 }
2177
2178 /* Constructors */
2179
2180 OP *
2181 Perl_newNULLLIST(pTHX)
2182 {
2183     return newOP(OP_STUB, 0);
2184 }
2185
2186 OP *
2187 Perl_force_list(pTHX_ OP *o)
2188 {
2189     if (!o || o->op_type != OP_LIST)
2190         o = newLISTOP(OP_LIST, 0, o, Nullop);
2191     null(o);
2192     return o;
2193 }
2194
2195 OP *
2196 Perl_newLISTOP(pTHX_ I32 type, I32 flags, OP *first, OP *last)
2197 {
2198     LISTOP *listop;
2199
2200     NewOp(1101, listop, 1, LISTOP);
2201
2202     listop->op_type = type;
2203     listop->op_ppaddr = PL_ppaddr[type];
2204     listop->op_children = (first != 0) + (last != 0);
2205     listop->op_flags = flags;
2206
2207     if (!last && first)
2208         last = first;
2209     else if (!first && last)
2210         first = last;
2211     else if (first)
2212         first->op_sibling = last;
2213     listop->op_first = first;
2214     listop->op_last = last;
2215     if (type == OP_LIST) {
2216         OP* pushop;
2217         pushop = newOP(OP_PUSHMARK, 0);
2218         pushop->op_sibling = first;
2219         listop->op_first = pushop;
2220         listop->op_flags |= OPf_KIDS;
2221         if (!last)
2222             listop->op_last = pushop;
2223     }
2224     else if (listop->op_children)
2225         listop->op_flags |= OPf_KIDS;
2226
2227     return (OP*)listop;
2228 }
2229
2230 OP *
2231 Perl_newOP(pTHX_ I32 type, I32 flags)
2232 {
2233     OP *o;
2234     NewOp(1101, o, 1, OP);
2235     o->op_type = type;
2236     o->op_ppaddr = PL_ppaddr[type];
2237     o->op_flags = flags;
2238
2239     o->op_next = o;
2240     o->op_private = 0 + (flags >> 8);
2241     if (PL_opargs[type] & OA_RETSCALAR)
2242         scalar(o);
2243     if (PL_opargs[type] & OA_TARGET)
2244         o->op_targ = pad_alloc(type, SVs_PADTMP);
2245     return CHECKOP(type, o);
2246 }
2247
2248 OP *
2249 Perl_newUNOP(pTHX_ I32 type, I32 flags, OP *first)
2250 {
2251     UNOP *unop;
2252
2253     if (!first)
2254         first = newOP(OP_STUB, 0);
2255     if (PL_opargs[type] & OA_MARK)
2256         first = force_list(first);
2257
2258     NewOp(1101, unop, 1, UNOP);
2259     unop->op_type = type;
2260     unop->op_ppaddr = PL_ppaddr[type];
2261     unop->op_first = first;
2262     unop->op_flags = flags | OPf_KIDS;
2263     unop->op_private = 1 | (flags >> 8);
2264     unop = (UNOP*) CHECKOP(type, unop);
2265     if (unop->op_next)
2266         return (OP*)unop;
2267
2268     return fold_constants((OP *) unop);
2269 }
2270
2271 OP *
2272 Perl_newBINOP(pTHX_ I32 type, I32 flags, OP *first, OP *last)
2273 {
2274     BINOP *binop;
2275     NewOp(1101, binop, 1, BINOP);
2276
2277     if (!first)
2278         first = newOP(OP_NULL, 0);
2279
2280     binop->op_type = type;
2281     binop->op_ppaddr = PL_ppaddr[type];
2282     binop->op_first = first;
2283     binop->op_flags = flags | OPf_KIDS;
2284     if (!last) {
2285         last = first;
2286         binop->op_private = 1 | (flags >> 8);
2287     }
2288     else {
2289         binop->op_private = 2 | (flags >> 8);
2290         first->op_sibling = last;
2291     }
2292
2293     binop = (BINOP*)CHECKOP(type, binop);
2294     if (binop->op_next || binop->op_type != type)
2295         return (OP*)binop;
2296
2297     binop->op_last = binop->op_first->op_sibling;
2298
2299     return fold_constants((OP *)binop);
2300 }
2301
2302 static int
2303 utf8compare(const void *a, const void *b)
2304 {
2305     int i;
2306     for (i = 0; i < 10; i++) {
2307         if ((*(U8**)a)[i] < (*(U8**)b)[i])
2308             return -1;
2309         if ((*(U8**)a)[i] > (*(U8**)b)[i])
2310             return 1;
2311     }
2312     return 0;
2313 }
2314
2315 OP *
2316 Perl_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
2317 {
2318     SV *tstr = ((SVOP*)expr)->op_sv;
2319     SV *rstr = ((SVOP*)repl)->op_sv;
2320     STRLEN tlen;
2321     STRLEN rlen;
2322     register U8 *t = (U8*)SvPV(tstr, tlen);
2323     register U8 *r = (U8*)SvPV(rstr, rlen);
2324     register I32 i;
2325     register I32 j;
2326     I32 del;
2327     I32 complement;
2328     I32 squash;
2329     register short *tbl;
2330
2331     complement  = o->op_private & OPpTRANS_COMPLEMENT;
2332     del         = o->op_private & OPpTRANS_DELETE;
2333     squash      = o->op_private & OPpTRANS_SQUASH;
2334
2335     if (o->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF)) {
2336         SV* listsv = newSVpvn("# comment\n",10);
2337         SV* transv = 0;
2338         U8* tend = t + tlen;
2339         U8* rend = r + rlen;
2340         I32 ulen;
2341         U32 tfirst = 1;
2342         U32 tlast = 0;
2343         I32 tdiff;
2344         U32 rfirst = 1;
2345         U32 rlast = 0;
2346         I32 rdiff;
2347         I32 diff;
2348         I32 none = 0;
2349         U32 max = 0;
2350         I32 bits;
2351         I32 grows = 0;
2352         I32 havefinal = 0;
2353         U32 final;
2354         HV *hv;
2355         I32 from_utf    = o->op_private & OPpTRANS_FROM_UTF;
2356         I32 to_utf      = o->op_private & OPpTRANS_TO_UTF;
2357
2358         if (complement) {
2359             U8 tmpbuf[10];
2360             U8** cp;
2361             UV nextmin = 0;
2362             New(1109, cp, tlen, U8*);
2363             i = 0;
2364             transv = newSVpvn("",0);
2365             while (t < tend) {
2366                 cp[i++] = t;
2367                 t += UTF8SKIP(t);
2368                 if (*t == 0xff) {
2369                     t++;
2370                     t += UTF8SKIP(t);
2371                 }
2372             }
2373             qsort(cp, i, sizeof(U8*), utf8compare);
2374             for (j = 0; j < i; j++) {
2375                 U8 *s = cp[j];
2376                 UV val = utf8_to_uv(s, &ulen);
2377                 s += ulen;
2378                 diff = val - nextmin;
2379                 if (diff > 0) {
2380                     t = uv_to_utf8(tmpbuf,nextmin);
2381                     sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
2382                     if (diff > 1) {
2383                         t = uv_to_utf8(tmpbuf, val - 1);
2384                         sv_catpvn(transv, "\377", 1);
2385                         sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
2386                     }
2387                 }
2388                 if (*s == 0xff)
2389                     val = utf8_to_uv(s+1, &ulen);
2390                 if (val >= nextmin)
2391                     nextmin = val + 1;
2392             }
2393             t = uv_to_utf8(tmpbuf,nextmin);
2394             sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
2395             t = uv_to_utf8(tmpbuf, 0x7fffffff);
2396             sv_catpvn(transv, "\377", 1);
2397             sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
2398             t = (U8*)SvPVX(transv);
2399             tlen = SvCUR(transv);
2400             tend = t + tlen;
2401         }
2402         else if (!rlen && !del) {
2403             r = t; rlen = tlen; rend = tend;
2404         }
2405         if (!squash) {
2406             if (to_utf && from_utf) {   /* only counting characters */
2407                 if (t == r || (tlen == rlen && memEQ(t, r, tlen)))
2408                     o->op_private |= OPpTRANS_IDENTICAL;
2409             }
2410             else {      /* straight latin-1 translation */
2411                 if (tlen == 4 && memEQ(t, "\0\377\303\277", 4) &&
2412                     rlen == 4 && memEQ(r, "\0\377\303\277", 4))
2413                     o->op_private |= OPpTRANS_IDENTICAL;
2414             }
2415         }
2416
2417         while (t < tend || tfirst <= tlast) {
2418             /* see if we need more "t" chars */
2419             if (tfirst > tlast) {
2420                 tfirst = (I32)utf8_to_uv(t, &ulen);
2421                 t += ulen;
2422                 if (t < tend && *t == 0xff) {   /* illegal utf8 val indicates range */
2423                     tlast = (I32)utf8_to_uv(++t, &ulen);
2424                     t += ulen;
2425                 }
2426                 else
2427                     tlast = tfirst;
2428             }
2429
2430             /* now see if we need more "r" chars */
2431             if (rfirst > rlast) {
2432                 if (r < rend) {
2433                     rfirst = (I32)utf8_to_uv(r, &ulen);
2434                     r += ulen;
2435                     if (r < rend && *r == 0xff) {       /* illegal utf8 val indicates range */
2436                         rlast = (I32)utf8_to_uv(++r, &ulen);
2437                         r += ulen;
2438                     }
2439                     else
2440                         rlast = rfirst;
2441                 }
2442                 else {
2443                     if (!havefinal++)
2444                         final = rlast;
2445                     rfirst = rlast = 0xffffffff;
2446                 }
2447             }
2448
2449             /* now see which range will peter our first, if either. */
2450             tdiff = tlast - tfirst;
2451             rdiff = rlast - rfirst;
2452
2453             if (tdiff <= rdiff)
2454                 diff = tdiff;
2455             else
2456                 diff = rdiff;
2457
2458             if (rfirst == 0xffffffff) {
2459                 diff = tdiff;   /* oops, pretend rdiff is infinite */
2460                 if (diff > 0)
2461                     Perl_sv_catpvf(aTHX_ listsv, "%04x\t%04x\tXXXX\n", tfirst, tlast);
2462                 else
2463                     Perl_sv_catpvf(aTHX_ listsv, "%04x\t\tXXXX\n", tfirst);
2464             }
2465             else {
2466                 if (diff > 0)
2467                     Perl_sv_catpvf(aTHX_ listsv, "%04x\t%04x\t%04x\n", tfirst, tfirst + diff, rfirst);
2468                 else
2469                     Perl_sv_catpvf(aTHX_ listsv, "%04x\t\t%04x\n", tfirst, rfirst);
2470
2471                 if (rfirst + diff > max)
2472                     max = rfirst + diff;
2473                 rfirst += diff + 1;
2474                 if (!grows) {
2475                     if (rfirst <= 0x80)
2476                         ;
2477                     else if (rfirst <= 0x800)
2478                         grows |= (tfirst < 0x80);
2479                     else if (rfirst <= 0x10000)
2480                         grows |= (tfirst < 0x800);
2481                     else if (rfirst <= 0x200000)
2482                         grows |= (tfirst < 0x10000);
2483                     else if (rfirst <= 0x4000000)
2484                         grows |= (tfirst < 0x200000);
2485                     else if (rfirst <= 0x80000000)
2486                         grows |= (tfirst < 0x4000000);
2487                 }
2488             }
2489             tfirst += diff + 1;
2490         }
2491
2492         none = ++max;
2493         if (del)
2494             del = ++max;
2495
2496         if (max > 0xffff)
2497             bits = 32;
2498         else if (max > 0xff)
2499             bits = 16;
2500         else
2501             bits = 8;
2502
2503         cSVOPo->op_sv = (SV*)swash_init("utf8", "", listsv, bits, none);
2504         SvREFCNT_dec(listsv);
2505         if (transv)
2506             SvREFCNT_dec(transv);
2507
2508         if (!del && havefinal)
2509             (void)hv_store((HV*)SvRV((cSVOPo->op_sv)), "FINAL", 5, newSViv((IV)final), 0);
2510
2511         if (grows && to_utf)
2512             o->op_private |= OPpTRANS_GROWS;
2513
2514         op_free(expr);
2515         op_free(repl);
2516         return o;
2517     }
2518
2519     tbl = (short*)cPVOPo->op_pv;
2520     if (complement) {
2521         Zero(tbl, 256, short);
2522         for (i = 0; i < tlen; i++)
2523             tbl[t[i]] = -1;
2524         for (i = 0, j = 0; i < 256; i++) {
2525             if (!tbl[i]) {
2526                 if (j >= rlen) {
2527                     if (del)
2528                         tbl[i] = -2;
2529                     else if (rlen)
2530                         tbl[i] = r[j-1];
2531                     else
2532                         tbl[i] = i;
2533                 }
2534                 else
2535                     tbl[i] = r[j++];
2536             }
2537         }
2538     }
2539     else {
2540         if (!rlen && !del) {
2541             r = t; rlen = tlen;
2542             if (!squash)
2543                 o->op_private |= OPpTRANS_IDENTICAL;
2544         }
2545         for (i = 0; i < 256; i++)
2546             tbl[i] = -1;
2547         for (i = 0, j = 0; i < tlen; i++,j++) {
2548             if (j >= rlen) {
2549                 if (del) {
2550                     if (tbl[t[i]] == -1)
2551                         tbl[t[i]] = -2;
2552                     continue;
2553                 }
2554                 --j;
2555             }
2556             if (tbl[t[i]] == -1)
2557                 tbl[t[i]] = r[j];
2558         }
2559     }
2560     op_free(expr);
2561     op_free(repl);
2562
2563     return o;
2564 }
2565
2566 OP *
2567 Perl_newPMOP(pTHX_ I32 type, I32 flags)
2568 {
2569     dTHR;
2570     PMOP *pmop;
2571
2572     NewOp(1101, pmop, 1, PMOP);
2573     pmop->op_type = type;
2574     pmop->op_ppaddr = PL_ppaddr[type];
2575     pmop->op_flags = flags;
2576     pmop->op_private = 0 | (flags >> 8);
2577
2578     if (PL_hints & HINT_RE_TAINT)
2579         pmop->op_pmpermflags |= PMf_RETAINT;
2580     if (PL_hints & HINT_LOCALE)
2581         pmop->op_pmpermflags |= PMf_LOCALE;
2582     pmop->op_pmflags = pmop->op_pmpermflags;
2583
2584     /* link into pm list */
2585     if (type != OP_TRANS && PL_curstash) {
2586         pmop->op_pmnext = HvPMROOT(PL_curstash);
2587         HvPMROOT(PL_curstash) = pmop;
2588     }
2589
2590     return (OP*)pmop;
2591 }
2592
2593 OP *
2594 Perl_pmruntime(pTHX_ OP *o, OP *expr, OP *repl)
2595 {
2596     dTHR;
2597     PMOP *pm;
2598     LOGOP *rcop;
2599     I32 repl_has_vars = 0;
2600
2601     if (o->op_type == OP_TRANS)
2602         return pmtrans(o, expr, repl);
2603
2604     PL_hints |= HINT_BLOCK_SCOPE;
2605     pm = (PMOP*)o;
2606
2607     if (expr->op_type == OP_CONST) {
2608         STRLEN plen;
2609         SV *pat = ((SVOP*)expr)->op_sv;
2610         char *p = SvPV(pat, plen);
2611         if ((o->op_flags & OPf_SPECIAL) && strEQ(p, " ")) {
2612             sv_setpvn(pat, "\\s+", 3);
2613             p = SvPV(pat, plen);
2614             pm->op_pmflags |= PMf_SKIPWHITE;
2615         }
2616         pm->op_pmregexp = CALLREGCOMP(aTHX_ p, p + plen, pm);
2617         if (strEQ("\\s+", pm->op_pmregexp->precomp))
2618             pm->op_pmflags |= PMf_WHITE;
2619         op_free(expr);
2620     }
2621     else {
2622         if (pm->op_pmflags & PMf_KEEP || !(PL_hints & HINT_RE_EVAL))
2623             expr = newUNOP((!(PL_hints & HINT_RE_EVAL) 
2624                             ? OP_REGCRESET
2625                             : OP_REGCMAYBE),0,expr);
2626
2627         NewOp(1101, rcop, 1, LOGOP);
2628         rcop->op_type = OP_REGCOMP;
2629         rcop->op_ppaddr = PL_ppaddr[OP_REGCOMP];
2630         rcop->op_first = scalar(expr);
2631         rcop->op_flags |= ((PL_hints & HINT_RE_EVAL) 
2632                            ? (OPf_SPECIAL | OPf_KIDS)
2633                            : OPf_KIDS);
2634         rcop->op_private = 1;
2635         rcop->op_other = o;
2636
2637         /* establish postfix order */
2638         if (pm->op_pmflags & PMf_KEEP || !(PL_hints & HINT_RE_EVAL)) {
2639             LINKLIST(expr);
2640             rcop->op_next = expr;
2641             ((UNOP*)expr)->op_first->op_next = (OP*)rcop;
2642         }
2643         else {
2644             rcop->op_next = LINKLIST(expr);
2645             expr->op_next = (OP*)rcop;
2646         }
2647
2648         prepend_elem(o->op_type, scalar((OP*)rcop), o);
2649     }
2650
2651     if (repl) {
2652         OP *curop;
2653         if (pm->op_pmflags & PMf_EVAL) {
2654             curop = 0;
2655             if (PL_curcop->cop_line < PL_multi_end)
2656                 PL_curcop->cop_line = PL_multi_end;
2657         }
2658 #ifdef USE_THREADS
2659         else if (repl->op_type == OP_THREADSV
2660                  && strchr("&`'123456789+",
2661                            PL_threadsv_names[repl->op_targ]))
2662         {
2663             curop = 0;
2664         }
2665 #endif /* USE_THREADS */
2666         else if (repl->op_type == OP_CONST)
2667             curop = repl;
2668         else {
2669             OP *lastop = 0;
2670             for (curop = LINKLIST(repl); curop!=repl; curop = LINKLIST(curop)) {
2671                 if (PL_opargs[curop->op_type] & OA_DANGEROUS) {
2672 #ifdef USE_THREADS
2673                     if (curop->op_type == OP_THREADSV) {
2674                         repl_has_vars = 1;
2675                         if (strchr("&`'123456789+", curop->op_private))
2676                             break;
2677                     }
2678 #else
2679                     if (curop->op_type == OP_GV) {
2680                         GV *gv = ((GVOP*)curop)->op_gv;
2681                         repl_has_vars = 1;
2682                         if (strchr("&`'123456789+", *GvENAME(gv)))
2683                             break;
2684                     }
2685 #endif /* USE_THREADS */
2686                     else if (curop->op_type == OP_RV2CV)
2687                         break;
2688                     else if (curop->op_type == OP_RV2SV ||
2689                              curop->op_type == OP_RV2AV ||
2690                              curop->op_type == OP_RV2HV ||
2691                              curop->op_type == OP_RV2GV) {
2692                         if (lastop && lastop->op_type != OP_GV) /*funny deref?*/
2693                             break;
2694                     }
2695                     else if (curop->op_type == OP_PADSV ||
2696                              curop->op_type == OP_PADAV ||
2697                              curop->op_type == OP_PADHV ||
2698                              curop->op_type == OP_PADANY) {
2699                         repl_has_vars = 1;
2700                     }
2701                     else if (curop->op_type == OP_PUSHRE)
2702                         ; /* Okay here, dangerous in newASSIGNOP */
2703                     else
2704                         break;
2705                 }
2706                 lastop = curop;
2707             }
2708         }
2709         if (curop == repl
2710             && !(repl_has_vars 
2711                  && (!pm->op_pmregexp 
2712                      || pm->op_pmregexp->reganch & ROPT_EVAL_SEEN))) {
2713             pm->op_pmflags |= PMf_CONST;        /* const for long enough */
2714             pm->op_pmpermflags |= PMf_CONST;    /* const for long enough */
2715             prepend_elem(o->op_type, scalar(repl), o);
2716         }
2717         else {
2718             if (curop == repl && !pm->op_pmregexp) { /* Has variables. */
2719                 pm->op_pmflags |= PMf_MAYBE_CONST;
2720                 pm->op_pmpermflags |= PMf_MAYBE_CONST;
2721             }
2722             NewOp(1101, rcop, 1, LOGOP);
2723             rcop->op_type = OP_SUBSTCONT;
2724             rcop->op_ppaddr = PL_ppaddr[OP_SUBSTCONT];
2725             rcop->op_first = scalar(repl);
2726             rcop->op_flags |= OPf_KIDS;
2727             rcop->op_private = 1;
2728             rcop->op_other = o;
2729
2730             /* establish postfix order */
2731             rcop->op_next = LINKLIST(repl);
2732             repl->op_next = (OP*)rcop;
2733
2734             pm->op_pmreplroot = scalar((OP*)rcop);
2735             pm->op_pmreplstart = LINKLIST(rcop);
2736             rcop->op_next = 0;
2737         }
2738     }
2739
2740     return (OP*)pm;
2741 }
2742
2743 OP *
2744 Perl_newSVOP(pTHX_ I32 type, I32 flags, SV *sv)
2745 {
2746     SVOP *svop;
2747     NewOp(1101, svop, 1, SVOP);
2748     svop->op_type = type;
2749     svop->op_ppaddr = PL_ppaddr[type];
2750     svop->op_sv = sv;
2751     svop->op_next = (OP*)svop;
2752     svop->op_flags = flags;
2753     if (PL_opargs[type] & OA_RETSCALAR)
2754         scalar((OP*)svop);
2755     if (PL_opargs[type] & OA_TARGET)
2756         svop->op_targ = pad_alloc(type, SVs_PADTMP);
2757     return CHECKOP(type, svop);
2758 }
2759
2760 OP *
2761 Perl_newGVOP(pTHX_ I32 type, I32 flags, GV *gv)
2762 {
2763     dTHR;
2764     GVOP *gvop;
2765     NewOp(1101, gvop, 1, GVOP);
2766     gvop->op_type = type;
2767     gvop->op_ppaddr = PL_ppaddr[type];
2768     gvop->op_gv = (GV*)SvREFCNT_inc(gv);
2769     gvop->op_next = (OP*)gvop;
2770     gvop->op_flags = flags;
2771     if (PL_opargs[type] & OA_RETSCALAR)
2772         scalar((OP*)gvop);
2773     if (PL_opargs[type] & OA_TARGET)
2774         gvop->op_targ = pad_alloc(type, SVs_PADTMP);
2775     return CHECKOP(type, gvop);
2776 }
2777
2778 OP *
2779 Perl_newPVOP(pTHX_ I32 type, I32 flags, char *pv)
2780 {
2781     PVOP *pvop;
2782     NewOp(1101, pvop, 1, PVOP);
2783     pvop->op_type = type;
2784     pvop->op_ppaddr = PL_ppaddr[type];
2785     pvop->op_pv = pv;
2786     pvop->op_next = (OP*)pvop;
2787     pvop->op_flags = flags;
2788     if (PL_opargs[type] & OA_RETSCALAR)
2789         scalar((OP*)pvop);
2790     if (PL_opargs[type] & OA_TARGET)
2791         pvop->op_targ = pad_alloc(type, SVs_PADTMP);
2792     return CHECKOP(type, pvop);
2793 }
2794
2795 void
2796 Perl_package(pTHX_ OP *o)
2797 {
2798     dTHR;
2799     SV *sv;
2800
2801     save_hptr(&PL_curstash);
2802     save_item(PL_curstname);
2803     if (o) {
2804         STRLEN len;
2805         char *name;
2806         sv = cSVOPo->op_sv;
2807         name = SvPV(sv, len);
2808         PL_curstash = gv_stashpvn(name,len,TRUE);
2809         sv_setpvn(PL_curstname, name, len);
2810         op_free(o);
2811     }
2812     else {
2813         sv_setpv(PL_curstname,"<none>");
2814         PL_curstash = Nullhv;
2815     }
2816     PL_hints |= HINT_BLOCK_SCOPE;
2817     PL_copline = NOLINE;
2818     PL_expect = XSTATE;
2819 }
2820
2821 void
2822 Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *id, OP *arg)
2823 {
2824     OP *pack;
2825     OP *meth;
2826     OP *rqop;
2827     OP *imop;
2828     OP *veop;
2829     GV *gv;
2830
2831     if (id->op_type != OP_CONST)
2832         Perl_croak(aTHX_ "Module name must be constant");
2833
2834     veop = Nullop;
2835
2836     if(version != Nullop) {
2837         SV *vesv = ((SVOP*)version)->op_sv;
2838
2839         if (arg == Nullop && !SvNIOK(vesv)) {
2840             arg = version;
2841         }
2842         else {
2843             OP *pack;
2844
2845             if (version->op_type != OP_CONST || !SvNIOK(vesv))
2846                 Perl_croak(aTHX_ "Version number must be constant number");
2847
2848             /* Make copy of id so we don't free it twice */
2849             pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)id)->op_sv));
2850
2851             /* Fake up a method call to VERSION */
2852             veop = convert(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL,
2853                             append_elem(OP_LIST,
2854                             prepend_elem(OP_LIST, pack, list(version)),
2855                             newSVOP(OP_METHOD_NAMED, 0,
2856                                     newSVpvn("VERSION", 7))));
2857         }
2858     }
2859
2860     /* Fake up an import/unimport */
2861     if (arg && arg->op_type == OP_STUB)
2862         imop = arg;             /* no import on explicit () */
2863     else if(SvNIOK(((SVOP*)id)->op_sv)) {
2864         imop = Nullop;          /* use 5.0; */
2865     }
2866     else {
2867         /* Make copy of id so we don't free it twice */
2868         pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)id)->op_sv));
2869         imop = convert(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL,
2870                     append_elem(OP_LIST,
2871                         prepend_elem(OP_LIST, pack, list(arg)),
2872                         newSVOP(OP_METHOD_NAMED, 0,
2873                                 aver ? newSVpvn("import", 6)
2874                                      : newSVpvn("unimport", 8))));
2875     }
2876
2877     /* Fake up a require, handle override, if any */
2878     gv = gv_fetchpv("require", FALSE, SVt_PVCV);
2879     if (!(gv && GvIMPORTED_CV(gv)))
2880         gv = gv_fetchpv("CORE::GLOBAL::require", FALSE, SVt_PVCV);
2881
2882     if (gv && GvIMPORTED_CV(gv)) {
2883         rqop = ck_subr(newUNOP(OP_ENTERSUB, OPf_STACKED,
2884                                append_elem(OP_LIST, id,
2885                                            scalar(newUNOP(OP_RV2CV, 0,
2886                                                           newGVOP(OP_GV, 0,
2887                                                                   gv))))));
2888     }
2889     else {
2890         rqop = newUNOP(OP_REQUIRE, 0, id);
2891     }
2892
2893     /* Fake up the BEGIN {}, which does its thing immediately. */
2894     newATTRSUB(floor,
2895         newSVOP(OP_CONST, 0, newSVpvn("BEGIN", 5)),
2896         Nullop,
2897         Nullop,
2898         append_elem(OP_LINESEQ,
2899             append_elem(OP_LINESEQ,
2900                 newSTATEOP(0, Nullch, rqop),
2901                 newSTATEOP(0, Nullch, veop)),
2902             newSTATEOP(0, Nullch, imop) ));
2903
2904     PL_copline = NOLINE;
2905     PL_expect = XSTATE;
2906 }
2907
2908 OP *
2909 Perl_dofile(pTHX_ OP *term)
2910 {
2911     OP *doop;
2912     GV *gv;
2913
2914     gv = gv_fetchpv("do", FALSE, SVt_PVCV);
2915     if (!(gv && GvIMPORTED_CV(gv)))
2916         gv = gv_fetchpv("CORE::GLOBAL::do", FALSE, SVt_PVCV);
2917
2918     if (gv && GvIMPORTED_CV(gv)) {
2919         doop = ck_subr(newUNOP(OP_ENTERSUB, OPf_STACKED,
2920                                append_elem(OP_LIST, term,
2921                                            scalar(newUNOP(OP_RV2CV, 0,
2922                                                           newGVOP(OP_GV, 0,
2923                                                                   gv))))));
2924     }
2925     else {
2926         doop = newUNOP(OP_DOFILE, 0, scalar(term));
2927     }
2928     return doop;
2929 }
2930
2931 OP *
2932 Perl_newSLICEOP(pTHX_ I32 flags, OP *subscript, OP *listval)
2933 {
2934     return newBINOP(OP_LSLICE, flags,
2935             list(force_list(subscript)),
2936             list(force_list(listval)) );
2937 }
2938
2939 STATIC I32
2940 S_list_assignment(pTHX_ register OP *o)
2941 {
2942     if (!o)
2943         return TRUE;
2944
2945     if (o->op_type == OP_NULL && o->op_flags & OPf_KIDS)
2946         o = cUNOPo->op_first;
2947
2948     if (o->op_type == OP_COND_EXPR) {
2949         I32 t = list_assignment(cLOGOPo->op_first->op_sibling);
2950         I32 f = list_assignment(cLOGOPo->op_first->op_sibling->op_sibling);
2951
2952         if (t && f)
2953             return TRUE;
2954         if (t || f)
2955             yyerror("Assignment to both a list and a scalar");
2956         return FALSE;
2957     }
2958
2959     if (o->op_type == OP_LIST || o->op_flags & OPf_PARENS ||
2960         o->op_type == OP_RV2AV || o->op_type == OP_RV2HV ||
2961         o->op_type == OP_ASLICE || o->op_type == OP_HSLICE)
2962         return TRUE;
2963
2964     if (o->op_type == OP_PADAV || o->op_type == OP_PADHV)
2965         return TRUE;
2966
2967     if (o->op_type == OP_RV2SV)
2968         return FALSE;
2969
2970     return FALSE;
2971 }
2972
2973 OP *
2974 Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
2975 {
2976     OP *o;
2977
2978     if (optype) {
2979         if (optype == OP_ANDASSIGN || optype == OP_ORASSIGN) {
2980             return newLOGOP(optype, 0,
2981                 mod(scalar(left), optype),
2982                 newUNOP(OP_SASSIGN, 0, scalar(right)));
2983         }
2984         else {
2985             return newBINOP(optype, OPf_STACKED,
2986                 mod(scalar(left), optype), scalar(right));
2987         }
2988     }
2989
2990     if (list_assignment(left)) {
2991         dTHR;
2992         PL_modcount = 0;
2993         PL_eval_start = right;  /* Grandfathering $[ assignment here.  Bletch.*/
2994         left = mod(left, OP_AASSIGN);
2995         if (PL_eval_start)
2996             PL_eval_start = 0;
2997         else {
2998             op_free(left);
2999             op_free(right);
3000             return Nullop;
3001         }
3002         o = newBINOP(OP_AASSIGN, flags,
3003                 list(force_list(right)),
3004                 list(force_list(left)) );
3005         o->op_private = 0 | (flags >> 8);
3006         if (!(left->op_private & OPpLVAL_INTRO)) {
3007             OP *curop;
3008             OP *lastop = o;
3009             PL_generation++;
3010             for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
3011                 if (PL_opargs[curop->op_type] & OA_DANGEROUS) {
3012                     if (curop->op_type == OP_GV) {
3013                         GV *gv = ((GVOP*)curop)->op_gv;
3014                         if (gv == PL_defgv || SvCUR(gv) == PL_generation)
3015                             break;
3016                         SvCUR(gv) = PL_generation;
3017                     }
3018                     else if (curop->op_type == OP_PADSV ||
3019                              curop->op_type == OP_PADAV ||
3020                              curop->op_type == OP_PADHV ||
3021                              curop->op_type == OP_PADANY) {
3022                         SV **svp = AvARRAY(PL_comppad_name);
3023                         SV *sv = svp[curop->op_targ];
3024                         if (SvCUR(sv) == PL_generation)
3025                             break;
3026                         SvCUR(sv) = PL_generation;      /* (SvCUR not used any more) */
3027                     }
3028                     else if (curop->op_type == OP_RV2CV)
3029                         break;
3030                     else if (curop->op_type == OP_RV2SV ||
3031                              curop->op_type == OP_RV2AV ||
3032                              curop->op_type == OP_RV2HV ||
3033                              curop->op_type == OP_RV2GV) {
3034                         if (lastop->op_type != OP_GV)   /* funny deref? */
3035                             break;
3036                     }
3037                     else if (curop->op_type == OP_PUSHRE) {
3038                         if (((PMOP*)curop)->op_pmreplroot) {
3039                             GV *gv = (GV*)((PMOP*)curop)->op_pmreplroot;
3040                             if (gv == PL_defgv || SvCUR(gv) == PL_generation)
3041                                 break;
3042                             SvCUR(gv) = PL_generation;
3043                         }       
3044                     }
3045                     else
3046                         break;
3047                 }
3048                 lastop = curop;
3049             }
3050             if (curop != o)
3051                 o->op_private = OPpASSIGN_COMMON;
3052         }
3053         if (right && right->op_type == OP_SPLIT) {
3054             OP* tmpop;
3055             if ((tmpop = ((LISTOP*)right)->op_first) &&
3056                 tmpop->op_type == OP_PUSHRE)
3057             {
3058                 PMOP *pm = (PMOP*)tmpop;
3059                 if (left->op_type == OP_RV2AV &&
3060                     !(left->op_private & OPpLVAL_INTRO) &&
3061                     !(o->op_private & OPpASSIGN_COMMON) )
3062                 {
3063                     tmpop = ((UNOP*)left)->op_first;
3064                     if (tmpop->op_type == OP_GV && !pm->op_pmreplroot) {
3065                         pm->op_pmreplroot = (OP*)((GVOP*)tmpop)->op_gv;
3066                         pm->op_pmflags |= PMf_ONCE;
3067                         tmpop = cUNOPo->op_first;       /* to list (nulled) */
3068                         tmpop = ((UNOP*)tmpop)->op_first; /* to pushmark */
3069                         tmpop->op_sibling = Nullop;     /* don't free split */
3070                         right->op_next = tmpop->op_next;  /* fix starting loc */
3071                         op_free(o);                     /* blow off assign */
3072                         right->op_flags &= ~OPf_WANT;
3073                                 /* "I don't know and I don't care." */
3074                         return right;
3075                     }
3076                 }
3077                 else {
3078                     if (PL_modcount < 10000 &&
3079                       ((LISTOP*)right)->op_last->op_type == OP_CONST)
3080                     {
3081                         SV *sv = ((SVOP*)((LISTOP*)right)->op_last)->op_sv;
3082                         if (SvIVX(sv) == 0)
3083                             sv_setiv(sv, PL_modcount+1);
3084                     }
3085                 }
3086             }
3087         }
3088         return o;
3089     }
3090     if (!right)
3091         right = newOP(OP_UNDEF, 0);
3092     if (right->op_type == OP_READLINE) {
3093         right->op_flags |= OPf_STACKED;
3094         return newBINOP(OP_NULL, flags, mod(scalar(left), OP_SASSIGN), scalar(right));
3095     }
3096     else {
3097         PL_eval_start = right;  /* Grandfathering $[ assignment here.  Bletch.*/
3098         o = newBINOP(OP_SASSIGN, flags,
3099             scalar(right), mod(scalar(left), OP_SASSIGN) );
3100         if (PL_eval_start)
3101             PL_eval_start = 0;
3102         else {
3103             op_free(o);
3104             return Nullop;
3105         }
3106     }
3107     return o;
3108 }
3109
3110 OP *
3111 Perl_newSTATEOP(pTHX_ I32 flags, char *label, OP *o)
3112 {
3113     dTHR;
3114     U32 seq = intro_my();
3115     register COP *cop;
3116
3117     NewOp(1101, cop, 1, COP);
3118     if (PERLDB_LINE && PL_curcop->cop_line && PL_curstash != PL_debstash) {
3119         cop->op_type = OP_DBSTATE;
3120         cop->op_ppaddr = PL_ppaddr[ OP_DBSTATE ];
3121     }
3122     else {
3123         cop->op_type = OP_NEXTSTATE;
3124         cop->op_ppaddr = PL_ppaddr[ OP_NEXTSTATE ];
3125     }
3126     cop->op_flags = flags;
3127     cop->op_private = (PL_hints & HINT_UTF8);
3128 #ifdef NATIVE_HINTS
3129     cop->op_private |= NATIVE_HINTS;
3130 #endif
3131     PL_compiling.op_private = cop->op_private;
3132     cop->op_next = (OP*)cop;
3133
3134     if (label) {
3135         cop->cop_label = label;
3136         PL_hints |= HINT_BLOCK_SCOPE;
3137     }
3138     cop->cop_seq = seq;
3139     cop->cop_arybase = PL_curcop->cop_arybase;
3140     if (specialWARN(PL_curcop->cop_warnings))
3141         cop->cop_warnings = PL_curcop->cop_warnings ;
3142     else 
3143         cop->cop_warnings = newSVsv(PL_curcop->cop_warnings) ;
3144
3145
3146     if (PL_copline == NOLINE)
3147         cop->cop_line = PL_curcop->cop_line;
3148     else {
3149         cop->cop_line = PL_copline;
3150         PL_copline = NOLINE;
3151     }
3152     cop->cop_filegv = (GV*)SvREFCNT_inc(PL_curcop->cop_filegv);
3153     cop->cop_stash = PL_curstash;
3154
3155     if (PERLDB_LINE && PL_curstash != PL_debstash) {
3156         SV **svp = av_fetch(GvAV(PL_curcop->cop_filegv),(I32)cop->cop_line, FALSE);
3157         if (svp && *svp != &PL_sv_undef && !SvIOK(*svp)) {
3158             (void)SvIOK_on(*svp);
3159             SvIVX(*svp) = 1;
3160             SvSTASH(*svp) = (HV*)cop;
3161         }
3162     }
3163
3164     return prepend_elem(OP_LINESEQ, (OP*)cop, o);
3165 }
3166
3167 /* "Introduce" my variables to visible status. */
3168 U32
3169 Perl_intro_my(pTHX)
3170 {
3171     SV **svp;
3172     SV *sv;
3173     I32 i;
3174
3175     if (! PL_min_intro_pending)
3176         return PL_cop_seqmax;
3177
3178     svp = AvARRAY(PL_comppad_name);
3179     for (i = PL_min_intro_pending; i <= PL_max_intro_pending; i++) {
3180         if ((sv = svp[i]) && sv != &PL_sv_undef && !SvIVX(sv)) {
3181             SvIVX(sv) = PAD_MAX;        /* Don't know scope end yet. */
3182             SvNVX(sv) = (NV)PL_cop_seqmax;
3183         }
3184     }
3185     PL_min_intro_pending = 0;
3186     PL_comppad_name_fill = PL_max_intro_pending;        /* Needn't search higher */
3187     return PL_cop_seqmax++;
3188 }
3189
3190 OP *
3191 Perl_newLOGOP(pTHX_ I32 type, I32 flags, OP *first, OP *other)
3192 {
3193     return new_logop(type, flags, &first, &other);
3194 }
3195
3196 STATIC OP *
3197 S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp)
3198 {
3199     dTHR;
3200     LOGOP *logop;
3201     OP *o;
3202     OP *first = *firstp;
3203     OP *other = *otherp;
3204
3205     if (type == OP_XOR)         /* Not short circuit, but here by precedence. */
3206         return newBINOP(type, flags, scalar(first), scalar(other));
3207
3208     scalarboolean(first);
3209     /* optimize "!a && b" to "a || b", and "!a || b" to "a && b" */
3210     if (first->op_type == OP_NOT && (first->op_flags & OPf_SPECIAL)) {
3211         if (type == OP_AND || type == OP_OR) {
3212             if (type == OP_AND)
3213                 type = OP_OR;
3214             else
3215                 type = OP_AND;
3216             o = first;
3217             first = *firstp = cUNOPo->op_first;
3218             if (o->op_next)
3219                 first->op_next = o->op_next;
3220             cUNOPo->op_first = Nullop;
3221             op_free(o);
3222         }
3223     }
3224     if (first->op_type == OP_CONST) {
3225         if (ckWARN(WARN_PRECEDENCE) && (first->op_private & OPpCONST_BARE))
3226             Perl_warner(aTHX_ WARN_PRECEDENCE, "Probable precedence problem on %s", 
3227                         PL_op_desc[type]);
3228         if ((type == OP_AND) == (SvTRUE(((SVOP*)first)->op_sv))) {
3229             op_free(first);
3230             *firstp = Nullop;
3231             return other;
3232         }
3233         else {
3234             op_free(other);
3235             *otherp = Nullop;
3236             return first;
3237         }
3238     }
3239     else if (first->op_type == OP_WANTARRAY) {
3240         if (type == OP_AND)
3241             list(other);
3242         else
3243             scalar(other);
3244     }
3245     else if (ckWARN(WARN_UNSAFE) && (first->op_flags & OPf_KIDS)) {
3246         OP *k1 = ((UNOP*)first)->op_first;
3247         OP *k2 = k1->op_sibling;
3248         OPCODE warnop = 0;
3249         switch (first->op_type)
3250         {
3251         case OP_NULL:
3252             if (k2 && k2->op_type == OP_READLINE
3253                   && (k2->op_flags & OPf_STACKED)
3254                   && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR)) 
3255                 warnop = k2->op_type;
3256             break;
3257
3258         case OP_SASSIGN:
3259             if (k1->op_type == OP_READDIR
3260                   || k1->op_type == OP_GLOB
3261                   || k1->op_type == OP_EACH)
3262                 warnop = k1->op_type;
3263             break;
3264         }
3265         if (warnop) {
3266             line_t oldline = PL_curcop->cop_line;
3267             PL_curcop->cop_line = PL_copline;
3268             Perl_warner(aTHX_ WARN_UNSAFE,
3269                  "Value of %s%s can be \"0\"; test with defined()",
3270                  PL_op_desc[warnop],
3271                  ((warnop == OP_READLINE || warnop == OP_GLOB)
3272                   ? " construct" : "() operator"));
3273             PL_curcop->cop_line = oldline;
3274         }
3275     }
3276
3277     if (!other)
3278         return first;
3279
3280     if (type == OP_ANDASSIGN || type == OP_ORASSIGN)
3281         other->op_private |= OPpASSIGN_BACKWARDS;  /* other is an OP_SASSIGN */
3282
3283     NewOp(1101, logop, 1, LOGOP);
3284
3285     logop->op_type = type;
3286     logop->op_ppaddr = PL_ppaddr[type];
3287     logop->op_first = first;
3288     logop->op_flags = flags | OPf_KIDS;
3289     logop->op_other = LINKLIST(other);
3290     logop->op_private = 1 | (flags >> 8);
3291
3292     /* establish postfix order */
3293     logop->op_next = LINKLIST(first);
3294     first->op_next = (OP*)logop;
3295     first->op_sibling = other;
3296
3297     o = newUNOP(OP_NULL, 0, (OP*)logop);
3298     other->op_next = o;
3299
3300     return o;
3301 }
3302
3303 OP *
3304 Perl_newCONDOP(pTHX_ I32 flags, OP *first, OP *trueop, OP *falseop)
3305 {
3306     dTHR;
3307     LOGOP *logop;
3308     OP *start;
3309     OP *o;
3310
3311     if (!falseop)
3312         return newLOGOP(OP_AND, 0, first, trueop);
3313     if (!trueop)
3314         return newLOGOP(OP_OR, 0, first, falseop);
3315
3316     scalarboolean(first);
3317     if (first->op_type == OP_CONST) {
3318         if (SvTRUE(((SVOP*)first)->op_sv)) {
3319             op_free(first);
3320             op_free(falseop);
3321             return trueop;
3322         }
3323         else {
3324             op_free(first);
3325             op_free(trueop);
3326             return falseop;
3327         }
3328     }
3329     else if (first->op_type == OP_WANTARRAY) {
3330         list(trueop);
3331         scalar(falseop);
3332     }
3333     NewOp(1101, logop, 1, LOGOP);
3334     logop->op_type = OP_COND_EXPR;
3335     logop->op_ppaddr = PL_ppaddr[OP_COND_EXPR];
3336     logop->op_first = first;
3337     logop->op_flags = flags | OPf_KIDS;
3338     logop->op_private = 1 | (flags >> 8);
3339     logop->op_other = LINKLIST(trueop);
3340     logop->op_next = LINKLIST(falseop);
3341
3342
3343     /* establish postfix order */
3344     start = LINKLIST(first);
3345     first->op_next = (OP*)logop;
3346
3347     first->op_sibling = trueop;
3348     trueop->op_sibling = falseop;
3349     o = newUNOP(OP_NULL, 0, (OP*)logop);
3350
3351     trueop->op_next = falseop->op_next = o;
3352
3353     o->op_next = start;
3354     return o;
3355 }
3356
3357 OP *
3358 Perl_newRANGE(pTHX_ I32 flags, OP *left, OP *right)
3359 {
3360     dTHR;
3361     LOGOP *range;
3362     OP *flip;
3363     OP *flop;
3364     OP *leftstart;
3365     OP *o;
3366
3367     NewOp(1101, range, 1, LOGOP);
3368
3369     range->op_type = OP_RANGE;
3370     range->op_ppaddr = PL_ppaddr[OP_RANGE];
3371     range->op_first = left;
3372     range->op_flags = OPf_KIDS;
3373     leftstart = LINKLIST(left);
3374     range->op_other = LINKLIST(right);
3375     range->op_private = 1 | (flags >> 8);
3376
3377     left->op_sibling = right;
3378
3379     range->op_next = (OP*)range;
3380     flip = newUNOP(OP_FLIP, flags, (OP*)range);
3381     flop = newUNOP(OP_FLOP, 0, flip);
3382     o = newUNOP(OP_NULL, 0, flop);
3383     linklist(flop);
3384     range->op_next = leftstart;
3385
3386     left->op_next = flip;
3387     right->op_next = flop;
3388
3389     range->op_targ = pad_alloc(OP_RANGE, SVs_PADMY);
3390     sv_upgrade(PAD_SV(range->op_targ), SVt_PVNV);
3391     flip->op_targ = pad_alloc(OP_RANGE, SVs_PADMY);
3392     sv_upgrade(PAD_SV(flip->op_targ), SVt_PVNV);
3393
3394     flip->op_private =  left->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
3395     flop->op_private = right->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
3396
3397     flip->op_next = o;
3398     if (!flip->op_private || !flop->op_private)
3399         linklist(o);            /* blow off optimizer unless constant */
3400
3401     return o;
3402 }
3403
3404 OP *
3405 Perl_newLOOPOP(pTHX_ I32 flags, I32 debuggable, OP *expr, OP *block)
3406 {
3407     dTHR;
3408     OP* listop;
3409     OP* o;
3410     int once = block && block->op_flags & OPf_SPECIAL &&
3411       (block->op_type == OP_ENTERSUB || block->op_type == OP_NULL);
3412
3413     if (expr) {
3414         if (once && expr->op_type == OP_CONST && !SvTRUE(((SVOP*)expr)->op_sv))
3415             return block;       /* do {} while 0 does once */
3416         if (expr->op_type == OP_READLINE || expr->op_type == OP_GLOB
3417             || (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB)) {
3418             expr = newUNOP(OP_DEFINED, 0,
3419                 newASSIGNOP(0, newDEFSVOP(), 0, expr) );
3420         } else if (expr->op_flags & OPf_KIDS) {
3421             OP *k1 = ((UNOP*)expr)->op_first;
3422             OP *k2 = (k1) ? k1->op_sibling : NULL;
3423             switch (expr->op_type) {
3424               case OP_NULL: 
3425                 if (k2 && k2->op_type == OP_READLINE
3426                       && (k2->op_flags & OPf_STACKED)
3427                       && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR)) 
3428                     expr = newUNOP(OP_DEFINED, 0, expr);
3429                 break;                                
3430
3431               case OP_SASSIGN:
3432                 if (k1->op_type == OP_READDIR
3433                       || k1->op_type == OP_GLOB
3434                       || k1->op_type == OP_EACH)
3435                     expr = newUNOP(OP_DEFINED, 0, expr);
3436                 break;
3437             }
3438         }
3439     }
3440
3441     listop = append_elem(OP_LINESEQ, block, newOP(OP_UNSTACK, 0));
3442     o = new_logop(OP_AND, 0, &expr, &listop);
3443
3444     if (listop)
3445         ((LISTOP*)listop)->op_last->op_next = LINKLIST(o);
3446
3447     if (once && o != listop)
3448         o->op_next = ((LOGOP*)cUNOPo->op_first)->op_other;
3449
3450     if (o == listop)
3451         o = newUNOP(OP_NULL, 0, o);     /* or do {} while 1 loses outer block */
3452
3453     o->op_flags |= flags;
3454     o = scope(o);
3455     o->op_flags |= OPf_SPECIAL; /* suppress POPBLOCK curpm restoration*/
3456     return o;
3457 }
3458
3459 OP *
3460 Perl_newWHILEOP(pTHX_ I32 flags, I32 debuggable, LOOP *loop, I32 whileline, OP *expr, OP *block, OP *cont)
3461 {
3462     dTHR;
3463     OP *redo;
3464     OP *next = 0;
3465     OP *listop;
3466     OP *o;
3467     OP *condop;
3468
3469     if (expr && (expr->op_type == OP_READLINE || expr->op_type == OP_GLOB
3470                  || (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB))) {
3471         expr = newUNOP(OP_DEFINED, 0,
3472             newASSIGNOP(0, newDEFSVOP(), 0, expr) );
3473     } else if (expr && (expr->op_flags & OPf_KIDS)) {
3474         OP *k1 = ((UNOP*)expr)->op_first;
3475         OP *k2 = (k1) ? k1->op_sibling : NULL;
3476         switch (expr->op_type) {
3477           case OP_NULL: 
3478             if (k2 && k2->op_type == OP_READLINE
3479                   && (k2->op_flags & OPf_STACKED)
3480                   && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR)) 
3481                 expr = newUNOP(OP_DEFINED, 0, expr);
3482             break;                                
3483
3484           case OP_SASSIGN:
3485             if (k1->op_type == OP_READDIR
3486                   || k1->op_type == OP_GLOB
3487                   || k1->op_type == OP_EACH)
3488                 expr = newUNOP(OP_DEFINED, 0, expr);
3489             break;
3490         }
3491     }
3492
3493     if (!block)
3494         block = newOP(OP_NULL, 0);
3495
3496     if (cont)
3497         next = LINKLIST(cont);
3498     if (expr) {
3499         cont = append_elem(OP_LINESEQ, cont, newOP(OP_UNSTACK, 0));
3500         if ((line_t)whileline != NOLINE) {
3501             PL_copline = whileline;
3502             cont = append_elem(OP_LINESEQ, cont,
3503                                newSTATEOP(0, Nullch, Nullop));
3504         }
3505     }
3506
3507     listop = append_list(OP_LINESEQ, (LISTOP*)block, (LISTOP*)cont);
3508     redo = LINKLIST(listop);
3509
3510     if (expr) {
3511         PL_copline = whileline;
3512         scalar(listop);
3513         o = new_logop(OP_AND, 0, &expr, &listop);
3514         if (o == expr && o->op_type == OP_CONST && !SvTRUE(cSVOPo->op_sv)) {
3515             op_free(expr);              /* oops, it's a while (0) */
3516             op_free((OP*)loop);
3517             return Nullop;              /* listop already freed by new_logop */
3518         }
3519         if (listop)
3520             ((LISTOP*)listop)->op_last->op_next = condop =
3521                 (o == listop ? redo : LINKLIST(o));
3522         if (!next)
3523             next = condop;
3524     }
3525     else
3526         o = listop;
3527
3528     if (!loop) {
3529         NewOp(1101,loop,1,LOOP);
3530         loop->op_type = OP_ENTERLOOP;
3531         loop->op_ppaddr = PL_ppaddr[OP_ENTERLOOP];
3532         loop->op_private = 0;
3533         loop->op_next = (OP*)loop;
3534     }
3535
3536     o = newBINOP(OP_LEAVELOOP, 0, (OP*)loop, o);
3537
3538     loop->op_redoop = redo;
3539     loop->op_lastop = o;
3540
3541     if (next)
3542         loop->op_nextop = next;
3543     else
3544         loop->op_nextop = o;
3545
3546     o->op_flags |= flags;
3547     o->op_private |= (flags >> 8);
3548     return o;
3549 }
3550
3551 OP *
3552 Perl_newFOROP(pTHX_ I32 flags,char *label,line_t forline,OP *sv,OP *expr,OP *block,OP *cont)
3553 {
3554     LOOP *loop;
3555     LOOP *tmp;
3556     OP *wop;
3557     int padoff = 0;
3558     I32 iterflags = 0;
3559
3560     if (sv) {
3561         if (sv->op_type == OP_RV2SV) {  /* symbol table variable */
3562             sv->op_type = OP_RV2GV;
3563             sv->op_ppaddr = PL_ppaddr[OP_RV2GV];
3564         }
3565         else if (sv->op_type == OP_PADSV) { /* private variable */
3566             padoff = sv->op_targ;
3567             op_free(sv);
3568             sv = Nullop;
3569         }
3570         else if (sv->op_type == OP_THREADSV) { /* per-thread variable */
3571             padoff = sv->op_targ;
3572             iterflags |= OPf_SPECIAL;
3573             op_free(sv);
3574             sv = Nullop;
3575         }
3576         else
3577             Perl_croak(aTHX_ "Can't use %s for loop variable", PL_op_desc[sv->op_type]);
3578     }
3579     else {
3580 #ifdef USE_THREADS
3581         padoff = find_threadsv("_");
3582         iterflags |= OPf_SPECIAL;
3583 #else
3584         sv = newGVOP(OP_GV, 0, PL_defgv);
3585 #endif
3586     }
3587     if (expr->op_type == OP_RV2AV || expr->op_type == OP_PADAV) {
3588         expr = mod(force_list(scalar(ref(expr, OP_ITER))), OP_GREPSTART);
3589         iterflags |= OPf_STACKED;
3590     }
3591     else if (expr->op_type == OP_NULL &&
3592              (expr->op_flags & OPf_KIDS) &&
3593              ((BINOP*)expr)->op_first->op_type == OP_FLOP)
3594     {
3595         /* Basically turn for($x..$y) into the same as for($x,$y), but we
3596          * set the STACKED flag to indicate that these values are to be
3597          * treated as min/max values by 'pp_iterinit'.
3598          */
3599         UNOP* flip = (UNOP*)((UNOP*)((BINOP*)expr)->op_first)->op_first;
3600         LOGOP* range = (LOGOP*) flip->op_first;
3601         OP* left  = range->op_first;
3602         OP* right = left->op_sibling;
3603         LISTOP* listop;
3604
3605         range->op_flags &= ~OPf_KIDS;
3606         range->op_first = Nullop;
3607
3608         listop = (LISTOP*)newLISTOP(OP_LIST, 0, left, right);
3609         listop->op_first->op_next = range->op_next;
3610         left->op_next = range->op_other;
3611         right->op_next = (OP*)listop;
3612         listop->op_next = listop->op_first;
3613
3614         op_free(expr);
3615         expr = (OP*)(listop);
3616         null(expr);
3617         iterflags |= OPf_STACKED;
3618     }
3619     else {
3620         expr = mod(force_list(expr), OP_GREPSTART);
3621     }
3622
3623
3624     loop = (LOOP*)list(convert(OP_ENTERITER, iterflags,
3625                                append_elem(OP_LIST, expr, scalar(sv))));
3626     assert(!loop->op_next);
3627 #ifdef PL_OP_SLAB_ALLOC
3628     NewOp(1234,tmp,1,LOOP);
3629     Copy(loop,tmp,1,LOOP);
3630     loop = tmp;
3631 #else
3632     Renew(loop, 1, LOOP);
3633 #endif 
3634     loop->op_targ = padoff;
3635     wop = newWHILEOP(flags, 1, loop, forline, newOP(OP_ITER, 0), block, cont);
3636     PL_copline = forline;
3637     return newSTATEOP(0, label, wop);
3638 }
3639
3640 OP*
3641 Perl_newLOOPEX(pTHX_ I32 type, OP *label)
3642 {
3643     dTHR;
3644     OP *o;
3645     STRLEN n_a;
3646
3647     if (type != OP_GOTO || label->op_type == OP_CONST) {
3648         /* "last()" means "last" */
3649         if (label->op_type == OP_STUB && (label->op_flags & OPf_PARENS))
3650             o = newOP(type, OPf_SPECIAL);
3651         else {
3652             o = newPVOP(type, 0, savepv(label->op_type == OP_CONST
3653                                         ? SvPVx(((SVOP*)label)->op_sv, n_a)
3654                                         : ""));
3655         }
3656         op_free(label);
3657     }
3658     else {
3659         if (label->op_type == OP_ENTERSUB)
3660             label = newUNOP(OP_REFGEN, 0, mod(label, OP_REFGEN));
3661         o = newUNOP(type, OPf_STACKED, label);
3662     }
3663     PL_hints |= HINT_BLOCK_SCOPE;
3664     return o;
3665 }
3666
3667 void
3668 Perl_cv_undef(pTHX_ CV *cv)
3669 {
3670     dTHR;
3671 #ifdef USE_THREADS
3672     if (CvMUTEXP(cv)) {
3673         MUTEX_DESTROY(CvMUTEXP(cv));
3674         Safefree(CvMUTEXP(cv));
3675         CvMUTEXP(cv) = 0;
3676     }
3677 #endif /* USE_THREADS */
3678
3679     if (!CvXSUB(cv) && CvROOT(cv)) {
3680 #ifdef USE_THREADS
3681         if (CvDEPTH(cv) || (CvOWNER(cv) && CvOWNER(cv) != thr))
3682             Perl_croak(aTHX_ "Can't undef active subroutine");
3683 #else
3684         if (CvDEPTH(cv))
3685             Perl_croak(aTHX_ "Can't undef active subroutine");
3686 #endif /* USE_THREADS */
3687         ENTER;
3688
3689         SAVESPTR(PL_curpad);
3690         PL_curpad = 0;
3691
3692         if (!CvCLONED(cv))
3693             op_free(CvROOT(cv));
3694         CvROOT(cv) = Nullop;
3695         LEAVE;
3696     }
3697     SvPOK_off((SV*)cv);         /* forget prototype */
3698     CvFLAGS(cv) = 0;
3699     SvREFCNT_dec(CvGV(cv));
3700     CvGV(cv) = Nullgv;
3701     SvREFCNT_dec(CvOUTSIDE(cv));
3702     CvOUTSIDE(cv) = Nullcv;
3703     if (CvPADLIST(cv)) {
3704         /* may be during global destruction */
3705         if (SvREFCNT(CvPADLIST(cv))) {
3706             I32 i = AvFILLp(CvPADLIST(cv));
3707             while (i >= 0) {
3708                 SV** svp = av_fetch(CvPADLIST(cv), i--, FALSE);
3709                 SV* sv = svp ? *svp : Nullsv;
3710                 if (!sv)
3711                     continue;
3712                 if (sv == (SV*)PL_comppad_name)
3713                     PL_comppad_name = Nullav;
3714                 else if (sv == (SV*)PL_comppad) {
3715                     PL_comppad = Nullav;
3716                     PL_curpad = Null(SV**);
3717                 }
3718                 SvREFCNT_dec(sv);
3719             }
3720             SvREFCNT_dec((SV*)CvPADLIST(cv));
3721         }
3722         CvPADLIST(cv) = Nullav;
3723     }
3724 }
3725
3726 #ifdef DEBUG_CLOSURES
3727 STATIC void
3728 cv_dump(CV *cv)
3729 {
3730     CV *outside = CvOUTSIDE(cv);
3731     AV* padlist = CvPADLIST(cv);
3732     AV* pad_name;
3733     AV* pad;
3734     SV** pname;
3735     SV** ppad;
3736     I32 ix;
3737
3738     PerlIO_printf(Perl_debug_log, "\tCV=0x%lx (%s), OUTSIDE=0x%lx (%s)\n",
3739                   cv,
3740                   (CvANON(cv) ? "ANON"
3741                    : (cv == PL_main_cv) ? "MAIN"
3742                    : CvUNIQUE(cv) ? "UNIQUE"
3743                    : CvGV(cv) ? GvNAME(CvGV(cv)) : "UNDEFINED"),
3744                   outside,
3745                   (!outside ? "null"
3746                    : CvANON(outside) ? "ANON"
3747                    : (outside == PL_main_cv) ? "MAIN"
3748                    : CvUNIQUE(outside) ? "UNIQUE"
3749                    : CvGV(outside) ? GvNAME(CvGV(outside)) : "UNDEFINED"));
3750
3751     if (!padlist)
3752         return;
3753
3754     pad_name = (AV*)*av_fetch(padlist, 0, FALSE);
3755     pad = (AV*)*av_fetch(padlist, 1, FALSE);
3756     pname = AvARRAY(pad_name);
3757     ppad = AvARRAY(pad);
3758
3759     for (ix = 1; ix <= AvFILLp(pad_name); ix++) {
3760         if (SvPOK(pname[ix]))
3761             PerlIO_printf(Perl_debug_log, "\t%4d. 0x%lx (%s\"%s\" %ld-%ld)\n",
3762                           ix, ppad[ix],
3763                           SvFAKE(pname[ix]) ? "FAKE " : "",
3764                           SvPVX(pname[ix]),
3765                           (long)I_32(SvNVX(pname[ix])),
3766                           (long)SvIVX(pname[ix]));
3767     }
3768 }
3769 #endif /* DEBUG_CLOSURES */
3770
3771 STATIC CV *
3772 S_cv_clone2(pTHX_ CV *proto, CV *outside)
3773 {
3774     dTHR;
3775     AV* av;
3776     I32 ix;
3777     AV* protopadlist = CvPADLIST(proto);
3778     AV* protopad_name = (AV*)*av_fetch(protopadlist, 0, FALSE);
3779     AV* protopad = (AV*)*av_fetch(protopadlist, 1, FALSE);
3780     SV** pname = AvARRAY(protopad_name);
3781     SV** ppad = AvARRAY(protopad);
3782     I32 fname = AvFILLp(protopad_name);
3783     I32 fpad = AvFILLp(protopad);
3784     AV* comppadlist;
3785     CV* cv;
3786
3787     assert(!CvUNIQUE(proto));
3788
3789     ENTER;
3790     SAVESPTR(PL_curpad);
3791     SAVESPTR(PL_comppad);
3792     SAVESPTR(PL_comppad_name);
3793     SAVESPTR(PL_compcv);
3794
3795     cv = PL_compcv = (CV*)NEWSV(1104,0);
3796     sv_upgrade((SV *)cv, SvTYPE(proto));
3797     CvCLONED_on(cv);
3798     if (CvANON(proto))
3799         CvANON_on(cv);
3800
3801 #ifdef USE_THREADS
3802     New(666, CvMUTEXP(cv), 1, perl_mutex);
3803     MUTEX_INIT(CvMUTEXP(cv));
3804     CvOWNER(cv)         = 0;
3805 #endif /* USE_THREADS */
3806     CvFILEGV(cv)        = CvFILEGV(proto);
3807     CvGV(cv)            = (GV*)SvREFCNT_inc(CvGV(proto));
3808     CvSTASH(cv)         = CvSTASH(proto);
3809     CvROOT(cv)          = CvROOT(proto);
3810     CvSTART(cv)         = CvSTART(proto);
3811     if (outside)
3812         CvOUTSIDE(cv)   = (CV*)SvREFCNT_inc(outside);
3813
3814     if (SvPOK(proto))
3815         sv_setpvn((SV*)cv, SvPVX(proto), SvCUR(proto));
3816
3817     PL_comppad_name = newAV();
3818     for (ix = fname; ix >= 0; ix--)
3819         av_store(PL_comppad_name, ix, SvREFCNT_inc(pname[ix]));
3820
3821     PL_comppad = newAV();
3822
3823     comppadlist = newAV();
3824     AvREAL_off(comppadlist);
3825     av_store(comppadlist, 0, (SV*)PL_comppad_name);
3826     av_store(comppadlist, 1, (SV*)PL_comppad);
3827     CvPADLIST(cv) = comppadlist;
3828     av_fill(PL_comppad, AvFILLp(protopad));
3829     PL_curpad = AvARRAY(PL_comppad);
3830
3831     av = newAV();           /* will be @_ */
3832     av_extend(av, 0);
3833     av_store(PL_comppad, 0, (SV*)av);
3834     AvFLAGS(av) = AVf_REIFY;
3835
3836     for (ix = fpad; ix > 0; ix--) {
3837         SV* namesv = (ix <= fname) ? pname[ix] : Nullsv;
3838         if (namesv && namesv != &PL_sv_undef) {
3839             char *name = SvPVX(namesv);    /* XXX */
3840             if (SvFLAGS(namesv) & SVf_FAKE) {   /* lexical from outside? */
3841                 I32 off = pad_findlex(name, ix, SvIVX(namesv),
3842                                       CvOUTSIDE(cv), cxstack_ix, 0, 0);
3843                 if (!off)
3844                     PL_curpad[ix] = SvREFCNT_inc(ppad[ix]);
3845                 else if (off != ix)
3846                     Perl_croak(aTHX_ "panic: cv_clone: %s", name);
3847             }
3848             else {                              /* our own lexical */
3849                 SV* sv;
3850                 if (*name == '&') {
3851                     /* anon code -- we'll come back for it */
3852                     sv = SvREFCNT_inc(ppad[ix]);
3853                 }
3854                 else if (*name == '@')
3855                     sv = (SV*)newAV();
3856                 else if (*name == '%')
3857                     sv = (SV*)newHV();
3858                 else
3859                     sv = NEWSV(0,0);
3860                 if (!SvPADBUSY(sv))
3861                     SvPADMY_on(sv);
3862                 PL_curpad[ix] = sv;
3863             }
3864         }
3865         else {
3866             SV* sv = NEWSV(0,0);
3867             SvPADTMP_on(sv);
3868             PL_curpad[ix] = sv;
3869         }
3870     }
3871
3872     /* Now that vars are all in place, clone nested closures. */
3873
3874     for (ix = fpad; ix > 0; ix--) {
3875         SV* namesv = (ix <= fname) ? pname[ix] : Nullsv;
3876         if (namesv
3877             && namesv != &PL_sv_undef
3878             && !(SvFLAGS(namesv) & SVf_FAKE)
3879             && *SvPVX(namesv) == '&'
3880             && CvCLONE(ppad[ix]))
3881         {
3882             CV *kid = cv_clone2((CV*)ppad[ix], cv);
3883             SvREFCNT_dec(ppad[ix]);
3884             CvCLONE_on(kid);
3885             SvPADMY_on(kid);
3886             PL_curpad[ix] = (SV*)kid;
3887         }
3888     }
3889
3890 #ifdef DEBUG_CLOSURES
3891     PerlIO_printf(Perl_debug_log, "Cloned inside:\n");
3892     cv_dump(outside);
3893     PerlIO_printf(Perl_debug_log, "  from:\n");
3894     cv_dump(proto);
3895     PerlIO_printf(Perl_debug_log, "   to:\n");
3896     cv_dump(cv);
3897 #endif
3898
3899     LEAVE;
3900     return cv;
3901 }
3902
3903 CV *
3904 Perl_cv_clone(pTHX_ CV *proto)
3905 {
3906     CV *cv;
3907     MUTEX_LOCK(&PL_cred_mutex);         /* XXX create separate mutex */
3908     cv = cv_clone2(proto, CvOUTSIDE(proto));
3909     MUTEX_UNLOCK(&PL_cred_mutex);       /* XXX create separate mutex */
3910     return cv;
3911 }
3912
3913 void
3914 Perl_cv_ckproto(pTHX_ CV *cv, GV *gv, char *p)
3915 {
3916     dTHR;
3917
3918     if (((!p != !SvPOK(cv)) || (p && strNE(p, SvPVX(cv)))) && ckWARN_d(WARN_UNSAFE)) {
3919         SV* msg = sv_newmortal();
3920         SV* name = Nullsv;
3921
3922         if (gv)
3923             gv_efullname3(name = sv_newmortal(), gv, Nullch);
3924         sv_setpv(msg, "Prototype mismatch:");
3925         if (name)
3926             Perl_sv_catpvf(aTHX_ msg, " sub %_", name);
3927         if (SvPOK(cv))
3928             Perl_sv_catpvf(aTHX_ msg, " (%s)", SvPVX(cv));
3929         sv_catpv(msg, " vs ");
3930         if (p)
3931             Perl_sv_catpvf(aTHX_ msg, "(%s)", p);
3932         else
3933             sv_catpv(msg, "none");
3934         Perl_warner(aTHX_ WARN_UNSAFE, "%_", msg);
3935     }
3936 }
3937
3938 SV *
3939 Perl_cv_const_sv(pTHX_ CV *cv)
3940 {
3941     if (!cv || !SvPOK(cv) || SvCUR(cv))
3942         return Nullsv;
3943     return op_const_sv(CvSTART(cv), cv);
3944 }
3945
3946 SV *
3947 Perl_op_const_sv(pTHX_ OP *o, CV *cv)
3948 {
3949     SV *sv = Nullsv;
3950
3951     if(!o)
3952         return Nullsv;
3953  
3954     if(o->op_type == OP_LINESEQ && cLISTOPo->op_first) 
3955         o = cLISTOPo->op_first->op_sibling;
3956
3957     for (; o; o = o->op_next) {
3958         OPCODE type = o->op_type;
3959
3960         if (sv && o->op_next == o) 
3961             return sv;
3962         if (type == OP_NEXTSTATE || type == OP_NULL || type == OP_PUSHMARK)
3963             continue;
3964         if (type == OP_LEAVESUB || type == OP_RETURN)
3965             break;
3966         if (sv)
3967             return Nullsv;
3968         if (type == OP_CONST)
3969             sv = cSVOPo->op_sv;
3970         else if (type == OP_PADSV && cv) {
3971             AV* padav = (AV*)(AvARRAY(CvPADLIST(cv))[1]);
3972             sv = padav ? AvARRAY(padav)[o->op_targ] : Nullsv;
3973             if (!sv || (!SvREADONLY(sv) && SvREFCNT(sv) > 1))
3974                 return Nullsv;
3975         }
3976         else
3977             return Nullsv;
3978     }
3979     if (sv)
3980         SvREADONLY_on(sv);
3981     return sv;
3982 }
3983
3984 void
3985 Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
3986 {
3987     if (o)
3988         SAVEFREEOP(o);
3989     if (proto)
3990         SAVEFREEOP(proto);
3991     if (attrs)
3992         SAVEFREEOP(attrs);
3993     if (block)
3994         SAVEFREEOP(block);
3995     Perl_croak(aTHX_ "\"my sub\" not yet implemented");
3996 }
3997
3998 CV *
3999 Perl_newSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *block)
4000 {
4001     return Perl_newATTRSUB(aTHX_ floor, o, proto, Nullop, block);
4002 }
4003
4004 CV *
4005 Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
4006 {
4007     dTHR;
4008     STRLEN n_a;
4009     char *name = o ? SvPVx(cSVOPo->op_sv, n_a) : Nullch;
4010     GV *gv = gv_fetchpv(name ? name : "__ANON__",
4011                         GV_ADDMULTI | ((block || attrs) ? 0 : GV_NOINIT),
4012                         SVt_PVCV);
4013     char *ps = proto ? SvPVx(((SVOP*)proto)->op_sv, n_a) : Nullch;
4014     register CV *cv=0;
4015     I32 ix;
4016
4017     if (o)
4018         SAVEFREEOP(o);
4019     if (proto)
4020         SAVEFREEOP(proto);
4021     if (attrs)
4022         SAVEFREEOP(attrs);
4023
4024     if (SvTYPE(gv) != SVt_PVGV) {       /* Maybe prototype now, and had at
4025                                            maximum a prototype before. */
4026         if (SvTYPE(gv) > SVt_NULL) {
4027             if (!SvPOK((SV*)gv) && !(SvIOK((SV*)gv) && SvIVX((SV*)gv) == -1)
4028                 && ckWARN_d(WARN_UNSAFE))
4029             {
4030                 Perl_warner(aTHX_ WARN_UNSAFE, "Runaway prototype");
4031             }
4032             cv_ckproto((CV*)gv, NULL, ps);
4033         }
4034         if (ps)
4035             sv_setpv((SV*)gv, ps);
4036         else
4037             sv_setiv((SV*)gv, -1);
4038         SvREFCNT_dec(PL_compcv);
4039         cv = PL_compcv = NULL;
4040         PL_sub_generation++;
4041         goto noblock;
4042     }
4043
4044     if (!name || GvCVGEN(gv))
4045         cv = Nullcv;
4046     else if (cv = GvCV(gv)) {
4047         cv_ckproto(cv, gv, ps);
4048         /* already defined (or promised)? */
4049         if (CvROOT(cv) || CvXSUB(cv) || GvASSUMECV(gv)) {
4050             SV* const_sv;
4051             bool const_changed = TRUE;
4052             if (!block && !attrs) {
4053                 /* just a "sub foo;" when &foo is already defined */
4054                 SAVEFREESV(PL_compcv);
4055                 goto done;
4056             }
4057             /* ahem, death to those who redefine active sort subs */
4058             if (PL_curstackinfo->si_type == PERLSI_SORT && PL_sortcop == CvSTART(cv))
4059                 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s", name);
4060             if (!block)
4061                 goto withattrs;
4062             if(const_sv = cv_const_sv(cv))
4063                 const_changed = sv_cmp(const_sv, op_const_sv(block, Nullcv));
4064             if ((const_sv && const_changed) || ckWARN(WARN_REDEFINE) 
4065                                         && !(CvGV(cv) && GvSTASH(CvGV(cv))
4066                                         && HvNAME(GvSTASH(CvGV(cv)))
4067                                         && strEQ(HvNAME(GvSTASH(CvGV(cv))),
4068                                                  "autouse"))) {
4069                 line_t oldline = PL_curcop->cop_line;
4070                 PL_curcop->cop_line = PL_copline;
4071                 Perl_warner(aTHX_ WARN_REDEFINE,
4072                         const_sv ? "Constant subroutine %s redefined"
4073                                  : "Subroutine %s redefined", name);
4074                 PL_curcop->cop_line = oldline;
4075             }
4076             SvREFCNT_dec(cv);
4077             cv = Nullcv;
4078         }
4079     }
4080   withattrs:
4081     if (attrs) {
4082         HV *stash;
4083         SV *rcv;
4084
4085         /* Need to do a C<use attributes $stash_of_cv,\&cv,@attrs>
4086          * before we clobber PL_compcv.
4087          */
4088         if (cv && !block) {
4089             rcv = (SV*)cv;
4090             if (CvGV(cv) && GvSTASH(CvGV(cv)) && HvNAME(GvSTASH(CvGV(cv))))
4091                 stash = GvSTASH(CvGV(cv));
4092             else if (CvSTASH(cv) && HvNAME(CvSTASH(cv)))
4093                 stash = CvSTASH(cv);
4094             else
4095                 stash = PL_curstash;
4096         }
4097         else {
4098             /* possibly about to re-define existing subr -- ignore old cv */
4099             rcv = (SV*)PL_compcv;
4100             if (name && GvSTASH(gv) && HvNAME(GvSTASH(gv)))
4101                 stash = GvSTASH(gv);
4102             else
4103                 stash = PL_curstash;
4104         }
4105         apply_attrs(stash, rcv, attrs);
4106     }
4107     if (cv) {                           /* must reuse cv if autoloaded */
4108         if (!block) {
4109             /* got here with just attrs -- work done, so bug out */
4110             SAVEFREESV(PL_compcv);
4111             goto done;
4112         }
4113         cv_undef(cv);
4114         CvFLAGS(cv) = CvFLAGS(PL_compcv);
4115         CvOUTSIDE(cv) = CvOUTSIDE(PL_compcv);
4116         CvOUTSIDE(PL_compcv) = 0;
4117         CvPADLIST(cv) = CvPADLIST(PL_compcv);
4118         CvPADLIST(PL_compcv) = 0;
4119         if (SvREFCNT(PL_compcv) > 1) /* XXX Make closures transit through stub. */
4120             CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc((SV*)cv);
4121         SvREFCNT_dec(PL_compcv);
4122     }
4123     else {
4124         cv = PL_compcv;
4125         if (name) {
4126             GvCV(gv) = cv;
4127             GvCVGEN(gv) = 0;
4128             PL_sub_generation++;
4129         }
4130     }
4131     CvGV(cv) = (GV*)SvREFCNT_inc(gv);
4132     CvFILEGV(cv) = PL_curcop->cop_filegv;
4133     CvSTASH(cv) = PL_curstash;
4134 #ifdef USE_THREADS
4135     CvOWNER(cv) = 0;
4136     if (!CvMUTEXP(cv)) {
4137         New(666, CvMUTEXP(cv), 1, perl_mutex);
4138         MUTEX_INIT(CvMUTEXP(cv));
4139     }
4140 #endif /* USE_THREADS */
4141
4142     if (ps)
4143         sv_setpv((SV*)cv, ps);
4144
4145     if (PL_error_count) {
4146         op_free(block);
4147         block = Nullop;
4148         if (name) {
4149             char *s = strrchr(name, ':');
4150             s = s ? s+1 : name;
4151             if (strEQ(s, "BEGIN")) {
4152                 char *not_safe =
4153                     "BEGIN not safe after errors--compilation aborted";
4154                 if (PL_in_eval & EVAL_KEEPERR)
4155                     Perl_croak(aTHX_ not_safe);
4156                 else {
4157                     /* force display of errors found but not reported */
4158                     sv_catpv(ERRSV, not_safe);
4159                     Perl_croak(aTHX_ "%s", SvPVx(ERRSV, n_a));
4160                 }
4161             }
4162         }
4163     }
4164     if (!block) {
4165       noblock:
4166         PL_copline = NOLINE;
4167         LEAVE_SCOPE(floor);
4168         return cv;
4169     }
4170
4171     if (AvFILLp(PL_comppad_name) < AvFILLp(PL_comppad))
4172         av_store(PL_comppad_name, AvFILLp(PL_comppad), Nullsv);
4173
4174     if (CvCLONE(cv)) {
4175         SV **namep = AvARRAY(PL_comppad_name);
4176         for (ix = AvFILLp(PL_comppad); ix > 0; ix--) {
4177             SV *namesv;
4178
4179             if (SvIMMORTAL(PL_curpad[ix]))
4180                 continue;
4181             /*
4182              * The only things that a clonable function needs in its
4183              * pad are references to outer lexicals and anonymous subs.
4184              * The rest are created anew during cloning.
4185              */
4186             if (!((namesv = namep[ix]) != Nullsv &&
4187                   namesv != &PL_sv_undef &&
4188                   (SvFAKE(namesv) ||
4189                    *SvPVX(namesv) == '&')))
4190             {
4191                 SvREFCNT_dec(PL_curpad[ix]);
4192                 PL_curpad[ix] = Nullsv;
4193             }
4194         }
4195     }
4196     else {
4197         AV *av = newAV();                       /* Will be @_ */
4198         av_extend(av, 0);
4199         av_store(PL_comppad, 0, (SV*)av);
4200         AvFLAGS(av) = AVf_REIFY;
4201
4202         for (ix = AvFILLp(PL_comppad); ix > 0; ix--) {
4203             if (SvIMMORTAL(PL_curpad[ix]))
4204                 continue;
4205             if (!SvPADMY(PL_curpad[ix]))
4206                 SvPADTMP_on(PL_curpad[ix]);
4207         }
4208     }
4209
4210     CvROOT(cv) = newUNOP(OP_LEAVESUB, 0, scalarseq(block));
4211     CvSTART(cv) = LINKLIST(CvROOT(cv));
4212     CvROOT(cv)->op_next = 0;
4213     peep(CvSTART(cv));
4214
4215     if (name) {
4216         char *s;
4217
4218         if (PERLDB_SUBLINE && PL_curstash != PL_debstash) {
4219             SV *sv = NEWSV(0,0);
4220             SV *tmpstr = sv_newmortal();
4221             GV *db_postponed = gv_fetchpv("DB::postponed", GV_ADDMULTI, SVt_PVHV);
4222             CV *cv;
4223             HV *hv;
4224
4225             Perl_sv_setpvf(aTHX_ sv, "%_:%ld-%ld",
4226                     GvSV(PL_curcop->cop_filegv),
4227                     (long)PL_subline, (long)PL_curcop->cop_line);
4228             gv_efullname3(tmpstr, gv, Nullch);
4229             hv_store(GvHV(PL_DBsub), SvPVX(tmpstr), SvCUR(tmpstr), sv, 0);
4230             hv = GvHVn(db_postponed);
4231             if (HvFILL(hv) > 0 && hv_exists(hv, SvPVX(tmpstr), SvCUR(tmpstr))
4232                   && (cv = GvCV(db_postponed))) {
4233                 dSP;
4234                 PUSHMARK(SP);
4235                 XPUSHs(tmpstr);
4236                 PUTBACK;
4237                 call_sv((SV*)cv, G_DISCARD);
4238             }
4239         }
4240
4241         if ((s = strrchr(name,':')))
4242             s++;
4243         else
4244             s = name;
4245         if (strEQ(s, "BEGIN")) {
4246             I32 oldscope = PL_scopestack_ix;
4247             ENTER;
4248             SAVESPTR(PL_compiling.cop_filegv);
4249             SAVEI16(PL_compiling.cop_line);
4250             save_svref(&PL_rs);
4251             sv_setsv(PL_rs, PL_nrs);
4252
4253             if (!PL_beginav)
4254                 PL_beginav = newAV();
4255             DEBUG_x( dump_sub(gv) );
4256             av_push(PL_beginav, (SV *)cv);
4257             GvCV(gv) = 0;
4258             call_list(oldscope, PL_beginav);
4259
4260             PL_curcop = &PL_compiling;
4261             PL_compiling.op_private = PL_hints;
4262             LEAVE;
4263         }
4264         else if (strEQ(s, "END") && !PL_error_count) {
4265             if (!PL_endav)
4266                 PL_endav = newAV();
4267             av_unshift(PL_endav, 1);
4268             av_store(PL_endav, 0, (SV *)cv);
4269             GvCV(gv) = 0;
4270         }
4271         else if (strEQ(s, "INIT") && !PL_error_count) {
4272             if (!PL_initav)
4273                 PL_initav = newAV();
4274             av_push(PL_initav, SvREFCNT_inc(cv));
4275             GvCV(gv) = 0;
4276         }
4277     }
4278
4279   done:
4280     PL_copline = NOLINE;
4281     LEAVE_SCOPE(floor);
4282     return cv;
4283 }
4284
4285 /* XXX unsafe for threads if eval_owner isn't held */
4286 void
4287 Perl_newCONSTSUB(pTHX_ HV *stash, char *name, SV *sv)
4288 {
4289     dTHR;
4290     U32 oldhints = PL_hints;
4291     HV *old_cop_stash = PL_curcop->cop_stash;
4292     HV *old_curstash = PL_curstash;
4293     line_t oldline = PL_curcop->cop_line;
4294     PL_curcop->cop_line = PL_copline;
4295
4296     PL_hints &= ~HINT_BLOCK_SCOPE;
4297     if(stash)
4298         PL_curstash = PL_curcop->cop_stash = stash;
4299
4300     newATTRSUB(
4301         start_subparse(FALSE, 0),
4302         newSVOP(OP_CONST, 0, newSVpv(name,0)),
4303         newSVOP(OP_CONST, 0, &PL_sv_no),        /* SvPV(&PL_sv_no) == "" -- GMB */
4304         Nullop,
4305         newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
4306     );
4307
4308     PL_hints = oldhints;
4309     PL_curcop->cop_stash = old_cop_stash;
4310     PL_curstash = old_curstash;
4311     PL_curcop->cop_line = oldline;
4312 }
4313
4314 CV *
4315 Perl_newXS(pTHX_ char *name, XSUBADDR_t subaddr, char *filename)
4316 {
4317     dTHR;
4318     GV *gv = gv_fetchpv(name ? name : "__ANON__", GV_ADDMULTI, SVt_PVCV);
4319     register CV *cv;
4320
4321     if (cv = (name ? GvCV(gv) : Nullcv)) {
4322         if (GvCVGEN(gv)) {
4323             /* just a cached method */
4324             SvREFCNT_dec(cv);
4325             cv = 0;
4326         }
4327         else if (CvROOT(cv) || CvXSUB(cv) || GvASSUMECV(gv)) {
4328             /* already defined (or promised) */
4329             if (ckWARN(WARN_REDEFINE) && !(CvGV(cv) && GvSTASH(CvGV(cv))
4330                             && HvNAME(GvSTASH(CvGV(cv)))
4331                             && strEQ(HvNAME(GvSTASH(CvGV(cv))), "autouse"))) {
4332                 line_t oldline = PL_curcop->cop_line;
4333                 if (PL_copline != NOLINE)
4334                     PL_curcop->cop_line = PL_copline;
4335                 Perl_warner(aTHX_ WARN_REDEFINE, "Subroutine %s redefined",name);
4336                 PL_curcop->cop_line = oldline;
4337             }
4338             SvREFCNT_dec(cv);
4339             cv = 0;
4340         }
4341     }
4342
4343     if (cv)                             /* must reuse cv if autoloaded */
4344         cv_undef(cv);
4345     else {
4346         cv = (CV*)NEWSV(1105,0);
4347         sv_upgrade((SV *)cv, SVt_PVCV);
4348         if (name) {
4349             GvCV(gv) = cv;
4350             GvCVGEN(gv) = 0;
4351             PL_sub_generation++;
4352         }
4353     }
4354     CvGV(cv) = (GV*)SvREFCNT_inc(gv);
4355 #ifdef USE_THREADS
4356     New(666, CvMUTEXP(cv), 1, perl_mutex);
4357     MUTEX_INIT(CvMUTEXP(cv));
4358     CvOWNER(cv) = 0;
4359 #endif /* USE_THREADS */
4360     CvFILEGV(cv) = gv_fetchfile(filename);
4361     CvXSUB(cv) = subaddr;
4362
4363     if (name) {
4364         char *s = strrchr(name,':');
4365         if (s)
4366             s++;
4367         else
4368             s = name;
4369         if (strEQ(s, "BEGIN")) {
4370             if (!PL_beginav)
4371                 PL_beginav = newAV();
4372             av_push(PL_beginav, (SV *)cv);
4373             GvCV(gv) = 0;
4374         }
4375         else if (strEQ(s, "END")) {
4376             if (!PL_endav)
4377                 PL_endav = newAV();
4378             av_unshift(PL_endav, 1);
4379             av_store(PL_endav, 0, (SV *)cv);
4380             GvCV(gv) = 0;
4381         }
4382         else if (strEQ(s, "INIT")) {
4383             if (!PL_initav)
4384                 PL_initav = newAV();
4385             av_push(PL_initav, (SV *)cv);
4386             GvCV(gv) = 0;
4387         }
4388     }
4389     else
4390         CvANON_on(cv);
4391
4392     return cv;
4393 }
4394
4395 void
4396 Perl_newFORM(pTHX_ I32 floor, OP *o, OP *block)
4397 {
4398     dTHR;
4399     register CV *cv;
4400     char *name;
4401     GV *gv;
4402     I32 ix;
4403     STRLEN n_a;
4404
4405     if (o)
4406         name = SvPVx(cSVOPo->op_sv, n_a);
4407     else
4408         name = "STDOUT";
4409     gv = gv_fetchpv(name,TRUE, SVt_PVFM);
4410     GvMULTI_on(gv);
4411     if (cv = GvFORM(gv)) {
4412         if (ckWARN(WARN_REDEFINE)) {
4413             line_t oldline = PL_curcop->cop_line;
4414
4415             PL_curcop->cop_line = PL_copline;
4416             Perl_warner(aTHX_ WARN_REDEFINE, "Format %s redefined",name);
4417             PL_curcop->cop_line = oldline;
4418         }
4419         SvREFCNT_dec(cv);
4420     }
4421     cv = PL_compcv;
4422     GvFORM(gv) = cv;
4423     CvGV(cv) = (GV*)SvREFCNT_inc(gv);
4424     CvFILEGV(cv) = PL_curcop->cop_filegv;
4425
4426     for (ix = AvFILLp(PL_comppad); ix > 0; ix--) {
4427         if (!SvPADMY(PL_curpad[ix]) && !SvIMMORTAL(PL_curpad[ix]))
4428             SvPADTMP_on(PL_curpad[ix]);
4429     }
4430
4431     CvROOT(cv) = newUNOP(OP_LEAVEWRITE, 0, scalarseq(block));
4432     CvSTART(cv) = LINKLIST(CvROOT(cv));
4433     CvROOT(cv)->op_next = 0;
4434     peep(CvSTART(cv));
4435     op_free(o);
4436     PL_copline = NOLINE;
4437     LEAVE_SCOPE(floor);
4438 }
4439
4440 OP *
4441 Perl_newANONLIST(pTHX_ OP *o)
4442 {
4443     return newUNOP(OP_REFGEN, 0,
4444         mod(list(convert(OP_ANONLIST, 0, o)), OP_REFGEN));
4445 }
4446
4447 OP *
4448 Perl_newANONHASH(pTHX_ OP *o)
4449 {
4450     return newUNOP(OP_REFGEN, 0,
4451         mod(list(convert(OP_ANONHASH, 0, o)), OP_REFGEN));
4452 }
4453
4454 OP *
4455 Perl_newANONSUB(pTHX_ I32 floor, OP *proto, OP *block)
4456 {
4457     return newANONATTRSUB(floor, proto, Nullop, block);
4458 }
4459
4460 OP *
4461 Perl_newANONATTRSUB(pTHX_ I32 floor, OP *proto, OP *attrs, OP *block)
4462 {
4463     return newUNOP(OP_REFGEN, 0,
4464         newSVOP(OP_ANONCODE, 0,
4465                 (SV*)newATTRSUB(floor, 0, proto, attrs, block)));
4466 }
4467
4468 OP *
4469 Perl_oopsAV(pTHX_ OP *o)
4470 {
4471     switch (o->op_type) {
4472     case OP_PADSV:
4473         o->op_type = OP_PADAV;
4474         o->op_ppaddr = PL_ppaddr[OP_PADAV];
4475         return ref(o, OP_RV2AV);
4476         
4477     case OP_RV2SV:
4478         o->op_type = OP_RV2AV;
4479         o->op_ppaddr = PL_ppaddr[OP_RV2AV];
4480         ref(o, OP_RV2AV);
4481         break;
4482
4483     default:
4484         if (ckWARN_d(WARN_INTERNAL))
4485             Perl_warner(aTHX_ WARN_INTERNAL, "oops: oopsAV");
4486         break;
4487     }
4488     return o;
4489 }
4490
4491 OP *
4492 Perl_oopsHV(pTHX_ OP *o)
4493 {
4494     dTHR;
4495     
4496     switch (o->op_type) {
4497     case OP_PADSV:
4498     case OP_PADAV:
4499         o->op_type = OP_PADHV;
4500         o->op_ppaddr = PL_ppaddr[OP_PADHV];
4501         return ref(o, OP_RV2HV);
4502
4503     case OP_RV2SV:
4504     case OP_RV2AV:
4505         o->op_type = OP_RV2HV;
4506         o->op_ppaddr = PL_ppaddr[OP_RV2HV];
4507         ref(o, OP_RV2HV);
4508         break;
4509
4510     default:
4511         if (ckWARN_d(WARN_INTERNAL))
4512             Perl_warner(aTHX_ WARN_INTERNAL, "oops: oopsHV");
4513         break;
4514     }
4515     return o;
4516 }
4517
4518 OP *
4519 Perl_newAVREF(pTHX_ OP *o)
4520 {
4521     if (o->op_type == OP_PADANY) {
4522         o->op_type = OP_PADAV;
4523         o->op_ppaddr = PL_ppaddr[OP_PADAV];
4524         return o;
4525     }
4526     return newUNOP(OP_RV2AV, 0, scalar(o));
4527 }
4528
4529 OP *
4530 Perl_newGVREF(pTHX_ I32 type, OP *o)
4531 {
4532     if (type == OP_MAPSTART || type == OP_GREPSTART || type == OP_SORT)
4533         return newUNOP(OP_NULL, 0, o);
4534     return ref(newUNOP(OP_RV2GV, OPf_REF, o), type);
4535 }
4536
4537 OP *
4538 Perl_newHVREF(pTHX_ OP *o)
4539 {
4540     if (o->op_type == OP_PADANY) {
4541         o->op_type = OP_PADHV;
4542         o->op_ppaddr = PL_ppaddr[OP_PADHV];
4543         return o;
4544     }
4545     return newUNOP(OP_RV2HV, 0, scalar(o));
4546 }
4547
4548 OP *
4549 Perl_oopsCV(pTHX_ OP *o)
4550 {
4551     Perl_croak(aTHX_ "NOT IMPL LINE %d",__LINE__);
4552     /* STUB */
4553     return o;
4554 }
4555
4556 OP *
4557 Perl_newCVREF(pTHX_ I32 flags, OP *o)
4558 {
4559     return newUNOP(OP_RV2CV, flags, scalar(o));
4560 }
4561
4562 OP *
4563 Perl_newSVREF(pTHX_ OP *o)
4564 {
4565     if (o->op_type == OP_PADANY) {
4566         o->op_type = OP_PADSV;
4567         o->op_ppaddr = PL_ppaddr[OP_PADSV];
4568         return o;
4569     }
4570     else if (o->op_type == OP_THREADSV && !(o->op_flags & OPpDONE_SVREF)) {
4571         o->op_flags |= OPpDONE_SVREF;
4572         return o;
4573     }
4574     return newUNOP(OP_RV2SV, 0, scalar(o));
4575 }
4576
4577 /* Check routines. */
4578
4579 OP *
4580 Perl_ck_anoncode(pTHX_ OP *o)
4581 {
4582     PADOFFSET ix;
4583     SV* name;
4584
4585     name = NEWSV(1106,0);
4586     sv_upgrade(name, SVt_PVNV);
4587     sv_setpvn(name, "&", 1);
4588     SvIVX(name) = -1;
4589     SvNVX(name) = 1;
4590     ix = pad_alloc(o->op_type, SVs_PADMY);
4591     av_store(PL_comppad_name, ix, name);
4592     av_store(PL_comppad, ix, cSVOPo->op_sv);
4593     SvPADMY_on(cSVOPo->op_sv);
4594     cSVOPo->op_sv = Nullsv;
4595     cSVOPo->op_targ = ix;
4596     return o;
4597 }
4598
4599 OP *
4600 Perl_ck_bitop(pTHX_ OP *o)
4601 {
4602     o->op_private = PL_hints;
4603     return o;
4604 }
4605
4606 OP *
4607 Perl_ck_concat(pTHX_ OP *o)
4608 {
4609     if (cUNOPo->op_first->op_type == OP_CONCAT)
4610         o->op_flags |= OPf_STACKED;
4611     return o;
4612 }
4613
4614 OP *
4615 Perl_ck_spair(pTHX_ OP *o)
4616 {
4617     if (o->op_flags & OPf_KIDS) {
4618         OP* newop;
4619         OP* kid;
4620         OPCODE type = o->op_type;
4621         o = modkids(ck_fun(o), type);
4622         kid = cUNOPo->op_first;
4623         newop = kUNOP->op_first->op_sibling;
4624         if (newop &&
4625             (newop->op_sibling ||
4626              !(PL_opargs[newop->op_type] & OA_RETSCALAR) ||
4627              newop->op_type == OP_PADAV || newop->op_type == OP_PADHV ||
4628              newop->op_type == OP_RV2AV || newop->op_type == OP_RV2HV)) {
4629         
4630             return o;
4631         }
4632         op_free(kUNOP->op_first);
4633         kUNOP->op_first = newop;
4634     }
4635     o->op_ppaddr = PL_ppaddr[++o->op_type];
4636     return ck_fun(o);
4637 }
4638
4639 OP *
4640 Perl_ck_delete(pTHX_ OP *o)
4641 {
4642     o = ck_fun(o);
4643     o->op_private = 0;
4644     if (o->op_flags & OPf_KIDS) {
4645         OP *kid = cUNOPo->op_first;
4646         if (kid->op_type == OP_HSLICE)
4647             o->op_private |= OPpSLICE;
4648         else if (kid->op_type != OP_HELEM)
4649             Perl_croak(aTHX_ "%s argument is not a HASH element or slice",
4650                   PL_op_desc[o->op_type]);
4651         null(kid);
4652     }
4653     return o;
4654 }
4655
4656 OP *
4657 Perl_ck_eof(pTHX_ OP *o)
4658 {
4659     I32 type = o->op_type;
4660
4661     if (o->op_flags & OPf_KIDS) {
4662         if (cLISTOPo->op_first->op_type == OP_STUB) {
4663             op_free(o);
4664             o = newUNOP(type, OPf_SPECIAL,
4665                 newGVOP(OP_GV, 0, gv_fetchpv("main::ARGV", TRUE, SVt_PVAV)));
4666         }
4667         return ck_fun(o);
4668     }
4669     return o;
4670 }
4671
4672 OP *
4673 Perl_ck_eval(pTHX_ OP *o)
4674 {
4675     PL_hints |= HINT_BLOCK_SCOPE;
4676     if (o->op_flags & OPf_KIDS) {
4677         SVOP *kid = (SVOP*)cUNOPo->op_first;
4678
4679         if (!kid) {
4680             o->op_flags &= ~OPf_KIDS;
4681             null(o);
4682         }
4683         else if (kid->op_type == OP_LINESEQ) {
4684             LOGOP *enter;
4685
4686             kid->op_next = o->op_next;
4687             cUNOPo->op_first = 0;
4688             op_free(o);
4689
4690             NewOp(1101, enter, 1, LOGOP);
4691             enter->op_type = OP_ENTERTRY;
4692             enter->op_ppaddr = PL_ppaddr[OP_ENTERTRY];
4693             enter->op_private = 0;
4694
4695             /* establish postfix order */
4696             enter->op_next = (OP*)enter;
4697
4698             o = prepend_elem(OP_LINESEQ, (OP*)enter, (OP*)kid);
4699             o->op_type = OP_LEAVETRY;
4700             o->op_ppaddr = PL_ppaddr[OP_LEAVETRY];
4701             enter->op_other = o;
4702             return o;
4703         }
4704         else
4705             scalar((OP*)kid);
4706     }
4707     else {
4708         op_free(o);
4709         o = newUNOP(OP_ENTEREVAL, 0, newDEFSVOP());
4710     }
4711     o->op_targ = (PADOFFSET)PL_hints;
4712     return o;
4713 }
4714
4715 OP *
4716 Perl_ck_exec(pTHX_ OP *o)
4717 {
4718     OP *kid;
4719     if (o->op_flags & OPf_STACKED) {
4720         o = ck_fun(o);
4721         kid = cUNOPo->op_first->op_sibling;
4722         if (kid->op_type == OP_RV2GV)
4723             null(kid);
4724     }
4725     else
4726         o = listkids(o);
4727     return o;
4728 }
4729
4730 OP *
4731 Perl_ck_exists(pTHX_ OP *o)
4732 {
4733     o = ck_fun(o);
4734     if (o->op_flags & OPf_KIDS) {
4735         OP *kid = cUNOPo->op_first;
4736         if (kid->op_type != OP_HELEM)
4737             Perl_croak(aTHX_ "%s argument is not a HASH element", PL_op_desc[o->op_type]);
4738         null(kid);
4739     }
4740     return o;
4741 }
4742
4743 #if 0
4744 OP *
4745 Perl_ck_gvconst(pTHX_ register OP *o)
4746 {
4747     o = fold_constants(o);
4748     if (o->op_type == OP_CONST)
4749         o->op_type = OP_GV;
4750     return o;
4751 }
4752 #endif
4753
4754 OP *
4755 Perl_ck_rvconst(pTHX_ register OP *o)
4756 {
4757     dTHR;
4758     SVOP *kid = (SVOP*)cUNOPo->op_first;
4759
4760     o->op_private |= (PL_hints & HINT_STRICT_REFS);
4761     if (kid->op_type == OP_CONST) {
4762         char *name;
4763         int iscv;
4764         GV *gv;
4765         SV *kidsv = kid->op_sv;
4766         STRLEN n_a;
4767
4768         /* Is it a constant from cv_const_sv()? */
4769         if (SvROK(kidsv) && SvREADONLY(kidsv)) {
4770             SV *rsv = SvRV(kidsv);
4771             int svtype = SvTYPE(rsv);
4772             char *badtype = Nullch;
4773
4774             switch (o->op_type) {
4775             case OP_RV2SV:
4776                 if (svtype > SVt_PVMG)
4777                     badtype = "a SCALAR";
4778                 break;
4779             case OP_RV2AV:
4780                 if (svtype != SVt_PVAV)
4781                     badtype = "an ARRAY";
4782                 break;
4783             case OP_RV2HV:
4784                 if (svtype != SVt_PVHV) {
4785                     if (svtype == SVt_PVAV) {   /* pseudohash? */
4786                         SV **ksv = av_fetch((AV*)rsv, 0, FALSE);
4787                         if (ksv && SvROK(*ksv)
4788                             && SvTYPE(SvRV(*ksv)) == SVt_PVHV)
4789                         {
4790                                 break;
4791                         }
4792                     }
4793                     badtype = "a HASH";
4794                 }
4795                 break;
4796             case OP_RV2CV:
4797                 if (svtype != SVt_PVCV)
4798                     badtype = "a CODE";
4799                 break;
4800             }
4801             if (badtype)
4802                 Perl_croak(aTHX_ "Constant is not %s reference", badtype);
4803             return o;
4804         }
4805         name = SvPV(kidsv, n_a);
4806         if ((PL_hints & HINT_STRICT_REFS) && (kid->op_private & OPpCONST_BARE)) {
4807             char *badthing = Nullch;
4808             switch (o->op_type) {
4809             case OP_RV2SV:
4810                 badthing = "a SCALAR";
4811                 break;
4812             case OP_RV2AV:
4813                 badthing = "an ARRAY";
4814                 break;
4815             case OP_RV2HV:
4816                 badthing = "a HASH";
4817                 break;
4818             }
4819             if (badthing)
4820                 Perl_croak(aTHX_ 
4821           "Can't use bareword (\"%s\") as %s ref while \"strict refs\" in use",
4822                       name, badthing);
4823         }
4824         /*
4825          * This is a little tricky.  We only want to add the symbol if we
4826          * didn't add it in the lexer.  Otherwise we get duplicate strict
4827          * warnings.  But if we didn't add it in the lexer, we must at
4828          * least pretend like we wanted to add it even if it existed before,
4829          * or we get possible typo warnings.  OPpCONST_ENTERED says
4830          * whether the lexer already added THIS instance of this symbol.
4831          */
4832         iscv = (o->op_type == OP_RV2CV) * 2;
4833         do {
4834             gv = gv_fetchpv(name,
4835                 iscv | !(kid->op_private & OPpCONST_ENTERED),
4836                 iscv
4837                     ? SVt_PVCV
4838                     : o->op_type == OP_RV2SV
4839                         ? SVt_PV
4840                         : o->op_type == OP_RV2AV
4841                             ? SVt_PVAV
4842                             : o->op_type == OP_RV2HV
4843                                 ? SVt_PVHV
4844                                 : SVt_PVGV);
4845         } while (!gv && !(kid->op_private & OPpCONST_ENTERED) && !iscv++);
4846         if (gv) {
4847             kid->op_type = OP_GV;
4848             SvREFCNT_dec(kid->op_sv);
4849             kid->op_sv = SvREFCNT_inc(gv);
4850             kid->op_ppaddr = PL_ppaddr[OP_GV];
4851         }
4852     }
4853     return o;
4854 }
4855
4856 OP *
4857 Perl_ck_ftst(pTHX_ OP *o)
4858 {
4859     dTHR;
4860     I32 type = o->op_type;
4861
4862     if (o->op_flags & OPf_REF)
4863         return o;
4864
4865     if (o->op_flags & OPf_KIDS && cUNOPo->op_first->op_type != OP_STUB) {
4866         SVOP *kid = (SVOP*)cUNOPo->op_first;
4867
4868         if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) {
4869             STRLEN n_a;
4870             OP *newop = newGVOP(type, OPf_REF,
4871                 gv_fetchpv(SvPVx(kid->op_sv, n_a), TRUE, SVt_PVIO));
4872             op_free(o);
4873             return newop;
4874         }
4875     }
4876     else {
4877         op_free(o);
4878         if (type == OP_FTTTY)
4879            return newGVOP(type, OPf_REF, gv_fetchpv("main::STDIN", TRUE,
4880                                 SVt_PVIO));
4881         else
4882             return newUNOP(type, 0, newDEFSVOP());
4883     }
4884     return o;
4885 }
4886
4887 OP *
4888 Perl_ck_fun(pTHX_ OP *o)
4889 {
4890     dTHR;
4891     register OP *kid;
4892     OP **tokid;
4893     OP *sibl;
4894     I32 numargs = 0;
4895     int type = o->op_type;
4896     register I32 oa = PL_opargs[type] >> OASHIFT;
4897
4898     if (o->op_flags & OPf_STACKED) {
4899         if ((oa & OA_OPTIONAL) && (oa >> 4) && !((oa >> 4) & OA_OPTIONAL))
4900             oa &= ~OA_OPTIONAL;
4901         else
4902             return no_fh_allowed(o);
4903     }
4904
4905     if (o->op_flags & OPf_KIDS) {
4906         STRLEN n_a;
4907         tokid = &cLISTOPo->op_first;
4908         kid = cLISTOPo->op_first;
4909         if (kid->op_type == OP_PUSHMARK ||
4910             kid->op_type == OP_NULL && kid->op_targ == OP_PUSHMARK)
4911         {
4912             tokid = &kid->op_sibling;
4913             kid = kid->op_sibling;
4914         }
4915         if (!kid && PL_opargs[type] & OA_DEFGV)
4916             *tokid = kid = newDEFSVOP();
4917
4918         while (oa && kid) {
4919             numargs++;
4920             sibl = kid->op_sibling;
4921             switch (oa & 7) {
4922             case OA_SCALAR:
4923                 /* list seen where single (scalar) arg expected? */
4924                 if (numargs == 1 && !(oa >> 4)
4925                     && kid->op_type == OP_LIST && type != OP_SCALAR)
4926                 {
4927                     return too_many_arguments(o,PL_op_desc[type]);
4928                 }
4929                 scalar(kid);
4930                 break;
4931             case OA_LIST:
4932                 if (oa < 16) {
4933                     kid = 0;
4934                     continue;
4935                 }
4936                 else
4937                     list(kid);
4938                 break;
4939             case OA_AVREF:
4940                 if (kid->op_type == OP_CONST &&
4941                     (kid->op_private & OPpCONST_BARE))
4942                 {
4943                     char *name = SvPVx(((SVOP*)kid)->op_sv, n_a);
4944                     OP *newop = newAVREF(newGVOP(OP_GV, 0,
4945                         gv_fetchpv(name, TRUE, SVt_PVAV) ));
4946 #ifdef IV_IS_QUAD
4947                     if (ckWARN(WARN_SYNTAX))
4948                         Perl_warner(aTHX_ WARN_SYNTAX,
4949                             "Array @%s missing the @ in argument %" PERL_PRId64 " of %s()",
4950                             name, (IV)numargs, PL_op_desc[type]);
4951 #else
4952                     if (ckWARN(WARN_SYNTAX))
4953                         Perl_warner(aTHX_ WARN_SYNTAX,
4954                             "Array @%s missing the @ in argument %ld of %s()",
4955                             name, (long)numargs, PL_op_desc[type]);
4956 #endif
4957                     op_free(kid);
4958                     kid = newop;
4959                     kid->op_sibling = sibl;
4960                     *tokid = kid;
4961                 }
4962                 else if (kid->op_type != OP_RV2AV && kid->op_type != OP_PADAV)
4963                     bad_type(numargs, "array", PL_op_desc[type], kid);
4964                 mod(kid, type);
4965                 break;
4966             case OA_HVREF:
4967                 if (kid->op_type == OP_CONST &&
4968                     (kid->op_private & OPpCONST_BARE))
4969                 {
4970                     char *name = SvPVx(((SVOP*)kid)->op_sv, n_a);
4971                     OP *newop = newHVREF(newGVOP(OP_GV, 0,
4972                         gv_fetchpv(name, TRUE, SVt_PVHV) ));
4973 #ifdef IV_IS_QUAD
4974                     if (ckWARN(WARN_SYNTAX))
4975                         Perl_warner(aTHX_ WARN_SYNTAX,
4976                             "Hash %%%s missing the %% in argument %" PERL_PRId64 " of %s()",
4977                             name, (IV)numargs, PL_op_desc[type]);
4978 #else
4979                     if (ckWARN(WARN_SYNTAX))
4980                         Perl_warner(aTHX_ WARN_SYNTAX,
4981                             "Hash %%%s missing the %% in argument %ld of %s()",
4982                             name, (long)numargs, PL_op_desc[type]);
4983 #endif
4984                     op_free(kid);
4985                     kid = newop;
4986                     kid->op_sibling = sibl;
4987                     *tokid = kid;
4988                 }
4989                 else if (kid->op_type != OP_RV2HV && kid->op_type != OP_PADHV)
4990                     bad_type(numargs, "hash", PL_op_desc[type], kid);
4991                 mod(kid, type);
4992                 break;
4993             case OA_CVREF:
4994                 {
4995                     OP *newop = newUNOP(OP_NULL, 0, kid);
4996                     kid->op_sibling = 0;
4997                     linklist(kid);
4998                     newop->op_next = newop;
4999                     kid = newop;
5000                     kid->op_sibling = sibl;
5001                     *tokid = kid;
5002                 }
5003                 break;
5004             case OA_FILEREF:
5005                 if (kid->op_type != OP_GV && kid->op_type != OP_RV2GV) {
5006                     if (kid->op_type == OP_CONST &&
5007                         (kid->op_private & OPpCONST_BARE))
5008                     {
5009                         OP *newop = newGVOP(OP_GV, 0,
5010                             gv_fetchpv(SvPVx(((SVOP*)kid)->op_sv, n_a), TRUE,
5011                                         SVt_PVIO) );
5012                         op_free(kid);
5013                         kid = newop;
5014                     }
5015                     else if (kid->op_type == OP_READLINE) {
5016                         /* neophyte patrol: open(<FH>), close(<FH>) etc. */
5017                         bad_type(numargs, "HANDLE", PL_op_desc[o->op_type], kid);
5018                     }
5019                     else {
5020                         I32 flags = OPf_SPECIAL;
5021                         I32 priv = 0;
5022                         /* is this op a FH constructor? */
5023                         if (is_handle_constructor(o,numargs)) {
5024                             flags   = 0;                         
5025                             /* Set a flag to tell rv2gv to vivify 
5026                              * need to "prove" flag does not mean something
5027                              * else already - NI-S 1999/05/07
5028                              */ 
5029                             priv = OPpDEREF; 
5030 #if 0
5031                             /* Helps with open($array[$n],...) 
5032                                but is too simplistic - need to do selectively
5033                             */
5034                             mod(kid,type);
5035 #endif
5036                         }
5037                         kid->op_sibling = 0;
5038                         kid = newUNOP(OP_RV2GV, flags, scalar(kid));
5039                         if (priv) {
5040                             kid->op_private |= priv;
5041                         }
5042                     }
5043                     kid->op_sibling = sibl;
5044                     *tokid = kid;
5045                 }
5046                 scalar(kid);
5047                 break;
5048             case OA_SCALARREF:
5049                 mod(scalar(kid), type);
5050                 break;
5051             }
5052             oa >>= 4;
5053             tokid = &kid->op_sibling;
5054             kid = kid->op_sibling;
5055         }
5056         o->op_private |= numargs;
5057         if (kid)
5058             return too_many_arguments(o,PL_op_desc[o->op_type]);
5059         listkids(o);
5060     }
5061     else if (PL_opargs[type] & OA_DEFGV) {
5062         op_free(o);
5063         return newUNOP(type, 0, newDEFSVOP());
5064     }
5065
5066     if (oa) {
5067         while (oa & OA_OPTIONAL)
5068             oa >>= 4;
5069         if (oa && oa != OA_LIST)
5070             return too_few_arguments(o,PL_op_desc[o->op_type]);
5071     }
5072     return o;
5073 }
5074
5075 OP *
5076 Perl_ck_glob(pTHX_ OP *o)
5077 {
5078     GV *gv;
5079
5080     if ((o->op_flags & OPf_KIDS) && !cLISTOPo->op_first->op_sibling)
5081         append_elem(OP_GLOB, o, newDEFSVOP());
5082
5083     if (!((gv = gv_fetchpv("glob", FALSE, SVt_PVCV)) && GvIMPORTED_CV(gv)))
5084         gv = gv_fetchpv("CORE::GLOBAL::glob", FALSE, SVt_PVCV);
5085
5086     if (gv && GvIMPORTED_CV(gv)) {
5087         append_elem(OP_GLOB, o,
5088                     newSVOP(OP_CONST, 0, newSViv(PL_glob_index++)));
5089         o->op_type = OP_LIST;
5090         o->op_ppaddr = PL_ppaddr[OP_LIST];
5091         cLISTOPo->op_first->op_type = OP_PUSHMARK;
5092         cLISTOPo->op_first->op_ppaddr = PL_ppaddr[OP_PUSHMARK];
5093         o = newUNOP(OP_ENTERSUB, OPf_STACKED,
5094                     append_elem(OP_LIST, o,
5095                                 scalar(newUNOP(OP_RV2CV, 0,
5096                                                newGVOP(OP_GV, 0, gv)))));
5097         o = newUNOP(OP_NULL, 0, ck_subr(o));
5098         o->op_targ = OP_GLOB;           /* hint at what it used to be */
5099         return o;
5100     }
5101     gv = newGVgen("main");
5102     gv_IOadd(gv);
5103     append_elem(OP_GLOB, o, newGVOP(OP_GV, 0, gv));
5104     scalarkids(o);
5105     return ck_fun(o);
5106 }
5107
5108 OP *
5109 Perl_ck_grep(pTHX_ OP *o)
5110 {
5111     LOGOP *gwop;
5112     OP *kid;
5113     OPCODE type = o->op_type == OP_GREPSTART ? OP_GREPWHILE : OP_MAPWHILE;
5114
5115     o->op_ppaddr = PL_ppaddr[OP_GREPSTART];
5116     NewOp(1101, gwop, 1, LOGOP);
5117
5118     if (o->op_flags & OPf_STACKED) {
5119         OP* k;
5120         o = ck_sort(o);
5121         kid = cLISTOPo->op_first->op_sibling;
5122         for (k = cLISTOPo->op_first->op_sibling->op_next; k; k = k->op_next) {
5123             kid = k;
5124         }
5125         kid->op_next = (OP*)gwop;
5126         o->op_flags &= ~OPf_STACKED;
5127     }
5128     kid = cLISTOPo->op_first->op_sibling;
5129     if (type == OP_MAPWHILE)
5130         list(kid);
5131     else
5132         scalar(kid);
5133     o = ck_fun(o);
5134     if (PL_error_count)
5135         return o;
5136     kid = cLISTOPo->op_first->op_sibling;
5137     if (kid->op_type != OP_NULL)
5138         Perl_croak(aTHX_ "panic: ck_grep");
5139     kid = kUNOP->op_first;
5140
5141     gwop->op_type = type;
5142     gwop->op_ppaddr = PL_ppaddr[type];
5143     gwop->op_first = listkids(o);
5144     gwop->op_flags |= OPf_KIDS;
5145     gwop->op_private = 1;
5146     gwop->op_other = LINKLIST(kid);
5147     gwop->op_targ = pad_alloc(type, SVs_PADTMP);
5148     kid->op_next = (OP*)gwop;
5149
5150     kid = cLISTOPo->op_first->op_sibling;
5151     if (!kid || !kid->op_sibling)
5152         return too_few_arguments(o,PL_op_desc[o->op_type]);
5153     for (kid = kid->op_sibling; kid; kid = kid->op_sibling)
5154         mod(kid, OP_GREPSTART);
5155
5156     return (OP*)gwop;
5157 }
5158
5159 OP *
5160 Perl_ck_index(pTHX_ OP *o)
5161 {
5162     if (o->op_flags & OPf_KIDS) {
5163         OP *kid = cLISTOPo->op_first->op_sibling;       /* get past pushmark */
5164         if (kid)
5165             kid = kid->op_sibling;                      /* get past "big" */
5166         if (kid && kid->op_type == OP_CONST)
5167             fbm_compile(((SVOP*)kid)->op_sv, 0);
5168     }
5169     return ck_fun(o);
5170 }
5171
5172 OP *
5173 Perl_ck_lengthconst(pTHX_ OP *o)
5174 {
5175     /* XXX length optimization goes here */
5176     return ck_fun(o);
5177 }
5178
5179 OP *
5180 Perl_ck_lfun(pTHX_ OP *o)
5181 {
5182     OPCODE type = o->op_type;
5183     return modkids(ck_fun(o), type);
5184 }
5185
5186 OP *
5187 Perl_ck_defined(pTHX_ OP *o)            /* 19990527 MJD */
5188 {
5189     dTHR;
5190     if ((o->op_flags & OPf_KIDS) && ckWARN(WARN_DEPRECATED)) {
5191         switch (cUNOPo->op_first->op_type) {
5192         case OP_RV2AV:
5193             break;                      /* Globals via GV can be undef */ 
5194         case OP_PADAV:
5195         case OP_AASSIGN:                /* Is this a good idea? */
5196             Perl_warner(aTHX_ WARN_DEPRECATED,
5197                         "defined(@array) is deprecated");
5198             Perl_warner(aTHX_ WARN_DEPRECATED,
5199                         "(Maybe you should just omit the defined()?)\n");
5200         break;
5201         case OP_RV2HV:
5202             break;                      /* Globals via GV can be undef */ 
5203         case OP_PADHV:
5204             Perl_warner(aTHX_ WARN_DEPRECATED,
5205                         "defined(%hash) is deprecated");
5206             Perl_warner(aTHX_ WARN_DEPRECATED,
5207                         "(Maybe you should just omit the defined()?)\n");
5208             break;
5209         default:
5210             /* no warning */
5211             break;
5212         }
5213     }
5214     return ck_rfun(o);
5215 }
5216
5217 OP *
5218 Perl_ck_rfun(pTHX_ OP *o)
5219 {
5220     OPCODE type = o->op_type;
5221     return refkids(ck_fun(o), type);
5222 }
5223
5224 OP *
5225 Perl_ck_listiob(pTHX_ OP *o)
5226 {
5227     register OP *kid;
5228
5229     kid = cLISTOPo->op_first;
5230     if (!kid) {
5231         o = force_list(o);
5232         kid = cLISTOPo->op_first;
5233     }
5234     if (kid->op_type == OP_PUSHMARK)
5235         kid = kid->op_sibling;
5236     if (kid && o->op_flags & OPf_STACKED)
5237         kid = kid->op_sibling;
5238     else if (kid && !kid->op_sibling) {         /* print HANDLE; */
5239         if (kid->op_type == OP_CONST && kid->op_private & OPpCONST_BARE) {
5240             o->op_flags |= OPf_STACKED; /* make it a filehandle */
5241             kid = newUNOP(OP_RV2GV, OPf_REF, scalar(kid));
5242             cLISTOPo->op_first->op_sibling = kid;
5243             cLISTOPo->op_last = kid;
5244             kid = kid->op_sibling;
5245         }
5246     }
5247         
5248     if (!kid)
5249         append_elem(o->op_type, o, newDEFSVOP());
5250
5251     o = listkids(o);
5252
5253     o->op_private = 0;
5254 #ifdef USE_LOCALE
5255     if (PL_hints & HINT_LOCALE)
5256         o->op_private |= OPpLOCALE;
5257 #endif
5258
5259     return o;
5260 }
5261
5262 OP *
5263 Perl_ck_fun_locale(pTHX_ OP *o)
5264 {
5265     o = ck_fun(o);
5266
5267     o->op_private = 0;
5268 #ifdef USE_LOCALE
5269     if (PL_hints & HINT_LOCALE)
5270         o->op_private |= OPpLOCALE;
5271 #endif
5272
5273     return o;
5274 }
5275
5276 OP *
5277 Perl_ck_sassign(pTHX_ OP *o)
5278 {
5279     OP *kid = cLISTOPo->op_first;
5280     /* has a disposable target? */
5281     if ((PL_opargs[kid->op_type] & OA_TARGLEX)
5282         && !(kid->op_flags & OPf_STACKED))
5283     {
5284         OP *kkid = kid->op_sibling;
5285
5286         /* Can just relocate the target. */
5287         if (kkid && kkid->op_type == OP_PADSV
5288             && !(kkid->op_private & OPpLVAL_INTRO))
5289         {
5290             /* Concat has problems if target is equal to right arg. */
5291             if (kid->op_type == OP_CONCAT
5292                 && kLISTOP->op_first->op_sibling->op_type == OP_PADSV
5293                 && kLISTOP->op_first->op_sibling->op_targ == kkid->op_targ)
5294             {
5295                 return o;
5296             }
5297             kid->op_targ = kkid->op_targ;
5298             /* Now we do not need PADSV and SASSIGN. */
5299             kid->op_sibling = o->op_sibling;    /* NULL */
5300             cLISTOPo->op_first = NULL;
5301             op_free(o);
5302             op_free(kkid);
5303             kid->op_private |= OPpTARGET_MY;    /* Used for context settings */
5304             return kid;
5305         }
5306     }
5307     return o;
5308 }
5309
5310 OP *
5311 Perl_ck_scmp(pTHX_ OP *o)
5312 {
5313     o->op_private = 0;
5314 #ifdef USE_LOCALE
5315     if (PL_hints & HINT_LOCALE)
5316         o->op_private |= OPpLOCALE;
5317 #endif
5318
5319     return o;
5320 }
5321
5322 OP *
5323 Perl_ck_match(pTHX_ OP *o)
5324 {
5325     o->op_private |= OPpRUNTIME;
5326     return o;
5327 }
5328
5329 OP *
5330 Perl_ck_method(pTHX_ OP *o)
5331 {
5332     OP *kid = cUNOPo->op_first;
5333     if (kid->op_type == OP_CONST) {
5334         SV* sv = kSVOP->op_sv;
5335         if (!(strchr(SvPVX(sv), ':') || strchr(SvPVX(sv), '\''))) {
5336             OP *cmop;
5337             sv_upgrade(sv, SVt_PVIV);
5338             SvIOK_on(sv);
5339             PERL_HASH(SvUVX(sv), SvPVX(sv), SvCUR(sv));
5340             cmop = newSVOP(OP_METHOD_NAMED, 0, sv);
5341             kSVOP->op_sv = Nullsv;
5342             op_free(o);
5343             return cmop;
5344         }
5345     }
5346     return o;
5347 }
5348
5349 OP *
5350 Perl_ck_null(pTHX_ OP *o)
5351 {
5352     return o;
5353 }
5354
5355 OP *
5356 Perl_ck_repeat(pTHX_ OP *o)
5357 {
5358     if (cBINOPo->op_first->op_flags & OPf_PARENS) {
5359         o->op_private |= OPpREPEAT_DOLIST;
5360         cBINOPo->op_first = force_list(cBINOPo->op_first);
5361     }
5362     else
5363         scalar(o);
5364     return o;
5365 }
5366
5367 OP *
5368 Perl_ck_require(pTHX_ OP *o)
5369 {
5370     if (o->op_flags & OPf_KIDS) {       /* Shall we supply missing .pm? */
5371         SVOP *kid = (SVOP*)cUNOPo->op_first;
5372
5373         if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) {
5374             char *s;
5375             for (s = SvPVX(kid->op_sv); *s; s++) {
5376                 if (*s == ':' && s[1] == ':') {
5377                     *s = '/';
5378                     Move(s+2, s+1, strlen(s+2)+1, char);
5379                     --SvCUR(kid->op_sv);
5380                 }
5381             }
5382             sv_catpvn(kid->op_sv, ".pm", 3);
5383         }
5384     }
5385     return ck_fun(o);
5386 }
5387
5388 #if 0
5389 OP *
5390 Perl_ck_retarget(pTHX_ OP *o)
5391 {
5392     Perl_croak(aTHX_ "NOT IMPL LINE %d",__LINE__);
5393     /* STUB */
5394     return o;
5395 }
5396 #endif
5397
5398 OP *
5399 Perl_ck_select(pTHX_ OP *o)
5400 {
5401     OP* kid;
5402     if (o->op_flags & OPf_KIDS) {
5403         kid = cLISTOPo->op_first->op_sibling;   /* get past pushmark */
5404         if (kid && kid->op_sibling) {
5405             o->op_type = OP_SSELECT;
5406             o->op_ppaddr = PL_ppaddr[OP_SSELECT];
5407             o = ck_fun(o);
5408             return fold_constants(o);
5409         }
5410     }
5411     o = ck_fun(o);
5412     kid = cLISTOPo->op_first->op_sibling;    /* get past pushmark */
5413     if (kid && kid->op_type == OP_RV2GV)
5414         kid->op_private &= ~HINT_STRICT_REFS;
5415     return o;
5416 }
5417
5418 OP *
5419 Perl_ck_shift(pTHX_ OP *o)
5420 {
5421     I32 type = o->op_type;
5422
5423     if (!(o->op_flags & OPf_KIDS)) {
5424         OP *argop;
5425         
5426         op_free(o);
5427 #ifdef USE_THREADS
5428         if (!CvUNIQUE(PL_compcv)) {
5429             argop = newOP(OP_PADAV, OPf_REF);
5430             argop->op_targ = 0;         /* PL_curpad[0] is @_ */
5431         }
5432         else {
5433             argop = newUNOP(OP_RV2AV, 0,
5434                 scalar(newGVOP(OP_GV, 0,
5435                     gv_fetchpv("ARGV", TRUE, SVt_PVAV))));
5436         }
5437 #else
5438         argop = newUNOP(OP_RV2AV, 0,
5439             scalar(newGVOP(OP_GV, 0, !CvUNIQUE(PL_compcv) ?
5440                            PL_defgv : gv_fetchpv("ARGV", TRUE, SVt_PVAV))));
5441 #endif /* USE_THREADS */
5442         return newUNOP(type, 0, scalar(argop));
5443     }
5444     return scalar(modkids(ck_fun(o), type));
5445 }
5446
5447 OP *
5448 Perl_ck_sort(pTHX_ OP *o)
5449 {
5450     o->op_private = 0;
5451 #ifdef USE_LOCALE
5452     if (PL_hints & HINT_LOCALE)
5453         o->op_private |= OPpLOCALE;
5454 #endif
5455
5456     if (o->op_type == OP_SORT && o->op_flags & OPf_STACKED)
5457         simplify_sort(o);
5458     if (o->op_flags & OPf_STACKED) {                 /* may have been cleared */
5459         OP *kid = cLISTOPo->op_first->op_sibling;       /* get past pushmark */
5460         OP *k;
5461         kid = kUNOP->op_first;                          /* get past null */
5462
5463         if (kid->op_type == OP_SCOPE || kid->op_type == OP_LEAVE) {
5464             linklist(kid);
5465             if (kid->op_type == OP_SCOPE) {
5466                 k = kid->op_next;
5467                 kid->op_next = 0;
5468             }
5469             else if (kid->op_type == OP_LEAVE) {
5470                 if (o->op_type == OP_SORT) {
5471                     null(kid);                  /* wipe out leave */
5472                     kid->op_next = kid;
5473
5474                     for (k = kLISTOP->op_first->op_next; k; k = k->op_next) {
5475                         if (k->op_next == kid)
5476                             k->op_next = 0;
5477                     }
5478                 }
5479                 else
5480                     kid->op_next = 0;           /* just disconnect the leave */
5481                 k = kLISTOP->op_first;
5482             }
5483             peep(k);
5484
5485             kid = cLISTOPo->op_first->op_sibling;       /* get past pushmark */
5486             if (o->op_type == OP_SORT)
5487                 kid->op_next = kid;
5488             else
5489                 kid->op_next = k;
5490             o->op_flags |= OPf_SPECIAL;
5491         }
5492         else if (kid->op_type == OP_RV2SV || kid->op_type == OP_PADSV)
5493             null(cLISTOPo->op_first->op_sibling);
5494     }
5495
5496     return o;
5497 }
5498
5499 STATIC void
5500 S_simplify_sort(pTHX_ OP *o)
5501 {
5502     dTHR;
5503     register OP *kid = cLISTOPo->op_first->op_sibling;  /* get past pushmark */
5504     OP *k;
5505     int reversed;
5506     if (!(o->op_flags & OPf_STACKED))
5507         return;
5508     GvMULTI_on(gv_fetchpv("a", TRUE, SVt_PV)); 
5509     GvMULTI_on(gv_fetchpv("b", TRUE, SVt_PV)); 
5510     kid = kUNOP->op_first;                              /* get past null */
5511     if (kid->op_type != OP_SCOPE)
5512         return;
5513     kid = kLISTOP->op_last;                             /* get past scope */
5514     switch(kid->op_type) {
5515         case OP_NCMP:
5516         case OP_I_NCMP:
5517         case OP_SCMP:
5518             break;
5519         default:
5520             return;
5521     }
5522     k = kid;                                            /* remember this node*/
5523     if (kBINOP->op_first->op_type != OP_RV2SV)
5524         return;
5525     kid = kBINOP->op_first;                             /* get past cmp */
5526     if (kUNOP->op_first->op_type != OP_GV)
5527         return;
5528     kid = kUNOP->op_first;                              /* get past rv2sv */
5529     if (GvSTASH(kGVOP->op_gv) != PL_curstash)
5530         return;
5531     if (strEQ(GvNAME(kGVOP->op_gv), "a"))
5532         reversed = 0;
5533     else if(strEQ(GvNAME(kGVOP->op_gv), "b"))
5534         reversed = 1;
5535     else
5536         return;
5537     kid = k;                                            /* back to cmp */
5538     if (kBINOP->op_last->op_type != OP_RV2SV)
5539         return;
5540     kid = kBINOP->op_last;                              /* down to 2nd arg */
5541     if (kUNOP->op_first->op_type != OP_GV)
5542         return;
5543     kid = kUNOP->op_first;                              /* get past rv2sv */
5544     if (GvSTASH(kGVOP->op_gv) != PL_curstash
5545         || ( reversed
5546             ? strNE(GvNAME(kGVOP->op_gv), "a")
5547             : strNE(GvNAME(kGVOP->op_gv), "b")))
5548         return;
5549     o->op_flags &= ~(OPf_STACKED | OPf_SPECIAL);
5550     if (reversed)
5551         o->op_private |= OPpSORT_REVERSE;
5552     if (k->op_type == OP_NCMP)
5553         o->op_private |= OPpSORT_NUMERIC;
5554     if (k->op_type == OP_I_NCMP)
5555         o->op_private |= OPpSORT_NUMERIC | OPpSORT_INTEGER;
5556     op_free(cLISTOPo->op_first->op_sibling);    /* delete comparison block */
5557     cLISTOPo->op_first->op_sibling = cLISTOPo->op_last;
5558     cLISTOPo->op_children = 1;
5559 }
5560
5561 OP *
5562 Perl_ck_split(pTHX_ OP *o)
5563 {
5564     register OP *kid;
5565
5566     if (o->op_flags & OPf_STACKED)
5567         return no_fh_allowed(o);
5568
5569     kid = cLISTOPo->op_first;
5570     if (kid->op_type != OP_NULL)
5571         Perl_croak(aTHX_ "panic: ck_split");
5572     kid = kid->op_sibling;
5573     op_free(cLISTOPo->op_first);
5574     cLISTOPo->op_first = kid;
5575     if (!kid) {
5576         cLISTOPo->op_first = kid = newSVOP(OP_CONST, 0, newSVpvn(" ", 1));
5577         cLISTOPo->op_last = kid; /* There was only one element previously */
5578     }
5579
5580     if (kid->op_type != OP_MATCH) {
5581         OP *sibl = kid->op_sibling;
5582         kid->op_sibling = 0;
5583         kid = pmruntime( newPMOP(OP_MATCH, OPf_SPECIAL), kid, Nullop);
5584         if (cLISTOPo->op_first == cLISTOPo->op_last)
5585             cLISTOPo->op_last = kid;
5586         cLISTOPo->op_first = kid;
5587         kid->op_sibling = sibl;
5588     }
5589
5590     kid->op_type = OP_PUSHRE;
5591     kid->op_ppaddr = PL_ppaddr[OP_PUSHRE];
5592     scalar(kid);
5593
5594     if (!kid->op_sibling)
5595         append_elem(OP_SPLIT, o, newDEFSVOP());
5596
5597     kid = kid->op_sibling;
5598     scalar(kid);
5599
5600     if (!kid->op_sibling)
5601         append_elem(OP_SPLIT, o, newSVOP(OP_CONST, 0, newSViv(0)));
5602
5603     kid = kid->op_sibling;
5604     scalar(kid);
5605
5606     if (kid->op_sibling)
5607         return too_many_arguments(o,PL_op_desc[o->op_type]);
5608
5609     return o;
5610 }
5611
5612 OP *
5613 Perl_ck_subr(pTHX_ OP *o)
5614 {
5615     dTHR;
5616     OP *prev = ((cUNOPo->op_first->op_sibling)
5617              ? cUNOPo : ((UNOP*)cUNOPo->op_first))->op_first;
5618     OP *o2 = prev->op_sibling;
5619     OP *cvop;
5620     char *proto = 0;
5621     CV *cv = 0;
5622     GV *namegv = 0;
5623     int optional = 0;
5624     I32 arg = 0;
5625     STRLEN n_a;
5626
5627     for (cvop = o2; cvop->op_sibling; cvop = cvop->op_sibling) ;
5628     if (cvop->op_type == OP_RV2CV) {
5629         SVOP* tmpop;
5630         o->op_private |= (cvop->op_private & OPpENTERSUB_AMPER);
5631         null(cvop);             /* disable rv2cv */
5632         tmpop = (SVOP*)((UNOP*)cvop)->op_first;
5633         if (tmpop->op_type == OP_GV && !(o->op_private & OPpENTERSUB_AMPER)) {
5634             cv = GvCVu(tmpop->op_sv);
5635             if (!cv)
5636                 tmpop->op_private |= OPpEARLY_CV;
5637             else if (SvPOK(cv)) {
5638                 namegv = CvANON(cv) ? (GV*)tmpop->op_sv : CvGV(cv);
5639                 proto = SvPV((SV*)cv, n_a);
5640             }
5641         }
5642     }
5643     else if (cvop->op_type == OP_METHOD || cvop->op_type == OP_METHOD_NAMED) {
5644         if (o2->op_type == OP_CONST)
5645             o2->op_private &= ~OPpCONST_STRICT;
5646         else if (o2->op_type == OP_LIST) {
5647             OP *o = ((UNOP*)o2)->op_first->op_sibling;
5648             if (o && o->op_type == OP_CONST)
5649                 o->op_private &= ~OPpCONST_STRICT;
5650         }
5651     }
5652     o->op_private |= (PL_hints & HINT_STRICT_REFS);
5653     if (PERLDB_SUB && PL_curstash != PL_debstash)
5654         o->op_private |= OPpENTERSUB_DB;
5655     while (o2 != cvop) {
5656         if (proto) {
5657             switch (*proto) {
5658             case '\0':
5659                 return too_many_arguments(o, gv_ename(namegv));
5660             case ';':
5661                 optional = 1;
5662                 proto++;
5663                 continue;
5664             case '$':
5665                 proto++;
5666                 arg++;
5667                 scalar(o2);
5668                 break;
5669             case '%':
5670             case '@':
5671                 list(o2);
5672                 arg++;
5673                 break;
5674             case '&':
5675                 proto++;
5676                 arg++;
5677                 if (o2->op_type != OP_REFGEN && o2->op_type != OP_UNDEF)
5678                     bad_type(arg, "block", gv_ename(namegv), o2);
5679                 break;
5680             case '*':
5681                 /* '*' allows any scalar type, including bareword */
5682                 proto++;
5683                 arg++;
5684                 if (o2->op_type == OP_RV2GV)
5685                     goto wrapref;       /* autoconvert GLOB -> GLOBref */
5686                 else if (o2->op_type == OP_CONST)
5687                     o2->op_private &= ~OPpCONST_STRICT;
5688                 else if (o2->op_type == OP_ENTERSUB) {
5689                     /* accidental subroutine, revert to bareword */
5690                     OP *gvop = ((UNOP*)o2)->op_first;
5691                     if (gvop && gvop->op_type == OP_NULL) {
5692                         gvop = ((UNOP*)gvop)->op_first;
5693                         if (gvop) {
5694                             for (; gvop->op_sibling; gvop = gvop->op_sibling)
5695                                 ;
5696                             if (gvop &&
5697                                 (gvop->op_private & OPpENTERSUB_NOPAREN) &&
5698                                 (gvop = ((UNOP*)gvop)->op_first) &&
5699                                 gvop->op_type == OP_GV)
5700                             {
5701                                 GV *gv = (GV*)((SVOP*)gvop)->op_sv;
5702                                 OP *sibling = o2->op_sibling;
5703                                 SV *n = newSVpvn("",0);
5704                                 op_free(o2);
5705                                 gv_fullname3(n, gv, "");
5706                                 if (SvCUR(n)>6 && strnEQ(SvPVX(n),"main::",6))
5707                                     sv_chop(n, SvPVX(n)+6);
5708                                 o2 = newSVOP(OP_CONST, 0, n);
5709                                 prev->op_sibling = o2;
5710                                 o2->op_sibling = sibling;
5711                             }
5712                         }
5713                     }
5714                 }
5715                 scalar(o2);
5716                 break;
5717             case '\\':
5718                 proto++;
5719                 arg++;
5720                 switch (*proto++) {
5721                 case '*':
5722                     if (o2->op_type != OP_RV2GV)
5723                         bad_type(arg, "symbol", gv_ename(namegv), o2);
5724                     goto wrapref;
5725                 case '&':
5726                     if (o2->op_type != OP_RV2CV)
5727                         bad_type(arg, "sub", gv_ename(namegv), o2);
5728                     goto wrapref;
5729                 case '$':
5730                     if (o2->op_type != OP_RV2SV
5731                         && o2->op_type != OP_PADSV
5732                         && o2->op_type != OP_HELEM
5733                         && o2->op_type != OP_AELEM
5734                         && o2->op_type != OP_THREADSV)
5735                     {
5736                         bad_type(arg, "scalar", gv_ename(namegv), o2);
5737                     }
5738                     goto wrapref;
5739                 case '@':
5740                     if (o2->op_type != OP_RV2AV && o2->op_type != OP_PADAV)
5741                         bad_type(arg, "array", gv_ename(namegv), o2);
5742                     goto wrapref;
5743                 case '%':
5744                     if (o2->op_type != OP_RV2HV && o2->op_type != OP_PADHV)
5745                         bad_type(arg, "hash", gv_ename(namegv), o2);
5746                   wrapref:
5747                     {
5748                         OP* kid = o2;
5749                         OP* sib = kid->op_sibling;
5750                         kid->op_sibling = 0;
5751                         o2 = newUNOP(OP_REFGEN, 0, kid);
5752                         o2->op_sibling = sib;
5753                         prev->op_sibling = o2;
5754                     }
5755                     break;
5756                 default: goto oops;
5757                 }
5758                 break;
5759             case ' ':
5760                 proto++;
5761                 continue;
5762             default:
5763               oops:
5764                 Perl_croak(aTHX_ "Malformed prototype for %s: %s",
5765                         gv_ename(namegv), SvPV((SV*)cv, n_a));
5766             }
5767         }
5768         else
5769             list(o2);
5770         mod(o2, OP_ENTERSUB);
5771         prev = o2;
5772         o2 = o2->op_sibling;
5773     }
5774     if (proto && !optional &&
5775           (*proto && *proto != '@' && *proto != '%' && *proto != ';'))
5776         return too_few_arguments(o, gv_ename(namegv));
5777     return o;
5778 }
5779
5780 OP *
5781 Perl_ck_svconst(pTHX_ OP *o)
5782 {
5783     SvREADONLY_on(cSVOPo->op_sv);
5784     return o;
5785 }
5786
5787 OP *
5788 Perl_ck_trunc(pTHX_ OP *o)
5789 {
5790     if (o->op_flags & OPf_KIDS) {
5791         SVOP *kid = (SVOP*)cUNOPo->op_first;
5792
5793         if (kid->op_type == OP_NULL)
5794             kid = (SVOP*)kid->op_sibling;
5795         if (kid && kid->op_type == OP_CONST &&
5796             (kid->op_private & OPpCONST_BARE))
5797         {
5798             o->op_flags |= OPf_SPECIAL;
5799             kid->op_private &= ~OPpCONST_STRICT;
5800         }
5801     }
5802     return ck_fun(o);
5803 }
5804
5805 /* A peephole optimizer.  We visit the ops in the order they're to execute. */
5806
5807 void
5808 Perl_peep(pTHX_ register OP *o)
5809 {
5810     dTHR;
5811     register OP* oldop = 0;
5812     STRLEN n_a;
5813
5814     if (!o || o->op_seq)
5815         return;
5816     ENTER;
5817     SAVEOP();
5818     SAVESPTR(PL_curcop);
5819     for (; o; o = o->op_next) {
5820         if (o->op_seq)
5821             break;
5822         if (!PL_op_seqmax)
5823             PL_op_seqmax++;
5824         PL_op = o;
5825         switch (o->op_type) {
5826         case OP_SETSTATE:
5827         case OP_NEXTSTATE:
5828         case OP_DBSTATE:
5829             PL_curcop = ((COP*)o);              /* for warnings */
5830             o->op_seq = PL_op_seqmax++;
5831             break;
5832
5833         case OP_CONST:
5834             if (cSVOPo->op_private & OPpCONST_STRICT)
5835                 no_bareword_allowed(o);
5836             /* FALL THROUGH */
5837         case OP_UC:
5838         case OP_UCFIRST:
5839         case OP_LC:
5840         case OP_LCFIRST:
5841             if ( o->op_next && o->op_next->op_type == OP_STRINGIFY
5842                  && !(o->op_next->op_private & OPpTARGET_MY) )
5843                 null(o->op_next);
5844             o->op_seq = PL_op_seqmax++;
5845             break;
5846         case OP_CONCAT:
5847         case OP_JOIN:
5848         case OP_QUOTEMETA:
5849             if (o->op_next && o->op_next->op_type == OP_STRINGIFY) {
5850                 if (o->op_next->op_private & OPpTARGET_MY) {
5851                     if ((o->op_flags & OPf_STACKED) /* chained concats */
5852                         || (o->op_type == OP_CONCAT
5853             /* Concat has problems if target is equal to right arg. */
5854                             && (((LISTOP*)o)->op_first->op_sibling->op_type
5855                                 == OP_PADSV)
5856                             && (((LISTOP*)o)->op_first->op_sibling->op_targ
5857                                 == o->op_next->op_targ))) {
5858                         goto ignore_optimization;
5859                     } else {
5860                         o->op_targ = o->op_next->op_targ;
5861                         o->op_private |= OPpTARGET_MY;
5862                     }
5863                 }
5864                 null(o->op_next);
5865             }
5866           ignore_optimization:
5867             o->op_seq = PL_op_seqmax++;
5868             break;
5869         case OP_STUB:
5870             if ((o->op_flags & OPf_WANT) != OPf_WANT_LIST) {
5871                 o->op_seq = PL_op_seqmax++;
5872                 break; /* Scalar stub must produce undef.  List stub is noop */
5873             }
5874             goto nothin;
5875         case OP_NULL:
5876             if (o->op_targ == OP_NEXTSTATE
5877                 || o->op_targ == OP_DBSTATE
5878                 || o->op_targ == OP_SETSTATE)
5879             {
5880                 PL_curcop = ((COP*)o);
5881             }
5882             goto nothin;
5883         case OP_SCALAR:
5884         case OP_LINESEQ:
5885         case OP_SCOPE:
5886           nothin:
5887             if (oldop && o->op_next) {
5888                 oldop->op_next = o->op_next;
5889                 continue;
5890             }
5891             o->op_seq = PL_op_seqmax++;
5892             break;
5893
5894         case OP_GV:
5895             if (o->op_next->op_type == OP_RV2SV) {
5896                 if (!(o->op_next->op_private & OPpDEREF)) {
5897                     null(o->op_next);
5898                     o->op_private |= o->op_next->op_private & OPpLVAL_INTRO;
5899                     o->op_next = o->op_next->op_next;
5900                     o->op_type = OP_GVSV;
5901                     o->op_ppaddr = PL_ppaddr[OP_GVSV];
5902                 }
5903             }
5904             else if (o->op_next->op_type == OP_RV2AV) {
5905                 OP* pop = o->op_next->op_next;
5906                 IV i;
5907                 if (pop->op_type == OP_CONST &&
5908                     (PL_op = pop->op_next) &&
5909                     pop->op_next->op_type == OP_AELEM &&
5910                     !(pop->op_next->op_private &
5911                       (OPpLVAL_INTRO|OPpLVAL_DEFER|OPpDEREF)) &&
5912                     (i = SvIV(((SVOP*)pop)->op_sv) - PL_compiling.cop_arybase)
5913                                 <= 255 &&
5914                     i >= 0)
5915                 {
5916                     null(o->op_next);
5917                     null(pop->op_next);
5918                     null(pop);
5919                     o->op_flags |= pop->op_next->op_flags & OPf_MOD;
5920                     o->op_next = pop->op_next->op_next;
5921                     o->op_type = OP_AELEMFAST;
5922                     o->op_ppaddr = PL_ppaddr[OP_AELEMFAST];
5923                     o->op_private = (U8)i;
5924                     GvAVn(((GVOP*)o)->op_gv);
5925                 }
5926             }
5927             else if ((o->op_private & OPpEARLY_CV) && ckWARN(WARN_UNSAFE)) {
5928                 GV *gv = cGVOPo->op_gv;
5929                 if (SvTYPE(gv) == SVt_PVGV && GvCV(gv) && SvPVX(GvCV(gv))) {
5930                     /* XXX could check prototype here instead of just carping */
5931                     SV *sv = sv_newmortal();
5932                     gv_efullname3(sv, gv, Nullch);
5933                     Perl_warner(aTHX_ WARN_UNSAFE,
5934                                 "%s() called too early to check prototype",
5935                                 SvPV_nolen(sv));
5936                 }
5937             }
5938
5939             o->op_seq = PL_op_seqmax++;
5940             break;
5941
5942         case OP_MAPWHILE:
5943         case OP_GREPWHILE:
5944         case OP_AND:
5945         case OP_OR:
5946         case OP_ANDASSIGN:
5947         case OP_ORASSIGN:
5948         case OP_COND_EXPR:
5949         case OP_RANGE:
5950             o->op_seq = PL_op_seqmax++;
5951             while (cLOGOP->op_other->op_type == OP_NULL)
5952                 cLOGOP->op_other = cLOGOP->op_other->op_next;
5953             peep(cLOGOP->op_other);
5954             break;
5955
5956         case OP_ENTERLOOP:
5957             o->op_seq = PL_op_seqmax++;
5958             peep(cLOOP->op_redoop);
5959             peep(cLOOP->op_nextop);
5960             peep(cLOOP->op_lastop);
5961             break;
5962
5963         case OP_QR:
5964         case OP_MATCH:
5965         case OP_SUBST:
5966             o->op_seq = PL_op_seqmax++;
5967             peep(cPMOP->op_pmreplstart);
5968             break;
5969
5970         case OP_EXEC:
5971             o->op_seq = PL_op_seqmax++;
5972             if (ckWARN(WARN_SYNTAX) && o->op_next 
5973                 && o->op_next->op_type == OP_NEXTSTATE) {
5974                 if (o->op_next->op_sibling &&
5975                         o->op_next->op_sibling->op_type != OP_EXIT &&
5976                         o->op_next->op_sibling->op_type != OP_WARN &&
5977                         o->op_next->op_sibling->op_type != OP_DIE) {
5978                     line_t oldline = PL_curcop->cop_line;
5979
5980                     PL_curcop->cop_line = ((COP*)o->op_next)->cop_line;
5981                     Perl_warner(aTHX_ WARN_SYNTAX, "Statement unlikely to be reached");
5982                     Perl_warner(aTHX_ WARN_SYNTAX, "(Maybe you meant system() when you said exec()?)\n");
5983                     PL_curcop->cop_line = oldline;
5984                 }
5985             }
5986             break;
5987         
5988         case OP_HELEM: {
5989             UNOP *rop;
5990             SV *lexname;
5991             GV **fields;
5992             SV **svp, **indsvp;
5993             I32 ind;
5994             char *key;
5995             STRLEN keylen;
5996         
5997             if ((o->op_private & (OPpLVAL_INTRO))
5998                 || ((BINOP*)o)->op_last->op_type != OP_CONST)
5999                 break;
6000             rop = (UNOP*)((BINOP*)o)->op_first;
6001             if (rop->op_type != OP_RV2HV || rop->op_first->op_type != OP_PADSV)
6002                 break;
6003             lexname = *av_fetch(PL_comppad_name, rop->op_first->op_targ, TRUE);
6004             if (!SvOBJECT(lexname))
6005                 break;
6006             fields = (GV**)hv_fetch(SvSTASH(lexname), "FIELDS", 6, FALSE);
6007             if (!fields || !GvHV(*fields))
6008                 break;
6009             svp = &((SVOP*)((BINOP*)o)->op_last)->op_sv;
6010             key = SvPV(*svp, keylen);
6011             indsvp = hv_fetch(GvHV(*fields), key, keylen, FALSE);
6012             if (!indsvp) {
6013                 Perl_croak(aTHX_ "No such field \"%s\" in variable %s of type %s",
6014                       key, SvPV(lexname, n_a), HvNAME(SvSTASH(lexname)));
6015             }
6016             ind = SvIV(*indsvp);
6017             if (ind < 1)
6018                 Perl_croak(aTHX_ "Bad index while coercing array into hash");
6019             rop->op_type = OP_RV2AV;
6020             rop->op_ppaddr = PL_ppaddr[OP_RV2AV];
6021             o->op_type = OP_AELEM;
6022             o->op_ppaddr = PL_ppaddr[OP_AELEM];
6023             SvREFCNT_dec(*svp);
6024             *svp = newSViv(ind);
6025             break;
6026         }
6027
6028         default:
6029             o->op_seq = PL_op_seqmax++;
6030             break;
6031         }
6032         oldop = o;
6033     }
6034     LEAVE;
6035 }