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