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