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