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