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