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