2423bf08248706e62a9d4941a59b292335e61636
[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, 2004, 2005, 2006, 2007, 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 /* This file contains the functions that create, manipulate and optimize
20  * the OP structures that hold a compiled perl program.
21  *
22  * A Perl program is compiled into a tree of OPs. Each op contains
23  * structural pointers (eg to its siblings and the next op in the
24  * execution sequence), a pointer to the function that would execute the
25  * op, plus any data specific to that op. For example, an OP_CONST op
26  * points to the pp_const() function and to an SV containing the constant
27  * value. When pp_const() is executed, its job is to push that SV onto the
28  * stack.
29  *
30  * OPs are mainly created by the newFOO() functions, which are mainly
31  * called from the parser (in perly.y) as the code is parsed. For example
32  * the Perl code $a + $b * $c would cause the equivalent of the following
33  * to be called (oversimplifying a bit):
34  *
35  *  newBINOP(OP_ADD, flags,
36  *      newSVREF($a),
37  *      newBINOP(OP_MULTIPLY, flags, newSVREF($b), newSVREF($c))
38  *  )
39  *
40  * Note that during the build of miniperl, a temporary copy of this file
41  * is made, called opmini.c.
42  */
43
44 /*
45 Perl's compiler is essentially a 3-pass compiler with interleaved phases:
46
47     A bottom-up pass
48     A top-down pass
49     An execution-order pass
50
51 The bottom-up pass is represented by all the "newOP" routines and
52 the ck_ routines.  The bottom-upness is actually driven by yacc.
53 So at the point that a ck_ routine fires, we have no idea what the
54 context is, either upward in the syntax tree, or either forward or
55 backward in the execution order.  (The bottom-up parser builds that
56 part of the execution order it knows about, but if you follow the "next"
57 links around, you'll find it's actually a closed loop through the
58 top level node.
59
60 Whenever the bottom-up parser gets to a node that supplies context to
61 its components, it invokes that portion of the top-down pass that applies
62 to that part of the subtree (and marks the top node as processed, so
63 if a node further up supplies context, it doesn't have to take the
64 plunge again).  As a particular subcase of this, as the new node is
65 built, it takes all the closed execution loops of its subcomponents
66 and links them into a new closed loop for the higher level node.  But
67 it's still not the real execution order.
68
69 The actual execution order is not known till we get a grammar reduction
70 to a top-level unit like a subroutine or file that will be called by
71 "name" rather than via a "next" pointer.  At that point, we can call
72 into peep() to do that code's portion of the 3rd pass.  It has to be
73 recursive, but it's recursive on basic blocks, not on tree nodes.
74 */
75
76 /* To implement user lexical pragmas, there needs to be a way at run time to
77    get the compile time state of %^H for that block.  Storing %^H in every
78    block (or even COP) would be very expensive, so a different approach is
79    taken.  The (running) state of %^H is serialised into a tree of HE-like
80    structs.  Stores into %^H are chained onto the current leaf as a struct
81    refcounted_he * with the key and the value.  Deletes from %^H are saved
82    with a value of PL_sv_placeholder.  The state of %^H at any point can be
83    turned back into a regular HV by walking back up the tree from that point's
84    leaf, ignoring any key you've already seen (placeholder or not), storing
85    the rest into the HV structure, then removing the placeholders. Hence
86    memory is only used to store the %^H deltas from the enclosing COP, rather
87    than the entire %^H on each COP.
88
89    To cause actions on %^H to write out the serialisation records, it has
90    magic type 'H'. This magic (itself) does nothing, but its presence causes
91    the values to gain magic type 'h', which has entries for set and clear.
92    C<Perl_magic_sethint> updates C<PL_compiling.cop_hints_hash> with a store
93    record, with deletes written by C<Perl_magic_clearhint>. C<SAVE_HINTS>
94    saves the current C<PL_compiling.cop_hints_hash> on the save stack, so that
95    it will be correctly restored when any inner compiling scope is exited.
96 */
97
98 #include "EXTERN.h"
99 #define PERL_IN_OP_C
100 #include "perl.h"
101 #include "keywords.h"
102
103 #define CALL_PEEP(o) CALL_FPTR(PL_peepp)(aTHX_ o)
104
105 #if defined(PL_OP_SLAB_ALLOC)
106
107 #ifdef PERL_DEBUG_READONLY_OPS
108 #  define PERL_SLAB_SIZE 4096
109 #  include <sys/mman.h>
110 #endif
111
112 #ifndef PERL_SLAB_SIZE
113 #define PERL_SLAB_SIZE 2048
114 #endif
115
116 void *
117 Perl_Slab_Alloc(pTHX_ size_t sz)
118 {
119     dVAR;
120     /*
121      * To make incrementing use count easy PL_OpSlab is an I32 *
122      * To make inserting the link to slab PL_OpPtr is I32 **
123      * So compute size in units of sizeof(I32 *) as that is how Pl_OpPtr increments
124      * Add an overhead for pointer to slab and round up as a number of pointers
125      */
126     sz = (sz + 2*sizeof(I32 *) -1)/sizeof(I32 *);
127     if ((PL_OpSpace -= sz) < 0) {
128 #ifdef PERL_DEBUG_READONLY_OPS
129         /* We need to allocate chunk by chunk so that we can control the VM
130            mapping */
131         PL_OpPtr = (I32**) mmap(0, PERL_SLAB_SIZE*sizeof(I32*), PROT_READ|PROT_WRITE,
132                         MAP_ANON|MAP_PRIVATE, -1, 0);
133
134         DEBUG_m(PerlIO_printf(Perl_debug_log, "mapped %lu at %p\n",
135                               (unsigned long) PERL_SLAB_SIZE*sizeof(I32*),
136                               PL_OpPtr));
137         if(PL_OpPtr == MAP_FAILED) {
138             perror("mmap failed");
139             abort();
140         }
141 #else
142
143         PL_OpPtr = (I32 **) PerlMemShared_calloc(PERL_SLAB_SIZE,sizeof(I32*)); 
144 #endif
145         if (!PL_OpPtr) {
146             return NULL;
147         }
148         /* We reserve the 0'th I32 sized chunk as a use count */
149         PL_OpSlab = (I32 *) PL_OpPtr;
150         /* Reduce size by the use count word, and by the size we need.
151          * Latter is to mimic the '-=' in the if() above
152          */
153         PL_OpSpace = PERL_SLAB_SIZE - (sizeof(I32)+sizeof(I32 **)-1)/sizeof(I32 **) - sz;
154         /* Allocation pointer starts at the top.
155            Theory: because we build leaves before trunk allocating at end
156            means that at run time access is cache friendly upward
157          */
158         PL_OpPtr += PERL_SLAB_SIZE;
159
160 #ifdef PERL_DEBUG_READONLY_OPS
161         /* We remember this slab.  */
162         /* This implementation isn't efficient, but it is simple. */
163         PL_slabs = (I32**) realloc(PL_slabs, sizeof(I32**) * (PL_slab_count + 1));
164         PL_slabs[PL_slab_count++] = PL_OpSlab;
165         DEBUG_m(PerlIO_printf(Perl_debug_log, "Allocate %p\n", PL_OpSlab));
166 #endif
167     }
168     assert( PL_OpSpace >= 0 );
169     /* Move the allocation pointer down */
170     PL_OpPtr   -= sz;
171     assert( PL_OpPtr > (I32 **) PL_OpSlab );
172     *PL_OpPtr   = PL_OpSlab;    /* Note which slab it belongs to */
173     (*PL_OpSlab)++;             /* Increment use count of slab */
174     assert( PL_OpPtr+sz <= ((I32 **) PL_OpSlab + PERL_SLAB_SIZE) );
175     assert( *PL_OpSlab > 0 );
176     return (void *)(PL_OpPtr + 1);
177 }
178
179 #ifdef PERL_DEBUG_READONLY_OPS
180 void
181 Perl_pending_Slabs_to_ro(pTHX) {
182     /* Turn all the allocated op slabs read only.  */
183     U32 count = PL_slab_count;
184     I32 **const slabs = PL_slabs;
185
186     /* Reset the array of pending OP slabs, as we're about to turn this lot
187        read only. Also, do it ahead of the loop in case the warn triggers,
188        and a warn handler has an eval */
189
190     PL_slabs = NULL;
191     PL_slab_count = 0;
192
193     /* Force a new slab for any further allocation.  */
194     PL_OpSpace = 0;
195
196     while (count--) {
197         void *const start = slabs[count];
198         const size_t size = PERL_SLAB_SIZE* sizeof(I32*);
199         if(mprotect(start, size, PROT_READ)) {
200             Perl_warn(aTHX_ "mprotect for %p %lu failed with %d",
201                       start, (unsigned long) size, errno);
202         }
203     }
204
205     free(slabs);
206 }
207
208 STATIC void
209 S_Slab_to_rw(pTHX_ void *op)
210 {
211     I32 * const * const ptr = (I32 **) op;
212     I32 * const slab = ptr[-1];
213     assert( ptr-1 > (I32 **) slab );
214     assert( ptr < ( (I32 **) slab + PERL_SLAB_SIZE) );
215     assert( *slab > 0 );
216     if(mprotect(slab, PERL_SLAB_SIZE*sizeof(I32*), PROT_READ|PROT_WRITE)) {
217         Perl_warn(aTHX_ "mprotect RW for %p %lu failed with %d",
218                   slab, (unsigned long) PERL_SLAB_SIZE*sizeof(I32*), errno);
219     }
220 }
221
222 OP *
223 Perl_op_refcnt_inc(pTHX_ OP *o)
224 {
225     if(o) {
226         Slab_to_rw(o);
227         ++o->op_targ;
228     }
229     return o;
230
231 }
232
233 PADOFFSET
234 Perl_op_refcnt_dec(pTHX_ OP *o)
235 {
236     Slab_to_rw(o);
237     return --o->op_targ;
238 }
239 #else
240 #  define Slab_to_rw(op)
241 #endif
242
243 void
244 Perl_Slab_Free(pTHX_ void *op)
245 {
246     I32 * const * const ptr = (I32 **) op;
247     I32 * const slab = ptr[-1];
248     assert( ptr-1 > (I32 **) slab );
249     assert( ptr < ( (I32 **) slab + PERL_SLAB_SIZE) );
250     assert( *slab > 0 );
251     Slab_to_rw(op);
252     if (--(*slab) == 0) {
253 #  ifdef NETWARE
254 #    define PerlMemShared PerlMem
255 #  endif
256         
257 #ifdef PERL_DEBUG_READONLY_OPS
258         U32 count = PL_slab_count;
259         /* Need to remove this slab from our list of slabs */
260         if (count) {
261             while (count--) {
262                 if (PL_slabs[count] == slab) {
263                     dVAR;
264                     /* Found it. Move the entry at the end to overwrite it.  */
265                     DEBUG_m(PerlIO_printf(Perl_debug_log,
266                                           "Deallocate %p by moving %p from %lu to %lu\n",
267                                           PL_OpSlab,
268                                           PL_slabs[PL_slab_count - 1],
269                                           PL_slab_count, count));
270                     PL_slabs[count] = PL_slabs[--PL_slab_count];
271                     /* Could realloc smaller at this point, but probably not
272                        worth it.  */
273                     if(munmap(slab, PERL_SLAB_SIZE*sizeof(I32*))) {
274                         perror("munmap failed");
275                         abort();
276                     }
277                     break;
278                 }
279             }
280         }
281 #else
282     PerlMemShared_free(slab);
283 #endif
284         if (slab == PL_OpSlab) {
285             PL_OpSpace = 0;
286         }
287     }
288 }
289 #endif
290 /*
291  * In the following definition, the ", (OP*)0" is just to make the compiler
292  * think the expression is of the right type: croak actually does a Siglongjmp.
293  */
294 #define CHECKOP(type,o) \
295     ((PL_op_mask && PL_op_mask[type])                           \
296      ? ( op_free((OP*)o),                                       \
297          Perl_croak(aTHX_ "'%s' trapped by operation mask", PL_op_desc[type]),  \
298          (OP*)0 )                                               \
299      : CALL_FPTR(PL_check[type])(aTHX_ (OP*)o))
300
301 #define RETURN_UNLIMITED_NUMBER (PERL_INT_MAX / 2)
302
303 STATIC const char*
304 S_gv_ename(pTHX_ GV *gv)
305 {
306     SV* const tmpsv = sv_newmortal();
307     gv_efullname3(tmpsv, gv, NULL);
308     return SvPV_nolen_const(tmpsv);
309 }
310
311 STATIC OP *
312 S_no_fh_allowed(pTHX_ OP *o)
313 {
314     yyerror(Perl_form(aTHX_ "Missing comma after first argument to %s function",
315                  OP_DESC(o)));
316     return o;
317 }
318
319 STATIC OP *
320 S_too_few_arguments(pTHX_ OP *o, const char *name)
321 {
322     yyerror(Perl_form(aTHX_ "Not enough arguments for %s", name));
323     return o;
324 }
325
326 STATIC OP *
327 S_too_many_arguments(pTHX_ OP *o, const char *name)
328 {
329     yyerror(Perl_form(aTHX_ "Too many arguments for %s", name));
330     return o;
331 }
332
333 STATIC void
334 S_bad_type(pTHX_ I32 n, const char *t, const char *name, const OP *kid)
335 {
336     yyerror(Perl_form(aTHX_ "Type of arg %d to %s must be %s (not %s)",
337                  (int)n, name, t, OP_DESC(kid)));
338 }
339
340 STATIC void
341 S_no_bareword_allowed(pTHX_ const OP *o)
342 {
343     if (PL_madskills)
344         return;         /* various ok barewords are hidden in extra OP_NULL */
345     qerror(Perl_mess(aTHX_
346                      "Bareword \"%"SVf"\" not allowed while \"strict subs\" in use",
347                      SVfARG(cSVOPo_sv)));
348 }
349
350 /* "register" allocation */
351
352 PADOFFSET
353 Perl_allocmy(pTHX_ const char *const name)
354 {
355     dVAR;
356     PADOFFSET off;
357     const bool is_our = (PL_parser->in_my == KEY_our);
358
359     /* complain about "my $<special_var>" etc etc */
360     if (*name &&
361         !(is_our ||
362           isALPHA(name[1]) ||
363           (USE_UTF8_IN_NAMES && UTF8_IS_START(name[1])) ||
364           (name[1] == '_' && (*name == '$' || name[2]))))
365     {
366         /* name[2] is true if strlen(name) > 2  */
367         if (!isPRINT(name[1]) || strchr("\t\n\r\f", name[1])) {
368             yyerror(Perl_form(aTHX_ "Can't use global %c^%c%s in \"%s\"",
369                               name[0], toCTRL(name[1]), name + 2,
370                               PL_parser->in_my == KEY_state ? "state" : "my"));
371         } else {
372             yyerror(Perl_form(aTHX_ "Can't use global %s in \"%s\"",name,
373                               PL_parser->in_my == KEY_state ? "state" : "my"));
374         }
375     }
376
377     /* check for duplicate declaration */
378     pad_check_dup(name, is_our, (PL_curstash ? PL_curstash : PL_defstash));
379
380     if (PL_parser->in_my_stash && *name != '$') {
381         yyerror(Perl_form(aTHX_
382                     "Can't declare class for non-scalar %s in \"%s\"",
383                      name,
384                      is_our ? "our"
385                             : PL_parser->in_my == KEY_state ? "state" : "my"));
386     }
387
388     /* allocate a spare slot and store the name in that slot */
389
390     off = pad_add_name(name,
391                     PL_parser->in_my_stash,
392                     (is_our
393                         /* $_ is always in main::, even with our */
394                         ? (PL_curstash && !strEQ(name,"$_") ? PL_curstash : PL_defstash)
395                         : NULL
396                     ),
397                     0, /*  not fake */
398                     PL_parser->in_my == KEY_state
399     );
400     /* anon sub prototypes contains state vars should always be cloned,
401      * otherwise the state var would be shared between anon subs */
402
403     if (PL_parser->in_my == KEY_state && CvANON(PL_compcv))
404         CvCLONE_on(PL_compcv);
405
406     return off;
407 }
408
409 /* free the body of an op without examining its contents.
410  * Always use this rather than FreeOp directly */
411
412 static void
413 S_op_destroy(pTHX_ OP *o)
414 {
415     if (o->op_latefree) {
416         o->op_latefreed = 1;
417         return;
418     }
419     FreeOp(o);
420 }
421
422 #ifdef USE_ITHREADS
423 #  define forget_pmop(a,b)      S_forget_pmop(aTHX_ a,b)
424 #else
425 #  define forget_pmop(a,b)      S_forget_pmop(aTHX_ a)
426 #endif
427
428 /* Destructor */
429
430 void
431 Perl_op_free(pTHX_ OP *o)
432 {
433     dVAR;
434     OPCODE type;
435
436     if (!o)
437         return;
438     if (o->op_latefreed) {
439         if (o->op_latefree)
440             return;
441         goto do_free;
442     }
443
444     type = o->op_type;
445     if (o->op_private & OPpREFCOUNTED) {
446         switch (type) {
447         case OP_LEAVESUB:
448         case OP_LEAVESUBLV:
449         case OP_LEAVEEVAL:
450         case OP_LEAVE:
451         case OP_SCOPE:
452         case OP_LEAVEWRITE:
453             {
454             PADOFFSET refcnt;
455             OP_REFCNT_LOCK;
456             refcnt = OpREFCNT_dec(o);
457             OP_REFCNT_UNLOCK;
458             if (refcnt) {
459                 /* Need to find and remove any pattern match ops from the list
460                    we maintain for reset().  */
461                 find_and_forget_pmops(o);
462                 return;
463             }
464             }
465             break;
466         default:
467             break;
468         }
469     }
470
471     if (o->op_flags & OPf_KIDS) {
472         register OP *kid, *nextkid;
473         for (kid = cUNOPo->op_first; kid; kid = nextkid) {
474             nextkid = kid->op_sibling; /* Get before next freeing kid */
475             op_free(kid);
476         }
477     }
478     if (type == OP_NULL)
479         type = (OPCODE)o->op_targ;
480
481 #ifdef PERL_DEBUG_READONLY_OPS
482     Slab_to_rw(o);
483 #endif
484
485     /* COP* is not cleared by op_clear() so that we may track line
486      * numbers etc even after null() */
487     if (type == OP_NEXTSTATE || type == OP_SETSTATE || type == OP_DBSTATE) {
488         cop_free((COP*)o);
489     }
490
491     op_clear(o);
492     if (o->op_latefree) {
493         o->op_latefreed = 1;
494         return;
495     }
496   do_free:
497     FreeOp(o);
498 #ifdef DEBUG_LEAKING_SCALARS
499     if (PL_op == o)
500         PL_op = NULL;
501 #endif
502 }
503
504 void
505 Perl_op_clear(pTHX_ OP *o)
506 {
507
508     dVAR;
509 #ifdef PERL_MAD
510     /* if (o->op_madprop && o->op_madprop->mad_next)
511        abort(); */
512     /* FIXME for MAD - if I uncomment these two lines t/op/pack.t fails with
513        "modification of a read only value" for a reason I can't fathom why.
514        It's the "" stringification of $_, where $_ was set to '' in a foreach
515        loop, but it defies simplification into a small test case.
516        However, commenting them out has caused ext/List/Util/t/weak.t to fail
517        the last test.  */
518     /*
519       mad_free(o->op_madprop);
520       o->op_madprop = 0;
521     */
522 #endif    
523
524  retry:
525     switch (o->op_type) {
526     case OP_NULL:       /* Was holding old type, if any. */
527         if (PL_madskills && o->op_targ != OP_NULL) {
528             o->op_type = o->op_targ;
529             o->op_targ = 0;
530             goto retry;
531         }
532     case OP_ENTEREVAL:  /* Was holding hints. */
533         o->op_targ = 0;
534         break;
535     default:
536         if (!(o->op_flags & OPf_REF)
537             || (PL_check[o->op_type] != MEMBER_TO_FPTR(Perl_ck_ftst)))
538             break;
539         /* FALL THROUGH */
540     case OP_GVSV:
541     case OP_GV:
542     case OP_AELEMFAST:
543         if (! (o->op_type == OP_AELEMFAST && o->op_flags & OPf_SPECIAL)) {
544             /* not an OP_PADAV replacement */
545 #ifdef USE_ITHREADS
546             if (cPADOPo->op_padix > 0) {
547                 /* No GvIN_PAD_off(cGVOPo_gv) here, because other references
548                  * may still exist on the pad */
549                 pad_swipe(cPADOPo->op_padix, TRUE);
550                 cPADOPo->op_padix = 0;
551             }
552 #else
553             SvREFCNT_dec(cSVOPo->op_sv);
554             cSVOPo->op_sv = NULL;
555 #endif
556         }
557         break;
558     case OP_METHOD_NAMED:
559     case OP_CONST:
560         SvREFCNT_dec(cSVOPo->op_sv);
561         cSVOPo->op_sv = NULL;
562 #ifdef USE_ITHREADS
563         /** Bug #15654
564           Even if op_clear does a pad_free for the target of the op,
565           pad_free doesn't actually remove the sv that exists in the pad;
566           instead it lives on. This results in that it could be reused as 
567           a target later on when the pad was reallocated.
568         **/
569         if(o->op_targ) {
570           pad_swipe(o->op_targ,1);
571           o->op_targ = 0;
572         }
573 #endif
574         break;
575     case OP_GOTO:
576     case OP_NEXT:
577     case OP_LAST:
578     case OP_REDO:
579         if (o->op_flags & (OPf_SPECIAL|OPf_STACKED|OPf_KIDS))
580             break;
581         /* FALL THROUGH */
582     case OP_TRANS:
583         if (o->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF)) {
584 #ifdef USE_ITHREADS
585             if (cPADOPo->op_padix > 0) {
586                 pad_swipe(cPADOPo->op_padix, TRUE);
587                 cPADOPo->op_padix = 0;
588             }
589 #else
590             SvREFCNT_dec(cSVOPo->op_sv);
591             cSVOPo->op_sv = NULL;
592 #endif
593         }
594         else {
595             PerlMemShared_free(cPVOPo->op_pv);
596             cPVOPo->op_pv = NULL;
597         }
598         break;
599     case OP_SUBST:
600         op_free(cPMOPo->op_pmreplrootu.op_pmreplroot);
601         goto clear_pmop;
602     case OP_PUSHRE:
603 #ifdef USE_ITHREADS
604         if (cPMOPo->op_pmreplrootu.op_pmtargetoff) {
605             /* No GvIN_PAD_off here, because other references may still
606              * exist on the pad */
607             pad_swipe(cPMOPo->op_pmreplrootu.op_pmtargetoff, TRUE);
608         }
609 #else
610         SvREFCNT_dec((SV*)cPMOPo->op_pmreplrootu.op_pmtargetgv);
611 #endif
612         /* FALL THROUGH */
613     case OP_MATCH:
614     case OP_QR:
615 clear_pmop:
616         forget_pmop(cPMOPo, 1);
617         cPMOPo->op_pmreplrootu.op_pmreplroot = NULL;
618         /* we use the same protection as the "SAFE" version of the PM_ macros
619          * here since sv_clean_all might release some PMOPs
620          * after PL_regex_padav has been cleared
621          * and the clearing of PL_regex_padav needs to
622          * happen before sv_clean_all
623          */
624 #ifdef USE_ITHREADS
625         if(PL_regex_pad) {        /* We could be in destruction */
626             ReREFCNT_dec(PM_GETRE(cPMOPo));
627             av_push((AV*) PL_regex_pad[0],
628                     (SV*) SvREFCNT_inc_simple_NN(PL_regex_pad[(cPMOPo)->op_pmoffset]));
629             SvREADONLY_off(PL_regex_pad[(cPMOPo)->op_pmoffset]);
630             SvREPADTMP_on(PL_regex_pad[(cPMOPo)->op_pmoffset]);
631             PM_SETRE_OFFSET(cPMOPo, (cPMOPo)->op_pmoffset);
632         }
633 #else
634         ReREFCNT_dec(PM_GETRE(cPMOPo));
635         PM_SETRE(cPMOPo, NULL);
636 #endif
637
638         break;
639     }
640
641     if (o->op_targ > 0) {
642         pad_free(o->op_targ);
643         o->op_targ = 0;
644     }
645 }
646
647 STATIC void
648 S_cop_free(pTHX_ COP* cop)
649 {
650     CopLABEL_free(cop);
651     CopFILE_free(cop);
652     CopSTASH_free(cop);
653     if (! specialWARN(cop->cop_warnings))
654         PerlMemShared_free(cop->cop_warnings);
655     Perl_refcounted_he_free(aTHX_ cop->cop_hints_hash);
656 }
657
658 STATIC void
659 S_forget_pmop(pTHX_ PMOP *const o
660 #ifdef USE_ITHREADS
661               , U32 flags
662 #endif
663               )
664 {
665     HV * const pmstash = PmopSTASH(o);
666     if (pmstash && !SvIS_FREED(pmstash)) {
667         MAGIC * const mg = mg_find((SV*)pmstash, PERL_MAGIC_symtab);
668         if (mg) {
669             PMOP **const array = (PMOP**) mg->mg_ptr;
670             U32 count = mg->mg_len / sizeof(PMOP**);
671             U32 i = count;
672
673             while (i--) {
674                 if (array[i] == o) {
675                     /* Found it. Move the entry at the end to overwrite it.  */
676                     array[i] = array[--count];
677                     mg->mg_len = count * sizeof(PMOP**);
678                     /* Could realloc smaller at this point always, but probably
679                        not worth it. Probably worth free()ing if we're the
680                        last.  */
681                     if(!count) {
682                         Safefree(mg->mg_ptr);
683                         mg->mg_ptr = NULL;
684                     }
685                     break;
686                 }
687             }
688         }
689     }
690     if (PL_curpm == o) 
691         PL_curpm = NULL;
692 #ifdef USE_ITHREADS
693     if (flags)
694         PmopSTASH_free(o);
695 #endif
696 }
697
698 STATIC void
699 S_find_and_forget_pmops(pTHX_ OP *o)
700 {
701     if (o->op_flags & OPf_KIDS) {
702         OP *kid = cUNOPo->op_first;
703         while (kid) {
704             switch (kid->op_type) {
705             case OP_SUBST:
706             case OP_PUSHRE:
707             case OP_MATCH:
708             case OP_QR:
709                 forget_pmop((PMOP*)kid, 0);
710             }
711             find_and_forget_pmops(kid);
712             kid = kid->op_sibling;
713         }
714     }
715 }
716
717 void
718 Perl_op_null(pTHX_ OP *o)
719 {
720     dVAR;
721     if (o->op_type == OP_NULL)
722         return;
723     if (!PL_madskills)
724         op_clear(o);
725     o->op_targ = o->op_type;
726     o->op_type = OP_NULL;
727     o->op_ppaddr = PL_ppaddr[OP_NULL];
728 }
729
730 void
731 Perl_op_refcnt_lock(pTHX)
732 {
733     dVAR;
734     PERL_UNUSED_CONTEXT;
735     OP_REFCNT_LOCK;
736 }
737
738 void
739 Perl_op_refcnt_unlock(pTHX)
740 {
741     dVAR;
742     PERL_UNUSED_CONTEXT;
743     OP_REFCNT_UNLOCK;
744 }
745
746 /* Contextualizers */
747
748 #define LINKLIST(o) ((o)->op_next ? (o)->op_next : linklist((OP*)o))
749
750 OP *
751 Perl_linklist(pTHX_ OP *o)
752 {
753     OP *first;
754
755     if (o->op_next)
756         return o->op_next;
757
758     /* establish postfix order */
759     first = cUNOPo->op_first;
760     if (first) {
761         register OP *kid;
762         o->op_next = LINKLIST(first);
763         kid = first;
764         for (;;) {
765             if (kid->op_sibling) {
766                 kid->op_next = LINKLIST(kid->op_sibling);
767                 kid = kid->op_sibling;
768             } else {
769                 kid->op_next = o;
770                 break;
771             }
772         }
773     }
774     else
775         o->op_next = o;
776
777     return o->op_next;
778 }
779
780 OP *
781 Perl_scalarkids(pTHX_ OP *o)
782 {
783     if (o && o->op_flags & OPf_KIDS) {
784         OP *kid;
785         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
786             scalar(kid);
787     }
788     return o;
789 }
790
791 STATIC OP *
792 S_scalarboolean(pTHX_ OP *o)
793 {
794     dVAR;
795     if (o->op_type == OP_SASSIGN && cBINOPo->op_first->op_type == OP_CONST) {
796         if (ckWARN(WARN_SYNTAX)) {
797             const line_t oldline = CopLINE(PL_curcop);
798
799             if (PL_parser && PL_parser->copline != NOLINE)
800                 CopLINE_set(PL_curcop, PL_parser->copline);
801             Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Found = in conditional, should be ==");
802             CopLINE_set(PL_curcop, oldline);
803         }
804     }
805     return scalar(o);
806 }
807
808 OP *
809 Perl_scalar(pTHX_ OP *o)
810 {
811     dVAR;
812     OP *kid;
813
814     /* assumes no premature commitment */
815     if (!o || (PL_parser && PL_parser->error_count)
816          || (o->op_flags & OPf_WANT)
817          || o->op_type == OP_RETURN)
818     {
819         return o;
820     }
821
822     o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_SCALAR;
823
824     switch (o->op_type) {
825     case OP_REPEAT:
826         scalar(cBINOPo->op_first);
827         break;
828     case OP_OR:
829     case OP_AND:
830     case OP_COND_EXPR:
831         for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
832             scalar(kid);
833         break;
834     case OP_SPLIT:
835         if ((kid = cLISTOPo->op_first) && kid->op_type == OP_PUSHRE) {
836             if (!kPMOP->op_pmreplrootu.op_pmreplroot)
837                 deprecate_old("implicit split to @_");
838         }
839         /* FALL THROUGH */
840     case OP_MATCH:
841     case OP_QR:
842     case OP_SUBST:
843     case OP_NULL:
844     default:
845         if (o->op_flags & OPf_KIDS) {
846             for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
847                 scalar(kid);
848         }
849         break;
850     case OP_LEAVE:
851     case OP_LEAVETRY:
852         kid = cLISTOPo->op_first;
853         scalar(kid);
854         while ((kid = kid->op_sibling)) {
855             if (kid->op_sibling)
856                 scalarvoid(kid);
857             else
858                 scalar(kid);
859         }
860         PL_curcop = &PL_compiling;
861         break;
862     case OP_SCOPE:
863     case OP_LINESEQ:
864     case OP_LIST:
865         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling) {
866             if (kid->op_sibling)
867                 scalarvoid(kid);
868             else
869                 scalar(kid);
870         }
871         PL_curcop = &PL_compiling;
872         break;
873     case OP_SORT:
874         if (ckWARN(WARN_VOID))
875             Perl_warner(aTHX_ packWARN(WARN_VOID), "Useless use of sort in scalar context");
876     }
877     return o;
878 }
879
880 OP *
881 Perl_scalarvoid(pTHX_ OP *o)
882 {
883     dVAR;
884     OP *kid;
885     const char* useless = NULL;
886     SV* sv;
887     U8 want;
888
889     /* trailing mad null ops don't count as "there" for void processing */
890     if (PL_madskills &&
891         o->op_type != OP_NULL &&
892         o->op_sibling &&
893         o->op_sibling->op_type == OP_NULL)
894     {
895         OP *sib;
896         for (sib = o->op_sibling;
897                 sib && sib->op_type == OP_NULL;
898                 sib = sib->op_sibling) ;
899         
900         if (!sib)
901             return o;
902     }
903
904     if (o->op_type == OP_NEXTSTATE
905         || o->op_type == OP_SETSTATE
906         || o->op_type == OP_DBSTATE
907         || (o->op_type == OP_NULL && (o->op_targ == OP_NEXTSTATE
908                                       || o->op_targ == OP_SETSTATE
909                                       || o->op_targ == OP_DBSTATE)))
910         PL_curcop = (COP*)o;            /* for warning below */
911
912     /* assumes no premature commitment */
913     want = o->op_flags & OPf_WANT;
914     if ((want && want != OPf_WANT_SCALAR)
915          || (PL_parser && PL_parser->error_count)
916          || o->op_type == OP_RETURN)
917     {
918         return o;
919     }
920
921     if ((o->op_private & OPpTARGET_MY)
922         && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
923     {
924         return scalar(o);                       /* As if inside SASSIGN */
925     }
926
927     o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_VOID;
928
929     switch (o->op_type) {
930     default:
931         if (!(PL_opargs[o->op_type] & OA_FOLDCONST))
932             break;
933         /* FALL THROUGH */
934     case OP_REPEAT:
935         if (o->op_flags & OPf_STACKED)
936             break;
937         goto func_ops;
938     case OP_SUBSTR:
939         if (o->op_private == 4)
940             break;
941         /* FALL THROUGH */
942     case OP_GVSV:
943     case OP_WANTARRAY:
944     case OP_GV:
945     case OP_SMARTMATCH:
946     case OP_PADSV:
947     case OP_PADAV:
948     case OP_PADHV:
949     case OP_PADANY:
950     case OP_AV2ARYLEN:
951     case OP_REF:
952     case OP_REFGEN:
953     case OP_SREFGEN:
954     case OP_DEFINED:
955     case OP_HEX:
956     case OP_OCT:
957     case OP_LENGTH:
958     case OP_VEC:
959     case OP_INDEX:
960     case OP_RINDEX:
961     case OP_SPRINTF:
962     case OP_AELEM:
963     case OP_AELEMFAST:
964     case OP_ASLICE:
965     case OP_HELEM:
966     case OP_HSLICE:
967     case OP_UNPACK:
968     case OP_PACK:
969     case OP_JOIN:
970     case OP_LSLICE:
971     case OP_ANONLIST:
972     case OP_ANONHASH:
973     case OP_SORT:
974     case OP_REVERSE:
975     case OP_RANGE:
976     case OP_FLIP:
977     case OP_FLOP:
978     case OP_CALLER:
979     case OP_FILENO:
980     case OP_EOF:
981     case OP_TELL:
982     case OP_GETSOCKNAME:
983     case OP_GETPEERNAME:
984     case OP_READLINK:
985     case OP_TELLDIR:
986     case OP_GETPPID:
987     case OP_GETPGRP:
988     case OP_GETPRIORITY:
989     case OP_TIME:
990     case OP_TMS:
991     case OP_LOCALTIME:
992     case OP_GMTIME:
993     case OP_GHBYNAME:
994     case OP_GHBYADDR:
995     case OP_GHOSTENT:
996     case OP_GNBYNAME:
997     case OP_GNBYADDR:
998     case OP_GNETENT:
999     case OP_GPBYNAME:
1000     case OP_GPBYNUMBER:
1001     case OP_GPROTOENT:
1002     case OP_GSBYNAME:
1003     case OP_GSBYPORT:
1004     case OP_GSERVENT:
1005     case OP_GPWNAM:
1006     case OP_GPWUID:
1007     case OP_GGRNAM:
1008     case OP_GGRGID:
1009     case OP_GETLOGIN:
1010     case OP_PROTOTYPE:
1011       func_ops:
1012         if (!(o->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO)))
1013             /* Otherwise it's "Useless use of grep iterator" */
1014             useless = OP_DESC(o);
1015         break;
1016
1017     case OP_NOT:
1018        kid = cUNOPo->op_first;
1019        if (kid->op_type != OP_MATCH && kid->op_type != OP_SUBST &&
1020            kid->op_type != OP_TRANS) {
1021                 goto func_ops;
1022        }
1023        useless = "negative pattern binding (!~)";
1024        break;
1025
1026     case OP_RV2GV:
1027     case OP_RV2SV:
1028     case OP_RV2AV:
1029     case OP_RV2HV:
1030         if (!(o->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO)) &&
1031                 (!o->op_sibling || o->op_sibling->op_type != OP_READLINE))
1032             useless = "a variable";
1033         break;
1034
1035     case OP_CONST:
1036         sv = cSVOPo_sv;
1037         if (cSVOPo->op_private & OPpCONST_STRICT)
1038             no_bareword_allowed(o);
1039         else {
1040             if (ckWARN(WARN_VOID)) {
1041                 useless = "a constant";
1042                 if (o->op_private & OPpCONST_ARYBASE)
1043                     useless = NULL;
1044                 /* don't warn on optimised away booleans, eg 
1045                  * use constant Foo, 5; Foo || print; */
1046                 if (cSVOPo->op_private & OPpCONST_SHORTCIRCUIT)
1047                     useless = NULL;
1048                 /* the constants 0 and 1 are permitted as they are
1049                    conventionally used as dummies in constructs like
1050                         1 while some_condition_with_side_effects;  */
1051                 else if (SvNIOK(sv) && (SvNV(sv) == 0.0 || SvNV(sv) == 1.0))
1052                     useless = NULL;
1053                 else if (SvPOK(sv)) {
1054                   /* perl4's way of mixing documentation and code
1055                      (before the invention of POD) was based on a
1056                      trick to mix nroff and perl code. The trick was
1057                      built upon these three nroff macros being used in
1058                      void context. The pink camel has the details in
1059                      the script wrapman near page 319. */
1060                     const char * const maybe_macro = SvPVX_const(sv);
1061                     if (strnEQ(maybe_macro, "di", 2) ||
1062                         strnEQ(maybe_macro, "ds", 2) ||
1063                         strnEQ(maybe_macro, "ig", 2))
1064                             useless = NULL;
1065                 }
1066             }
1067         }
1068         op_null(o);             /* don't execute or even remember it */
1069         break;
1070
1071     case OP_POSTINC:
1072         o->op_type = OP_PREINC;         /* pre-increment is faster */
1073         o->op_ppaddr = PL_ppaddr[OP_PREINC];
1074         break;
1075
1076     case OP_POSTDEC:
1077         o->op_type = OP_PREDEC;         /* pre-decrement is faster */
1078         o->op_ppaddr = PL_ppaddr[OP_PREDEC];
1079         break;
1080
1081     case OP_I_POSTINC:
1082         o->op_type = OP_I_PREINC;       /* pre-increment is faster */
1083         o->op_ppaddr = PL_ppaddr[OP_I_PREINC];
1084         break;
1085
1086     case OP_I_POSTDEC:
1087         o->op_type = OP_I_PREDEC;       /* pre-decrement is faster */
1088         o->op_ppaddr = PL_ppaddr[OP_I_PREDEC];
1089         break;
1090
1091     case OP_OR:
1092     case OP_AND:
1093     case OP_DOR:
1094     case OP_COND_EXPR:
1095     case OP_ENTERGIVEN:
1096     case OP_ENTERWHEN:
1097         for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
1098             scalarvoid(kid);
1099         break;
1100
1101     case OP_NULL:
1102         if (o->op_flags & OPf_STACKED)
1103             break;
1104         /* FALL THROUGH */
1105     case OP_NEXTSTATE:
1106     case OP_DBSTATE:
1107     case OP_ENTERTRY:
1108     case OP_ENTER:
1109         if (!(o->op_flags & OPf_KIDS))
1110             break;
1111         /* FALL THROUGH */
1112     case OP_SCOPE:
1113     case OP_LEAVE:
1114     case OP_LEAVETRY:
1115     case OP_LEAVELOOP:
1116     case OP_LINESEQ:
1117     case OP_LIST:
1118     case OP_LEAVEGIVEN:
1119     case OP_LEAVEWHEN:
1120         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
1121             scalarvoid(kid);
1122         break;
1123     case OP_ENTEREVAL:
1124         scalarkids(o);
1125         break;
1126     case OP_REQUIRE:
1127         /* all requires must return a boolean value */
1128         o->op_flags &= ~OPf_WANT;
1129         /* FALL THROUGH */
1130     case OP_SCALAR:
1131         return scalar(o);
1132     case OP_SPLIT:
1133         if ((kid = cLISTOPo->op_first) && kid->op_type == OP_PUSHRE) {
1134             if (!kPMOP->op_pmreplrootu.op_pmreplroot)
1135                 deprecate_old("implicit split to @_");
1136         }
1137         break;
1138     }
1139     if (useless && ckWARN(WARN_VOID))
1140         Perl_warner(aTHX_ packWARN(WARN_VOID), "Useless use of %s in void context", useless);
1141     return o;
1142 }
1143
1144 OP *
1145 Perl_listkids(pTHX_ OP *o)
1146 {
1147     if (o && o->op_flags & OPf_KIDS) {
1148         OP *kid;
1149         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
1150             list(kid);
1151     }
1152     return o;
1153 }
1154
1155 OP *
1156 Perl_list(pTHX_ OP *o)
1157 {
1158     dVAR;
1159     OP *kid;
1160
1161     /* assumes no premature commitment */
1162     if (!o || (o->op_flags & OPf_WANT)
1163          || (PL_parser && PL_parser->error_count)
1164          || o->op_type == OP_RETURN)
1165     {
1166         return o;
1167     }
1168
1169     if ((o->op_private & OPpTARGET_MY)
1170         && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
1171     {
1172         return o;                               /* As if inside SASSIGN */
1173     }
1174
1175     o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_LIST;
1176
1177     switch (o->op_type) {
1178     case OP_FLOP:
1179     case OP_REPEAT:
1180         list(cBINOPo->op_first);
1181         break;
1182     case OP_OR:
1183     case OP_AND:
1184     case OP_COND_EXPR:
1185         for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
1186             list(kid);
1187         break;
1188     default:
1189     case OP_MATCH:
1190     case OP_QR:
1191     case OP_SUBST:
1192     case OP_NULL:
1193         if (!(o->op_flags & OPf_KIDS))
1194             break;
1195         if (!o->op_next && cUNOPo->op_first->op_type == OP_FLOP) {
1196             list(cBINOPo->op_first);
1197             return gen_constant_list(o);
1198         }
1199     case OP_LIST:
1200         listkids(o);
1201         break;
1202     case OP_LEAVE:
1203     case OP_LEAVETRY:
1204         kid = cLISTOPo->op_first;
1205         list(kid);
1206         while ((kid = kid->op_sibling)) {
1207             if (kid->op_sibling)
1208                 scalarvoid(kid);
1209             else
1210                 list(kid);
1211         }
1212         PL_curcop = &PL_compiling;
1213         break;
1214     case OP_SCOPE:
1215     case OP_LINESEQ:
1216         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling) {
1217             if (kid->op_sibling)
1218                 scalarvoid(kid);
1219             else
1220                 list(kid);
1221         }
1222         PL_curcop = &PL_compiling;
1223         break;
1224     case OP_REQUIRE:
1225         /* all requires must return a boolean value */
1226         o->op_flags &= ~OPf_WANT;
1227         return scalar(o);
1228     }
1229     return o;
1230 }
1231
1232 OP *
1233 Perl_scalarseq(pTHX_ OP *o)
1234 {
1235     dVAR;
1236     if (o) {
1237         const OPCODE type = o->op_type;
1238
1239         if (type == OP_LINESEQ || type == OP_SCOPE ||
1240             type == OP_LEAVE || type == OP_LEAVETRY)
1241         {
1242             OP *kid;
1243             for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling) {
1244                 if (kid->op_sibling) {
1245                     scalarvoid(kid);
1246                 }
1247             }
1248             PL_curcop = &PL_compiling;
1249         }
1250         o->op_flags &= ~OPf_PARENS;
1251         if (PL_hints & HINT_BLOCK_SCOPE)
1252             o->op_flags |= OPf_PARENS;
1253     }
1254     else
1255         o = newOP(OP_STUB, 0);
1256     return o;
1257 }
1258
1259 STATIC OP *
1260 S_modkids(pTHX_ OP *o, I32 type)
1261 {
1262     if (o && o->op_flags & OPf_KIDS) {
1263         OP *kid;
1264         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
1265             mod(kid, type);
1266     }
1267     return o;
1268 }
1269
1270 /* Propagate lvalue ("modifiable") context to an op and its children.
1271  * 'type' represents the context type, roughly based on the type of op that
1272  * would do the modifying, although local() is represented by OP_NULL.
1273  * It's responsible for detecting things that can't be modified,  flag
1274  * things that need to behave specially in an lvalue context (e.g., "$$x = 5"
1275  * might have to vivify a reference in $x), and so on.
1276  *
1277  * For example, "$a+1 = 2" would cause mod() to be called with o being
1278  * OP_ADD and type being OP_SASSIGN, and would output an error.
1279  */
1280
1281 OP *
1282 Perl_mod(pTHX_ OP *o, I32 type)
1283 {
1284     dVAR;
1285     OP *kid;
1286     /* -1 = error on localize, 0 = ignore localize, 1 = ok to localize */
1287     int localize = -1;
1288
1289     if (!o || (PL_parser && PL_parser->error_count))
1290         return o;
1291
1292     if ((o->op_private & OPpTARGET_MY)
1293         && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
1294     {
1295         return o;
1296     }
1297
1298     switch (o->op_type) {
1299     case OP_UNDEF:
1300         localize = 0;
1301         PL_modcount++;
1302         return o;
1303     case OP_CONST:
1304         if (!(o->op_private & OPpCONST_ARYBASE))
1305             goto nomod;
1306         localize = 0;
1307         if (PL_eval_start && PL_eval_start->op_type == OP_CONST) {
1308             CopARYBASE_set(&PL_compiling,
1309                            (I32)SvIV(cSVOPx(PL_eval_start)->op_sv));
1310             PL_eval_start = 0;
1311         }
1312         else if (!type) {
1313             SAVECOPARYBASE(&PL_compiling);
1314             CopARYBASE_set(&PL_compiling, 0);
1315         }
1316         else if (type == OP_REFGEN)
1317             goto nomod;
1318         else
1319             Perl_croak(aTHX_ "That use of $[ is unsupported");
1320         break;
1321     case OP_STUB:
1322         if ((o->op_flags & OPf_PARENS) || PL_madskills)
1323             break;
1324         goto nomod;
1325     case OP_ENTERSUB:
1326         if ((type == OP_UNDEF || type == OP_REFGEN) &&
1327             !(o->op_flags & OPf_STACKED)) {
1328             o->op_type = OP_RV2CV;              /* entersub => rv2cv */
1329             /* The default is to set op_private to the number of children,
1330                which for a UNOP such as RV2CV is always 1. And w're using
1331                the bit for a flag in RV2CV, so we need it clear.  */
1332             o->op_private &= ~1;
1333             o->op_ppaddr = PL_ppaddr[OP_RV2CV];
1334             assert(cUNOPo->op_first->op_type == OP_NULL);
1335             op_null(((LISTOP*)cUNOPo->op_first)->op_first);/* disable pushmark */
1336             break;
1337         }
1338         else if (o->op_private & OPpENTERSUB_NOMOD)
1339             return o;
1340         else {                          /* lvalue subroutine call */
1341             o->op_private |= OPpLVAL_INTRO;
1342             PL_modcount = RETURN_UNLIMITED_NUMBER;
1343             if (type == OP_GREPSTART || type == OP_ENTERSUB || type == OP_REFGEN) {
1344                 /* Backward compatibility mode: */
1345                 o->op_private |= OPpENTERSUB_INARGS;
1346                 break;
1347             }
1348             else {                      /* Compile-time error message: */
1349                 OP *kid = cUNOPo->op_first;
1350                 CV *cv;
1351                 OP *okid;
1352
1353                 if (kid->op_type != OP_PUSHMARK) {
1354                     if (kid->op_type != OP_NULL || kid->op_targ != OP_LIST)
1355                         Perl_croak(aTHX_
1356                                 "panic: unexpected lvalue entersub "
1357                                 "args: type/targ %ld:%"UVuf,
1358                                 (long)kid->op_type, (UV)kid->op_targ);
1359                     kid = kLISTOP->op_first;
1360                 }
1361                 while (kid->op_sibling)
1362                     kid = kid->op_sibling;
1363                 if (!(kid->op_type == OP_NULL && kid->op_targ == OP_RV2CV)) {
1364                     /* Indirect call */
1365                     if (kid->op_type == OP_METHOD_NAMED
1366                         || kid->op_type == OP_METHOD)
1367                     {
1368                         UNOP *newop;
1369
1370                         NewOp(1101, newop, 1, UNOP);
1371                         newop->op_type = OP_RV2CV;
1372                         newop->op_ppaddr = PL_ppaddr[OP_RV2CV];
1373                         newop->op_first = NULL;
1374                         newop->op_next = (OP*)newop;
1375                         kid->op_sibling = (OP*)newop;
1376                         newop->op_private |= OPpLVAL_INTRO;
1377                         newop->op_private &= ~1;
1378                         break;
1379                     }
1380
1381                     if (kid->op_type != OP_RV2CV)
1382                         Perl_croak(aTHX_
1383                                    "panic: unexpected lvalue entersub "
1384                                    "entry via type/targ %ld:%"UVuf,
1385                                    (long)kid->op_type, (UV)kid->op_targ);
1386                     kid->op_private |= OPpLVAL_INTRO;
1387                     break;      /* Postpone until runtime */
1388                 }
1389
1390                 okid = kid;
1391                 kid = kUNOP->op_first;
1392                 if (kid->op_type == OP_NULL && kid->op_targ == OP_RV2SV)
1393                     kid = kUNOP->op_first;
1394                 if (kid->op_type == OP_NULL)
1395                     Perl_croak(aTHX_
1396                                "Unexpected constant lvalue entersub "
1397                                "entry via type/targ %ld:%"UVuf,
1398                                (long)kid->op_type, (UV)kid->op_targ);
1399                 if (kid->op_type != OP_GV) {
1400                     /* Restore RV2CV to check lvalueness */
1401                   restore_2cv:
1402                     if (kid->op_next && kid->op_next != kid) { /* Happens? */
1403                         okid->op_next = kid->op_next;
1404                         kid->op_next = okid;
1405                     }
1406                     else
1407                         okid->op_next = NULL;
1408                     okid->op_type = OP_RV2CV;
1409                     okid->op_targ = 0;
1410                     okid->op_ppaddr = PL_ppaddr[OP_RV2CV];
1411                     okid->op_private |= OPpLVAL_INTRO;
1412                     okid->op_private &= ~1;
1413                     break;
1414                 }
1415
1416                 cv = GvCV(kGVOP_gv);
1417                 if (!cv)
1418                     goto restore_2cv;
1419                 if (CvLVALUE(cv))
1420                     break;
1421             }
1422         }
1423         /* FALL THROUGH */
1424     default:
1425       nomod:
1426         /* grep, foreach, subcalls, refgen */
1427         if (type == OP_GREPSTART || type == OP_ENTERSUB || type == OP_REFGEN)
1428             break;
1429         yyerror(Perl_form(aTHX_ "Can't modify %s in %s",
1430                      (o->op_type == OP_NULL && (o->op_flags & OPf_SPECIAL)
1431                       ? "do block"
1432                       : (o->op_type == OP_ENTERSUB
1433                         ? "non-lvalue subroutine call"
1434                         : OP_DESC(o))),
1435                      type ? PL_op_desc[type] : "local"));
1436         return o;
1437
1438     case OP_PREINC:
1439     case OP_PREDEC:
1440     case OP_POW:
1441     case OP_MULTIPLY:
1442     case OP_DIVIDE:
1443     case OP_MODULO:
1444     case OP_REPEAT:
1445     case OP_ADD:
1446     case OP_SUBTRACT:
1447     case OP_CONCAT:
1448     case OP_LEFT_SHIFT:
1449     case OP_RIGHT_SHIFT:
1450     case OP_BIT_AND:
1451     case OP_BIT_XOR:
1452     case OP_BIT_OR:
1453     case OP_I_MULTIPLY:
1454     case OP_I_DIVIDE:
1455     case OP_I_MODULO:
1456     case OP_I_ADD:
1457     case OP_I_SUBTRACT:
1458         if (!(o->op_flags & OPf_STACKED))
1459             goto nomod;
1460         PL_modcount++;
1461         break;
1462
1463     case OP_COND_EXPR:
1464         localize = 1;
1465         for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
1466             mod(kid, type);
1467         break;
1468
1469     case OP_RV2AV:
1470     case OP_RV2HV:
1471         if (type == OP_REFGEN && o->op_flags & OPf_PARENS) {
1472            PL_modcount = RETURN_UNLIMITED_NUMBER;
1473             return o;           /* Treat \(@foo) like ordinary list. */
1474         }
1475         /* FALL THROUGH */
1476     case OP_RV2GV:
1477         if (scalar_mod_type(o, type))
1478             goto nomod;
1479         ref(cUNOPo->op_first, o->op_type);
1480         /* FALL THROUGH */
1481     case OP_ASLICE:
1482     case OP_HSLICE:
1483         if (type == OP_LEAVESUBLV)
1484             o->op_private |= OPpMAYBE_LVSUB;
1485         localize = 1;
1486         /* FALL THROUGH */
1487     case OP_AASSIGN:
1488     case OP_NEXTSTATE:
1489     case OP_DBSTATE:
1490        PL_modcount = RETURN_UNLIMITED_NUMBER;
1491         break;
1492     case OP_RV2SV:
1493         ref(cUNOPo->op_first, o->op_type);
1494         localize = 1;
1495         /* FALL THROUGH */
1496     case OP_GV:
1497     case OP_AV2ARYLEN:
1498         PL_hints |= HINT_BLOCK_SCOPE;
1499     case OP_SASSIGN:
1500     case OP_ANDASSIGN:
1501     case OP_ORASSIGN:
1502     case OP_DORASSIGN:
1503         PL_modcount++;
1504         break;
1505
1506     case OP_AELEMFAST:
1507         localize = -1;
1508         PL_modcount++;
1509         break;
1510
1511     case OP_PADAV:
1512     case OP_PADHV:
1513        PL_modcount = RETURN_UNLIMITED_NUMBER;
1514         if (type == OP_REFGEN && o->op_flags & OPf_PARENS)
1515             return o;           /* Treat \(@foo) like ordinary list. */
1516         if (scalar_mod_type(o, type))
1517             goto nomod;
1518         if (type == OP_LEAVESUBLV)
1519             o->op_private |= OPpMAYBE_LVSUB;
1520         /* FALL THROUGH */
1521     case OP_PADSV:
1522         PL_modcount++;
1523         if (!type) /* local() */
1524             Perl_croak(aTHX_ "Can't localize lexical variable %s",
1525                  PAD_COMPNAME_PV(o->op_targ));
1526         break;
1527
1528     case OP_PUSHMARK:
1529         localize = 0;
1530         break;
1531
1532     case OP_KEYS:
1533         if (type != OP_SASSIGN)
1534             goto nomod;
1535         goto lvalue_func;
1536     case OP_SUBSTR:
1537         if (o->op_private == 4) /* don't allow 4 arg substr as lvalue */
1538             goto nomod;
1539         /* FALL THROUGH */
1540     case OP_POS:
1541     case OP_VEC:
1542         if (type == OP_LEAVESUBLV)
1543             o->op_private |= OPpMAYBE_LVSUB;
1544       lvalue_func:
1545         pad_free(o->op_targ);
1546         o->op_targ = pad_alloc(o->op_type, SVs_PADMY);
1547         assert(SvTYPE(PAD_SV(o->op_targ)) == SVt_NULL);
1548         if (o->op_flags & OPf_KIDS)
1549             mod(cBINOPo->op_first->op_sibling, type);
1550         break;
1551
1552     case OP_AELEM:
1553     case OP_HELEM:
1554         ref(cBINOPo->op_first, o->op_type);
1555         if (type == OP_ENTERSUB &&
1556              !(o->op_private & (OPpLVAL_INTRO | OPpDEREF)))
1557             o->op_private |= OPpLVAL_DEFER;
1558         if (type == OP_LEAVESUBLV)
1559             o->op_private |= OPpMAYBE_LVSUB;
1560         localize = 1;
1561         PL_modcount++;
1562         break;
1563
1564     case OP_SCOPE:
1565     case OP_LEAVE:
1566     case OP_ENTER:
1567     case OP_LINESEQ:
1568         localize = 0;
1569         if (o->op_flags & OPf_KIDS)
1570             mod(cLISTOPo->op_last, type);
1571         break;
1572
1573     case OP_NULL:
1574         localize = 0;
1575         if (o->op_flags & OPf_SPECIAL)          /* do BLOCK */
1576             goto nomod;
1577         else if (!(o->op_flags & OPf_KIDS))
1578             break;
1579         if (o->op_targ != OP_LIST) {
1580             mod(cBINOPo->op_first, type);
1581             break;
1582         }
1583         /* FALL THROUGH */
1584     case OP_LIST:
1585         localize = 0;
1586         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
1587             mod(kid, type);
1588         break;
1589
1590     case OP_RETURN:
1591         if (type != OP_LEAVESUBLV)
1592             goto nomod;
1593         break; /* mod()ing was handled by ck_return() */
1594     }
1595
1596     /* [20011101.069] File test operators interpret OPf_REF to mean that
1597        their argument is a filehandle; thus \stat(".") should not set
1598        it. AMS 20011102 */
1599     if (type == OP_REFGEN &&
1600         PL_check[o->op_type] == MEMBER_TO_FPTR(Perl_ck_ftst))
1601         return o;
1602
1603     if (type != OP_LEAVESUBLV)
1604         o->op_flags |= OPf_MOD;
1605
1606     if (type == OP_AASSIGN || type == OP_SASSIGN)
1607         o->op_flags |= OPf_SPECIAL|OPf_REF;
1608     else if (!type) { /* local() */
1609         switch (localize) {
1610         case 1:
1611             o->op_private |= OPpLVAL_INTRO;
1612             o->op_flags &= ~OPf_SPECIAL;
1613             PL_hints |= HINT_BLOCK_SCOPE;
1614             break;
1615         case 0:
1616             break;
1617         case -1:
1618             if (ckWARN(WARN_SYNTAX)) {
1619                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
1620                     "Useless localization of %s", OP_DESC(o));
1621             }
1622         }
1623     }
1624     else if (type != OP_GREPSTART && type != OP_ENTERSUB
1625              && type != OP_LEAVESUBLV)
1626         o->op_flags |= OPf_REF;
1627     return o;
1628 }
1629
1630 STATIC bool
1631 S_scalar_mod_type(const OP *o, I32 type)
1632 {
1633     switch (type) {
1634     case OP_SASSIGN:
1635         if (o->op_type == OP_RV2GV)
1636             return FALSE;
1637         /* FALL THROUGH */
1638     case OP_PREINC:
1639     case OP_PREDEC:
1640     case OP_POSTINC:
1641     case OP_POSTDEC:
1642     case OP_I_PREINC:
1643     case OP_I_PREDEC:
1644     case OP_I_POSTINC:
1645     case OP_I_POSTDEC:
1646     case OP_POW:
1647     case OP_MULTIPLY:
1648     case OP_DIVIDE:
1649     case OP_MODULO:
1650     case OP_REPEAT:
1651     case OP_ADD:
1652     case OP_SUBTRACT:
1653     case OP_I_MULTIPLY:
1654     case OP_I_DIVIDE:
1655     case OP_I_MODULO:
1656     case OP_I_ADD:
1657     case OP_I_SUBTRACT:
1658     case OP_LEFT_SHIFT:
1659     case OP_RIGHT_SHIFT:
1660     case OP_BIT_AND:
1661     case OP_BIT_XOR:
1662     case OP_BIT_OR:
1663     case OP_CONCAT:
1664     case OP_SUBST:
1665     case OP_TRANS:
1666     case OP_READ:
1667     case OP_SYSREAD:
1668     case OP_RECV:
1669     case OP_ANDASSIGN:
1670     case OP_ORASSIGN:
1671     case OP_DORASSIGN:
1672         return TRUE;
1673     default:
1674         return FALSE;
1675     }
1676 }
1677
1678 STATIC bool
1679 S_is_handle_constructor(const OP *o, I32 numargs)
1680 {
1681     switch (o->op_type) {
1682     case OP_PIPE_OP:
1683     case OP_SOCKPAIR:
1684         if (numargs == 2)
1685             return TRUE;
1686         /* FALL THROUGH */
1687     case OP_SYSOPEN:
1688     case OP_OPEN:
1689     case OP_SELECT:             /* XXX c.f. SelectSaver.pm */
1690     case OP_SOCKET:
1691     case OP_OPEN_DIR:
1692     case OP_ACCEPT:
1693         if (numargs == 1)
1694             return TRUE;
1695         /* FALLTHROUGH */
1696     default:
1697         return FALSE;
1698     }
1699 }
1700
1701 OP *
1702 Perl_refkids(pTHX_ OP *o, I32 type)
1703 {
1704     if (o && o->op_flags & OPf_KIDS) {
1705         OP *kid;
1706         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
1707             ref(kid, type);
1708     }
1709     return o;
1710 }
1711
1712 OP *
1713 Perl_doref(pTHX_ OP *o, I32 type, bool set_op_ref)
1714 {
1715     dVAR;
1716     OP *kid;
1717
1718     if (!o || (PL_parser && PL_parser->error_count))
1719         return o;
1720
1721     switch (o->op_type) {
1722     case OP_ENTERSUB:
1723         if ((type == OP_EXISTS || type == OP_DEFINED || type == OP_LOCK) &&
1724             !(o->op_flags & OPf_STACKED)) {
1725             o->op_type = OP_RV2CV;             /* entersub => rv2cv */
1726             o->op_ppaddr = PL_ppaddr[OP_RV2CV];
1727             assert(cUNOPo->op_first->op_type == OP_NULL);
1728             op_null(((LISTOP*)cUNOPo->op_first)->op_first);     /* disable pushmark */
1729             o->op_flags |= OPf_SPECIAL;
1730             o->op_private &= ~1;
1731         }
1732         break;
1733
1734     case OP_COND_EXPR:
1735         for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
1736             doref(kid, type, set_op_ref);
1737         break;
1738     case OP_RV2SV:
1739         if (type == OP_DEFINED)
1740             o->op_flags |= OPf_SPECIAL;         /* don't create GV */
1741         doref(cUNOPo->op_first, o->op_type, set_op_ref);
1742         /* FALL THROUGH */
1743     case OP_PADSV:
1744         if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV) {
1745             o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV
1746                               : type == OP_RV2HV ? OPpDEREF_HV
1747                               : OPpDEREF_SV);
1748             o->op_flags |= OPf_MOD;
1749         }
1750         break;
1751
1752     case OP_RV2AV:
1753     case OP_RV2HV:
1754         if (set_op_ref)
1755             o->op_flags |= OPf_REF;
1756         /* FALL THROUGH */
1757     case OP_RV2GV:
1758         if (type == OP_DEFINED)
1759             o->op_flags |= OPf_SPECIAL;         /* don't create GV */
1760         doref(cUNOPo->op_first, o->op_type, set_op_ref);
1761         break;
1762
1763     case OP_PADAV:
1764     case OP_PADHV:
1765         if (set_op_ref)
1766             o->op_flags |= OPf_REF;
1767         break;
1768
1769     case OP_SCALAR:
1770     case OP_NULL:
1771         if (!(o->op_flags & OPf_KIDS))
1772             break;
1773         doref(cBINOPo->op_first, type, set_op_ref);
1774         break;
1775     case OP_AELEM:
1776     case OP_HELEM:
1777         doref(cBINOPo->op_first, o->op_type, set_op_ref);
1778         if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV) {
1779             o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV
1780                               : type == OP_RV2HV ? OPpDEREF_HV
1781                               : OPpDEREF_SV);
1782             o->op_flags |= OPf_MOD;
1783         }
1784         break;
1785
1786     case OP_SCOPE:
1787     case OP_LEAVE:
1788         set_op_ref = FALSE;
1789         /* FALL THROUGH */
1790     case OP_ENTER:
1791     case OP_LIST:
1792         if (!(o->op_flags & OPf_KIDS))
1793             break;
1794         doref(cLISTOPo->op_last, type, set_op_ref);
1795         break;
1796     default:
1797         break;
1798     }
1799     return scalar(o);
1800
1801 }
1802
1803 STATIC OP *
1804 S_dup_attrlist(pTHX_ OP *o)
1805 {
1806     dVAR;
1807     OP *rop;
1808
1809     /* An attrlist is either a simple OP_CONST or an OP_LIST with kids,
1810      * where the first kid is OP_PUSHMARK and the remaining ones
1811      * are OP_CONST.  We need to push the OP_CONST values.
1812      */
1813     if (o->op_type == OP_CONST)
1814         rop = newSVOP(OP_CONST, o->op_flags, SvREFCNT_inc_NN(cSVOPo->op_sv));
1815 #ifdef PERL_MAD
1816     else if (o->op_type == OP_NULL)
1817         rop = NULL;
1818 #endif
1819     else {
1820         assert((o->op_type == OP_LIST) && (o->op_flags & OPf_KIDS));
1821         rop = NULL;
1822         for (o = cLISTOPo->op_first; o; o=o->op_sibling) {
1823             if (o->op_type == OP_CONST)
1824                 rop = append_elem(OP_LIST, rop,
1825                                   newSVOP(OP_CONST, o->op_flags,
1826                                           SvREFCNT_inc_NN(cSVOPo->op_sv)));
1827         }
1828     }
1829     return rop;
1830 }
1831
1832 STATIC void
1833 S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs, bool for_my)
1834 {
1835     dVAR;
1836     SV *stashsv;
1837
1838     /* fake up C<use attributes $pkg,$rv,@attrs> */
1839     ENTER;              /* need to protect against side-effects of 'use' */
1840     stashsv = stash ? newSVhek(HvNAME_HEK(stash)) : &PL_sv_no;
1841
1842 #define ATTRSMODULE "attributes"
1843 #define ATTRSMODULE_PM "attributes.pm"
1844
1845     if (for_my) {
1846         /* Don't force the C<use> if we don't need it. */
1847         SV * const * const svp = hv_fetchs(GvHVn(PL_incgv), ATTRSMODULE_PM, FALSE);
1848         if (svp && *svp != &PL_sv_undef)
1849             NOOP;       /* already in %INC */
1850         else
1851             Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT,
1852                              newSVpvs(ATTRSMODULE), NULL);
1853     }
1854     else {
1855         Perl_load_module(aTHX_ PERL_LOADMOD_IMPORT_OPS,
1856                          newSVpvs(ATTRSMODULE),
1857                          NULL,
1858                          prepend_elem(OP_LIST,
1859                                       newSVOP(OP_CONST, 0, stashsv),
1860                                       prepend_elem(OP_LIST,
1861                                                    newSVOP(OP_CONST, 0,
1862                                                            newRV(target)),
1863                                                    dup_attrlist(attrs))));
1864     }
1865     LEAVE;
1866 }
1867
1868 STATIC void
1869 S_apply_attrs_my(pTHX_ HV *stash, OP *target, OP *attrs, OP **imopsp)
1870 {
1871     dVAR;
1872     OP *pack, *imop, *arg;
1873     SV *meth, *stashsv;
1874
1875     if (!attrs)
1876         return;
1877
1878     assert(target->op_type == OP_PADSV ||
1879            target->op_type == OP_PADHV ||
1880            target->op_type == OP_PADAV);
1881
1882     /* Ensure that attributes.pm is loaded. */
1883     apply_attrs(stash, PAD_SV(target->op_targ), attrs, TRUE);
1884
1885     /* Need package name for method call. */
1886     pack = newSVOP(OP_CONST, 0, newSVpvs(ATTRSMODULE));
1887
1888     /* Build up the real arg-list. */
1889     stashsv = stash ? newSVhek(HvNAME_HEK(stash)) : &PL_sv_no;
1890
1891     arg = newOP(OP_PADSV, 0);
1892     arg->op_targ = target->op_targ;
1893     arg = prepend_elem(OP_LIST,
1894                        newSVOP(OP_CONST, 0, stashsv),
1895                        prepend_elem(OP_LIST,
1896                                     newUNOP(OP_REFGEN, 0,
1897                                             mod(arg, OP_REFGEN)),
1898                                     dup_attrlist(attrs)));
1899
1900     /* Fake up a method call to import */
1901     meth = newSVpvs_share("import");
1902     imop = convert(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL|OPf_WANT_VOID,
1903                    append_elem(OP_LIST,
1904                                prepend_elem(OP_LIST, pack, list(arg)),
1905                                newSVOP(OP_METHOD_NAMED, 0, meth)));
1906     imop->op_private |= OPpENTERSUB_NOMOD;
1907
1908     /* Combine the ops. */
1909     *imopsp = append_elem(OP_LIST, *imopsp, imop);
1910 }
1911
1912 /*
1913 =notfor apidoc apply_attrs_string
1914
1915 Attempts to apply a list of attributes specified by the C<attrstr> and
1916 C<len> arguments to the subroutine identified by the C<cv> argument which
1917 is expected to be associated with the package identified by the C<stashpv>
1918 argument (see L<attributes>).  It gets this wrong, though, in that it
1919 does not correctly identify the boundaries of the individual attribute
1920 specifications within C<attrstr>.  This is not really intended for the
1921 public API, but has to be listed here for systems such as AIX which
1922 need an explicit export list for symbols.  (It's called from XS code
1923 in support of the C<ATTRS:> keyword from F<xsubpp>.)  Patches to fix it
1924 to respect attribute syntax properly would be welcome.
1925
1926 =cut
1927 */
1928
1929 void
1930 Perl_apply_attrs_string(pTHX_ const char *stashpv, CV *cv,
1931                         const char *attrstr, STRLEN len)
1932 {
1933     OP *attrs = NULL;
1934
1935     if (!len) {
1936         len = strlen(attrstr);
1937     }
1938
1939     while (len) {
1940         for (; isSPACE(*attrstr) && len; --len, ++attrstr) ;
1941         if (len) {
1942             const char * const sstr = attrstr;
1943             for (; !isSPACE(*attrstr) && len; --len, ++attrstr) ;
1944             attrs = append_elem(OP_LIST, attrs,
1945                                 newSVOP(OP_CONST, 0,
1946                                         newSVpvn(sstr, attrstr-sstr)));
1947         }
1948     }
1949
1950     Perl_load_module(aTHX_ PERL_LOADMOD_IMPORT_OPS,
1951                      newSVpvs(ATTRSMODULE),
1952                      NULL, prepend_elem(OP_LIST,
1953                                   newSVOP(OP_CONST, 0, newSVpv(stashpv,0)),
1954                                   prepend_elem(OP_LIST,
1955                                                newSVOP(OP_CONST, 0,
1956                                                        newRV((SV*)cv)),
1957                                                attrs)));
1958 }
1959
1960 STATIC OP *
1961 S_my_kid(pTHX_ OP *o, OP *attrs, OP **imopsp)
1962 {
1963     dVAR;
1964     I32 type;
1965
1966     if (!o || (PL_parser && PL_parser->error_count))
1967         return o;
1968
1969     type = o->op_type;
1970     if (PL_madskills && type == OP_NULL && o->op_flags & OPf_KIDS) {
1971         (void)my_kid(cUNOPo->op_first, attrs, imopsp);
1972         return o;
1973     }
1974
1975     if (type == OP_LIST) {
1976         OP *kid;
1977         for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
1978             my_kid(kid, attrs, imopsp);
1979     } else if (type == OP_UNDEF
1980 #ifdef PERL_MAD
1981                || type == OP_STUB
1982 #endif
1983                ) {
1984         return o;
1985     } else if (type == OP_RV2SV ||      /* "our" declaration */
1986                type == OP_RV2AV ||
1987                type == OP_RV2HV) { /* XXX does this let anything illegal in? */
1988         if (cUNOPo->op_first->op_type != OP_GV) { /* MJD 20011224 */
1989             yyerror(Perl_form(aTHX_ "Can't declare %s in \"%s\"",
1990                         OP_DESC(o),
1991                         PL_parser->in_my == KEY_our
1992                             ? "our"
1993                             : PL_parser->in_my == KEY_state ? "state" : "my"));
1994         } else if (attrs) {
1995             GV * const gv = cGVOPx_gv(cUNOPo->op_first);
1996             PL_parser->in_my = FALSE;
1997             PL_parser->in_my_stash = NULL;
1998             apply_attrs(GvSTASH(gv),
1999                         (type == OP_RV2SV ? GvSV(gv) :
2000                          type == OP_RV2AV ? (SV*)GvAV(gv) :
2001                          type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)gv),
2002                         attrs, FALSE);
2003         }
2004         o->op_private |= OPpOUR_INTRO;
2005         return o;
2006     }
2007     else if (type != OP_PADSV &&
2008              type != OP_PADAV &&
2009              type != OP_PADHV &&
2010              type != OP_PUSHMARK)
2011     {
2012         yyerror(Perl_form(aTHX_ "Can't declare %s in \"%s\"",
2013                           OP_DESC(o),
2014                           PL_parser->in_my == KEY_our
2015                             ? "our"
2016                             : PL_parser->in_my == KEY_state ? "state" : "my"));
2017         return o;
2018     }
2019     else if (attrs && type != OP_PUSHMARK) {
2020         HV *stash;
2021
2022         PL_parser->in_my = FALSE;
2023         PL_parser->in_my_stash = NULL;
2024
2025         /* check for C<my Dog $spot> when deciding package */
2026         stash = PAD_COMPNAME_TYPE(o->op_targ);
2027         if (!stash)
2028             stash = PL_curstash;
2029         apply_attrs_my(stash, o, attrs, imopsp);
2030     }
2031     o->op_flags |= OPf_MOD;
2032     o->op_private |= OPpLVAL_INTRO;
2033     if (PL_parser->in_my == KEY_state)
2034         o->op_private |= OPpPAD_STATE;
2035     return o;
2036 }
2037
2038 OP *
2039 Perl_my_attrs(pTHX_ OP *o, OP *attrs)
2040 {
2041     dVAR;
2042     OP *rops;
2043     int maybe_scalar = 0;
2044
2045 /* [perl #17376]: this appears to be premature, and results in code such as
2046    C< our(%x); > executing in list mode rather than void mode */
2047 #if 0
2048     if (o->op_flags & OPf_PARENS)
2049         list(o);
2050     else
2051         maybe_scalar = 1;
2052 #else
2053     maybe_scalar = 1;
2054 #endif
2055     if (attrs)
2056         SAVEFREEOP(attrs);
2057     rops = NULL;
2058     o = my_kid(o, attrs, &rops);
2059     if (rops) {
2060         if (maybe_scalar && o->op_type == OP_PADSV) {
2061             o = scalar(append_list(OP_LIST, (LISTOP*)rops, (LISTOP*)o));
2062             o->op_private |= OPpLVAL_INTRO;
2063         }
2064         else
2065             o = append_list(OP_LIST, (LISTOP*)o, (LISTOP*)rops);
2066     }
2067     PL_parser->in_my = FALSE;
2068     PL_parser->in_my_stash = NULL;
2069     return o;
2070 }
2071
2072 OP *
2073 Perl_my(pTHX_ OP *o)
2074 {
2075     return my_attrs(o, NULL);
2076 }
2077
2078 OP *
2079 Perl_sawparens(pTHX_ OP *o)
2080 {
2081     PERL_UNUSED_CONTEXT;
2082     if (o)
2083         o->op_flags |= OPf_PARENS;
2084     return o;
2085 }
2086
2087 OP *
2088 Perl_bind_match(pTHX_ I32 type, OP *left, OP *right)
2089 {
2090     OP *o;
2091     bool ismatchop = 0;
2092     const OPCODE ltype = left->op_type;
2093     const OPCODE rtype = right->op_type;
2094
2095     if ( (ltype == OP_RV2AV || ltype == OP_RV2HV || ltype == OP_PADAV
2096           || ltype == OP_PADHV) && ckWARN(WARN_MISC))
2097     {
2098       const char * const desc
2099           = PL_op_desc[(rtype == OP_SUBST || rtype == OP_TRANS)
2100                        ? (int)rtype : OP_MATCH];
2101       const char * const sample = ((ltype == OP_RV2AV || ltype == OP_PADAV)
2102              ? "@array" : "%hash");
2103       Perl_warner(aTHX_ packWARN(WARN_MISC),
2104              "Applying %s to %s will act on scalar(%s)",
2105              desc, sample, sample);
2106     }
2107
2108     if (rtype == OP_CONST &&
2109         cSVOPx(right)->op_private & OPpCONST_BARE &&
2110         cSVOPx(right)->op_private & OPpCONST_STRICT)
2111     {
2112         no_bareword_allowed(right);
2113     }
2114
2115     ismatchop = rtype == OP_MATCH ||
2116                 rtype == OP_SUBST ||
2117                 rtype == OP_TRANS;
2118     if (ismatchop && right->op_private & OPpTARGET_MY) {
2119         right->op_targ = 0;
2120         right->op_private &= ~OPpTARGET_MY;
2121     }
2122     if (!(right->op_flags & OPf_STACKED) && ismatchop) {
2123         OP *newleft;
2124
2125         right->op_flags |= OPf_STACKED;
2126         if (rtype != OP_MATCH &&
2127             ! (rtype == OP_TRANS &&
2128                right->op_private & OPpTRANS_IDENTICAL))
2129             newleft = mod(left, rtype);
2130         else
2131             newleft = left;
2132         if (right->op_type == OP_TRANS)
2133             o = newBINOP(OP_NULL, OPf_STACKED, scalar(newleft), right);
2134         else
2135             o = prepend_elem(rtype, scalar(newleft), right);
2136         if (type == OP_NOT)
2137             return newUNOP(OP_NOT, 0, scalar(o));
2138         return o;
2139     }
2140     else
2141         return bind_match(type, left,
2142                 pmruntime(newPMOP(OP_MATCH, 0), right, 0));
2143 }
2144
2145 OP *
2146 Perl_invert(pTHX_ OP *o)
2147 {
2148     if (!o)
2149         return NULL;
2150     return newUNOP(OP_NOT, OPf_SPECIAL, scalar(o));
2151 }
2152
2153 OP *
2154 Perl_scope(pTHX_ OP *o)
2155 {
2156     dVAR;
2157     if (o) {
2158         if (o->op_flags & OPf_PARENS || PERLDB_NOOPT || PL_tainting) {
2159             o = prepend_elem(OP_LINESEQ, newOP(OP_ENTER, 0), o);
2160             o->op_type = OP_LEAVE;
2161             o->op_ppaddr = PL_ppaddr[OP_LEAVE];
2162         }
2163         else if (o->op_type == OP_LINESEQ) {
2164             OP *kid;
2165             o->op_type = OP_SCOPE;
2166             o->op_ppaddr = PL_ppaddr[OP_SCOPE];
2167             kid = ((LISTOP*)o)->op_first;
2168             if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) {
2169                 op_null(kid);
2170
2171                 /* The following deals with things like 'do {1 for 1}' */
2172                 kid = kid->op_sibling;
2173                 if (kid &&
2174                     (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE))
2175                     op_null(kid);
2176             }
2177         }
2178         else
2179             o = newLISTOP(OP_SCOPE, 0, o, NULL);
2180     }
2181     return o;
2182 }
2183         
2184 int
2185 Perl_block_start(pTHX_ int full)
2186 {
2187     dVAR;
2188     const int retval = PL_savestack_ix;
2189     pad_block_start(full);
2190     SAVEHINTS();
2191     PL_hints &= ~HINT_BLOCK_SCOPE;
2192     SAVECOMPILEWARNINGS();
2193     PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
2194     return retval;
2195 }
2196
2197 OP*
2198 Perl_block_end(pTHX_ I32 floor, OP *seq)
2199 {
2200     dVAR;
2201     const int needblockscope = PL_hints & HINT_BLOCK_SCOPE;
2202     OP* const retval = scalarseq(seq);
2203     LEAVE_SCOPE(floor);
2204     CopHINTS_set(&PL_compiling, PL_hints);
2205     if (needblockscope)
2206         PL_hints |= HINT_BLOCK_SCOPE; /* propagate out */
2207     pad_leavemy();
2208     return retval;
2209 }
2210
2211 STATIC OP *
2212 S_newDEFSVOP(pTHX)
2213 {
2214     dVAR;
2215     const PADOFFSET offset = pad_findmy("$_");
2216     if (offset == NOT_IN_PAD || PAD_COMPNAME_FLAGS_isOUR(offset)) {
2217         return newSVREF(newGVOP(OP_GV, 0, PL_defgv));
2218     }
2219     else {
2220         OP * const o = newOP(OP_PADSV, 0);
2221         o->op_targ = offset;
2222         return o;
2223     }
2224 }
2225
2226 void
2227 Perl_newPROG(pTHX_ OP *o)
2228 {
2229     dVAR;
2230     if (PL_in_eval) {
2231         if (PL_eval_root)
2232                 return;
2233         PL_eval_root = newUNOP(OP_LEAVEEVAL,
2234                                ((PL_in_eval & EVAL_KEEPERR)
2235                                 ? OPf_SPECIAL : 0), o);
2236         PL_eval_start = linklist(PL_eval_root);
2237         PL_eval_root->op_private |= OPpREFCOUNTED;
2238         OpREFCNT_set(PL_eval_root, 1);
2239         PL_eval_root->op_next = 0;
2240         CALL_PEEP(PL_eval_start);
2241     }
2242     else {
2243         if (o->op_type == OP_STUB) {
2244             PL_comppad_name = 0;
2245             PL_compcv = 0;
2246             S_op_destroy(aTHX_ o);
2247             return;
2248         }
2249         PL_main_root = scope(sawparens(scalarvoid(o)));
2250         PL_curcop = &PL_compiling;
2251         PL_main_start = LINKLIST(PL_main_root);
2252         PL_main_root->op_private |= OPpREFCOUNTED;
2253         OpREFCNT_set(PL_main_root, 1);
2254         PL_main_root->op_next = 0;
2255         CALL_PEEP(PL_main_start);
2256         PL_compcv = 0;
2257
2258         /* Register with debugger */
2259         if (PERLDB_INTER) {
2260             CV * const cv
2261                 = Perl_get_cvn_flags(aTHX_ STR_WITH_LEN("DB::postponed"), 0);
2262             if (cv) {
2263                 dSP;
2264                 PUSHMARK(SP);
2265                 XPUSHs((SV*)CopFILEGV(&PL_compiling));
2266                 PUTBACK;
2267                 call_sv((SV*)cv, G_DISCARD);
2268             }
2269         }
2270     }
2271 }
2272
2273 OP *
2274 Perl_localize(pTHX_ OP *o, I32 lex)
2275 {
2276     dVAR;
2277     if (o->op_flags & OPf_PARENS)
2278 /* [perl #17376]: this appears to be premature, and results in code such as
2279    C< our(%x); > executing in list mode rather than void mode */
2280 #if 0
2281         list(o);
2282 #else
2283         NOOP;
2284 #endif
2285     else {
2286         if ( PL_parser->bufptr > PL_parser->oldbufptr
2287             && PL_parser->bufptr[-1] == ','
2288             && ckWARN(WARN_PARENTHESIS))
2289         {
2290             char *s = PL_parser->bufptr;
2291             bool sigil = FALSE;
2292
2293             /* some heuristics to detect a potential error */
2294             while (*s && (strchr(", \t\n", *s)))
2295                 s++;
2296
2297             while (1) {
2298                 if (*s && strchr("@$%*", *s) && *++s
2299                        && (isALNUM(*s) || UTF8_IS_CONTINUED(*s))) {
2300                     s++;
2301                     sigil = TRUE;
2302                     while (*s && (isALNUM(*s) || UTF8_IS_CONTINUED(*s)))
2303                         s++;
2304                     while (*s && (strchr(", \t\n", *s)))
2305                         s++;
2306                 }
2307                 else
2308                     break;
2309             }
2310             if (sigil && (*s == ';' || *s == '=')) {
2311                 Perl_warner(aTHX_ packWARN(WARN_PARENTHESIS),
2312                                 "Parentheses missing around \"%s\" list",
2313                                 lex
2314                                     ? (PL_parser->in_my == KEY_our
2315                                         ? "our"
2316                                         : PL_parser->in_my == KEY_state
2317                                             ? "state"
2318                                             : "my")
2319                                     : "local");
2320             }
2321         }
2322     }
2323     if (lex)
2324         o = my(o);
2325     else
2326         o = mod(o, OP_NULL);            /* a bit kludgey */
2327     PL_parser->in_my = FALSE;
2328     PL_parser->in_my_stash = NULL;
2329     return o;
2330 }
2331
2332 OP *
2333 Perl_jmaybe(pTHX_ OP *o)
2334 {
2335     if (o->op_type == OP_LIST) {
2336         OP * const o2
2337             = newSVREF(newGVOP(OP_GV, 0, gv_fetchpvs(";", GV_ADD|GV_NOTQUAL, SVt_PV)));
2338         o = convert(OP_JOIN, 0, prepend_elem(OP_LIST, o2, o));
2339     }
2340     return o;
2341 }
2342
2343 OP *
2344 Perl_fold_constants(pTHX_ register OP *o)
2345 {
2346     dVAR;
2347     register OP *curop;
2348     OP *newop;
2349     VOL I32 type = o->op_type;
2350     SV * VOL sv = NULL;
2351     int ret = 0;
2352     I32 oldscope;
2353     OP *old_next;
2354     SV * const oldwarnhook = PL_warnhook;
2355     SV * const olddiehook  = PL_diehook;
2356     dJMPENV;
2357
2358     if (PL_opargs[type] & OA_RETSCALAR)
2359         scalar(o);
2360     if (PL_opargs[type] & OA_TARGET && !o->op_targ)
2361         o->op_targ = pad_alloc(type, SVs_PADTMP);
2362
2363     /* integerize op, unless it happens to be C<-foo>.
2364      * XXX should pp_i_negate() do magic string negation instead? */
2365     if ((PL_opargs[type] & OA_OTHERINT) && (PL_hints & HINT_INTEGER)
2366         && !(type == OP_NEGATE && cUNOPo->op_first->op_type == OP_CONST
2367              && (cUNOPo->op_first->op_private & OPpCONST_BARE)))
2368     {
2369         o->op_ppaddr = PL_ppaddr[type = ++(o->op_type)];
2370     }
2371
2372     if (!(PL_opargs[type] & OA_FOLDCONST))
2373         goto nope;
2374
2375     switch (type) {
2376     case OP_NEGATE:
2377         /* XXX might want a ck_negate() for this */
2378         cUNOPo->op_first->op_private &= ~OPpCONST_STRICT;
2379         break;
2380     case OP_UCFIRST:
2381     case OP_LCFIRST:
2382     case OP_UC:
2383     case OP_LC:
2384     case OP_SLT:
2385     case OP_SGT:
2386     case OP_SLE:
2387     case OP_SGE:
2388     case OP_SCMP:
2389         /* XXX what about the numeric ops? */
2390         if (PL_hints & HINT_LOCALE)
2391             goto nope;
2392     }
2393
2394     if (PL_parser && PL_parser->error_count)
2395         goto nope;              /* Don't try to run w/ errors */
2396
2397     for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
2398         const OPCODE type = curop->op_type;
2399         if ((type != OP_CONST || (curop->op_private & OPpCONST_BARE)) &&
2400             type != OP_LIST &&
2401             type != OP_SCALAR &&
2402             type != OP_NULL &&
2403             type != OP_PUSHMARK)
2404         {
2405             goto nope;
2406         }
2407     }
2408
2409     curop = LINKLIST(o);
2410     old_next = o->op_next;
2411     o->op_next = 0;
2412     PL_op = curop;
2413
2414     oldscope = PL_scopestack_ix;
2415     create_eval_scope(G_FAKINGEVAL);
2416
2417     PL_warnhook = PERL_WARNHOOK_FATAL;
2418     PL_diehook  = NULL;
2419     JMPENV_PUSH(ret);
2420
2421     switch (ret) {
2422     case 0:
2423         CALLRUNOPS(aTHX);
2424         sv = *(PL_stack_sp--);
2425         if (o->op_targ && sv == PAD_SV(o->op_targ))     /* grab pad temp? */
2426             pad_swipe(o->op_targ,  FALSE);
2427         else if (SvTEMP(sv)) {                  /* grab mortal temp? */
2428             SvREFCNT_inc_simple_void(sv);
2429             SvTEMP_off(sv);
2430         }
2431         break;
2432     case 3:
2433         /* Something tried to die.  Abandon constant folding.  */
2434         /* Pretend the error never happened.  */
2435         sv_setpvn(ERRSV,"",0);
2436         o->op_next = old_next;
2437         break;
2438     default:
2439         JMPENV_POP;
2440         /* Don't expect 1 (setjmp failed) or 2 (something called my_exit)  */
2441         PL_warnhook = oldwarnhook;
2442         PL_diehook  = olddiehook;
2443         /* XXX note that this croak may fail as we've already blown away
2444          * the stack - eg any nested evals */
2445         Perl_croak(aTHX_ "panic: fold_constants JMPENV_PUSH returned %d", ret);
2446     }
2447     JMPENV_POP;
2448     PL_warnhook = oldwarnhook;
2449     PL_diehook  = olddiehook;
2450
2451     if (PL_scopestack_ix > oldscope)
2452         delete_eval_scope();
2453
2454     if (ret)
2455         goto nope;
2456
2457 #ifndef PERL_MAD
2458     op_free(o);
2459 #endif
2460     assert(sv);
2461     if (type == OP_RV2GV)
2462         newop = newGVOP(OP_GV, 0, (GV*)sv);
2463     else
2464         newop = newSVOP(OP_CONST, 0, (SV*)sv);
2465     op_getmad(o,newop,'f');
2466     return newop;
2467
2468  nope:
2469     return o;
2470 }
2471
2472 OP *
2473 Perl_gen_constant_list(pTHX_ register OP *o)
2474 {
2475     dVAR;
2476     register OP *curop;
2477     const I32 oldtmps_floor = PL_tmps_floor;
2478
2479     list(o);
2480     if (PL_parser && PL_parser->error_count)
2481         return o;               /* Don't attempt to run with errors */
2482
2483     PL_op = curop = LINKLIST(o);
2484     o->op_next = 0;
2485     CALL_PEEP(curop);
2486     pp_pushmark();
2487     CALLRUNOPS(aTHX);
2488     PL_op = curop;
2489     assert (!(curop->op_flags & OPf_SPECIAL));
2490     assert(curop->op_type == OP_RANGE);
2491     pp_anonlist();
2492     PL_tmps_floor = oldtmps_floor;
2493
2494     o->op_type = OP_RV2AV;
2495     o->op_ppaddr = PL_ppaddr[OP_RV2AV];
2496     o->op_flags &= ~OPf_REF;    /* treat \(1..2) like an ordinary list */
2497     o->op_flags |= OPf_PARENS;  /* and flatten \(1..2,3) */
2498     o->op_opt = 0;              /* needs to be revisited in peep() */
2499     curop = ((UNOP*)o)->op_first;
2500     ((UNOP*)o)->op_first = newSVOP(OP_CONST, 0, SvREFCNT_inc_NN(*PL_stack_sp--));
2501 #ifdef PERL_MAD
2502     op_getmad(curop,o,'O');
2503 #else
2504     op_free(curop);
2505 #endif
2506     linklist(o);
2507     return list(o);
2508 }
2509
2510 OP *
2511 Perl_convert(pTHX_ I32 type, I32 flags, OP *o)
2512 {
2513     dVAR;
2514     if (!o || o->op_type != OP_LIST)
2515         o = newLISTOP(OP_LIST, 0, o, NULL);
2516     else
2517         o->op_flags &= ~OPf_WANT;
2518
2519     if (!(PL_opargs[type] & OA_MARK))
2520         op_null(cLISTOPo->op_first);
2521
2522     o->op_type = (OPCODE)type;
2523     o->op_ppaddr = PL_ppaddr[type];
2524     o->op_flags |= flags;
2525
2526     o = CHECKOP(type, o);
2527     if (o->op_type != (unsigned)type)
2528         return o;
2529
2530     return fold_constants(o);
2531 }
2532
2533 /* List constructors */
2534
2535 OP *
2536 Perl_append_elem(pTHX_ I32 type, OP *first, OP *last)
2537 {
2538     if (!first)
2539         return last;
2540
2541     if (!last)
2542         return first;
2543
2544     if (first->op_type != (unsigned)type
2545         || (type == OP_LIST && (first->op_flags & OPf_PARENS)))
2546     {
2547         return newLISTOP(type, 0, first, last);
2548     }
2549
2550     if (first->op_flags & OPf_KIDS)
2551         ((LISTOP*)first)->op_last->op_sibling = last;
2552     else {
2553         first->op_flags |= OPf_KIDS;
2554         ((LISTOP*)first)->op_first = last;
2555     }
2556     ((LISTOP*)first)->op_last = last;
2557     return first;
2558 }
2559
2560 OP *
2561 Perl_append_list(pTHX_ I32 type, LISTOP *first, LISTOP *last)
2562 {
2563     if (!first)
2564         return (OP*)last;
2565
2566     if (!last)
2567         return (OP*)first;
2568
2569     if (first->op_type != (unsigned)type)
2570         return prepend_elem(type, (OP*)first, (OP*)last);
2571
2572     if (last->op_type != (unsigned)type)
2573         return append_elem(type, (OP*)first, (OP*)last);
2574
2575     first->op_last->op_sibling = last->op_first;
2576     first->op_last = last->op_last;
2577     first->op_flags |= (last->op_flags & OPf_KIDS);
2578
2579 #ifdef PERL_MAD
2580     if (last->op_first && first->op_madprop) {
2581         MADPROP *mp = last->op_first->op_madprop;
2582         if (mp) {
2583             while (mp->mad_next)
2584                 mp = mp->mad_next;
2585             mp->mad_next = first->op_madprop;
2586         }
2587         else {
2588             last->op_first->op_madprop = first->op_madprop;
2589         }
2590     }
2591     first->op_madprop = last->op_madprop;
2592     last->op_madprop = 0;
2593 #endif
2594
2595     S_op_destroy(aTHX_ (OP*)last);
2596
2597     return (OP*)first;
2598 }
2599
2600 OP *
2601 Perl_prepend_elem(pTHX_ I32 type, OP *first, OP *last)
2602 {
2603     if (!first)
2604         return last;
2605
2606     if (!last)
2607         return first;
2608
2609     if (last->op_type == (unsigned)type) {
2610         if (type == OP_LIST) {  /* already a PUSHMARK there */
2611             first->op_sibling = ((LISTOP*)last)->op_first->op_sibling;
2612             ((LISTOP*)last)->op_first->op_sibling = first;
2613             if (!(first->op_flags & OPf_PARENS))
2614                 last->op_flags &= ~OPf_PARENS;
2615         }
2616         else {
2617             if (!(last->op_flags & OPf_KIDS)) {
2618                 ((LISTOP*)last)->op_last = first;
2619                 last->op_flags |= OPf_KIDS;
2620             }
2621             first->op_sibling = ((LISTOP*)last)->op_first;
2622             ((LISTOP*)last)->op_first = first;
2623         }
2624         last->op_flags |= OPf_KIDS;
2625         return last;
2626     }
2627
2628     return newLISTOP(type, 0, first, last);
2629 }
2630
2631 /* Constructors */
2632
2633 #ifdef PERL_MAD
2634  
2635 TOKEN *
2636 Perl_newTOKEN(pTHX_ I32 optype, YYSTYPE lval, MADPROP* madprop)
2637 {
2638     TOKEN *tk;
2639     Newxz(tk, 1, TOKEN);
2640     tk->tk_type = (OPCODE)optype;
2641     tk->tk_type = 12345;
2642     tk->tk_lval = lval;
2643     tk->tk_mad = madprop;
2644     return tk;
2645 }
2646
2647 void
2648 Perl_token_free(pTHX_ TOKEN* tk)
2649 {
2650     if (tk->tk_type != 12345)
2651         return;
2652     mad_free(tk->tk_mad);
2653     Safefree(tk);
2654 }
2655
2656 void
2657 Perl_token_getmad(pTHX_ TOKEN* tk, OP* o, char slot)
2658 {
2659     MADPROP* mp;
2660     MADPROP* tm;
2661     if (tk->tk_type != 12345) {
2662         Perl_warner(aTHX_ packWARN(WARN_MISC),
2663              "Invalid TOKEN object ignored");
2664         return;
2665     }
2666     tm = tk->tk_mad;
2667     if (!tm)
2668         return;
2669
2670     /* faked up qw list? */
2671     if (slot == '(' &&
2672         tm->mad_type == MAD_SV &&
2673         SvPVX((SV*)tm->mad_val)[0] == 'q')
2674             slot = 'x';
2675
2676     if (o) {
2677         mp = o->op_madprop;
2678         if (mp) {
2679             for (;;) {
2680                 /* pretend constant fold didn't happen? */
2681                 if (mp->mad_key == 'f' &&
2682                     (o->op_type == OP_CONST ||
2683                      o->op_type == OP_GV) )
2684                 {
2685                     token_getmad(tk,(OP*)mp->mad_val,slot);
2686                     return;
2687                 }
2688                 if (!mp->mad_next)
2689                     break;
2690                 mp = mp->mad_next;
2691             }
2692             mp->mad_next = tm;
2693             mp = mp->mad_next;
2694         }
2695         else {
2696             o->op_madprop = tm;
2697             mp = o->op_madprop;
2698         }
2699         if (mp->mad_key == 'X')
2700             mp->mad_key = slot; /* just change the first one */
2701
2702         tk->tk_mad = 0;
2703     }
2704     else
2705         mad_free(tm);
2706     Safefree(tk);
2707 }
2708
2709 void
2710 Perl_op_getmad_weak(pTHX_ OP* from, OP* o, char slot)
2711 {
2712     MADPROP* mp;
2713     if (!from)
2714         return;
2715     if (o) {
2716         mp = o->op_madprop;
2717         if (mp) {
2718             for (;;) {
2719                 /* pretend constant fold didn't happen? */
2720                 if (mp->mad_key == 'f' &&
2721                     (o->op_type == OP_CONST ||
2722                      o->op_type == OP_GV) )
2723                 {
2724                     op_getmad(from,(OP*)mp->mad_val,slot);
2725                     return;
2726                 }
2727                 if (!mp->mad_next)
2728                     break;
2729                 mp = mp->mad_next;
2730             }
2731             mp->mad_next = newMADPROP(slot,MAD_OP,from,0);
2732         }
2733         else {
2734             o->op_madprop = newMADPROP(slot,MAD_OP,from,0);
2735         }
2736     }
2737 }
2738
2739 void
2740 Perl_op_getmad(pTHX_ OP* from, OP* o, char slot)
2741 {
2742     MADPROP* mp;
2743     if (!from)
2744         return;
2745     if (o) {
2746         mp = o->op_madprop;
2747         if (mp) {
2748             for (;;) {
2749                 /* pretend constant fold didn't happen? */
2750                 if (mp->mad_key == 'f' &&
2751                     (o->op_type == OP_CONST ||
2752                      o->op_type == OP_GV) )
2753                 {
2754                     op_getmad(from,(OP*)mp->mad_val,slot);
2755                     return;
2756                 }
2757                 if (!mp->mad_next)
2758                     break;
2759                 mp = mp->mad_next;
2760             }
2761             mp->mad_next = newMADPROP(slot,MAD_OP,from,1);
2762         }
2763         else {
2764             o->op_madprop = newMADPROP(slot,MAD_OP,from,1);
2765         }
2766     }
2767     else {
2768         PerlIO_printf(PerlIO_stderr(),
2769                       "DESTROYING op = %0"UVxf"\n", PTR2UV(from));
2770         op_free(from);
2771     }
2772 }
2773
2774 void
2775 Perl_prepend_madprops(pTHX_ MADPROP* mp, OP* o, char slot)
2776 {
2777     MADPROP* tm;
2778     if (!mp || !o)
2779         return;
2780     if (slot)
2781         mp->mad_key = slot;
2782     tm = o->op_madprop;
2783     o->op_madprop = mp;
2784     for (;;) {
2785         if (!mp->mad_next)
2786             break;
2787         mp = mp->mad_next;
2788     }
2789     mp->mad_next = tm;
2790 }
2791
2792 void
2793 Perl_append_madprops(pTHX_ MADPROP* tm, OP* o, char slot)
2794 {
2795     if (!o)
2796         return;
2797     addmad(tm, &(o->op_madprop), slot);
2798 }
2799
2800 void
2801 Perl_addmad(pTHX_ MADPROP* tm, MADPROP** root, char slot)
2802 {
2803     MADPROP* mp;
2804     if (!tm || !root)
2805         return;
2806     if (slot)
2807         tm->mad_key = slot;
2808     mp = *root;
2809     if (!mp) {
2810         *root = tm;
2811         return;
2812     }
2813     for (;;) {
2814         if (!mp->mad_next)
2815             break;
2816         mp = mp->mad_next;
2817     }
2818     mp->mad_next = tm;
2819 }
2820
2821 MADPROP *
2822 Perl_newMADsv(pTHX_ char key, SV* sv)
2823 {
2824     return newMADPROP(key, MAD_SV, sv, 0);
2825 }
2826
2827 MADPROP *
2828 Perl_newMADPROP(pTHX_ char key, char type, const void* val, I32 vlen)
2829 {
2830     MADPROP *mp;
2831     Newxz(mp, 1, MADPROP);
2832     mp->mad_next = 0;
2833     mp->mad_key = key;
2834     mp->mad_vlen = vlen;
2835     mp->mad_type = type;
2836     mp->mad_val = val;
2837 /*    PerlIO_printf(PerlIO_stderr(), "NEW  mp = %0x\n", mp);  */
2838     return mp;
2839 }
2840
2841 void
2842 Perl_mad_free(pTHX_ MADPROP* mp)
2843 {
2844 /*    PerlIO_printf(PerlIO_stderr(), "FREE mp = %0x\n", mp); */
2845     if (!mp)
2846         return;
2847     if (mp->mad_next)
2848         mad_free(mp->mad_next);
2849 /*    if (PL_parser && PL_parser->lex_state != LEX_NOTPARSING && mp->mad_vlen)
2850         PerlIO_printf(PerlIO_stderr(), "DESTROYING '%c'=<%s>\n", mp->mad_key & 255, mp->mad_val); */
2851     switch (mp->mad_type) {
2852     case MAD_NULL:
2853         break;
2854     case MAD_PV:
2855         Safefree((char*)mp->mad_val);
2856         break;
2857     case MAD_OP:
2858         if (mp->mad_vlen)       /* vlen holds "strong/weak" boolean */
2859             op_free((OP*)mp->mad_val);
2860         break;
2861     case MAD_SV:
2862         sv_free((SV*)mp->mad_val);
2863         break;
2864     default:
2865         PerlIO_printf(PerlIO_stderr(), "Unrecognized mad\n");
2866         break;
2867     }
2868     Safefree(mp);
2869 }
2870
2871 #endif
2872
2873 OP *
2874 Perl_newNULLLIST(pTHX)
2875 {
2876     return newOP(OP_STUB, 0);
2877 }
2878
2879 OP *
2880 Perl_force_list(pTHX_ OP *o)
2881 {
2882     if (!o || o->op_type != OP_LIST)
2883         o = newLISTOP(OP_LIST, 0, o, NULL);
2884     op_null(o);
2885     return o;
2886 }
2887
2888 OP *
2889 Perl_newLISTOP(pTHX_ I32 type, I32 flags, OP *first, OP *last)
2890 {
2891     dVAR;
2892     LISTOP *listop;
2893
2894     NewOp(1101, listop, 1, LISTOP);
2895
2896     listop->op_type = (OPCODE)type;
2897     listop->op_ppaddr = PL_ppaddr[type];
2898     if (first || last)
2899         flags |= OPf_KIDS;
2900     listop->op_flags = (U8)flags;
2901
2902     if (!last && first)
2903         last = first;
2904     else if (!first && last)
2905         first = last;
2906     else if (first)
2907         first->op_sibling = last;
2908     listop->op_first = first;
2909     listop->op_last = last;
2910     if (type == OP_LIST) {
2911         OP* const pushop = newOP(OP_PUSHMARK, 0);
2912         pushop->op_sibling = first;
2913         listop->op_first = pushop;
2914         listop->op_flags |= OPf_KIDS;
2915         if (!last)
2916             listop->op_last = pushop;
2917     }
2918
2919     return CHECKOP(type, listop);
2920 }
2921
2922 OP *
2923 Perl_newOP(pTHX_ I32 type, I32 flags)
2924 {
2925     dVAR;
2926     OP *o;
2927     NewOp(1101, o, 1, OP);
2928     o->op_type = (OPCODE)type;
2929     o->op_ppaddr = PL_ppaddr[type];
2930     o->op_flags = (U8)flags;
2931     o->op_latefree = 0;
2932     o->op_latefreed = 0;
2933     o->op_attached = 0;
2934
2935     o->op_next = o;
2936     o->op_private = (U8)(0 | (flags >> 8));
2937     if (PL_opargs[type] & OA_RETSCALAR)
2938         scalar(o);
2939     if (PL_opargs[type] & OA_TARGET)
2940         o->op_targ = pad_alloc(type, SVs_PADTMP);
2941     return CHECKOP(type, o);
2942 }
2943
2944 OP *
2945 Perl_newUNOP(pTHX_ I32 type, I32 flags, OP *first)
2946 {
2947     dVAR;
2948     UNOP *unop;
2949
2950     if (!first)
2951         first = newOP(OP_STUB, 0);
2952     if (PL_opargs[type] & OA_MARK)
2953         first = force_list(first);
2954
2955     NewOp(1101, unop, 1, UNOP);
2956     unop->op_type = (OPCODE)type;
2957     unop->op_ppaddr = PL_ppaddr[type];
2958     unop->op_first = first;
2959     unop->op_flags = (U8)(flags | OPf_KIDS);
2960     unop->op_private = (U8)(1 | (flags >> 8));
2961     unop = (UNOP*) CHECKOP(type, unop);
2962     if (unop->op_next)
2963         return (OP*)unop;
2964
2965     return fold_constants((OP *) unop);
2966 }
2967
2968 OP *
2969 Perl_newBINOP(pTHX_ I32 type, I32 flags, OP *first, OP *last)
2970 {
2971     dVAR;
2972     BINOP *binop;
2973     NewOp(1101, binop, 1, BINOP);
2974
2975     if (!first)
2976         first = newOP(OP_NULL, 0);
2977
2978     binop->op_type = (OPCODE)type;
2979     binop->op_ppaddr = PL_ppaddr[type];
2980     binop->op_first = first;
2981     binop->op_flags = (U8)(flags | OPf_KIDS);
2982     if (!last) {
2983         last = first;
2984         binop->op_private = (U8)(1 | (flags >> 8));
2985     }
2986     else {
2987         binop->op_private = (U8)(2 | (flags >> 8));
2988         first->op_sibling = last;
2989     }
2990
2991     binop = (BINOP*)CHECKOP(type, binop);
2992     if (binop->op_next || binop->op_type != (OPCODE)type)
2993         return (OP*)binop;
2994
2995     binop->op_last = binop->op_first->op_sibling;
2996
2997     return fold_constants((OP *)binop);
2998 }
2999
3000 static int uvcompare(const void *a, const void *b)
3001     __attribute__nonnull__(1)
3002     __attribute__nonnull__(2)
3003     __attribute__pure__;
3004 static int uvcompare(const void *a, const void *b)
3005 {
3006     if (*((const UV *)a) < (*(const UV *)b))
3007         return -1;
3008     if (*((const UV *)a) > (*(const UV *)b))
3009         return 1;
3010     if (*((const UV *)a+1) < (*(const UV *)b+1))
3011         return -1;
3012     if (*((const UV *)a+1) > (*(const UV *)b+1))
3013         return 1;
3014     return 0;
3015 }
3016
3017 OP *
3018 Perl_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
3019 {
3020     dVAR;
3021     SV * const tstr = ((SVOP*)expr)->op_sv;
3022     SV * const rstr =
3023 #ifdef PERL_MAD
3024                         (repl->op_type == OP_NULL)
3025                             ? ((SVOP*)((LISTOP*)repl)->op_first)->op_sv :
3026 #endif
3027                               ((SVOP*)repl)->op_sv;
3028     STRLEN tlen;
3029     STRLEN rlen;
3030     const U8 *t = (U8*)SvPV_const(tstr, tlen);
3031     const U8 *r = (U8*)SvPV_const(rstr, rlen);
3032     register I32 i;
3033     register I32 j;
3034     I32 grows = 0;
3035     register short *tbl;
3036
3037     const I32 complement = o->op_private & OPpTRANS_COMPLEMENT;
3038     const I32 squash     = o->op_private & OPpTRANS_SQUASH;
3039     I32 del              = o->op_private & OPpTRANS_DELETE;
3040     SV* swash;
3041     PL_hints |= HINT_BLOCK_SCOPE;
3042
3043     if (SvUTF8(tstr))
3044         o->op_private |= OPpTRANS_FROM_UTF;
3045
3046     if (SvUTF8(rstr))
3047         o->op_private |= OPpTRANS_TO_UTF;
3048
3049     if (o->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF)) {
3050         SV* const listsv = newSVpvs("# comment\n");
3051         SV* transv = NULL;
3052         const U8* tend = t + tlen;
3053         const U8* rend = r + rlen;
3054         STRLEN ulen;
3055         UV tfirst = 1;
3056         UV tlast = 0;
3057         IV tdiff;
3058         UV rfirst = 1;
3059         UV rlast = 0;
3060         IV rdiff;
3061         IV diff;
3062         I32 none = 0;
3063         U32 max = 0;
3064         I32 bits;
3065         I32 havefinal = 0;
3066         U32 final = 0;
3067         const I32 from_utf  = o->op_private & OPpTRANS_FROM_UTF;
3068         const I32 to_utf    = o->op_private & OPpTRANS_TO_UTF;
3069         U8* tsave = NULL;
3070         U8* rsave = NULL;
3071         const U32 flags = UTF8_ALLOW_DEFAULT;
3072
3073         if (!from_utf) {
3074             STRLEN len = tlen;
3075             t = tsave = bytes_to_utf8(t, &len);
3076             tend = t + len;
3077         }
3078         if (!to_utf && rlen) {
3079             STRLEN len = rlen;
3080             r = rsave = bytes_to_utf8(r, &len);
3081             rend = r + len;
3082         }
3083
3084 /* There are several snags with this code on EBCDIC:
3085    1. 0xFF is a legal UTF-EBCDIC byte (there are no illegal bytes).
3086    2. scan_const() in toke.c has encoded chars in native encoding which makes
3087       ranges at least in EBCDIC 0..255 range the bottom odd.
3088 */
3089
3090         if (complement) {
3091             U8 tmpbuf[UTF8_MAXBYTES+1];
3092             UV *cp;
3093             UV nextmin = 0;
3094             Newx(cp, 2*tlen, UV);
3095             i = 0;
3096             transv = newSVpvs("");
3097             while (t < tend) {
3098                 cp[2*i] = utf8n_to_uvuni(t, tend-t, &ulen, flags);
3099                 t += ulen;
3100                 if (t < tend && NATIVE_TO_UTF(*t) == 0xff) {
3101                     t++;
3102                     cp[2*i+1] = utf8n_to_uvuni(t, tend-t, &ulen, flags);
3103                     t += ulen;
3104                 }
3105                 else {
3106                  cp[2*i+1] = cp[2*i];
3107                 }
3108                 i++;
3109             }
3110             qsort(cp, i, 2*sizeof(UV), uvcompare);
3111             for (j = 0; j < i; j++) {
3112                 UV  val = cp[2*j];
3113                 diff = val - nextmin;
3114                 if (diff > 0) {
3115                     t = uvuni_to_utf8(tmpbuf,nextmin);
3116                     sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
3117                     if (diff > 1) {
3118                         U8  range_mark = UTF_TO_NATIVE(0xff);
3119                         t = uvuni_to_utf8(tmpbuf, val - 1);
3120                         sv_catpvn(transv, (char *)&range_mark, 1);
3121                         sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
3122                     }
3123                 }
3124                 val = cp[2*j+1];
3125                 if (val >= nextmin)
3126                     nextmin = val + 1;
3127             }
3128             t = uvuni_to_utf8(tmpbuf,nextmin);
3129             sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
3130             {
3131                 U8 range_mark = UTF_TO_NATIVE(0xff);
3132                 sv_catpvn(transv, (char *)&range_mark, 1);
3133             }
3134             t = uvuni_to_utf8_flags(tmpbuf, 0x7fffffff,
3135                                     UNICODE_ALLOW_SUPER);
3136             sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
3137             t = (const U8*)SvPVX_const(transv);
3138             tlen = SvCUR(transv);
3139             tend = t + tlen;
3140             Safefree(cp);
3141         }
3142         else if (!rlen && !del) {
3143             r = t; rlen = tlen; rend = tend;
3144         }
3145         if (!squash) {
3146                 if ((!rlen && !del) || t == r ||
3147                     (tlen == rlen && memEQ((char *)t, (char *)r, tlen)))
3148                 {
3149                     o->op_private |= OPpTRANS_IDENTICAL;
3150                 }
3151         }
3152
3153         while (t < tend || tfirst <= tlast) {
3154             /* see if we need more "t" chars */
3155             if (tfirst > tlast) {
3156                 tfirst = (I32)utf8n_to_uvuni(t, tend - t, &ulen, flags);
3157                 t += ulen;
3158                 if (t < tend && NATIVE_TO_UTF(*t) == 0xff) {    /* illegal utf8 val indicates range */
3159                     t++;
3160                     tlast = (I32)utf8n_to_uvuni(t, tend - t, &ulen, flags);
3161                     t += ulen;
3162                 }
3163                 else
3164                     tlast = tfirst;
3165             }
3166
3167             /* now see if we need more "r" chars */
3168             if (rfirst > rlast) {
3169                 if (r < rend) {
3170                     rfirst = (I32)utf8n_to_uvuni(r, rend - r, &ulen, flags);
3171                     r += ulen;
3172                     if (r < rend && NATIVE_TO_UTF(*r) == 0xff) {        /* illegal utf8 val indicates range */
3173                         r++;
3174                         rlast = (I32)utf8n_to_uvuni(r, rend - r, &ulen, flags);
3175                         r += ulen;
3176                     }
3177                     else
3178                         rlast = rfirst;
3179                 }
3180                 else {
3181                     if (!havefinal++)
3182                         final = rlast;
3183                     rfirst = rlast = 0xffffffff;
3184                 }
3185             }
3186
3187             /* now see which range will peter our first, if either. */
3188             tdiff = tlast - tfirst;
3189             rdiff = rlast - rfirst;
3190
3191             if (tdiff <= rdiff)
3192                 diff = tdiff;
3193             else
3194                 diff = rdiff;
3195
3196             if (rfirst == 0xffffffff) {
3197                 diff = tdiff;   /* oops, pretend rdiff is infinite */
3198                 if (diff > 0)
3199                     Perl_sv_catpvf(aTHX_ listsv, "%04lx\t%04lx\tXXXX\n",
3200                                    (long)tfirst, (long)tlast);
3201                 else
3202                     Perl_sv_catpvf(aTHX_ listsv, "%04lx\t\tXXXX\n", (long)tfirst);
3203             }
3204             else {
3205                 if (diff > 0)
3206                     Perl_sv_catpvf(aTHX_ listsv, "%04lx\t%04lx\t%04lx\n",
3207                                    (long)tfirst, (long)(tfirst + diff),
3208                                    (long)rfirst);
3209                 else
3210                     Perl_sv_catpvf(aTHX_ listsv, "%04lx\t\t%04lx\n",
3211                                    (long)tfirst, (long)rfirst);
3212
3213                 if (rfirst + diff > max)
3214                     max = rfirst + diff;
3215                 if (!grows)
3216                     grows = (tfirst < rfirst &&
3217                              UNISKIP(tfirst) < UNISKIP(rfirst + diff));
3218                 rfirst += diff + 1;
3219             }
3220             tfirst += diff + 1;
3221         }
3222
3223         none = ++max;
3224         if (del)
3225             del = ++max;
3226
3227         if (max > 0xffff)
3228             bits = 32;
3229         else if (max > 0xff)
3230             bits = 16;
3231         else
3232             bits = 8;
3233
3234         PerlMemShared_free(cPVOPo->op_pv);
3235         cPVOPo->op_pv = NULL;
3236
3237         swash = (SV*)swash_init("utf8", "", listsv, bits, none);
3238 #ifdef USE_ITHREADS
3239         cPADOPo->op_padix = pad_alloc(OP_TRANS, SVs_PADTMP);
3240         SvREFCNT_dec(PAD_SVl(cPADOPo->op_padix));
3241         PAD_SETSV(cPADOPo->op_padix, swash);
3242         SvPADTMP_on(swash);
3243 #else
3244         cSVOPo->op_sv = swash;
3245 #endif
3246         SvREFCNT_dec(listsv);
3247         SvREFCNT_dec(transv);
3248
3249         if (!del && havefinal && rlen)
3250             (void)hv_store((HV*)SvRV(swash), "FINAL", 5,
3251                            newSVuv((UV)final), 0);
3252
3253         if (grows)
3254             o->op_private |= OPpTRANS_GROWS;
3255
3256         Safefree(tsave);
3257         Safefree(rsave);
3258
3259 #ifdef PERL_MAD
3260         op_getmad(expr,o,'e');
3261         op_getmad(repl,o,'r');
3262 #else
3263         op_free(expr);
3264         op_free(repl);
3265 #endif
3266         return o;
3267     }
3268
3269     tbl = (short*)cPVOPo->op_pv;
3270     if (complement) {
3271         Zero(tbl, 256, short);
3272         for (i = 0; i < (I32)tlen; i++)
3273             tbl[t[i]] = -1;
3274         for (i = 0, j = 0; i < 256; i++) {
3275             if (!tbl[i]) {
3276                 if (j >= (I32)rlen) {
3277                     if (del)
3278                         tbl[i] = -2;
3279                     else if (rlen)
3280                         tbl[i] = r[j-1];
3281                     else
3282                         tbl[i] = (short)i;
3283                 }
3284                 else {
3285                     if (i < 128 && r[j] >= 128)
3286                         grows = 1;
3287                     tbl[i] = r[j++];
3288                 }
3289             }
3290         }
3291         if (!del) {
3292             if (!rlen) {
3293                 j = rlen;
3294                 if (!squash)
3295                     o->op_private |= OPpTRANS_IDENTICAL;
3296             }
3297             else if (j >= (I32)rlen)
3298                 j = rlen - 1;
3299             else {
3300                 tbl = 
3301                     (short *)
3302                     PerlMemShared_realloc(tbl,
3303                                           (0x101+rlen-j) * sizeof(short));
3304                 cPVOPo->op_pv = (char*)tbl;
3305             }
3306             tbl[0x100] = (short)(rlen - j);
3307             for (i=0; i < (I32)rlen - j; i++)
3308                 tbl[0x101+i] = r[j+i];
3309         }
3310     }
3311     else {
3312         if (!rlen && !del) {
3313             r = t; rlen = tlen;
3314             if (!squash)
3315                 o->op_private |= OPpTRANS_IDENTICAL;
3316         }
3317         else if (!squash && rlen == tlen && memEQ((char*)t, (char*)r, tlen)) {
3318             o->op_private |= OPpTRANS_IDENTICAL;
3319         }
3320         for (i = 0; i < 256; i++)
3321             tbl[i] = -1;
3322         for (i = 0, j = 0; i < (I32)tlen; i++,j++) {
3323             if (j >= (I32)rlen) {
3324                 if (del) {
3325                     if (tbl[t[i]] == -1)
3326                         tbl[t[i]] = -2;
3327                     continue;
3328                 }
3329                 --j;
3330             }
3331             if (tbl[t[i]] == -1) {
3332                 if (t[i] < 128 && r[j] >= 128)
3333                     grows = 1;
3334                 tbl[t[i]] = r[j];
3335             }
3336         }
3337     }
3338     if (grows)
3339         o->op_private |= OPpTRANS_GROWS;
3340 #ifdef PERL_MAD
3341     op_getmad(expr,o,'e');
3342     op_getmad(repl,o,'r');
3343 #else
3344     op_free(expr);
3345     op_free(repl);
3346 #endif
3347
3348     return o;
3349 }
3350
3351 OP *
3352 Perl_newPMOP(pTHX_ I32 type, I32 flags)
3353 {
3354     dVAR;
3355     PMOP *pmop;
3356
3357     NewOp(1101, pmop, 1, PMOP);
3358     pmop->op_type = (OPCODE)type;
3359     pmop->op_ppaddr = PL_ppaddr[type];
3360     pmop->op_flags = (U8)flags;
3361     pmop->op_private = (U8)(0 | (flags >> 8));
3362
3363     if (PL_hints & HINT_RE_TAINT)
3364         pmop->op_pmflags |= PMf_RETAINT;
3365     if (PL_hints & HINT_LOCALE)
3366         pmop->op_pmflags |= PMf_LOCALE;
3367
3368
3369 #ifdef USE_ITHREADS
3370     if (av_len((AV*) PL_regex_pad[0]) > -1) {
3371         SV * const repointer = av_pop((AV*)PL_regex_pad[0]);
3372         pmop->op_pmoffset = SvIV(repointer);
3373         SvREPADTMP_off(repointer);
3374         sv_setiv(repointer,0);
3375     } else {
3376         SV * const repointer = newSViv(0);
3377         av_push(PL_regex_padav, repointer);
3378         pmop->op_pmoffset = av_len(PL_regex_padav);
3379         PL_regex_pad = AvARRAY(PL_regex_padav);
3380     }
3381 #endif
3382
3383     return CHECKOP(type, pmop);
3384 }
3385
3386 /* Given some sort of match op o, and an expression expr containing a
3387  * pattern, either compile expr into a regex and attach it to o (if it's
3388  * constant), or convert expr into a runtime regcomp op sequence (if it's
3389  * not)
3390  *
3391  * isreg indicates that the pattern is part of a regex construct, eg
3392  * $x =~ /pattern/ or split /pattern/, as opposed to $x =~ $pattern or
3393  * split "pattern", which aren't. In the former case, expr will be a list
3394  * if the pattern contains more than one term (eg /a$b/) or if it contains
3395  * a replacement, ie s/// or tr///.
3396  */
3397
3398 OP *
3399 Perl_pmruntime(pTHX_ OP *o, OP *expr, bool isreg)
3400 {
3401     dVAR;
3402     PMOP *pm;
3403     LOGOP *rcop;
3404     I32 repl_has_vars = 0;
3405     OP* repl = NULL;
3406     bool reglist;
3407
3408     if (o->op_type == OP_SUBST || o->op_type == OP_TRANS) {
3409         /* last element in list is the replacement; pop it */
3410         OP* kid;
3411         repl = cLISTOPx(expr)->op_last;
3412         kid = cLISTOPx(expr)->op_first;
3413         while (kid->op_sibling != repl)
3414             kid = kid->op_sibling;
3415         kid->op_sibling = NULL;
3416         cLISTOPx(expr)->op_last = kid;
3417     }
3418
3419     if (isreg && expr->op_type == OP_LIST &&
3420         cLISTOPx(expr)->op_first->op_sibling == cLISTOPx(expr)->op_last)
3421     {
3422         /* convert single element list to element */
3423         OP* const oe = expr;
3424         expr = cLISTOPx(oe)->op_first->op_sibling;
3425         cLISTOPx(oe)->op_first->op_sibling = NULL;
3426         cLISTOPx(oe)->op_last = NULL;
3427         op_free(oe);
3428     }
3429
3430     if (o->op_type == OP_TRANS) {
3431         return pmtrans(o, expr, repl);
3432     }
3433
3434     reglist = isreg && expr->op_type == OP_LIST;
3435     if (reglist)
3436         op_null(expr);
3437
3438     PL_hints |= HINT_BLOCK_SCOPE;
3439     pm = (PMOP*)o;
3440
3441     if (expr->op_type == OP_CONST) {
3442         SV *pat = ((SVOP*)expr)->op_sv;
3443         U32 pm_flags = pm->op_pmflags & PMf_COMPILETIME;
3444
3445         if (o->op_flags & OPf_SPECIAL)
3446             pm_flags |= RXf_SPLIT;
3447
3448         if (DO_UTF8(pat)) {
3449             assert (SvUTF8(pat));
3450         } else if (SvUTF8(pat)) {
3451             /* Not doing UTF-8, despite what the SV says. Is this only if we're
3452                trapped in use 'bytes'?  */
3453             /* Make a copy of the octet sequence, but without the flag on, as
3454                the compiler now honours the SvUTF8 flag on pat.  */
3455             STRLEN len;
3456             const char *const p = SvPV(pat, len);
3457             pat = newSVpvn_flags(p, len, SVs_TEMP);
3458         }
3459
3460         PM_SETRE(pm, CALLREGCOMP(pat, pm_flags));
3461
3462 #ifdef PERL_MAD
3463         op_getmad(expr,(OP*)pm,'e');
3464 #else
3465         op_free(expr);
3466 #endif
3467     }
3468     else {
3469         if (pm->op_pmflags & PMf_KEEP || !(PL_hints & HINT_RE_EVAL))
3470             expr = newUNOP((!(PL_hints & HINT_RE_EVAL)
3471                             ? OP_REGCRESET
3472                             : OP_REGCMAYBE),0,expr);
3473
3474         NewOp(1101, rcop, 1, LOGOP);
3475         rcop->op_type = OP_REGCOMP;
3476         rcop->op_ppaddr = PL_ppaddr[OP_REGCOMP];
3477         rcop->op_first = scalar(expr);
3478         rcop->op_flags |= OPf_KIDS
3479                             | ((PL_hints & HINT_RE_EVAL) ? OPf_SPECIAL : 0)
3480                             | (reglist ? OPf_STACKED : 0);
3481         rcop->op_private = 1;
3482         rcop->op_other = o;
3483         if (reglist)
3484             rcop->op_targ = pad_alloc(rcop->op_type, SVs_PADTMP);
3485
3486         /* /$x/ may cause an eval, since $x might be qr/(?{..})/  */
3487         PL_cv_has_eval = 1;
3488
3489         /* establish postfix order */
3490         if (pm->op_pmflags & PMf_KEEP || !(PL_hints & HINT_RE_EVAL)) {
3491             LINKLIST(expr);
3492             rcop->op_next = expr;
3493             ((UNOP*)expr)->op_first->op_next = (OP*)rcop;
3494         }
3495         else {
3496             rcop->op_next = LINKLIST(expr);
3497             expr->op_next = (OP*)rcop;
3498         }
3499
3500         prepend_elem(o->op_type, scalar((OP*)rcop), o);
3501     }
3502
3503     if (repl) {
3504         OP *curop;
3505         if (pm->op_pmflags & PMf_EVAL) {
3506             curop = NULL;
3507             if (CopLINE(PL_curcop) < (line_t)PL_parser->multi_end)
3508                 CopLINE_set(PL_curcop, (line_t)PL_parser->multi_end);
3509         }
3510         else if (repl->op_type == OP_CONST)
3511             curop = repl;
3512         else {
3513             OP *lastop = NULL;
3514             for (curop = LINKLIST(repl); curop!=repl; curop = LINKLIST(curop)) {
3515                 if (curop->op_type == OP_SCOPE
3516                         || curop->op_type == OP_LEAVE
3517                         || (PL_opargs[curop->op_type] & OA_DANGEROUS)) {
3518                     if (curop->op_type == OP_GV) {
3519                         GV * const gv = cGVOPx_gv(curop);
3520                         repl_has_vars = 1;
3521                         if (strchr("&`'123456789+-\016\022", *GvENAME(gv)))
3522                             break;
3523                     }
3524                     else if (curop->op_type == OP_RV2CV)
3525                         break;
3526                     else if (curop->op_type == OP_RV2SV ||
3527                              curop->op_type == OP_RV2AV ||
3528                              curop->op_type == OP_RV2HV ||
3529                              curop->op_type == OP_RV2GV) {
3530                         if (lastop && lastop->op_type != OP_GV) /*funny deref?*/
3531                             break;
3532                     }
3533                     else if (curop->op_type == OP_PADSV ||
3534                              curop->op_type == OP_PADAV ||
3535                              curop->op_type == OP_PADHV ||
3536                              curop->op_type == OP_PADANY)
3537                     {
3538                         repl_has_vars = 1;
3539                     }
3540                     else if (curop->op_type == OP_PUSHRE)
3541                         NOOP; /* Okay here, dangerous in newASSIGNOP */
3542                     else
3543                         break;
3544                 }
3545                 lastop = curop;
3546             }
3547         }
3548         if (curop == repl
3549             && !(repl_has_vars
3550                  && (!PM_GETRE(pm)
3551                      || RX_EXTFLAGS(PM_GETRE(pm)) & RXf_EVAL_SEEN)))
3552         {
3553             pm->op_pmflags |= PMf_CONST;        /* const for long enough */
3554             prepend_elem(o->op_type, scalar(repl), o);
3555         }
3556         else {
3557             if (curop == repl && !PM_GETRE(pm)) { /* Has variables. */
3558                 pm->op_pmflags |= PMf_MAYBE_CONST;
3559             }
3560             NewOp(1101, rcop, 1, LOGOP);
3561             rcop->op_type = OP_SUBSTCONT;
3562             rcop->op_ppaddr = PL_ppaddr[OP_SUBSTCONT];
3563             rcop->op_first = scalar(repl);
3564             rcop->op_flags |= OPf_KIDS;
3565             rcop->op_private = 1;
3566             rcop->op_other = o;
3567
3568             /* establish postfix order */
3569             rcop->op_next = LINKLIST(repl);
3570             repl->op_next = (OP*)rcop;
3571
3572             pm->op_pmreplrootu.op_pmreplroot = scalar((OP*)rcop);
3573             assert(!(pm->op_pmflags & PMf_ONCE));
3574             pm->op_pmstashstartu.op_pmreplstart = LINKLIST(rcop);
3575             rcop->op_next = 0;
3576         }
3577     }
3578
3579     return (OP*)pm;
3580 }
3581
3582 OP *
3583 Perl_newSVOP(pTHX_ I32 type, I32 flags, SV *sv)
3584 {
3585     dVAR;
3586     SVOP *svop;
3587     NewOp(1101, svop, 1, SVOP);
3588     svop->op_type = (OPCODE)type;
3589     svop->op_ppaddr = PL_ppaddr[type];
3590     svop->op_sv = sv;
3591     svop->op_next = (OP*)svop;
3592     svop->op_flags = (U8)flags;
3593     if (PL_opargs[type] & OA_RETSCALAR)
3594         scalar((OP*)svop);
3595     if (PL_opargs[type] & OA_TARGET)
3596         svop->op_targ = pad_alloc(type, SVs_PADTMP);
3597     return CHECKOP(type, svop);
3598 }
3599
3600 #ifdef USE_ITHREADS
3601 OP *
3602 Perl_newPADOP(pTHX_ I32 type, I32 flags, SV *sv)
3603 {
3604     dVAR;
3605     PADOP *padop;
3606     NewOp(1101, padop, 1, PADOP);
3607     padop->op_type = (OPCODE)type;
3608     padop->op_ppaddr = PL_ppaddr[type];
3609     padop->op_padix = pad_alloc(type, SVs_PADTMP);
3610     SvREFCNT_dec(PAD_SVl(padop->op_padix));
3611     PAD_SETSV(padop->op_padix, sv);
3612     assert(sv);
3613     SvPADTMP_on(sv);
3614     padop->op_next = (OP*)padop;
3615     padop->op_flags = (U8)flags;
3616     if (PL_opargs[type] & OA_RETSCALAR)
3617         scalar((OP*)padop);
3618     if (PL_opargs[type] & OA_TARGET)
3619         padop->op_targ = pad_alloc(type, SVs_PADTMP);
3620     return CHECKOP(type, padop);
3621 }
3622 #endif
3623
3624 OP *
3625 Perl_newGVOP(pTHX_ I32 type, I32 flags, GV *gv)
3626 {
3627     dVAR;
3628     assert(gv);
3629 #ifdef USE_ITHREADS
3630     GvIN_PAD_on(gv);
3631     return newPADOP(type, flags, SvREFCNT_inc_simple_NN(gv));
3632 #else
3633     return newSVOP(type, flags, SvREFCNT_inc_simple_NN(gv));
3634 #endif
3635 }
3636
3637 OP *
3638 Perl_newPVOP(pTHX_ I32 type, I32 flags, char *pv)
3639 {
3640     dVAR;
3641     PVOP *pvop;
3642     NewOp(1101, pvop, 1, PVOP);
3643     pvop->op_type = (OPCODE)type;
3644     pvop->op_ppaddr = PL_ppaddr[type];
3645     pvop->op_pv = pv;
3646     pvop->op_next = (OP*)pvop;
3647     pvop->op_flags = (U8)flags;
3648     if (PL_opargs[type] & OA_RETSCALAR)
3649         scalar((OP*)pvop);
3650     if (PL_opargs[type] & OA_TARGET)
3651         pvop->op_targ = pad_alloc(type, SVs_PADTMP);
3652     return CHECKOP(type, pvop);
3653 }
3654
3655 #ifdef PERL_MAD
3656 OP*
3657 #else
3658 void
3659 #endif
3660 Perl_package(pTHX_ OP *o)
3661 {
3662     dVAR;
3663     SV *const sv = cSVOPo->op_sv;
3664 #ifdef PERL_MAD
3665     OP *pegop;
3666 #endif
3667
3668     save_hptr(&PL_curstash);
3669     save_item(PL_curstname);
3670
3671     PL_curstash = gv_stashsv(sv, GV_ADD);
3672
3673     sv_setsv(PL_curstname, sv);
3674
3675     PL_hints |= HINT_BLOCK_SCOPE;
3676     PL_parser->copline = NOLINE;
3677     PL_parser->expect = XSTATE;
3678
3679 #ifndef PERL_MAD
3680     op_free(o);
3681 #else
3682     if (!PL_madskills) {
3683         op_free(o);
3684         return NULL;
3685     }
3686
3687     pegop = newOP(OP_NULL,0);
3688     op_getmad(o,pegop,'P');
3689     return pegop;
3690 #endif
3691 }
3692
3693 #ifdef PERL_MAD
3694 OP*
3695 #else
3696 void
3697 #endif
3698 Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg)
3699 {
3700     dVAR;
3701     OP *pack;
3702     OP *imop;
3703     OP *veop;
3704 #ifdef PERL_MAD
3705     OP *pegop = newOP(OP_NULL,0);
3706 #endif
3707
3708     if (idop->op_type != OP_CONST)
3709         Perl_croak(aTHX_ "Module name must be constant");
3710
3711     if (PL_madskills)
3712         op_getmad(idop,pegop,'U');
3713
3714     veop = NULL;
3715
3716     if (version) {
3717         SV * const vesv = ((SVOP*)version)->op_sv;
3718
3719         if (PL_madskills)
3720             op_getmad(version,pegop,'V');
3721         if (!arg && !SvNIOKp(vesv)) {
3722             arg = version;
3723         }
3724         else {
3725             OP *pack;
3726             SV *meth;
3727
3728             if (version->op_type != OP_CONST || !SvNIOKp(vesv))
3729                 Perl_croak(aTHX_ "Version number must be constant number");
3730
3731             /* Make copy of idop so we don't free it twice */
3732             pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)idop)->op_sv));
3733
3734             /* Fake up a method call to VERSION */
3735             meth = newSVpvs_share("VERSION");
3736             veop = convert(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL,
3737                             append_elem(OP_LIST,
3738                                         prepend_elem(OP_LIST, pack, list(version)),
3739                                         newSVOP(OP_METHOD_NAMED, 0, meth)));
3740         }
3741     }
3742
3743     /* Fake up an import/unimport */
3744     if (arg && arg->op_type == OP_STUB) {
3745         if (PL_madskills)
3746             op_getmad(arg,pegop,'S');
3747         imop = arg;             /* no import on explicit () */
3748     }
3749     else if (SvNIOKp(((SVOP*)idop)->op_sv)) {
3750         imop = NULL;            /* use 5.0; */
3751         if (!aver)
3752             idop->op_private |= OPpCONST_NOVER;
3753     }
3754     else {
3755         SV *meth;
3756
3757         if (PL_madskills)
3758             op_getmad(arg,pegop,'A');
3759
3760         /* Make copy of idop so we don't free it twice */
3761         pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)idop)->op_sv));
3762
3763         /* Fake up a method call to import/unimport */
3764         meth = aver
3765             ? newSVpvs_share("import") : newSVpvs_share("unimport");
3766         imop = convert(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL,
3767                        append_elem(OP_LIST,
3768                                    prepend_elem(OP_LIST, pack, list(arg)),
3769                                    newSVOP(OP_METHOD_NAMED, 0, meth)));
3770     }
3771
3772     /* Fake up the BEGIN {}, which does its thing immediately. */
3773     newATTRSUB(floor,
3774         newSVOP(OP_CONST, 0, newSVpvs_share("BEGIN")),
3775         NULL,
3776         NULL,
3777         append_elem(OP_LINESEQ,
3778             append_elem(OP_LINESEQ,
3779                 newSTATEOP(0, NULL, newUNOP(OP_REQUIRE, 0, idop)),
3780                 newSTATEOP(0, NULL, veop)),
3781             newSTATEOP(0, NULL, imop) ));
3782
3783     /* The "did you use incorrect case?" warning used to be here.
3784      * The problem is that on case-insensitive filesystems one
3785      * might get false positives for "use" (and "require"):
3786      * "use Strict" or "require CARP" will work.  This causes
3787      * portability problems for the script: in case-strict
3788      * filesystems the script will stop working.
3789      *
3790      * The "incorrect case" warning checked whether "use Foo"
3791      * imported "Foo" to your namespace, but that is wrong, too:
3792      * there is no requirement nor promise in the language that
3793      * a Foo.pm should or would contain anything in package "Foo".
3794      *
3795      * There is very little Configure-wise that can be done, either:
3796      * the case-sensitivity of the build filesystem of Perl does not
3797      * help in guessing the case-sensitivity of the runtime environment.
3798      */
3799
3800     PL_hints |= HINT_BLOCK_SCOPE;
3801     PL_parser->copline = NOLINE;
3802     PL_parser->expect = XSTATE;
3803     PL_cop_seqmax++; /* Purely for B::*'s benefit */
3804
3805 #ifdef PERL_MAD
3806     if (!PL_madskills) {
3807         /* FIXME - don't allocate pegop if !PL_madskills */
3808         op_free(pegop);
3809         return NULL;
3810     }
3811     return pegop;
3812 #endif
3813 }
3814
3815 /*
3816 =head1 Embedding Functions
3817
3818 =for apidoc load_module
3819
3820 Loads the module whose name is pointed to by the string part of name.
3821 Note that the actual module name, not its filename, should be given.
3822 Eg, "Foo::Bar" instead of "Foo/Bar.pm".  flags can be any of
3823 PERL_LOADMOD_DENY, PERL_LOADMOD_NOIMPORT, or PERL_LOADMOD_IMPORT_OPS
3824 (or 0 for no flags). ver, if specified, provides version semantics
3825 similar to C<use Foo::Bar VERSION>.  The optional trailing SV*
3826 arguments can be used to specify arguments to the module's import()
3827 method, similar to C<use Foo::Bar VERSION LIST>.
3828
3829 =cut */
3830
3831 void
3832 Perl_load_module(pTHX_ U32 flags, SV *name, SV *ver, ...)
3833 {
3834     va_list args;
3835     va_start(args, ver);
3836     vload_module(flags, name, ver, &args);
3837     va_end(args);
3838 }
3839
3840 #ifdef PERL_IMPLICIT_CONTEXT
3841 void
3842 Perl_load_module_nocontext(U32 flags, SV *name, SV *ver, ...)
3843 {
3844     dTHX;
3845     va_list args;
3846     va_start(args, ver);
3847     vload_module(flags, name, ver, &args);
3848     va_end(args);
3849 }
3850 #endif
3851
3852 void
3853 Perl_vload_module(pTHX_ U32 flags, SV *name, SV *ver, va_list *args)
3854 {
3855     dVAR;
3856     OP *veop, *imop;
3857
3858     OP * const modname = newSVOP(OP_CONST, 0, name);
3859     modname->op_private |= OPpCONST_BARE;
3860     if (ver) {
3861         veop = newSVOP(OP_CONST, 0, ver);
3862     }
3863     else
3864         veop = NULL;
3865     if (flags & PERL_LOADMOD_NOIMPORT) {
3866         imop = sawparens(newNULLLIST());
3867     }
3868     else if (flags & PERL_LOADMOD_IMPORT_OPS) {
3869         imop = va_arg(*args, OP*);
3870     }
3871     else {
3872         SV *sv;
3873         imop = NULL;
3874         sv = va_arg(*args, SV*);
3875         while (sv) {
3876             imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv));
3877             sv = va_arg(*args, SV*);
3878         }
3879     }
3880
3881     /* utilize() fakes up a BEGIN { require ..; import ... }, so make sure
3882      * that it has a PL_parser to play with while doing that, and also
3883      * that it doesn't mess with any existing parser, by creating a tmp
3884      * new parser with lex_start(). This won't actually be used for much,
3885      * since pp_require() will create another parser for the real work. */
3886
3887     ENTER;
3888     SAVEVPTR(PL_curcop);
3889     lex_start(NULL, NULL, FALSE);
3890     utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0),
3891             veop, modname, imop);
3892     LEAVE;
3893 }
3894
3895 OP *
3896 Perl_dofile(pTHX_ OP *term, I32 force_builtin)
3897 {
3898     dVAR;
3899     OP *doop;
3900     GV *gv = NULL;
3901
3902     if (!force_builtin) {
3903         gv = gv_fetchpvs("do", GV_NOTQUAL, SVt_PVCV);
3904         if (!(gv && GvCVu(gv) && GvIMPORTED_CV(gv))) {
3905             GV * const * const gvp = (GV**)hv_fetchs(PL_globalstash, "do", FALSE);
3906             gv = gvp ? *gvp : NULL;
3907         }
3908     }
3909
3910     if (gv && GvCVu(gv) && GvIMPORTED_CV(gv)) {
3911         doop = ck_subr(newUNOP(OP_ENTERSUB, OPf_STACKED,
3912                                append_elem(OP_LIST, term,
3913                                            scalar(newUNOP(OP_RV2CV, 0,
3914                                                           newGVOP(OP_GV, 0, gv))))));
3915     }
3916     else {
3917         doop = newUNOP(OP_DOFILE, 0, scalar(term));
3918     }
3919     return doop;
3920 }
3921
3922 OP *
3923 Perl_newSLICEOP(pTHX_ I32 flags, OP *subscript, OP *listval)
3924 {
3925     return newBINOP(OP_LSLICE, flags,
3926             list(force_list(subscript)),
3927             list(force_list(listval)) );
3928 }
3929
3930 STATIC I32
3931 S_is_list_assignment(pTHX_ register const OP *o)
3932 {
3933     unsigned type;
3934     U8 flags;
3935
3936     if (!o)
3937         return TRUE;
3938
3939     if ((o->op_type == OP_NULL) && (o->op_flags & OPf_KIDS))
3940         o = cUNOPo->op_first;
3941
3942     flags = o->op_flags;
3943     type = o->op_type;
3944     if (type == OP_COND_EXPR) {
3945         const I32 t = is_list_assignment(cLOGOPo->op_first->op_sibling);
3946         const I32 f = is_list_assignment(cLOGOPo->op_first->op_sibling->op_sibling);
3947
3948         if (t && f)
3949             return TRUE;
3950         if (t || f)
3951             yyerror("Assignment to both a list and a scalar");
3952         return FALSE;
3953     }
3954
3955     if (type == OP_LIST &&
3956         (flags & OPf_WANT) == OPf_WANT_SCALAR &&
3957         o->op_private & OPpLVAL_INTRO)
3958         return FALSE;
3959
3960     if (type == OP_LIST || flags & OPf_PARENS ||
3961         type == OP_RV2AV || type == OP_RV2HV ||
3962         type == OP_ASLICE || type == OP_HSLICE)
3963         return TRUE;
3964
3965     if (type == OP_PADAV || type == OP_PADHV)
3966         return TRUE;
3967
3968     if (type == OP_RV2SV)
3969         return FALSE;
3970
3971     return FALSE;
3972 }
3973
3974 OP *
3975 Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
3976 {
3977     dVAR;
3978     OP *o;
3979
3980     if (optype) {
3981         if (optype == OP_ANDASSIGN || optype == OP_ORASSIGN || optype == OP_DORASSIGN) {
3982             return newLOGOP(optype, 0,
3983                 mod(scalar(left), optype),
3984                 newUNOP(OP_SASSIGN, 0, scalar(right)));
3985         }
3986         else {
3987             return newBINOP(optype, OPf_STACKED,
3988                 mod(scalar(left), optype), scalar(right));
3989         }
3990     }
3991
3992     if (is_list_assignment(left)) {
3993         static const char no_list_state[] = "Initialization of state variables"
3994             " in list context currently forbidden";
3995         OP *curop;
3996         bool maybe_common_vars = TRUE;
3997
3998         PL_modcount = 0;
3999         /* Grandfathering $[ assignment here.  Bletch.*/
4000         /* Only simple assignments like C<< ($[) = 1 >> are allowed */
4001         PL_eval_start = (left->op_type == OP_CONST) ? right : NULL;
4002         left = mod(left, OP_AASSIGN);
4003         if (PL_eval_start)
4004             PL_eval_start = 0;
4005         else if (left->op_type == OP_CONST) {
4006             /* FIXME for MAD */
4007             /* Result of assignment is always 1 (or we'd be dead already) */
4008             return newSVOP(OP_CONST, 0, newSViv(1));
4009         }
4010         curop = list(force_list(left));
4011         o = newBINOP(OP_AASSIGN, flags, list(force_list(right)), curop);
4012         o->op_private = (U8)(0 | (flags >> 8));
4013
4014         if ((left->op_type == OP_LIST
4015              || (left->op_type == OP_NULL && left->op_targ == OP_LIST)))
4016         {
4017             OP* lop = ((LISTOP*)left)->op_first;
4018             maybe_common_vars = FALSE;
4019             while (lop) {
4020                 if (lop->op_type == OP_PADSV ||
4021                     lop->op_type == OP_PADAV ||
4022                     lop->op_type == OP_PADHV ||
4023                     lop->op_type == OP_PADANY) {
4024                     if (!(lop->op_private & OPpLVAL_INTRO))
4025                         maybe_common_vars = TRUE;
4026
4027                     if (lop->op_private & OPpPAD_STATE) {
4028                         if (left->op_private & OPpLVAL_INTRO) {
4029                             /* Each variable in state($a, $b, $c) = ... */
4030                         }
4031                         else {
4032                             /* Each state variable in
4033                                (state $a, my $b, our $c, $d, undef) = ... */
4034                         }
4035                         yyerror(no_list_state);
4036                     } else {
4037                         /* Each my variable in
4038                            (state $a, my $b, our $c, $d, undef) = ... */
4039                     }
4040                 } else if (lop->op_type == OP_UNDEF ||
4041                            lop->op_type == OP_PUSHMARK) {
4042                     /* undef may be interesting in
4043                        (state $a, undef, state $c) */
4044                 } else {
4045                     /* Other ops in the list. */
4046                     maybe_common_vars = TRUE;
4047                 }
4048                 lop = lop->op_sibling;
4049             }
4050         }
4051         else if ((left->op_private & OPpLVAL_INTRO)
4052                 && (   left->op_type == OP_PADSV
4053                     || left->op_type == OP_PADAV
4054                     || left->op_type == OP_PADHV
4055                     || left->op_type == OP_PADANY))
4056         {
4057             maybe_common_vars = FALSE;
4058             if (left->op_private & OPpPAD_STATE) {
4059                 /* All single variable list context state assignments, hence
4060                    state ($a) = ...
4061                    (state $a) = ...
4062                    state @a = ...
4063                    state (@a) = ...
4064                    (state @a) = ...
4065                    state %a = ...
4066                    state (%a) = ...
4067                    (state %a) = ...
4068                 */
4069                 yyerror(no_list_state);
4070             }
4071         }
4072
4073         /* PL_generation sorcery:
4074          * an assignment like ($a,$b) = ($c,$d) is easier than
4075          * ($a,$b) = ($c,$a), since there is no need for temporary vars.
4076          * To detect whether there are common vars, the global var
4077          * PL_generation is incremented for each assign op we compile.
4078          * Then, while compiling the assign op, we run through all the
4079          * variables on both sides of the assignment, setting a spare slot
4080          * in each of them to PL_generation. If any of them already have
4081          * that value, we know we've got commonality.  We could use a
4082          * single bit marker, but then we'd have to make 2 passes, first
4083          * to clear the flag, then to test and set it.  To find somewhere
4084          * to store these values, evil chicanery is done with SvUVX().
4085          */
4086
4087         if (maybe_common_vars) {
4088             OP *lastop = o;
4089             PL_generation++;
4090             for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
4091                 if (PL_opargs[curop->op_type] & OA_DANGEROUS) {
4092                     if (curop->op_type == OP_GV) {
4093                         GV *gv = cGVOPx_gv(curop);
4094                         if (gv == PL_defgv
4095                             || (int)GvASSIGN_GENERATION(gv) == PL_generation)
4096                             break;
4097                         GvASSIGN_GENERATION_set(gv, PL_generation);
4098                     }
4099                     else if (curop->op_type == OP_PADSV ||
4100                              curop->op_type == OP_PADAV ||
4101                              curop->op_type == OP_PADHV ||
4102                              curop->op_type == OP_PADANY)
4103                     {
4104                         if (PAD_COMPNAME_GEN(curop->op_targ)
4105                                                     == (STRLEN)PL_generation)
4106                             break;
4107                         PAD_COMPNAME_GEN_set(curop->op_targ, PL_generation);
4108
4109                     }
4110                     else if (curop->op_type == OP_RV2CV)
4111                         break;
4112                     else if (curop->op_type == OP_RV2SV ||
4113                              curop->op_type == OP_RV2AV ||
4114                              curop->op_type == OP_RV2HV ||
4115                              curop->op_type == OP_RV2GV) {
4116                         if (lastop->op_type != OP_GV)   /* funny deref? */
4117                             break;
4118                     }
4119                     else if (curop->op_type == OP_PUSHRE) {
4120 #ifdef USE_ITHREADS
4121                         if (((PMOP*)curop)->op_pmreplrootu.op_pmtargetoff) {
4122                             GV *const gv = (GV*)PAD_SVl(((PMOP*)curop)->op_pmreplrootu.op_pmtargetoff);
4123                             if (gv == PL_defgv
4124                                 || (int)GvASSIGN_GENERATION(gv) == PL_generation)
4125                                 break;
4126                             GvASSIGN_GENERATION_set(gv, PL_generation);
4127                         }
4128 #else
4129                         GV *const gv
4130                             = ((PMOP*)curop)->op_pmreplrootu.op_pmtargetgv;
4131                         if (gv) {
4132                             if (gv == PL_defgv
4133                                 || (int)GvASSIGN_GENERATION(gv) == PL_generation)
4134                                 break;
4135                             GvASSIGN_GENERATION_set(gv, PL_generation);
4136                         }
4137 #endif
4138                     }
4139                     else
4140                         break;
4141                 }
4142                 lastop = curop;
4143             }
4144             if (curop != o)
4145                 o->op_private |= OPpASSIGN_COMMON;
4146         }
4147
4148         if (right && right->op_type == OP_SPLIT && !PL_madskills) {
4149             OP* tmpop = ((LISTOP*)right)->op_first;
4150             if (tmpop && (tmpop->op_type == OP_PUSHRE)) {
4151                 PMOP * const pm = (PMOP*)tmpop;
4152                 if (left->op_type == OP_RV2AV &&
4153                     !(left->op_private & OPpLVAL_INTRO) &&
4154                     !(o->op_private & OPpASSIGN_COMMON) )
4155                 {
4156                     tmpop = ((UNOP*)left)->op_first;
4157                     if (tmpop->op_type == OP_GV
4158 #ifdef USE_ITHREADS
4159                         && !pm->op_pmreplrootu.op_pmtargetoff
4160 #else
4161                         && !pm->op_pmreplrootu.op_pmtargetgv
4162 #endif
4163                         ) {
4164 #ifdef USE_ITHREADS
4165                         pm->op_pmreplrootu.op_pmtargetoff
4166                             = cPADOPx(tmpop)->op_padix;
4167                         cPADOPx(tmpop)->op_padix = 0;   /* steal it */
4168 #else
4169                         pm->op_pmreplrootu.op_pmtargetgv
4170                             = (GV*)cSVOPx(tmpop)->op_sv;
4171                         cSVOPx(tmpop)->op_sv = NULL;    /* steal it */
4172 #endif
4173                         pm->op_pmflags |= PMf_ONCE;
4174                         tmpop = cUNOPo->op_first;       /* to list (nulled) */
4175                         tmpop = ((UNOP*)tmpop)->op_first; /* to pushmark */
4176                         tmpop->op_sibling = NULL;       /* don't free split */
4177                         right->op_next = tmpop->op_next;  /* fix starting loc */
4178                         op_free(o);                     /* blow off assign */
4179                         right->op_flags &= ~OPf_WANT;
4180                                 /* "I don't know and I don't care." */
4181                         return right;
4182                     }
4183                 }
4184                 else {
4185                    if (PL_modcount < RETURN_UNLIMITED_NUMBER &&
4186                       ((LISTOP*)right)->op_last->op_type == OP_CONST)
4187                     {
4188                         SV *sv = ((SVOP*)((LISTOP*)right)->op_last)->op_sv;
4189                         if (SvIVX(sv) == 0)
4190                             sv_setiv(sv, PL_modcount+1);
4191                     }
4192                 }
4193             }
4194         }
4195         return o;
4196     }
4197     if (!right)
4198         right = newOP(OP_UNDEF, 0);
4199     if (right->op_type == OP_READLINE) {
4200         right->op_flags |= OPf_STACKED;
4201         return newBINOP(OP_NULL, flags, mod(scalar(left), OP_SASSIGN), scalar(right));
4202     }
4203     else {
4204         PL_eval_start = right;  /* Grandfathering $[ assignment here.  Bletch.*/
4205         o = newBINOP(OP_SASSIGN, flags,
4206             scalar(right), mod(scalar(left), OP_SASSIGN) );
4207         if (PL_eval_start)
4208             PL_eval_start = 0;
4209         else {
4210             /* FIXME for MAD */
4211             op_free(o);
4212             o = newSVOP(OP_CONST, 0, newSViv(CopARYBASE_get(&PL_compiling)));
4213             o->op_private |= OPpCONST_ARYBASE;
4214         }
4215     }
4216     return o;
4217 }
4218
4219 OP *
4220 Perl_newSTATEOP(pTHX_ I32 flags, char *label, OP *o)
4221 {
4222     dVAR;
4223     const U32 seq = intro_my();
4224     register COP *cop;
4225
4226     NewOp(1101, cop, 1, COP);
4227     if (PERLDB_LINE && CopLINE(PL_curcop) && PL_curstash != PL_debstash) {
4228         cop->op_type = OP_DBSTATE;
4229         cop->op_ppaddr = PL_ppaddr[ OP_DBSTATE ];
4230     }
4231     else {
4232         cop->op_type = OP_NEXTSTATE;
4233         cop->op_ppaddr = PL_ppaddr[ OP_NEXTSTATE ];
4234     }
4235     cop->op_flags = (U8)flags;
4236     CopHINTS_set(cop, PL_hints);
4237 #ifdef NATIVE_HINTS
4238     cop->op_private |= NATIVE_HINTS;
4239 #endif
4240     CopHINTS_set(&PL_compiling, CopHINTS_get(cop));
4241     cop->op_next = (OP*)cop;
4242
4243     if (label) {
4244         CopLABEL_set(cop, label);
4245         PL_hints |= HINT_BLOCK_SCOPE;
4246     }
4247     cop->cop_seq = seq;
4248     /* CopARYBASE is now "virtual", in that it's stored as a flag bit in
4249        CopHINTS and a possible value in cop_hints_hash, so no need to copy it.
4250     */
4251     cop->cop_warnings = DUP_WARNINGS(PL_curcop->cop_warnings);
4252     cop->cop_hints_hash = PL_curcop->cop_hints_hash;
4253     if (cop->cop_hints_hash) {
4254         HINTS_REFCNT_LOCK;
4255         cop->cop_hints_hash->refcounted_he_refcnt++;
4256         HINTS_REFCNT_UNLOCK;
4257     }
4258
4259     if (PL_parser && PL_parser->copline == NOLINE)
4260         CopLINE_set(cop, CopLINE(PL_curcop));
4261     else {
4262         CopLINE_set(cop, PL_parser->copline);
4263         if (PL_parser)
4264             PL_parser->copline = NOLINE;
4265     }
4266 #ifdef USE_ITHREADS
4267     CopFILE_set(cop, CopFILE(PL_curcop));       /* XXX share in a pvtable? */
4268 #else
4269     CopFILEGV_set(cop, CopFILEGV(PL_curcop));
4270 #endif
4271     CopSTASH_set(cop, PL_curstash);
4272
4273     if (PERLDB_LINE && PL_curstash != PL_debstash) {
4274         AV *av = CopFILEAVx(PL_curcop);
4275         if (av) {
4276             SV * const * const svp = av_fetch(av, (I32)CopLINE(cop), FALSE);
4277             if (svp && *svp != &PL_sv_undef ) {
4278                 (void)SvIOK_on(*svp);
4279                 SvIV_set(*svp, PTR2IV(cop));
4280             }
4281         }
4282     }
4283
4284     return prepend_elem(OP_LINESEQ, (OP*)cop, o);
4285 }
4286
4287
4288 OP *
4289 Perl_newLOGOP(pTHX_ I32 type, I32 flags, OP *first, OP *other)
4290 {
4291     dVAR;
4292     return new_logop(type, flags, &first, &other);
4293 }
4294
4295 STATIC OP *
4296 S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp)
4297 {
4298     dVAR;
4299     LOGOP *logop;
4300     OP *o;
4301     OP *first = *firstp;
4302     OP * const other = *otherp;
4303
4304     if (type == OP_XOR)         /* Not short circuit, but here by precedence. */
4305         return newBINOP(type, flags, scalar(first), scalar(other));
4306
4307     scalarboolean(first);
4308     /* optimize "!a && b" to "a || b", and "!a || b" to "a && b" */
4309     if (first->op_type == OP_NOT
4310         && (first->op_flags & OPf_SPECIAL)
4311         && (first->op_flags & OPf_KIDS)
4312         && !PL_madskills) {
4313         if (type == OP_AND || type == OP_OR) {
4314             if (type == OP_AND)
4315                 type = OP_OR;
4316             else
4317                 type = OP_AND;
4318             o = first;
4319             first = *firstp = cUNOPo->op_first;
4320             if (o->op_next)
4321                 first->op_next = o->op_next;
4322             cUNOPo->op_first = NULL;
4323             op_free(o);
4324         }
4325     }
4326     if (first->op_type == OP_CONST) {
4327         if (first->op_private & OPpCONST_STRICT)
4328             no_bareword_allowed(first);
4329         else if ((first->op_private & OPpCONST_BARE) && ckWARN(WARN_BAREWORD))
4330                 Perl_warner(aTHX_ packWARN(WARN_BAREWORD), "Bareword found in conditional");
4331         if ((type == OP_AND &&  SvTRUE(((SVOP*)first)->op_sv)) ||
4332             (type == OP_OR  && !SvTRUE(((SVOP*)first)->op_sv)) ||
4333             (type == OP_DOR && !SvOK(((SVOP*)first)->op_sv))) {
4334             *firstp = NULL;
4335             if (other->op_type == OP_CONST)
4336                 other->op_private |= OPpCONST_SHORTCIRCUIT;
4337             if (PL_madskills) {
4338                 OP *newop = newUNOP(OP_NULL, 0, other);
4339                 op_getmad(first, newop, '1');
4340                 newop->op_targ = type;  /* set "was" field */
4341                 return newop;
4342             }
4343             op_free(first);
4344             return other;
4345         }
4346         else {
4347             /* check for C<my $x if 0>, or C<my($x,$y) if 0> */
4348             const OP *o2 = other;
4349             if ( ! (o2->op_type == OP_LIST
4350                     && (( o2 = cUNOPx(o2)->op_first))
4351                     && o2->op_type == OP_PUSHMARK
4352                     && (( o2 = o2->op_sibling)) )
4353             )
4354                 o2 = other;
4355             if ((o2->op_type == OP_PADSV || o2->op_type == OP_PADAV
4356                         || o2->op_type == OP_PADHV)
4357                 && o2->op_private & OPpLVAL_INTRO
4358                 && !(o2->op_private & OPpPAD_STATE)
4359                 && ckWARN(WARN_DEPRECATED))
4360             {
4361                 Perl_warner(aTHX_ packWARN(WARN_DEPRECATED),
4362                             "Deprecated use of my() in false conditional");
4363             }
4364
4365             *otherp = NULL;
4366             if (first->op_type == OP_CONST)
4367                 first->op_private |= OPpCONST_SHORTCIRCUIT;
4368             if (PL_madskills) {
4369                 first = newUNOP(OP_NULL, 0, first);
4370                 op_getmad(other, first, '2');
4371                 first->op_targ = type;  /* set "was" field */
4372             }
4373             else
4374                 op_free(other);
4375             return first;
4376         }
4377     }
4378     else if ((first->op_flags & OPf_KIDS) && type != OP_DOR
4379         && ckWARN(WARN_MISC)) /* [#24076] Don't warn for <FH> err FOO. */
4380     {
4381         const OP * const k1 = ((UNOP*)first)->op_first;
4382         const OP * const k2 = k1->op_sibling;
4383         OPCODE warnop = 0;
4384         switch (first->op_type)
4385         {
4386         case OP_NULL:
4387             if (k2 && k2->op_type == OP_READLINE
4388                   && (k2->op_flags & OPf_STACKED)
4389                   && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
4390             {
4391                 warnop = k2->op_type;
4392             }
4393             break;
4394
4395         case OP_SASSIGN:
4396             if (k1->op_type == OP_READDIR
4397                   || k1->op_type == OP_GLOB
4398                   || (k1->op_type == OP_NULL && k1->op_targ == OP_GLOB)
4399                   || k1->op_type == OP_EACH)
4400             {
4401                 warnop = ((k1->op_type == OP_NULL)
4402                           ? (OPCODE)k1->op_targ : k1->op_type);
4403             }
4404             break;
4405         }
4406         if (warnop) {
4407             const line_t oldline = CopLINE(PL_curcop);
4408             CopLINE_set(PL_curcop, PL_parser->copline);
4409             Perl_warner(aTHX_ packWARN(WARN_MISC),
4410                  "Value of %s%s can be \"0\"; test with defined()",
4411                  PL_op_desc[warnop],
4412                  ((warnop == OP_READLINE || warnop == OP_GLOB)
4413                   ? " construct" : "() operator"));
4414             CopLINE_set(PL_curcop, oldline);
4415         }
4416     }
4417
4418     if (!other)
4419         return first;
4420
4421     if (type == OP_ANDASSIGN || type == OP_ORASSIGN || type == OP_DORASSIGN)
4422         other->op_private |= OPpASSIGN_BACKWARDS;  /* other is an OP_SASSIGN */
4423
4424     NewOp(1101, logop, 1, LOGOP);
4425
4426     logop->op_type = (OPCODE)type;
4427     logop->op_ppaddr = PL_ppaddr[type];
4428     logop->op_first = first;
4429     logop->op_flags = (U8)(flags | OPf_KIDS);
4430     logop->op_other = LINKLIST(other);
4431     logop->op_private = (U8)(1 | (flags >> 8));
4432
4433     /* establish postfix order */
4434     logop->op_next = LINKLIST(first);
4435     first->op_next = (OP*)logop;
4436     first->op_sibling = other;
4437
4438     CHECKOP(type,logop);
4439
4440     o = newUNOP(OP_NULL, 0, (OP*)logop);
4441     other->op_next = o;
4442
4443     return o;
4444 }
4445
4446 OP *
4447 Perl_newCONDOP(pTHX_ I32 flags, OP *first, OP *trueop, OP *falseop)
4448 {
4449     dVAR;
4450     LOGOP *logop;
4451     OP *start;
4452     OP *o;
4453
4454     if (!falseop)
4455         return newLOGOP(OP_AND, 0, first, trueop);
4456     if (!trueop)
4457         return newLOGOP(OP_OR, 0, first, falseop);
4458
4459     scalarboolean(first);
4460     if (first->op_type == OP_CONST) {
4461         /* Left or right arm of the conditional?  */
4462         const bool left = SvTRUE(((SVOP*)first)->op_sv);
4463         OP *live = left ? trueop : falseop;
4464         OP *const dead = left ? falseop : trueop;
4465         if (first->op_private & OPpCONST_BARE &&
4466             first->op_private & OPpCONST_STRICT) {
4467             no_bareword_allowed(first);
4468         }
4469         if (PL_madskills) {
4470             /* This is all dead code when PERL_MAD is not defined.  */
4471             live = newUNOP(OP_NULL, 0, live);
4472             op_getmad(first, live, 'C');
4473             op_getmad(dead, live, left ? 'e' : 't');
4474         } else {
4475             op_free(first);
4476             op_free(dead);
4477         }
4478         return live;
4479     }
4480     NewOp(1101, logop, 1, LOGOP);
4481     logop->op_type = OP_COND_EXPR;
4482     logop->op_ppaddr = PL_ppaddr[OP_COND_EXPR];
4483     logop->op_first = first;
4484     logop->op_flags = (U8)(flags | OPf_KIDS);
4485     logop->op_private = (U8)(1 | (flags >> 8));
4486     logop->op_other = LINKLIST(trueop);
4487     logop->op_next = LINKLIST(falseop);
4488
4489     CHECKOP(OP_COND_EXPR, /* that's logop->op_type */
4490             logop);
4491
4492     /* establish postfix order */
4493     start = LINKLIST(first);
4494     first->op_next = (OP*)logop;
4495
4496     first->op_sibling = trueop;
4497     trueop->op_sibling = falseop;
4498     o = newUNOP(OP_NULL, 0, (OP*)logop);
4499
4500     trueop->op_next = falseop->op_next = o;
4501
4502     o->op_next = start;
4503     return o;
4504 }
4505
4506 OP *
4507 Perl_newRANGE(pTHX_ I32 flags, OP *left, OP *right)
4508 {
4509     dVAR;
4510     LOGOP *range;
4511     OP *flip;
4512     OP *flop;
4513     OP *leftstart;
4514     OP *o;
4515
4516     NewOp(1101, range, 1, LOGOP);
4517
4518     range->op_type = OP_RANGE;
4519     range->op_ppaddr = PL_ppaddr[OP_RANGE];
4520     range->op_first = left;
4521     range->op_flags = OPf_KIDS;
4522     leftstart = LINKLIST(left);
4523     range->op_other = LINKLIST(right);
4524     range->op_private = (U8)(1 | (flags >> 8));
4525
4526     left->op_sibling = right;
4527
4528     range->op_next = (OP*)range;
4529     flip = newUNOP(OP_FLIP, flags, (OP*)range);
4530     flop = newUNOP(OP_FLOP, 0, flip);
4531     o = newUNOP(OP_NULL, 0, flop);
4532     linklist(flop);
4533     range->op_next = leftstart;
4534
4535     left->op_next = flip;
4536     right->op_next = flop;
4537
4538     range->op_targ = pad_alloc(OP_RANGE, SVs_PADMY);
4539     sv_upgrade(PAD_SV(range->op_targ), SVt_PVNV);
4540     flip->op_targ = pad_alloc(OP_RANGE, SVs_PADMY);
4541     sv_upgrade(PAD_SV(flip->op_targ), SVt_PVNV);
4542
4543     flip->op_private =  left->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
4544     flop->op_private = right->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
4545
4546     flip->op_next = o;
4547     if (!flip->op_private || !flop->op_private)
4548         linklist(o);            /* blow off optimizer unless constant */
4549
4550     return o;
4551 }
4552
4553 OP *
4554 Perl_newLOOPOP(pTHX_ I32 flags, I32 debuggable, OP *expr, OP *block)
4555 {
4556     dVAR;
4557     OP* listop;
4558     OP* o;
4559     const bool once = block && block->op_flags & OPf_SPECIAL &&
4560       (block->op_type == OP_ENTERSUB || block->op_type == OP_NULL);
4561
4562     PERL_UNUSED_ARG(debuggable);
4563
4564     if (expr) {
4565         if (once && expr->op_type == OP_CONST && !SvTRUE(((SVOP*)expr)->op_sv))
4566             return block;       /* do {} while 0 does once */
4567         if (expr->op_type == OP_READLINE || expr->op_type == OP_GLOB
4568             || (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB)) {
4569             expr = newUNOP(OP_DEFINED, 0,
4570                 newASSIGNOP(0, newDEFSVOP(), 0, expr) );
4571         } else if (expr->op_flags & OPf_KIDS) {
4572             const OP * const k1 = ((UNOP*)expr)->op_first;
4573             const OP * const k2 = k1 ? k1->op_sibling : NULL;
4574             switch (expr->op_type) {
4575               case OP_NULL:
4576                 if (k2 && k2->op_type == OP_READLINE
4577                       && (k2->op_flags & OPf_STACKED)
4578                       && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
4579                     expr = newUNOP(OP_DEFINED, 0, expr);
4580                 break;
4581
4582               case OP_SASSIGN:
4583                 if (k1 && (k1->op_type == OP_READDIR
4584                       || k1->op_type == OP_GLOB
4585                       || (k1->op_type == OP_NULL && k1->op_targ == OP_GLOB)
4586                       || k1->op_type == OP_EACH))
4587                     expr = newUNOP(OP_DEFINED, 0, expr);
4588                 break;
4589             }
4590         }
4591     }
4592
4593     /* if block is null, the next append_elem() would put UNSTACK, a scalar
4594      * op, in listop. This is wrong. [perl #27024] */
4595     if (!block)
4596         block = newOP(OP_NULL, 0);
4597     listop = append_elem(OP_LINESEQ, block, newOP(OP_UNSTACK, 0));
4598     o = new_logop(OP_AND, 0, &expr, &listop);
4599
4600     if (listop)
4601         ((LISTOP*)listop)->op_last->op_next = LINKLIST(o);
4602
4603     if (once && o != listop)
4604         o->op_next = ((LOGOP*)cUNOPo->op_first)->op_other;
4605
4606     if (o == listop)
4607         o = newUNOP(OP_NULL, 0, o);     /* or do {} while 1 loses outer block */
4608
4609     o->op_flags |= flags;
4610     o = scope(o);
4611     o->op_flags |= OPf_SPECIAL; /* suppress POPBLOCK curpm restoration*/
4612     return o;
4613 }
4614
4615 OP *
4616 Perl_newWHILEOP(pTHX_ I32 flags, I32 debuggable, LOOP *loop, I32
4617 whileline, OP *expr, OP *block, OP *cont, I32 has_my)
4618 {
4619     dVAR;
4620     OP *redo;
4621     OP *next = NULL;
4622     OP *listop;
4623     OP *o;
4624     U8 loopflags = 0;
4625
4626     PERL_UNUSED_ARG(debuggable);
4627
4628     if (expr) {
4629         if (expr->op_type == OP_READLINE || expr->op_type == OP_GLOB
4630                      || (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB)) {
4631             expr = newUNOP(OP_DEFINED, 0,
4632                 newASSIGNOP(0, newDEFSVOP(), 0, expr) );
4633         } else if (expr->op_flags & OPf_KIDS) {
4634             const OP * const k1 = ((UNOP*)expr)->op_first;
4635             const OP * const k2 = (k1) ? k1->op_sibling : NULL;
4636             switch (expr->op_type) {
4637               case OP_NULL:
4638                 if (k2 && k2->op_type == OP_READLINE
4639                       && (k2->op_flags & OPf_STACKED)
4640                       && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
4641                     expr = newUNOP(OP_DEFINED, 0, expr);
4642                 break;
4643
4644               case OP_SASSIGN:
4645                 if (k1 && (k1->op_type == OP_READDIR
4646                       || k1->op_type == OP_GLOB
4647                       || (k1->op_type == OP_NULL && k1->op_targ == OP_GLOB)
4648                       || k1->op_type == OP_EACH))
4649                     expr = newUNOP(OP_DEFINED, 0, expr);
4650                 break;
4651             }
4652         }
4653     }
4654
4655     if (!block)
4656         block = newOP(OP_NULL, 0);
4657     else if (cont || has_my) {
4658         block = scope(block);
4659     }
4660
4661     if (cont) {
4662         next = LINKLIST(cont);
4663     }
4664     if (expr) {
4665         OP * const unstack = newOP(OP_UNSTACK, 0);
4666         if (!next)
4667             next = unstack;
4668         cont = append_elem(OP_LINESEQ, cont, unstack);
4669     }
4670
4671     assert(block);
4672     listop = append_list(OP_LINESEQ, (LISTOP*)block, (LISTOP*)cont);
4673     assert(listop);
4674     redo = LINKLIST(listop);
4675
4676     if (expr) {
4677         PL_parser->copline = (line_t)whileline;
4678         scalar(listop);
4679         o = new_logop(OP_AND, 0, &expr, &listop);
4680         if (o == expr && o->op_type == OP_CONST && !SvTRUE(cSVOPo->op_sv)) {
4681             op_free(expr);              /* oops, it's a while (0) */
4682             op_free((OP*)loop);
4683             return NULL;                /* listop already freed by new_logop */
4684         }
4685         if (listop)
4686             ((LISTOP*)listop)->op_last->op_next =
4687                 (o == listop ? redo : LINKLIST(o));
4688     }
4689     else
4690         o = listop;
4691
4692     if (!loop) {
4693         NewOp(1101,loop,1,LOOP);
4694         loop->op_type = OP_ENTERLOOP;
4695         loop->op_ppaddr = PL_ppaddr[OP_ENTERLOOP];
4696         loop->op_private = 0;
4697         loop->op_next = (OP*)loop;
4698     }
4699
4700     o = newBINOP(OP_LEAVELOOP, 0, (OP*)loop, o);
4701
4702     loop->op_redoop = redo;
4703     loop->op_lastop = o;
4704     o->op_private |= loopflags;
4705
4706     if (next)
4707         loop->op_nextop = next;
4708     else
4709         loop->op_nextop = o;
4710
4711     o->op_flags |= flags;
4712     o->op_private |= (flags >> 8);
4713     return o;
4714 }
4715
4716 OP *
4717 Perl_newFOROP(pTHX_ I32 flags, char *label, line_t forline, OP *sv, OP *expr, OP *block, OP *cont)
4718 {
4719     dVAR;
4720     LOOP *loop;
4721     OP *wop;
4722     PADOFFSET padoff = 0;
4723     I32 iterflags = 0;
4724     I32 iterpflags = 0;
4725     OP *madsv = NULL;
4726
4727     if (sv) {
4728         if (sv->op_type == OP_RV2SV) {  /* symbol table variable */
4729             iterpflags = sv->op_private & OPpOUR_INTRO; /* for our $x () */
4730             sv->op_type = OP_RV2GV;
4731             sv->op_ppaddr = PL_ppaddr[OP_RV2GV];
4732
4733             /* The op_type check is needed to prevent a possible segfault
4734              * if the loop variable is undeclared and 'strict vars' is in
4735              * effect. This is illegal but is nonetheless parsed, so we
4736              * may reach this point with an OP_CONST where we're expecting
4737              * an OP_GV.
4738              */
4739             if (cUNOPx(sv)->op_first->op_type == OP_GV
4740              && cGVOPx_gv(cUNOPx(sv)->op_first) == PL_defgv)
4741                 iterpflags |= OPpITER_DEF;
4742         }
4743         else if (sv->op_type == OP_PADSV) { /* private variable */
4744             iterpflags = sv->op_private & OPpLVAL_INTRO; /* for my $x () */
4745             padoff = sv->op_targ;
4746             if (PL_madskills)
4747                 madsv = sv;
4748             else {
4749                 sv->op_targ = 0;
4750                 op_free(sv);
4751             }
4752             sv = NULL;
4753         }
4754         else
4755             Perl_croak(aTHX_ "Can't use %s for loop variable", PL_op_desc[sv->op_type]);
4756         if (padoff) {
4757             SV *const namesv = PAD_COMPNAME_SV(padoff);
4758             STRLEN len;
4759             const char *const name = SvPV_const(namesv, len);
4760
4761             if (len == 2 && name[0] == '$' && name[1] == '_')
4762                 iterpflags |= OPpITER_DEF;
4763         }
4764     }
4765     else {
4766         const PADOFFSET offset = pad_findmy("$_");
4767         if (offset == NOT_IN_PAD || PAD_COMPNAME_FLAGS_isOUR(offset)) {
4768             sv = newGVOP(OP_GV, 0, PL_defgv);
4769         }
4770         else {
4771             padoff = offset;
4772         }
4773         iterpflags |= OPpITER_DEF;
4774     }
4775     if (expr->op_type == OP_RV2AV || expr->op_type == OP_PADAV) {
4776         expr = mod(force_list(scalar(ref(expr, OP_ITER))), OP_GREPSTART);
4777         iterflags |= OPf_STACKED;
4778     }
4779     else if (expr->op_type == OP_NULL &&
4780              (expr->op_flags & OPf_KIDS) &&
4781              ((BINOP*)expr)->op_first->op_type == OP_FLOP)
4782     {
4783         /* Basically turn for($x..$y) into the same as for($x,$y), but we
4784          * set the STACKED flag to indicate that these values are to be
4785          * treated as min/max values by 'pp_iterinit'.
4786          */
4787         const UNOP* const flip = (UNOP*)((UNOP*)((BINOP*)expr)->op_first)->op_first;
4788         LOGOP* const range = (LOGOP*) flip->op_first;
4789         OP* const left  = range->op_first;
4790         OP* const right = left->op_sibling;
4791         LISTOP* listop;
4792
4793         range->op_flags &= ~OPf_KIDS;
4794         range->op_first = NULL;
4795
4796         listop = (LISTOP*)newLISTOP(OP_LIST, 0, left, right);
4797         listop->op_first->op_next = range->op_next;
4798         left->op_next = range->op_other;
4799         right->op_next = (OP*)listop;
4800         listop->op_next = listop->op_first;
4801
4802 #ifdef PERL_MAD
4803         op_getmad(expr,(OP*)listop,'O');
4804 #else
4805         op_free(expr);
4806 #endif
4807         expr = (OP*)(listop);
4808         op_null(expr);
4809         iterflags |= OPf_STACKED;
4810     }
4811     else {
4812         expr = mod(force_list(expr), OP_GREPSTART);
4813     }
4814
4815     loop = (LOOP*)list(convert(OP_ENTERITER, iterflags,
4816                                append_elem(OP_LIST, expr, scalar(sv))));
4817     assert(!loop->op_next);
4818     /* for my  $x () sets OPpLVAL_INTRO;
4819      * for our $x () sets OPpOUR_INTRO */
4820     loop->op_private = (U8)iterpflags;
4821 #ifdef PL_OP_SLAB_ALLOC
4822     {
4823         LOOP *tmp;
4824         NewOp(1234,tmp,1,LOOP);
4825         Copy(loop,tmp,1,LISTOP);
4826         S_op_destroy(aTHX_ (OP*)loop);
4827         loop = tmp;
4828     }
4829 #else
4830     loop = (LOOP*)PerlMemShared_realloc(loop, sizeof(LOOP));
4831 #endif
4832     loop->op_targ = padoff;
4833     wop = newWHILEOP(flags, 1, loop, forline, newOP(OP_ITER, 0), block, cont, 0);
4834     if (madsv)
4835         op_getmad(madsv, (OP*)loop, 'v');
4836     PL_parser->copline = forline;
4837     return newSTATEOP(0, label, wop);
4838 }
4839
4840 OP*
4841 Perl_newLOOPEX(pTHX_ I32 type, OP *label)
4842 {
4843     dVAR;
4844     OP *o;
4845
4846     if (type != OP_GOTO || label->op_type == OP_CONST) {
4847         /* "last()" means "last" */
4848         if (label->op_type == OP_STUB && (label->op_flags & OPf_PARENS))
4849             o = newOP(type, OPf_SPECIAL);
4850         else {
4851             o = newPVOP(type, 0, savesharedpv(label->op_type == OP_CONST
4852                                         ? SvPV_nolen_const(((SVOP*)label)->op_sv)
4853                                         : ""));
4854         }
4855 #ifdef PERL_MAD
4856         op_getmad(label,o,'L');
4857 #else
4858         op_free(label);
4859 #endif
4860     }
4861     else {
4862         /* Check whether it's going to be a goto &function */
4863         if (label->op_type == OP_ENTERSUB
4864                 && !(label->op_flags & OPf_STACKED))
4865             label = newUNOP(OP_REFGEN, 0, mod(label, OP_REFGEN));
4866         o = newUNOP(type, OPf_STACKED, label);
4867     }
4868     PL_hints |= HINT_BLOCK_SCOPE;
4869     return o;
4870 }
4871
4872 /* if the condition is a literal array or hash
4873    (or @{ ... } etc), make a reference to it.
4874  */
4875 STATIC OP *
4876 S_ref_array_or_hash(pTHX_ OP *cond)
4877 {
4878     if (cond
4879     && (cond->op_type == OP_RV2AV
4880     ||  cond->op_type == OP_PADAV
4881     ||  cond->op_type == OP_RV2HV
4882     ||  cond->op_type == OP_PADHV))
4883
4884         return newUNOP(OP_REFGEN,
4885             0, mod(cond, OP_REFGEN));
4886
4887     else
4888         return cond;
4889 }
4890
4891 /* These construct the optree fragments representing given()
4892    and when() blocks.
4893
4894    entergiven and enterwhen are LOGOPs; the op_other pointer
4895    points up to the associated leave op. We need this so we
4896    can put it in the context and make break/continue work.
4897    (Also, of course, pp_enterwhen will jump straight to
4898    op_other if the match fails.)
4899  */
4900
4901 STATIC OP *
4902 S_newGIVWHENOP(pTHX_ OP *cond, OP *block,
4903                    I32 enter_opcode, I32 leave_opcode,
4904                    PADOFFSET entertarg)
4905 {
4906     dVAR;
4907     LOGOP *enterop;
4908     OP *o;
4909
4910     NewOp(1101, enterop, 1, LOGOP);
4911     enterop->op_type = enter_opcode;
4912     enterop->op_ppaddr = PL_ppaddr[enter_opcode];
4913     enterop->op_flags =  (U8) OPf_KIDS;
4914     enterop->op_targ = ((entertarg == NOT_IN_PAD) ? 0 : entertarg);
4915     enterop->op_private = 0;
4916
4917     o = newUNOP(leave_opcode, 0, (OP *) enterop);
4918
4919     if (cond) {
4920         enterop->op_first = scalar(cond);
4921         cond->op_sibling = block;
4922
4923         o->op_next = LINKLIST(cond);
4924         cond->op_next = (OP *) enterop;
4925     }
4926     else {
4927         /* This is a default {} block */
4928         enterop->op_first = block;
4929         enterop->op_flags |= OPf_SPECIAL;
4930
4931         o->op_next = (OP *) enterop;
4932     }
4933
4934     CHECKOP(enter_opcode, enterop); /* Currently does nothing, since
4935                                        entergiven and enterwhen both
4936                                        use ck_null() */
4937
4938     enterop->op_next = LINKLIST(block);
4939     block->op_next = enterop->op_other = o;
4940
4941     return o;
4942 }
4943
4944 /* Does this look like a boolean operation? For these purposes
4945    a boolean operation is:
4946      - a subroutine call [*]
4947      - a logical connective
4948      - a comparison operator
4949      - a filetest operator, with the exception of -s -M -A -C
4950      - defined(), exists() or eof()
4951      - /$re/ or $foo =~ /$re/
4952    
4953    [*] possibly surprising
4954  */
4955 STATIC bool
4956 S_looks_like_bool(pTHX_ const OP *o)
4957 {
4958     dVAR;
4959     switch(o->op_type) {
4960         case OP_OR:
4961             return looks_like_bool(cLOGOPo->op_first);
4962
4963         case OP_AND:
4964             return (
4965                 looks_like_bool(cLOGOPo->op_first)
4966              && looks_like_bool(cLOGOPo->op_first->op_sibling));
4967
4968         case OP_NULL:
4969             return (
4970                 o->op_flags & OPf_KIDS
4971             && looks_like_bool(cUNOPo->op_first));
4972
4973         case OP_ENTERSUB:
4974
4975         case OP_NOT:    case OP_XOR:
4976         /* Note that OP_DOR is not here */
4977
4978         case OP_EQ:     case OP_NE:     case OP_LT:
4979         case OP_GT:     case OP_LE:     case OP_GE:
4980
4981         case OP_I_EQ:   case OP_I_NE:   case OP_I_LT:
4982         case OP_I_GT:   case OP_I_LE:   case OP_I_GE:
4983
4984         case OP_SEQ:    case OP_SNE:    case OP_SLT:
4985         case OP_SGT:    case OP_SLE:    case OP_SGE:
4986         
4987         case OP_SMARTMATCH:
4988         
4989         case OP_FTRREAD:  case OP_FTRWRITE: case OP_FTREXEC:
4990         case OP_FTEREAD:  case OP_FTEWRITE: case OP_FTEEXEC:
4991         case OP_FTIS:     case OP_FTEOWNED: case OP_FTROWNED:
4992         case OP_FTZERO:   case OP_FTSOCK:   case OP_FTCHR:
4993         case OP_FTBLK:    case OP_FTFILE:   case OP_FTDIR:
4994         case OP_FTPIPE:   case OP_FTLINK:   case OP_FTSUID:
4995         case OP_FTSGID:   case OP_FTSVTX:   case OP_FTTTY:
4996         case OP_FTTEXT:   case OP_FTBINARY:
4997         
4998         case OP_DEFINED: case OP_EXISTS:
4999         case OP_MATCH:   case OP_EOF:
5000
5001             return TRUE;
5002         
5003         case OP_CONST:
5004             /* Detect comparisons that have been optimized away */
5005             if (cSVOPo->op_sv == &PL_sv_yes
5006             ||  cSVOPo->op_sv == &PL_sv_no)
5007             
5008                 return TRUE;
5009                 
5010         /* FALL THROUGH */
5011         default:
5012             return FALSE;
5013     }
5014 }
5015
5016 OP *
5017 Perl_newGIVENOP(pTHX_ OP *cond, OP *block, PADOFFSET defsv_off)
5018 {
5019     dVAR;
5020     assert( cond );
5021     return newGIVWHENOP(
5022         ref_array_or_hash(cond),
5023         block,
5024         OP_ENTERGIVEN, OP_LEAVEGIVEN,
5025         defsv_off);
5026 }
5027
5028 /* If cond is null, this is a default {} block */
5029 OP *
5030 Perl_newWHENOP(pTHX_ OP *cond, OP *block)
5031 {
5032     const bool cond_llb = (!cond || looks_like_bool(cond));
5033     OP *cond_op;
5034
5035     if (cond_llb)
5036         cond_op = cond;
5037     else {
5038         cond_op = newBINOP(OP_SMARTMATCH, OPf_SPECIAL,
5039                 newDEFSVOP(),
5040                 scalar(ref_array_or_hash(cond)));
5041     }
5042     
5043     return newGIVWHENOP(
5044         cond_op,
5045         append_elem(block->op_type, block, newOP(OP_BREAK, OPf_SPECIAL)),
5046         OP_ENTERWHEN, OP_LEAVEWHEN, 0);
5047 }
5048
5049 /*
5050 =for apidoc cv_undef
5051
5052 Clear out all the active components of a CV. This can happen either
5053 by an explicit C<undef &foo>, or by the reference count going to zero.
5054 In the former case, we keep the CvOUTSIDE pointer, so that any anonymous
5055 children can still follow the full lexical scope chain.
5056
5057 =cut
5058 */
5059
5060 void
5061 Perl_cv_undef(pTHX_ CV *cv)
5062 {
5063     dVAR;
5064
5065     DEBUG_X(PerlIO_printf(Perl_debug_log,
5066           "CV undef: cv=0x%"UVxf" comppad=0x%"UVxf"\n",
5067             PTR2UV(cv), PTR2UV(PL_comppad))
5068     );
5069
5070 #ifdef USE_ITHREADS
5071     if (CvFILE(cv) && !CvISXSUB(cv)) {
5072         /* for XSUBs CvFILE point directly to static memory; __FILE__ */
5073         Safefree(CvFILE(cv));
5074     }
5075     CvFILE(cv) = NULL;
5076 #endif
5077
5078     if (!CvISXSUB(cv) && CvROOT(cv)) {
5079         if (SvTYPE(cv) == SVt_PVCV && CvDEPTH(cv))
5080             Perl_croak(aTHX_ "Can't undef active subroutine");
5081         ENTER;
5082
5083         PAD_SAVE_SETNULLPAD();
5084
5085         op_free(CvROOT(cv));
5086         CvROOT(cv) = NULL;
5087         CvSTART(cv) = NULL;
5088         LEAVE;
5089     }
5090     SvPOK_off((SV*)cv);         /* forget prototype */
5091     CvGV(cv) = NULL;
5092
5093     pad_undef(cv);
5094
5095     /* remove CvOUTSIDE unless this is an undef rather than a free */
5096     if (!SvREFCNT(cv) && CvOUTSIDE(cv)) {
5097         if (!CvWEAKOUTSIDE(cv))
5098             SvREFCNT_dec(CvOUTSIDE(cv));
5099         CvOUTSIDE(cv) = NULL;
5100     }
5101     if (CvCONST(cv)) {
5102         SvREFCNT_dec((SV*)CvXSUBANY(cv).any_ptr);
5103         CvCONST_off(cv);
5104     }
5105     if (CvISXSUB(cv) && CvXSUB(cv)) {
5106         CvXSUB(cv) = NULL;
5107     }
5108     /* delete all flags except WEAKOUTSIDE */
5109     CvFLAGS(cv) &= CVf_WEAKOUTSIDE;
5110 }
5111
5112 void
5113 Perl_cv_ckproto_len(pTHX_ const CV *cv, const GV *gv, const char *p,
5114                     const STRLEN len)
5115 {
5116     /* Can't just use a strcmp on the prototype, as CONSTSUBs "cheat" by
5117        relying on SvCUR, and doubling up the buffer to hold CvFILE().  */
5118     if (((!p != !SvPOK(cv)) /* One has prototype, one has not.  */
5119          || (p && (len != SvCUR(cv) /* Not the same length.  */
5120                    || memNE(p, SvPVX_const(cv), len))))
5121          && ckWARN_d(WARN_PROTOTYPE)) {
5122         SV* const msg = sv_newmortal();
5123         SV* name = NULL;
5124
5125         if (gv)
5126             gv_efullname3(name = sv_newmortal(), gv, NULL);
5127         sv_setpvs(msg, "Prototype mismatch:");
5128         if (name)
5129             Perl_sv_catpvf(aTHX_ msg, " sub %"SVf, SVfARG(name));
5130         if (SvPOK(cv))
5131             Perl_sv_catpvf(aTHX_ msg, " (%"SVf")", SVfARG(cv));
5132         else
5133             sv_catpvs(msg, ": none");
5134         sv_catpvs(msg, " vs ");
5135         if (p)
5136             Perl_sv_catpvf(aTHX_ msg, "(%.*s)", (int) len, p);
5137         else
5138             sv_catpvs(msg, "none");
5139         Perl_warner(aTHX_ packWARN(WARN_PROTOTYPE), "%"SVf, SVfARG(msg));
5140     }
5141 }
5142
5143 static void const_sv_xsub(pTHX_ CV* cv);
5144
5145 /*
5146
5147 =head1 Optree Manipulation Functions
5148
5149 =for apidoc cv_const_sv
5150
5151 If C<cv> is a constant sub eligible for inlining. returns the constant
5152 value returned by the sub.  Otherwise, returns NULL.
5153
5154 Constant subs can be created with C<newCONSTSUB> or as described in
5155 L<perlsub/"Constant Functions">.
5156
5157 =cut
5158 */
5159 SV *
5160 Perl_cv_const_sv(pTHX_ CV *cv)
5161 {
5162     PERL_UNUSED_CONTEXT;
5163     if (!cv)
5164         return NULL;
5165     if (!(SvTYPE(cv) == SVt_PVCV || SvTYPE(cv) == SVt_PVFM))
5166         return NULL;
5167     return CvCONST(cv) ? (SV*)CvXSUBANY(cv).any_ptr : NULL;
5168 }
5169
5170 /* op_const_sv:  examine an optree to determine whether it's in-lineable.
5171  * Can be called in 3 ways:
5172  *
5173  * !cv
5174  *      look for a single OP_CONST with attached value: return the value
5175  *
5176  * cv && CvCLONE(cv) && !CvCONST(cv)
5177  *
5178  *      examine the clone prototype, and if contains only a single
5179  *      OP_CONST referencing a pad const, or a single PADSV referencing
5180  *      an outer lexical, return a non-zero value to indicate the CV is
5181  *      a candidate for "constizing" at clone time
5182  *
5183  * cv && CvCONST(cv)
5184  *
5185  *      We have just cloned an anon prototype that was marked as a const
5186  *      candidiate. Try to grab the current value, and in the case of
5187  *      PADSV, ignore it if it has multiple references. Return the value.
5188  */
5189
5190 SV *
5191 Perl_op_const_sv(pTHX_ const OP *o, CV *cv)
5192 {
5193     dVAR;
5194     SV *sv = NULL;
5195
5196     if (PL_madskills)
5197         return NULL;
5198
5199     if (!o)
5200         return NULL;
5201
5202     if (o->op_type == OP_LINESEQ && cLISTOPo->op_first)
5203         o = cLISTOPo->op_first->op_sibling;
5204
5205     for (; o; o = o->op_next) {
5206         const OPCODE type = o->op_type;
5207
5208         if (sv && o->op_next == o)
5209             return sv;
5210         if (o->op_next != o) {
5211             if (type == OP_NEXTSTATE || type == OP_NULL || type == OP_PUSHMARK)
5212                 continue;
5213             if (type == OP_DBSTATE)
5214                 continue;
5215         }
5216         if (type == OP_LEAVESUB || type == OP_RETURN)
5217             break;
5218         if (sv)
5219             return NULL;
5220         if (type == OP_CONST && cSVOPo->op_sv)
5221             sv = cSVOPo->op_sv;
5222         else if (cv && type == OP_CONST) {
5223             sv = PAD_BASE_SV(CvPADLIST(cv), o->op_targ);
5224             if (!sv)
5225                 return NULL;
5226         }
5227         else if (cv && type == OP_PADSV) {
5228             if (CvCONST(cv)) { /* newly cloned anon */
5229                 sv = PAD_BASE_SV(CvPADLIST(cv), o->op_targ);
5230                 /* the candidate should have 1 ref from this pad and 1 ref
5231                  * from the parent */
5232                 if (!sv || SvREFCNT(sv) != 2)
5233                     return NULL;
5234                 sv = newSVsv(sv);
5235                 SvREADONLY_on(sv);
5236                 return sv;
5237             }
5238             else {
5239                 if (PAD_COMPNAME_FLAGS(o->op_targ) & SVf_FAKE)
5240                     sv = &PL_sv_undef; /* an arbitrary non-null value */
5241             }
5242         }
5243         else {
5244             return NULL;
5245         }
5246     }
5247     return sv;
5248 }
5249
5250 #ifdef PERL_MAD
5251 OP *
5252 #else
5253 void
5254 #endif
5255 Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
5256 {
5257 #if 0
5258     /* This would be the return value, but the return cannot be reached.  */
5259     OP* pegop = newOP(OP_NULL, 0);
5260 #endif
5261
5262     PERL_UNUSED_ARG(floor);
5263
5264     if (o)
5265         SAVEFREEOP(o);
5266     if (proto)
5267         SAVEFREEOP(proto);
5268     if (attrs)
5269         SAVEFREEOP(attrs);
5270     if (block)
5271         SAVEFREEOP(block);
5272     Perl_croak(aTHX_ "\"my sub\" not yet implemented");
5273 #ifdef PERL_MAD
5274     NORETURN_FUNCTION_END;
5275 #endif
5276 }
5277
5278 CV *
5279 Perl_newSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *block)
5280 {
5281     return Perl_newATTRSUB(aTHX_ floor, o, proto, NULL, block);
5282 }
5283
5284 CV *
5285 Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
5286 {
5287     dVAR;
5288     const char *aname;
5289     GV *gv;
5290     const char *ps;
5291     STRLEN ps_len;
5292     register CV *cv = NULL;
5293     SV *const_sv;
5294     /* If the subroutine has no body, no attributes, and no builtin attributes
5295        then it's just a sub declaration, and we may be able to get away with
5296        storing with a placeholder scalar in the symbol table, rather than a
5297        full GV and CV.  If anything is present then it will take a full CV to
5298        store it.  */
5299     const I32 gv_fetch_flags
5300         = (block || attrs || (CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS)
5301            || PL_madskills)
5302         ? GV_ADDMULTI : GV_ADDMULTI | GV_NOINIT;
5303     const char * const name = o ? SvPV_nolen_const(cSVOPo->op_sv) : NULL;
5304
5305     if (proto) {
5306         assert(proto->op_type == OP_CONST);
5307         ps = SvPV_const(((SVOP*)proto)->op_sv, ps_len);
5308     }
5309     else
5310         ps = NULL;
5311
5312     if (!name && PERLDB_NAMEANON && CopLINE(PL_curcop)) {
5313         SV * const sv = sv_newmortal();
5314         Perl_sv_setpvf(aTHX_ sv, "%s[%s:%"IVdf"]",
5315                        PL_curstash ? "__ANON__" : "__ANON__::__ANON__",
5316                        CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
5317         aname = SvPVX_const(sv);
5318     }
5319     else
5320         aname = NULL;
5321
5322     gv = name ? gv_fetchsv(cSVOPo->op_sv, gv_fetch_flags, SVt_PVCV)
5323         : gv_fetchpv(aname ? aname
5324                      : (PL_curstash ? "__ANON__" : "__ANON__::__ANON__"),
5325                      gv_fetch_flags, SVt_PVCV);
5326
5327     if (!PL_madskills) {
5328         if (o)
5329             SAVEFREEOP(o);
5330         if (proto)
5331             SAVEFREEOP(proto);
5332         if (attrs)
5333             SAVEFREEOP(attrs);
5334     }
5335
5336     if (SvTYPE(gv) != SVt_PVGV) {       /* Maybe prototype now, and had at
5337                                            maximum a prototype before. */
5338         if (SvTYPE(gv) > SVt_NULL) {
5339             if (!SvPOK((SV*)gv) && !(SvIOK((SV*)gv) && SvIVX((SV*)gv) == -1)
5340                 && ckWARN_d(WARN_PROTOTYPE))
5341             {
5342                 Perl_warner(aTHX_ packWARN(WARN_PROTOTYPE), "Runaway prototype");
5343             }
5344             cv_ckproto_len((CV*)gv, NULL, ps, ps_len);
5345         }
5346         if (ps)
5347             sv_setpvn((SV*)gv, ps, ps_len);
5348         else
5349             sv_setiv((SV*)gv, -1);
5350
5351         SvREFCNT_dec(PL_compcv);
5352         cv = PL_compcv = NULL;
5353         goto done;
5354     }
5355
5356     cv = (!name || GvCVGEN(gv)) ? NULL : GvCV(gv);
5357
5358 #ifdef GV_UNIQUE_CHECK
5359     if (cv && GvUNIQUE(gv) && SvREADONLY(cv)) {
5360         Perl_croak(aTHX_ "Can't define subroutine %s (GV is unique)", name);
5361     }
5362 #endif
5363
5364     if (!block || !ps || *ps || attrs
5365         || (CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS)
5366 #ifdef PERL_MAD
5367         || block->op_type == OP_NULL
5368 #endif
5369         )
5370         const_sv = NULL;
5371     else
5372         const_sv = op_const_sv(block, NULL);
5373
5374     if (cv) {
5375         const bool exists = CvROOT(cv) || CvXSUB(cv);
5376
5377 #ifdef GV_UNIQUE_CHECK
5378         if (exists && GvUNIQUE(gv)) {
5379             Perl_croak(aTHX_ "Can't redefine unique subroutine %s", name);
5380         }
5381 #endif
5382
5383         /* if the subroutine doesn't exist and wasn't pre-declared
5384          * with a prototype, assume it will be AUTOLOADed,
5385          * skipping the prototype check
5386          */
5387         if (exists || SvPOK(cv))
5388             cv_ckproto_len(cv, gv, ps, ps_len);
5389         /* already defined (or promised)? */
5390         if (exists || GvASSUMECV(gv)) {
5391             if ((!block
5392 #ifdef PERL_MAD
5393                  || block->op_type == OP_NULL
5394 #endif
5395                  )&& !attrs) {
5396                 if (CvFLAGS(PL_compcv)) {
5397                     /* might have had built-in attrs applied */
5398                     CvFLAGS(cv) |= (CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS);
5399                 }
5400                 /* just a "sub foo;" when &foo is already defined */
5401                 SAVEFREESV(PL_compcv);
5402                 goto done;
5403             }
5404             if (block
5405 #ifdef PERL_MAD
5406                 && block->op_type != OP_NULL
5407 #endif
5408                 ) {
5409                 if (ckWARN(WARN_REDEFINE)
5410                     || (CvCONST(cv)
5411                         && (!const_sv || sv_cmp(cv_const_sv(cv), const_sv))))
5412                 {
5413                     const line_t oldline = CopLINE(PL_curcop);
5414                     if (PL_parser && PL_parser->copline != NOLINE)
5415                         CopLINE_set(PL_curcop, PL_parser->copline);
5416                     Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
5417                         CvCONST(cv) ? "Constant subroutine %s redefined"
5418                                     : "Subroutine %s redefined", name);
5419                     CopLINE_set(PL_curcop, oldline);
5420                 }
5421 #ifdef PERL_MAD
5422                 if (!PL_minus_c)        /* keep old one around for madskills */
5423 #endif
5424                     {
5425                         /* (PL_madskills unset in used file.) */
5426                         SvREFCNT_dec(cv);
5427                     }
5428                 cv = NULL;
5429             }
5430         }
5431     }
5432     if (const_sv) {
5433         SvREFCNT_inc_simple_void_NN(const_sv);
5434         if (cv) {
5435             assert(!CvROOT(cv) && !CvCONST(cv));
5436             sv_setpvn((SV*)cv, "", 0);  /* prototype is "" */
5437             CvXSUBANY(cv).any_ptr = const_sv;
5438             CvXSUB(cv) = const_sv_xsub;
5439             CvCONST_on(cv);
5440             CvISXSUB_on(cv);
5441         }
5442         else {
5443             GvCV(gv) = NULL;
5444             cv = newCONSTSUB(NULL, name, const_sv);
5445         }
5446         mro_method_changed_in( /* sub Foo::Bar () { 123 } */
5447             (CvGV(cv) && GvSTASH(CvGV(cv)))
5448                 ? GvSTASH(CvGV(cv))
5449                 : CvSTASH(cv)
5450                     ? CvSTASH(cv)
5451                     : PL_curstash
5452         );
5453         if (PL_madskills)
5454             goto install_block;
5455         op_free(block);
5456         SvREFCNT_dec(PL_compcv);
5457         PL_compcv = NULL;
5458         goto done;
5459     }
5460     if (attrs) {
5461         HV *stash;
5462         SV *rcv;
5463
5464         /* Need to do a C<use attributes $stash_of_cv,\&cv,@attrs>
5465          * before we clobber PL_compcv.
5466          */
5467         if (cv && (!block
5468 #ifdef PERL_MAD
5469                     || block->op_type == OP_NULL
5470 #endif
5471                     )) {
5472             rcv = (SV*)cv;
5473             /* Might have had built-in attributes applied -- propagate them. */
5474             CvFLAGS(cv) |= (CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS);
5475             if (CvGV(cv) && GvSTASH(CvGV(cv)))
5476                 stash = GvSTASH(CvGV(cv));
5477             else if (CvSTASH(cv))
5478                 stash = CvSTASH(cv);
5479             else
5480                 stash = PL_curstash;
5481         }
5482         else {
5483             /* possibly about to re-define existing subr -- ignore old cv */
5484             rcv = (SV*)PL_compcv;
5485             if (name && GvSTASH(gv))
5486                 stash = GvSTASH(gv);
5487             else
5488                 stash = PL_curstash;
5489         }
5490         apply_attrs(stash, rcv, attrs, FALSE);
5491     }
5492     if (cv) {                           /* must reuse cv if autoloaded */
5493         if (
5494 #ifdef PERL_MAD
5495             (
5496 #endif
5497              !block
5498 #ifdef PERL_MAD
5499              || block->op_type == OP_NULL) && !PL_madskills
5500 #endif
5501              ) {
5502             /* got here with just attrs -- work done, so bug out */
5503             SAVEFREESV(PL_compcv);
5504             goto done;
5505         }
5506         /* transfer PL_compcv to cv */
5507         cv_undef(cv);
5508         CvFLAGS(cv) = CvFLAGS(PL_compcv);
5509         if (!CvWEAKOUTSIDE(cv))
5510             SvREFCNT_dec(CvOUTSIDE(cv));
5511         CvOUTSIDE(cv) = CvOUTSIDE(PL_compcv);
5512         CvOUTSIDE_SEQ(cv) = CvOUTSIDE_SEQ(PL_compcv);
5513         CvOUTSIDE(PL_compcv) = 0;
5514         CvPADLIST(cv) = CvPADLIST(PL_compcv);
5515         CvPADLIST(PL_compcv) = 0;
5516         /* inner references to PL_compcv must be fixed up ... */
5517         pad_fixup_inner_anons(CvPADLIST(cv), PL_compcv, cv);
5518         /* ... before we throw it away */
5519         SvREFCNT_dec(PL_compcv);
5520         PL_compcv = cv;
5521         if (PERLDB_INTER)/* Advice debugger on the new sub. */
5522           ++PL_sub_generation;
5523     }
5524     else {
5525         cv = PL_compcv;
5526         if (name) {
5527             GvCV(gv) = cv;
5528             if (PL_madskills) {
5529                 if (strEQ(name, "import")) {
5530                     PL_formfeed = (SV*)cv;
5531                     Perl_warner(aTHX_ packWARN(WARN_VOID), "%lx\n", (long)cv);
5532                 }
5533             }
5534             GvCVGEN(gv) = 0;
5535             mro_method_changed_in(GvSTASH(gv)); /* sub Foo::bar { (shift)+1 } */
5536         }
5537     }
5538     CvGV(cv) = gv;
5539     CvFILE_set_from_cop(cv, PL_curcop);
5540     CvSTASH(cv) = PL_curstash;
5541
5542     if (ps)
5543         sv_setpvn((SV*)cv, ps, ps_len);
5544
5545     if (PL_parser && PL_parser->error_count) {
5546         op_free(block);
5547         block = NULL;
5548         if (name) {
5549             const char *s = strrchr(name, ':');
5550             s = s ? s+1 : name;
5551             if (strEQ(s, "BEGIN")) {
5552                 const char not_safe[] =
5553                     "BEGIN not safe after errors--compilation aborted";
5554                 if (PL_in_eval & EVAL_KEEPERR)
5555                     Perl_croak(aTHX_ not_safe);
5556                 else {
5557                     /* force display of errors found but not reported */
5558                     sv_catpv(ERRSV, not_safe);
5559                     Perl_croak(aTHX_ "%"SVf, SVfARG(ERRSV));
5560                 }
5561             }
5562         }
5563     }
5564  install_block:
5565     if (!block)
5566         goto done;
5567
5568     if (CvLVALUE(cv)) {
5569         CvROOT(cv) = newUNOP(OP_LEAVESUBLV, 0,
5570                              mod(scalarseq(block), OP_LEAVESUBLV));
5571         block->op_attached = 1;
5572     }
5573     else {
5574         /* This makes sub {}; work as expected.  */
5575         if (block->op_type == OP_STUB) {
5576             OP* const newblock = newSTATEOP(0, NULL, 0);
5577 #ifdef PERL_MAD
5578             op_getmad(block,newblock,'B');
5579 #else
5580             op_free(block);
5581 #endif
5582             block = newblock;
5583         }
5584         else
5585             block->op_attached = 1;
5586         CvROOT(cv) = newUNOP(OP_LEAVESUB, 0, scalarseq(block));
5587     }
5588     CvROOT(cv)->op_private |= OPpREFCOUNTED;
5589     OpREFCNT_set(CvROOT(cv), 1);
5590     CvSTART(cv) = LINKLIST(CvROOT(cv));
5591     CvROOT(cv)->op_next = 0;
5592     CALL_PEEP(CvSTART(cv));
5593
5594     /* now that optimizer has done its work, adjust pad values */
5595
5596     pad_tidy(CvCLONE(cv) ? padtidy_SUBCLONE : padtidy_SUB);
5597
5598     if (CvCLONE(cv)) {
5599         assert(!CvCONST(cv));
5600         if (ps && !*ps && op_const_sv(block, cv))
5601             CvCONST_on(cv);
5602     }
5603
5604     if (name || aname) {
5605         if (PERLDB_SUBLINE && PL_curstash != PL_debstash) {
5606             SV * const sv = newSV(0);
5607             SV * const tmpstr = sv_newmortal();
5608             GV * const db_postponed = gv_fetchpvs("DB::postponed",
5609                                                   GV_ADDMULTI, SVt_PVHV);
5610             HV *hv;
5611
5612             Perl_sv_setpvf(aTHX_ sv, "%s:%ld-%ld",
5613                            CopFILE(PL_curcop),
5614                            (long)PL_subline, (long)CopLINE(PL_curcop));
5615             gv_efullname3(tmpstr, gv, NULL);
5616             (void)hv_store(GvHV(PL_DBsub), SvPVX_const(tmpstr),
5617                     SvCUR(tmpstr), sv, 0);
5618             hv = GvHVn(db_postponed);
5619             if (HvFILL(hv) > 0 && hv_exists(hv, SvPVX_const(tmpstr), SvCUR(tmpstr))) {
5620                 CV * const pcv = GvCV(db_postponed);
5621                 if (pcv) {
5622                     dSP;
5623                     PUSHMARK(SP);
5624                     XPUSHs(tmpstr);
5625                     PUTBACK;
5626                     call_sv((SV*)pcv, G_DISCARD);
5627                 }
5628             }
5629         }
5630
5631         if (name && ! (PL_parser && PL_parser->error_count))
5632             process_special_blocks(name, gv, cv);
5633     }
5634
5635   done:
5636     if (PL_parser)
5637         PL_parser->copline = NOLINE;
5638     LEAVE_SCOPE(floor);
5639     return cv;
5640 }
5641
5642 STATIC void
5643 S_process_special_blocks(pTHX_ const char *const fullname, GV *const gv,
5644                          CV *const cv)
5645 {
5646     const char *const colon = strrchr(fullname,':');
5647     const char *const name = colon ? colon + 1 : fullname;
5648
5649     if (*name == 'B') {
5650         if (strEQ(name, "BEGIN")) {
5651             const I32 oldscope = PL_scopestack_ix;
5652             ENTER;
5653             SAVECOPFILE(&PL_compiling);
5654             SAVECOPLINE(&PL_compiling);
5655
5656             DEBUG_x( dump_sub(gv) );
5657             Perl_av_create_and_push(aTHX_ &PL_beginav, (SV*)cv);
5658             GvCV(gv) = 0;               /* cv has been hijacked */
5659             call_list(oldscope, PL_beginav);
5660
5661             PL_curcop = &PL_compiling;
5662             CopHINTS_set(&PL_compiling, PL_hints);
5663             LEAVE;
5664         }
5665         else
5666             return;
5667     } else {
5668         if (*name == 'E') {
5669             if strEQ(name, "END") {
5670                 DEBUG_x( dump_sub(gv) );
5671                 Perl_av_create_and_unshift_one(aTHX_ &PL_endav, (SV*)cv);
5672             } else
5673                 return;
5674         } else if (*name == 'U') {
5675             if (strEQ(name, "UNITCHECK")) {
5676                 /* It's never too late to run a unitcheck block */
5677                 Perl_av_create_and_unshift_one(aTHX_ &PL_unitcheckav, (SV*)cv);
5678             }
5679             else
5680                 return;
5681         } else if (*name == 'C') {
5682             if (strEQ(name, "CHECK")) {
5683                 if (PL_main_start && ckWARN(WARN_VOID))
5684                     Perl_warner(aTHX_ packWARN(WARN_VOID),
5685                                 "Too late to run CHECK block");
5686                 Perl_av_create_and_unshift_one(aTHX_ &PL_checkav, (SV*)cv);
5687             }
5688             else
5689                 return;
5690         } else if (*name == 'I') {
5691             if (strEQ(name, "INIT")) {
5692                 if (PL_main_start && ckWARN(WARN_VOID))
5693                     Perl_warner(aTHX_ packWARN(WARN_VOID),
5694                                 "Too late to run INIT block");
5695                 Perl_av_create_and_push(aTHX_ &PL_initav, (SV*)cv);
5696             }
5697             else
5698                 return;
5699         } else
5700             return;
5701         DEBUG_x( dump_sub(gv) );
5702         GvCV(gv) = 0;           /* cv has been hijacked */
5703     }
5704 }
5705
5706 /*
5707 =for apidoc newCONSTSUB
5708
5709 Creates a constant sub equivalent to Perl C<sub FOO () { 123 }> which is
5710 eligible for inlining at compile-time.
5711
5712 =cut
5713 */
5714
5715 CV *
5716 Perl_newCONSTSUB(pTHX_ HV *stash, const char *name, SV *sv)
5717 {
5718     dVAR;
5719     CV* cv;
5720 #ifdef USE_ITHREADS
5721     const char *const temp_p = CopFILE(PL_curcop);
5722     const STRLEN len = temp_p ? strlen(temp_p) : 0;
5723 #else
5724     SV *const temp_sv = CopFILESV(PL_curcop);
5725     STRLEN len;
5726     const char *const temp_p = temp_sv ? SvPV_const(temp_sv, len) : NULL;
5727 #endif
5728     char *const file = savepvn(temp_p, temp_p ? len : 0);
5729
5730     ENTER;
5731
5732     if (IN_PERL_RUNTIME) {
5733         /* at runtime, it's not safe to manipulate PL_curcop: it may be
5734          * an op shared between threads. Use a non-shared COP for our
5735          * dirty work */
5736          SAVEVPTR(PL_curcop);
5737          PL_curcop = &PL_compiling;
5738     }
5739     SAVECOPLINE(PL_curcop);
5740     CopLINE_set(PL_curcop, PL_parser ? PL_parser->copline : NOLINE);
5741
5742     SAVEHINTS();
5743     PL_hints &= ~HINT_BLOCK_SCOPE;
5744
5745     if (stash) {
5746         SAVESPTR(PL_curstash);
5747         SAVECOPSTASH(PL_curcop);
5748         PL_curstash = stash;
5749         CopSTASH_set(PL_curcop,stash);
5750     }
5751
5752     /* file becomes the CvFILE. For an XS, it's supposed to be static storage,
5753        and so doesn't get free()d.  (It's expected to be from the C pre-
5754        processor __FILE__ directive). But we need a dynamically allocated one,
5755        and we need it to get freed.  */
5756     cv = newXS_flags(name, const_sv_xsub, file, "", XS_DYNAMIC_FILENAME);
5757     CvXSUBANY(cv).any_ptr = sv;
5758     CvCONST_on(cv);
5759     Safefree(file);
5760
5761 #ifdef USE_ITHREADS
5762     if (stash)
5763         CopSTASH_free(PL_curcop);
5764 #endif
5765     LEAVE;
5766
5767     return cv;
5768 }
5769
5770 CV *
5771 Perl_newXS_flags(pTHX_ const char *name, XSUBADDR_t subaddr,
5772                  const char *const filename, const char *const proto,
5773                  U32 flags)
5774 {
5775     CV *cv = newXS(name, subaddr, filename);
5776
5777     if (flags & XS_DYNAMIC_FILENAME) {
5778         /* We need to "make arrangements" (ie cheat) to ensure that the
5779            filename lasts as long as the PVCV we just created, but also doesn't
5780            leak  */
5781         STRLEN filename_len = strlen(filename);
5782         STRLEN proto_and_file_len = filename_len;
5783         char *proto_and_file;
5784         STRLEN proto_len;
5785
5786         if (proto) {
5787             proto_len = strlen(proto);
5788             proto_and_file_len += proto_len;
5789
5790             Newx(proto_and_file, proto_and_file_len + 1, char);
5791             Copy(proto, proto_and_file, proto_len, char);
5792             Copy(filename, proto_and_file + proto_len, filename_len + 1, char);
5793         } else {
5794             proto_len = 0;
5795             proto_and_file = savepvn(filename, filename_len);
5796         }
5797
5798         /* This gets free()d.  :-)  */
5799         sv_usepvn_flags((SV*)cv, proto_and_file, proto_and_file_len,
5800                         SV_HAS_TRAILING_NUL);
5801         if (proto) {
5802             /* This gives us the correct prototype, rather than one with the
5803                file name appended.  */
5804             SvCUR_set(cv, proto_len);
5805         } else {
5806             SvPOK_off(cv);
5807         }
5808         CvFILE(cv) = proto_and_file + proto_len;
5809     } else {
5810         sv_setpv((SV *)cv, proto);
5811     }
5812     return cv;
5813 }
5814
5815 /*
5816 =for apidoc U||newXS
5817
5818 Used by C<xsubpp> to hook up XSUBs as Perl subs.  I<filename> needs to be
5819 static storage, as it is used directly as CvFILE(), without a copy being made.
5820
5821 =cut
5822 */
5823
5824 CV *
5825 Perl_newXS(pTHX_ const char *name, XSUBADDR_t subaddr, const char *filename)
5826 {
5827     dVAR;
5828     GV * const gv = gv_fetchpv(name ? name :
5829                         (PL_curstash ? "__ANON__" : "__ANON__::__ANON__"),
5830                         GV_ADDMULTI, SVt_PVCV);
5831     register CV *cv;
5832
5833     if (!subaddr)
5834         Perl_croak(aTHX_ "panic: no address for '%s' in '%s'", name, filename);
5835
5836     if ((cv = (name ? GvCV(gv) : NULL))) {
5837         if (GvCVGEN(gv)) {
5838             /* just a cached method */
5839             SvREFCNT_dec(cv);
5840             cv = NULL;
5841         }
5842         else if (CvROOT(cv) || CvXSUB(cv) || GvASSUMECV(gv)) {
5843             /* already defined (or promised) */
5844             /* XXX It's possible for this HvNAME_get to return null, and get passed into strEQ */
5845             if (ckWARN(WARN_REDEFINE)) {
5846                 GV * const gvcv = CvGV(cv);
5847                 if (gvcv) {
5848                     HV * const stash = GvSTASH(gvcv);
5849                     if (stash) {
5850                         const char *redefined_name = HvNAME_get(stash);
5851                         if ( strEQ(redefined_name,"autouse") ) {
5852                             const line_t oldline = CopLINE(PL_curcop);
5853                             if (PL_parser && PL_parser->copline != NOLINE)
5854                                 CopLINE_set(PL_curcop, PL_parser->copline);
5855                             Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
5856                                         CvCONST(cv) ? "Constant subroutine %s redefined"
5857                                                     : "Subroutine %s redefined"
5858                                         ,name);
5859                             CopLINE_set(PL_curcop, oldline);
5860                         }
5861                     }
5862                 }
5863             }
5864             SvREFCNT_dec(cv);
5865             cv = NULL;
5866         }
5867     }
5868
5869     if (cv)                             /* must reuse cv if autoloaded */
5870         cv_undef(cv);
5871     else {
5872         cv = (CV*)newSV_type(SVt_PVCV);
5873         if (name) {
5874             GvCV(gv) = cv;
5875             GvCVGEN(gv) = 0;
5876             mro_method_changed_in(GvSTASH(gv)); /* newXS */
5877         }
5878     }
5879     CvGV(cv) = gv;
5880     (void)gv_fetchfile(filename);
5881     CvFILE(cv) = (char *)filename; /* NOTE: not copied, as it is expected to be
5882                                    an external constant string */
5883     CvISXSUB_on(cv);
5884     CvXSUB(cv) = subaddr;
5885
5886     if (name)
5887         process_special_blocks(name, gv, cv);
5888     else
5889         CvANON_on(cv);
5890
5891     return cv;
5892 }
5893
5894 #ifdef PERL_MAD
5895 OP *
5896 #else
5897 void
5898 #endif
5899 Perl_newFORM(pTHX_ I32 floor, OP *o, OP *block)
5900 {
5901     dVAR;
5902     register CV *cv;
5903 #ifdef PERL_MAD
5904     OP* pegop = newOP(OP_NULL, 0);
5905 #endif
5906
5907     GV * const gv = o
5908         ? gv_fetchsv(cSVOPo->op_sv, GV_ADD, SVt_PVFM)
5909         : gv_fetchpvs("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVFM);
5910
5911 #ifdef GV_UNIQUE_CHECK
5912     if (GvUNIQUE(gv)) {
5913         Perl_croak(aTHX_ "Bad symbol for form (GV is unique)");
5914     }
5915 #endif
5916     GvMULTI_on(gv);
5917     if ((cv = GvFORM(gv))) {
5918         if (ckWARN(WARN_REDEFINE)) {
5919             const line_t oldline = CopLINE(PL_curcop);
5920             if (PL_parser && PL_parser->copline != NOLINE)
5921                 CopLINE_set(PL_curcop, PL_parser->copline);
5922             Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
5923                         o ? "Format %"SVf" redefined"
5924                         : "Format STDOUT redefined", SVfARG(cSVOPo->op_sv));
5925             CopLINE_set(PL_curcop, oldline);
5926         }
5927         SvREFCNT_dec(cv);
5928     }
5929     cv = PL_compcv;
5930     GvFORM(gv) = cv;
5931     CvGV(cv) = gv;
5932     CvFILE_set_from_cop(cv, PL_curcop);
5933
5934
5935     pad_tidy(padtidy_FORMAT);
5936     CvROOT(cv) = newUNOP(OP_LEAVEWRITE, 0, scalarseq(block));
5937     CvROOT(cv)->op_private |= OPpREFCOUNTED;
5938     OpREFCNT_set(CvROOT(cv), 1);
5939     CvSTART(cv) = LINKLIST(CvROOT(cv));
5940     CvROOT(cv)->op_next = 0;
5941     CALL_PEEP(CvSTART(cv));
5942 #ifdef PERL_MAD
5943     op_getmad(o,pegop,'n');
5944     op_getmad_weak(block, pegop, 'b');
5945 #else
5946     op_free(o);
5947 #endif
5948     if (PL_parser)
5949         PL_parser->copline = NOLINE;
5950     LEAVE_SCOPE(floor);
5951 #ifdef PERL_MAD
5952     return pegop;
5953 #endif
5954 }
5955
5956 OP *
5957 Perl_newANONLIST(pTHX_ OP *o)
5958 {
5959     return convert(OP_ANONLIST, OPf_SPECIAL, o);
5960 }
5961
5962 OP *
5963 Perl_newANONHASH(pTHX_ OP *o)
5964 {
5965     return convert(OP_ANONHASH, OPf_SPECIAL, o);
5966 }
5967
5968 OP *
5969 Perl_newANONSUB(pTHX_ I32 floor, OP *proto, OP *block)
5970 {
5971     return newANONATTRSUB(floor, proto, NULL, block);
5972 }
5973
5974 OP *
5975 Perl_newANONATTRSUB(pTHX_ I32 floor, OP *proto, OP *attrs, OP *block)
5976 {
5977     return newUNOP(OP_REFGEN, 0,
5978         newSVOP(OP_ANONCODE, 0,
5979                 (SV*)newATTRSUB(floor, 0, proto, attrs, block)));
5980 }
5981
5982 OP *
5983 Perl_oopsAV(pTHX_ OP *o)
5984 {
5985     dVAR;
5986     switch (o->op_type) {
5987     case OP_PADSV:
5988         o->op_type = OP_PADAV;
5989         o->op_ppaddr = PL_ppaddr[OP_PADAV];
5990         return ref(o, OP_RV2AV);
5991
5992     case OP_RV2SV:
5993         o->op_type = OP_RV2AV;
5994         o->op_ppaddr = PL_ppaddr[OP_RV2AV];
5995         ref(o, OP_RV2AV);
5996         break;
5997
5998     default:
5999         if (ckWARN_d(WARN_INTERNAL))
6000             Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "oops: oopsAV");
6001         break;
6002     }
6003     return o;
6004 }
6005
6006 OP *
6007 Perl_oopsHV(pTHX_ OP *o)
6008 {
6009     dVAR;
6010     switch (o->op_type) {
6011     case OP_PADSV:
6012     case OP_PADAV:
6013         o->op_type = OP_PADHV;
6014         o->op_ppaddr = PL_ppaddr[OP_PADHV];
6015         return ref(o, OP_RV2HV);
6016
6017     case OP_RV2SV:
6018     case OP_RV2AV:
6019         o->op_type = OP_RV2HV;
6020         o->op_ppaddr = PL_ppaddr[OP_RV2HV];
6021         ref(o, OP_RV2HV);
6022         break;
6023
6024     default:
6025         if (ckWARN_d(WARN_INTERNAL))
6026             Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "oops: oopsHV");
6027         break;
6028     }
6029     return o;
6030 }
6031
6032 OP *
6033 Perl_newAVREF(pTHX_ OP *o)
6034 {
6035     dVAR;
6036     if (o->op_type == OP_PADANY) {
6037         o->op_type = OP_PADAV;
6038         o->op_ppaddr = PL_ppaddr[OP_PADAV];
6039         return o;
6040     }
6041     else if ((o->op_type == OP_RV2AV || o->op_type == OP_PADAV)
6042                 && ckWARN(WARN_DEPRECATED)) {
6043         Perl_warner(aTHX_ packWARN(WARN_DEPRECATED),
6044                 "Using an array as a reference is deprecated");
6045     }
6046     return newUNOP(OP_RV2AV, 0, scalar(o));
6047 }
6048
6049 OP *
6050 Perl_newGVREF(pTHX_ I32 type, OP *o)
6051 {
6052     if (type == OP_MAPSTART || type == OP_GREPSTART || type == OP_SORT)
6053         return newUNOP(OP_NULL, 0, o);
6054     return ref(newUNOP(OP_RV2GV, OPf_REF, o), type);
6055 }
6056
6057 OP *
6058 Perl_newHVREF(pTHX_ OP *o)
6059 {
6060     dVAR;
6061     if (o->op_type == OP_PADANY) {
6062         o->op_type = OP_PADHV;
6063         o->op_ppaddr = PL_ppaddr[OP_PADHV];
6064         return o;
6065     }
6066     else if ((o->op_type == OP_RV2HV || o->op_type == OP_PADHV)
6067                 && ckWARN(WARN_DEPRECATED)) {
6068         Perl_warner(aTHX_ packWARN(WARN_DEPRECATED),
6069                 "Using a hash as a reference is deprecated");
6070     }
6071     return newUNOP(OP_RV2HV, 0, scalar(o));
6072 }
6073
6074 OP *
6075 Perl_newCVREF(pTHX_ I32 flags, OP *o)
6076 {
6077     return newUNOP(OP_RV2CV, flags, scalar(o));
6078 }
6079
6080 OP *
6081 Perl_newSVREF(pTHX_ OP *o)
6082 {
6083     dVAR;
6084     if (o->op_type == OP_PADANY) {
6085         o->op_type = OP_PADSV;
6086         o->op_ppaddr = PL_ppaddr[OP_PADSV];
6087         return o;
6088     }
6089     return newUNOP(OP_RV2SV, 0, scalar(o));
6090 }
6091
6092 /* Check routines. See the comments at the top of this file for details
6093  * on when these are called */
6094
6095 OP *
6096 Perl_ck_anoncode(pTHX_ OP *o)
6097 {
6098     cSVOPo->op_targ = pad_add_anon(cSVOPo->op_sv, o->op_type);
6099     if (!PL_madskills)
6100         cSVOPo->op_sv = NULL;
6101     return o;
6102 }
6103
6104 OP *
6105 Perl_ck_bitop(pTHX_ OP *o)
6106 {
6107     dVAR;
6108 #define OP_IS_NUMCOMPARE(op) \
6109         ((op) == OP_LT   || (op) == OP_I_LT || \
6110          (op) == OP_GT   || (op) == OP_I_GT || \
6111          (op) == OP_LE   || (op) == OP_I_LE || \
6112          (op) == OP_GE   || (op) == OP_I_GE || \
6113          (op) == OP_EQ   || (op) == OP_I_EQ || \
6114          (op) == OP_NE   || (op) == OP_I_NE || \
6115          (op) == OP_NCMP || (op) == OP_I_NCMP)
6116     o->op_private = (U8)(PL_hints & HINT_INTEGER);
6117     if (!(o->op_flags & OPf_STACKED) /* Not an assignment */
6118             && (o->op_type == OP_BIT_OR
6119              || o->op_type == OP_BIT_AND
6120              || o->op_type == OP_BIT_XOR))
6121     {
6122         const OP * const left = cBINOPo->op_first;
6123         const OP * const right = left->op_sibling;
6124         if ((OP_IS_NUMCOMPARE(left->op_type) &&
6125                 (left->op_flags & OPf_PARENS) == 0) ||
6126             (OP_IS_NUMCOMPARE(right->op_type) &&
6127                 (right->op_flags & OPf_PARENS) == 0))
6128             if (ckWARN(WARN_PRECEDENCE))
6129                 Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
6130                         "Possible precedence problem on bitwise %c operator",
6131                         o->op_type == OP_BIT_OR ? '|'
6132                             : o->op_type == OP_BIT_AND ? '&' : '^'
6133                         );
6134     }
6135     return o;
6136 }
6137
6138 OP *
6139 Perl_ck_concat(pTHX_ OP *o)
6140 {
6141     const OP * const kid = cUNOPo->op_first;
6142     PERL_UNUSED_CONTEXT;
6143     if (kid->op_type == OP_CONCAT && !(kid->op_private & OPpTARGET_MY) &&
6144             !(kUNOP->op_first->op_flags & OPf_MOD))
6145         o->op_flags |= OPf_STACKED;
6146     return o;
6147 }
6148
6149 OP *
6150 Perl_ck_spair(pTHX_ OP *o)
6151 {
6152     dVAR;
6153     if (o->op_flags & OPf_KIDS) {
6154         OP* newop;
6155         OP* kid;
6156         const OPCODE type = o->op_type;
6157         o = modkids(ck_fun(o), type);
6158         kid = cUNOPo->op_first;
6159         newop = kUNOP->op_first->op_sibling;
6160         if (newop) {
6161             const OPCODE type = newop->op_type;
6162             if (newop->op_sibling || !(PL_opargs[type] & OA_RETSCALAR) ||
6163                     type == OP_PADAV || type == OP_PADHV ||
6164                     type == OP_RV2AV || type == OP_RV2HV)
6165                 return o;
6166         }
6167 #ifdef PERL_MAD
6168         op_getmad(kUNOP->op_first,newop,'K');
6169 #else
6170         op_free(kUNOP->op_first);
6171 #endif
6172         kUNOP->op_first = newop;
6173     }
6174     o->op_ppaddr = PL_ppaddr[++o->op_type];
6175     return ck_fun(o);
6176 }
6177
6178 OP *
6179 Perl_ck_delete(pTHX_ OP *o)
6180 {
6181     o = ck_fun(o);
6182     o->op_private = 0;
6183     if (o->op_flags & OPf_KIDS) {
6184         OP * const kid = cUNOPo->op_first;
6185         switch (kid->op_type) {
6186         case OP_ASLICE:
6187             o->op_flags |= OPf_SPECIAL;
6188             /* FALL THROUGH */
6189         case OP_HSLICE:
6190             o->op_private |= OPpSLICE;
6191             break;
6192         case OP_AELEM:
6193             o->op_flags |= OPf_SPECIAL;
6194             /* FALL THROUGH */
6195         case OP_HELEM:
6196             break;
6197         default:
6198             Perl_croak(aTHX_ "%s argument is not a HASH or ARRAY element or slice",
6199                   OP_DESC(o));
6200         }
6201         op_null(kid);
6202     }
6203     return o;
6204 }
6205
6206 OP *
6207 Perl_ck_die(pTHX_ OP *o)
6208 {
6209 #ifdef VMS
6210     if (VMSISH_HUSHED) o->op_private |= OPpHUSH_VMSISH;
6211 #endif
6212     return ck_fun(o);
6213 }
6214
6215 OP *
6216 Perl_ck_eof(pTHX_ OP *o)
6217 {
6218     dVAR;
6219
6220     if (o->op_flags & OPf_KIDS) {
6221         if (cLISTOPo->op_first->op_type == OP_STUB) {
6222             OP * const newop
6223                 = newUNOP(o->op_type, OPf_SPECIAL, newGVOP(OP_GV, 0, PL_argvgv));
6224 #ifdef PERL_MAD
6225             op_getmad(o,newop,'O');
6226 #else
6227             op_free(o);
6228 #endif
6229             o = newop;
6230         }
6231         return ck_fun(o);
6232     }
6233     return o;
6234 }
6235
6236 OP *
6237 Perl_ck_eval(pTHX_ OP *o)
6238 {
6239     dVAR;
6240     PL_hints |= HINT_BLOCK_SCOPE;
6241     if (o->op_flags & OPf_KIDS) {
6242         SVOP * const kid = (SVOP*)cUNOPo->op_first;
6243
6244         if (!kid) {
6245             o->op_flags &= ~OPf_KIDS;
6246             op_null(o);
6247         }
6248         else if (kid->op_type == OP_LINESEQ || kid->op_type == OP_STUB) {
6249             LOGOP *enter;
6250 #ifdef PERL_MAD
6251             OP* const oldo = o;
6252 #endif
6253
6254             cUNOPo->op_first = 0;
6255 #ifndef PERL_MAD
6256             op_free(o);
6257 #endif
6258
6259             NewOp(1101, enter, 1, LOGOP);
6260             enter->op_type = OP_ENTERTRY;
6261             enter->op_ppaddr = PL_ppaddr[OP_ENTERTRY];
6262             enter->op_private = 0;
6263
6264             /* establish postfix order */
6265             enter->op_next = (OP*)enter;
6266
6267             o = prepend_elem(OP_LINESEQ, (OP*)enter, (OP*)kid);
6268             o->op_type = OP_LEAVETRY;
6269             o->op_ppaddr = PL_ppaddr[OP_LEAVETRY];
6270             enter->op_other = o;
6271             op_getmad(oldo,o,'O');
6272             return o;
6273         }
6274         else {
6275             scalar((OP*)kid);
6276             PL_cv_has_eval = 1;
6277         }
6278     }
6279     else {
6280 #ifdef PERL_MAD
6281         OP* const oldo = o;
6282 #else
6283         op_free(o);
6284 #endif
6285         o = newUNOP(OP_ENTEREVAL, 0, newDEFSVOP());
6286         op_getmad(oldo,o,'O');
6287     }
6288     o->op_targ = (PADOFFSET)PL_hints;
6289     if ((PL_hints & HINT_LOCALIZE_HH) != 0 && GvHV(PL_hintgv)) {
6290         /* Store a copy of %^H that pp_entereval can pick up.
6291            OPf_SPECIAL flags the opcode as being for this purpose,
6292            so that it in turn will return a copy at every
6293            eval.*/
6294         OP *hhop = newSVOP(OP_CONST, OPf_SPECIAL,
6295                            (SV*)Perl_hv_copy_hints_hv(aTHX_ GvHV(PL_hintgv)));
6296         cUNOPo->op_first->op_sibling = hhop;
6297         o->op_private |= OPpEVAL_HAS_HH;
6298     }
6299     return o;
6300 }
6301
6302 OP *
6303 Perl_ck_exit(pTHX_ OP *o)
6304 {
6305 #ifdef VMS
6306     HV * const table = GvHV(PL_hintgv);
6307     if (table) {
6308        SV * const * const svp = hv_fetchs(table, "vmsish_exit", FALSE);
6309        if (svp && *svp && SvTRUE(*svp))
6310            o->op_private |= OPpEXIT_VMSISH;
6311     }
6312     if (VMSISH_HUSHED) o->op_private |= OPpHUSH_VMSISH;
6313 #endif
6314     return ck_fun(o);
6315 }
6316
6317 OP *
6318 Perl_ck_exec(pTHX_ OP *o)
6319 {
6320     if (o->op_flags & OPf_STACKED) {
6321         OP *kid;
6322         o = ck_fun(o);
6323         kid = cUNOPo->op_first->op_sibling;
6324         if (kid->op_type == OP_RV2GV)
6325             op_null(kid);
6326     }
6327     else
6328         o = listkids(o);
6329     return o;
6330 }
6331
6332 OP *
6333 Perl_ck_exists(pTHX_ OP *o)
6334 {
6335     dVAR;
6336     o = ck_fun(o);
6337     if (o->op_flags & OPf_KIDS) {
6338         OP * const kid = cUNOPo->op_first;
6339         if (kid->op_type == OP_ENTERSUB) {
6340             (void) ref(kid, o->op_type);
6341             if (kid->op_type != OP_RV2CV
6342                         && !(PL_parser && PL_parser->error_count))
6343                 Perl_croak(aTHX_ "%s argument is not a subroutine name",
6344                             OP_DESC(o));
6345             o->op_private |= OPpEXISTS_SUB;
6346         }
6347         else if (kid->op_type == OP_AELEM)
6348             o->op_flags |= OPf_SPECIAL;
6349         else if (kid->op_type != OP_HELEM)
6350             Perl_croak(aTHX_ "%s argument is not a HASH or ARRAY element",
6351                         OP_DESC(o));
6352         op_null(kid);
6353     }
6354     return o;
6355 }
6356
6357 OP *
6358 Perl_ck_rvconst(pTHX_ register OP *o)
6359 {
6360     dVAR;
6361     SVOP * const kid = (SVOP*)cUNOPo->op_first;
6362
6363     o->op_private |= (PL_hints & HINT_STRICT_REFS);
6364     if (o->op_type == OP_RV2CV)
6365         o->op_private &= ~1;
6366
6367     if (kid->op_type == OP_CONST) {
6368         int iscv;
6369         GV *gv;
6370         SV * const kidsv = kid->op_sv;
6371
6372         /* Is it a constant from cv_const_sv()? */
6373         if (SvROK(kidsv) && SvREADONLY(kidsv)) {
6374             SV * const rsv = SvRV(kidsv);
6375             const svtype type = SvTYPE(rsv);
6376             const char *badtype = NULL;
6377
6378             switch (o->op_type) {
6379             case OP_RV2SV:
6380                 if (type > SVt_PVMG)
6381                     badtype = "a SCALAR";
6382                 break;
6383             case OP_RV2AV:
6384                 if (type != SVt_PVAV)
6385                     badtype = "an ARRAY";
6386                 break;
6387             case OP_RV2HV:
6388                 if (type != SVt_PVHV)
6389                     badtype = "a HASH";
6390                 break;
6391             case OP_RV2CV:
6392                 if (type != SVt_PVCV)
6393                     badtype = "a CODE";
6394                 break;
6395             }
6396             if (badtype)
6397                 Perl_croak(aTHX_ "Constant is not %s reference", badtype);
6398             return o;
6399         }
6400         else if ((o->op_type == OP_RV2HV || o->op_type == OP_RV2SV) &&
6401                 (PL_hints & HINT_STRICT_REFS) && SvPOK(kidsv)) {
6402             /* If this is an access to a stash, disable "strict refs", because
6403              * stashes aren't auto-vivified at compile-time (unless we store
6404              * symbols in them), and we don't want to produce a run-time
6405              * stricture error when auto-vivifying the stash. */
6406             const char *s = SvPV_nolen(kidsv);
6407             const STRLEN l = SvCUR(kidsv);
6408             if (l > 1 && s[l-1] == ':' && s[l-2] == ':')
6409                 o->op_private &= ~HINT_STRICT_REFS;
6410         }
6411         if ((o->op_private & HINT_STRICT_REFS) && (kid->op_private & OPpCONST_BARE)) {
6412             const char *badthing;
6413             switch (o->op_type) {
6414             case OP_RV2SV:
6415                 badthing = "a SCALAR";
6416                 break;
6417             case OP_RV2AV:
6418                 badthing = "an ARRAY";
6419                 break;
6420             case OP_RV2HV:
6421                 badthing = "a HASH";
6422                 break;
6423             default:
6424                 badthing = NULL;
6425                 break;
6426             }
6427             if (badthing)
6428                 Perl_croak(aTHX_
6429                            "Can't use bareword (\"%"SVf"\") as %s ref while \"strict refs\" in use",
6430                            SVfARG(kidsv), badthing);
6431         }
6432         /*
6433          * This is a little tricky.  We only want to add the symbol if we
6434          * didn't add it in the lexer.  Otherwise we get duplicate strict
6435          * warnings.  But if we didn't add it in the lexer, we must at
6436          * least pretend like we wanted to add it even if it existed before,
6437          * or we get possible typo warnings.  OPpCONST_ENTERED says
6438          * whether the lexer already added THIS instance of this symbol.
6439          */
6440         iscv = (o->op_type == OP_RV2CV) * 2;
6441         do {
6442             gv = gv_fetchsv(kidsv,
6443                 iscv | !(kid->op_private & OPpCONST_ENTERED),
6444                 iscv
6445                     ? SVt_PVCV
6446                     : o->op_type == OP_RV2SV
6447                         ? SVt_PV
6448                         : o->op_type == OP_RV2AV
6449                             ? SVt_PVAV
6450                             : o->op_type == OP_RV2HV
6451                                 ? SVt_PVHV
6452                                 : SVt_PVGV);
6453         } while (!gv && !(kid->op_private & OPpCONST_ENTERED) && !iscv++);
6454         if (gv) {
6455             kid->op_type = OP_GV;
6456             SvREFCNT_dec(kid->op_sv);
6457 #ifdef USE_ITHREADS
6458             /* XXX hack: dependence on sizeof(PADOP) <= sizeof(SVOP) */
6459             kPADOP->op_padix = pad_alloc(OP_GV, SVs_PADTMP);
6460             SvREFCNT_dec(PAD_SVl(kPADOP->op_padix));
6461             GvIN_PAD_on(gv);
6462             PAD_SETSV(kPADOP->op_padix, (SV*) SvREFCNT_inc_simple_NN(gv));
6463 #else
6464             kid->op_sv = SvREFCNT_inc_simple_NN(gv);
6465 #endif
6466             kid->op_private = 0;
6467             kid->op_ppaddr = PL_ppaddr[OP_GV];
6468         }
6469     }
6470     return o;
6471 }
6472
6473 OP *
6474 Perl_ck_ftst(pTHX_ OP *o)
6475 {
6476     dVAR;
6477     const I32 type = o->op_type;
6478
6479     if (o->op_flags & OPf_REF) {
6480         NOOP;
6481     }
6482     else if (o->op_flags & OPf_KIDS && cUNOPo->op_first->op_type != OP_STUB) {
6483         SVOP * const kid = (SVOP*)cUNOPo->op_first;
6484         const OPCODE kidtype = kid->op_type;
6485
6486         if (kidtype == OP_CONST && (kid->op_private & OPpCONST_BARE)) {
6487             OP * const newop = newGVOP(type, OPf_REF,
6488                 gv_fetchsv(kid->op_sv, GV_ADD, SVt_PVIO));
6489 #ifdef PERL_MAD
6490             op_getmad(o,newop,'O');
6491 #else
6492             op_free(o);
6493 #endif
6494             return newop;
6495         }
6496         if ((PL_hints & HINT_FILETEST_ACCESS) && OP_IS_FILETEST_ACCESS(o))
6497             o->op_private |= OPpFT_ACCESS;
6498         if (PL_check[kidtype] == MEMBER_TO_FPTR(Perl_ck_ftst)
6499                 && kidtype != OP_STAT && kidtype != OP_LSTAT)
6500             o->op_private |= OPpFT_STACKED;
6501     }
6502     else {
6503 #ifdef PERL_MAD
6504         OP* const oldo = o;
6505 #else
6506         op_free(o);
6507 #endif
6508         if (type == OP_FTTTY)
6509             o = newGVOP(type, OPf_REF, PL_stdingv);
6510         else
6511             o = newUNOP(type, 0, newDEFSVOP());
6512         op_getmad(oldo,o,'O');
6513     }
6514     return o;
6515 }
6516
6517 OP *
6518 Perl_ck_fun(pTHX_ OP *o)
6519 {
6520     dVAR;
6521     const int type = o->op_type;
6522     register I32 oa = PL_opargs[type] >> OASHIFT;
6523
6524     if (o->op_flags & OPf_STACKED) {
6525         if ((oa & OA_OPTIONAL) && (oa >> 4) && !((oa >> 4) & OA_OPTIONAL))
6526             oa &= ~OA_OPTIONAL;
6527         else
6528             return no_fh_allowed(o);
6529     }
6530
6531     if (o->op_flags & OPf_KIDS) {
6532         OP **tokid = &cLISTOPo->op_first;
6533         register OP *kid = cLISTOPo->op_first;
6534         OP *sibl;
6535         I32 numargs = 0;
6536
6537         if (kid->op_type == OP_PUSHMARK ||
6538             (kid->op_type == OP_NULL && kid->op_targ == OP_PUSHMARK))
6539         {
6540             tokid = &kid->op_sibling;
6541             kid = kid->op_sibling;
6542         }
6543         if (!kid && PL_opargs[type] & OA_DEFGV)
6544             *tokid = kid = newDEFSVOP();
6545
6546         while (oa && kid) {
6547             numargs++;
6548             sibl = kid->op_sibling;
6549 #ifdef PERL_MAD
6550             if (!sibl && kid->op_type == OP_STUB) {
6551                 numargs--;
6552                 break;
6553             }
6554 #endif
6555             switch (oa & 7) {
6556             case OA_SCALAR:
6557                 /* list seen where single (scalar) arg expected? */
6558                 if (numargs == 1 && !(oa >> 4)
6559                     && kid->op_type == OP_LIST && type != OP_SCALAR)
6560                 {
6561                     return too_many_arguments(o,PL_op_desc[type]);
6562                 }
6563                 scalar(kid);
6564                 break;
6565             case OA_LIST:
6566                 if (oa < 16) {
6567                     kid = 0;
6568                     continue;
6569                 }
6570                 else
6571                     list(kid);
6572                 break;
6573             case OA_AVREF:
6574                 if ((type == OP_PUSH || type == OP_UNSHIFT)
6575                     && !kid->op_sibling && ckWARN(WARN_SYNTAX))
6576                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
6577                         "Useless use of %s with no values",
6578                         PL_op_desc[type]);
6579
6580                 if (kid->op_type == OP_CONST &&
6581                     (kid->op_private & OPpCONST_BARE))
6582                 {
6583                     OP * const newop = newAVREF(newGVOP(OP_GV, 0,
6584                         gv_fetchsv(((SVOP*)kid)->op_sv, GV_ADD, SVt_PVAV) ));
6585                     if (ckWARN2(WARN_DEPRECATED, WARN_SYNTAX))
6586                         Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
6587                             "Array @%"SVf" missing the @ in argument %"IVdf" of %s()",
6588                             SVfARG(((SVOP*)kid)->op_sv), (IV)numargs, PL_op_desc[type]);
6589 #ifdef PERL_MAD
6590                     op_getmad(kid,newop,'K');
6591 #else
6592                     op_free(kid);
6593 #endif
6594                     kid = newop;
6595                     kid->op_sibling = sibl;
6596                     *tokid = kid;
6597                 }
6598                 else if (kid->op_type != OP_RV2AV && kid->op_type != OP_PADAV)
6599                     bad_type(numargs, "array", PL_op_desc[type], kid);
6600                 mod(kid, type);
6601                 break;
6602             case OA_HVREF:
6603                 if (kid->op_type == OP_CONST &&
6604                     (kid->op_private & OPpCONST_BARE))
6605                 {
6606                     OP * const newop = newHVREF(newGVOP(OP_GV, 0,
6607                         gv_fetchsv(((SVOP*)kid)->op_sv, GV_ADD, SVt_PVHV) ));
6608                     if (ckWARN2(WARN_DEPRECATED, WARN_SYNTAX))
6609                         Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
6610                             "Hash %%%"SVf" missing the %% in argument %"IVdf" of %s()",
6611                             SVfARG(((SVOP*)kid)->op_sv), (IV)numargs, PL_op_desc[type]);
6612 #ifdef PERL_MAD
6613                     op_getmad(kid,newop,'K');
6614 #else
6615                     op_free(kid);
6616 #endif
6617                     kid = newop;
6618                     kid->op_sibling = sibl;
6619                     *tokid = kid;
6620                 }
6621                 else if (kid->op_type != OP_RV2HV && kid->op_type != OP_PADHV)
6622                     bad_type(numargs, "hash", PL_op_desc[type], kid);
6623                 mod(kid, type);
6624                 break;
6625             case OA_CVREF:
6626                 {
6627                     OP * const newop = newUNOP(OP_NULL, 0, kid);
6628                     kid->op_sibling = 0;
6629                     linklist(kid);
6630                     newop->op_next = newop;
6631                     kid = newop;
6632                     kid->op_sibling = sibl;
6633                     *tokid = kid;
6634                 }
6635                 break;
6636             case OA_FILEREF:
6637                 if (kid->op_type != OP_GV && kid->op_type != OP_RV2GV) {
6638                     if (kid->op_type == OP_CONST &&
6639                         (kid->op_private & OPpCONST_BARE))
6640                     {
6641                         OP * const newop = newGVOP(OP_GV, 0,
6642                             gv_fetchsv(((SVOP*)kid)->op_sv, GV_ADD, SVt_PVIO));
6643                         if (!(o->op_private & 1) && /* if not unop */
6644                             kid == cLISTOPo->op_last)
6645                             cLISTOPo->op_last = newop;
6646 #ifdef PERL_MAD
6647                         op_getmad(kid,newop,'K');
6648 #else
6649                         op_free(kid);
6650 #endif
6651                         kid = newop;
6652                     }
6653                     else if (kid->op_type == OP_READLINE) {
6654                         /* neophyte patrol: open(<FH>), close(<FH>) etc. */
6655                         bad_type(numargs, "HANDLE", OP_DESC(o), kid);
6656                     }
6657                     else {
6658                         I32 flags = OPf_SPECIAL;
6659                         I32 priv = 0;
6660                         PADOFFSET targ = 0;
6661
6662                         /* is this op a FH constructor? */
6663                         if (is_handle_constructor(o,numargs)) {
6664                             const char *name = NULL;
6665                             STRLEN len = 0;
6666
6667                             flags = 0;
6668                             /* Set a flag to tell rv2gv to vivify
6669                              * need to "prove" flag does not mean something
6670                              * else already - NI-S 1999/05/07
6671                              */
6672                             priv = OPpDEREF;
6673                             if (kid->op_type == OP_PADSV) {
6674                                 SV *const namesv
6675                                     = PAD_COMPNAME_SV(kid->op_targ);
6676                                 name = SvPV_const(namesv, len);
6677                             }
6678                             else if (kid->op_type == OP_RV2SV
6679                                      && kUNOP->op_first->op_type == OP_GV)
6680                             {
6681                                 GV * const gv = cGVOPx_gv(kUNOP->op_first);
6682                                 name = GvNAME(gv);
6683                                 len = GvNAMELEN(gv);
6684                             }
6685                             else if (kid->op_type == OP_AELEM
6686                                      || kid->op_type == OP_HELEM)
6687                             {
6688                                  OP *firstop;
6689                                  OP *op = ((BINOP*)kid)->op_first;
6690                                  name = NULL;
6691                                  if (op) {
6692                                       SV *tmpstr = NULL;
6693                                       const char * const a =
6694                                            kid->op_type == OP_AELEM ?
6695                                            "[]" : "{}";
6696                                       if (((op->op_type == OP_RV2AV) ||
6697                                            (op->op_type == OP_RV2HV)) &&
6698                                           (firstop = ((UNOP*)op)->op_first) &&
6699                                           (firstop->op_type == OP_GV)) {
6700                                            /* packagevar $a[] or $h{} */
6701                                            GV * const gv = cGVOPx_gv(firstop);
6702                                            if (gv)
6703                                                 tmpstr =
6704                                                      Perl_newSVpvf(aTHX_
6705                                                                    "%s%c...%c",
6706                                                                    GvNAME(gv),
6707                                                                    a[0], a[1]);
6708                                       }
6709                                       else if (op->op_type == OP_PADAV
6710                                                || op->op_type == OP_PADHV) {
6711                                            /* lexicalvar $a[] or $h{} */
6712                                            const char * const padname =
6713                                                 PAD_COMPNAME_PV(op->op_targ);
6714                                            if (padname)
6715                                                 tmpstr =
6716                                                      Perl_newSVpvf(aTHX_
6717                                                                    "%s%c...%c",
6718                                                                    padname + 1,
6719                                                                    a[0], a[1]);
6720                                       }
6721                                       if (tmpstr) {
6722                                            name = SvPV_const(tmpstr, len);
6723                                            sv_2mortal(tmpstr);
6724                                       }
6725                                  }
6726                                  if (!name) {
6727                                       name = "__ANONIO__";
6728                                       len = 10;
6729                                  }
6730                                  mod(kid, type);
6731                             }
6732                             if (name) {
6733                                 SV *namesv;
6734                                 targ = pad_alloc(OP_RV2GV, SVs_PADTMP);
6735                                 namesv = PAD_SVl(targ);
6736                                 SvUPGRADE(namesv, SVt_PV);
6737                                 if (*name != '$')
6738                                     sv_setpvn(namesv, "$", 1);
6739                                 sv_catpvn(namesv, name, len);
6740                             }
6741                         }
6742                         kid->op_sibling = 0;
6743                         kid = newUNOP(OP_RV2GV, flags, scalar(kid));
6744                         kid->op_targ = targ;
6745                         kid->op_private |= priv;
6746                     }
6747                     kid->op_sibling = sibl;
6748                     *tokid = kid;
6749                 }
6750                 scalar(kid);
6751                 break;
6752             case OA_SCALARREF:
6753                 mod(scalar(kid), type);
6754                 break;
6755             }
6756             oa >>= 4;
6757             tokid = &kid->op_sibling;
6758             kid = kid->op_sibling;
6759         }
6760 #ifdef PERL_MAD
6761         if (kid && kid->op_type != OP_STUB)
6762             return too_many_arguments(o,OP_DESC(o));
6763         o->op_private |= numargs;
6764 #else
6765         /* FIXME - should the numargs move as for the PERL_MAD case?  */
6766         o->op_private |= numargs;
6767         if (kid)
6768             return too_many_arguments(o,OP_DESC(o));
6769 #endif
6770         listkids(o);
6771     }
6772     else if (PL_opargs[type] & OA_DEFGV) {
6773 #ifdef PERL_MAD
6774         OP *newop = newUNOP(type, 0, newDEFSVOP());
6775         op_getmad(o,newop,'O');
6776         return newop;
6777 #else
6778         /* Ordering of these two is important to keep f_map.t passing.  */
6779         op_free(o);
6780         return newUNOP(type, 0, newDEFSVOP());
6781 #endif
6782     }
6783
6784     if (oa) {
6785         while (oa & OA_OPTIONAL)
6786             oa >>= 4;
6787         if (oa && oa != OA_LIST)
6788             return too_few_arguments(o,OP_DESC(o));
6789     }
6790     return o;
6791 }
6792
6793 OP *
6794 Perl_ck_glob(pTHX_ OP *o)
6795 {
6796     dVAR;
6797     GV *gv;
6798
6799     o = ck_fun(o);
6800     if ((o->op_flags & OPf_KIDS) && !cLISTOPo->op_first->op_sibling)
6801         append_elem(OP_GLOB, o, newDEFSVOP());
6802
6803     if (!((gv = gv_fetchpvs("glob", GV_NOTQUAL, SVt_PVCV))
6804           && GvCVu(gv) && GvIMPORTED_CV(gv)))
6805     {
6806         gv = gv_fetchpvs("CORE::GLOBAL::glob", 0, SVt_PVCV);
6807     }
6808
6809 #if !defined(PERL_EXTERNAL_GLOB)
6810     /* XXX this can be tightened up and made more failsafe. */
6811     if (!(gv && GvCVu(gv) && GvIMPORTED_CV(gv))) {
6812         GV *glob_gv;
6813         ENTER;
6814         Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT,
6815                 newSVpvs("File::Glob"), NULL, NULL, NULL);
6816         gv = gv_fetchpvs("CORE::GLOBAL::glob", 0, SVt_PVCV);
6817         glob_gv = gv_fetchpvs("File::Glob::csh_glob", 0, SVt_PVCV);
6818         GvCV(gv) = GvCV(glob_gv);
6819         SvREFCNT_inc_void((SV*)GvCV(gv));
6820         GvIMPORTED_CV_on(gv);
6821         LEAVE;
6822     }
6823 #endif /* PERL_EXTERNAL_GLOB */
6824
6825     if (gv && GvCVu(gv) && GvIMPORTED_CV(gv)) {
6826         append_elem(OP_GLOB, o,
6827                     newSVOP(OP_CONST, 0, newSViv(PL_glob_index++)));
6828         o->op_type = OP_LIST;
6829         o->op_ppaddr = PL_ppaddr[OP_LIST];
6830         cLISTOPo->op_first->op_type = OP_PUSHMARK;
6831         cLISTOPo->op_first->op_ppaddr = PL_ppaddr[OP_PUSHMARK];
6832         cLISTOPo->op_first->op_targ = 0;
6833         o = newUNOP(OP_ENTERSUB, OPf_STACKED,
6834                     append_elem(OP_LIST, o,
6835                                 scalar(newUNOP(OP_RV2CV, 0,
6836                                                newGVOP(OP_GV, 0, gv)))));
6837         o = newUNOP(OP_NULL, 0, ck_subr(o));
6838         o->op_targ = OP_GLOB;           /* hint at what it used to be */
6839         return o;
6840     }
6841     gv = newGVgen("main");
6842     gv_IOadd(gv);
6843     append_elem(OP_GLOB, o, newGVOP(OP_GV, 0, gv));
6844     scalarkids(o);
6845     return o;
6846 }
6847
6848 OP *
6849 Perl_ck_grep(pTHX_ OP *o)
6850 {
6851     dVAR;
6852     LOGOP *gwop = NULL;
6853     OP *kid;
6854     const OPCODE type = o->op_type == OP_GREPSTART ? OP_GREPWHILE : OP_MAPWHILE;
6855     PADOFFSET offset;
6856
6857     o->op_ppaddr = PL_ppaddr[OP_GREPSTART];
6858     /* don't allocate gwop here, as we may leak it if PL_parser->error_count > 0 */
6859
6860     if (o->op_flags & OPf_STACKED) {
6861         OP* k;
6862         o = ck_sort(o);
6863         kid = cLISTOPo->op_first->op_sibling;
6864         if (!cUNOPx(kid)->op_next)
6865             Perl_croak(aTHX_ "panic: ck_grep");
6866         for (k = cUNOPx(kid)->op_first; k; k = k->op_next) {
6867             kid = k;
6868         }
6869         NewOp(1101, gwop, 1, LOGOP);
6870         kid->op_next = (OP*)gwop;
6871         o->op_flags &= ~OPf_STACKED;
6872     }
6873     kid = cLISTOPo->op_first->op_sibling;
6874     if (type == OP_MAPWHILE)
6875         list(kid);
6876     else
6877         scalar(kid);
6878     o = ck_fun(o);
6879     if (PL_parser && PL_parser->error_count)
6880         return o;
6881     kid = cLISTOPo->op_first->op_sibling;
6882     if (kid->op_type != OP_NULL)
6883         Perl_croak(aTHX_ "panic: ck_grep");
6884     kid = kUNOP->op_first;
6885
6886     if (!gwop)
6887         NewOp(1101, gwop, 1, LOGOP);
6888     gwop->op_type = type;
6889     gwop->op_ppaddr = PL_ppaddr[type];
6890     gwop->op_first = listkids(o);
6891     gwop->op_flags |= OPf_KIDS;
6892     gwop->op_other = LINKLIST(kid);
6893     kid->op_next = (OP*)gwop;
6894     offset = pad_findmy("$_");
6895     if (offset == NOT_IN_PAD || PAD_COMPNAME_FLAGS_isOUR(offset)) {
6896         o->op_private = gwop->op_private = 0;
6897         gwop->op_targ = pad_alloc(type, SVs_PADTMP);
6898     }
6899     else {
6900         o->op_private = gwop->op_private = OPpGREP_LEX;
6901         gwop->op_targ = o->op_targ = offset;
6902     }
6903
6904     kid = cLISTOPo->op_first->op_sibling;
6905     if (!kid || !kid->op_sibling)
6906         return too_few_arguments(o,OP_DESC(o));
6907     for (kid = kid->op_sibling; kid; kid = kid->op_sibling)
6908         mod(kid, OP_GREPSTART);
6909
6910     return (OP*)gwop;
6911 }
6912
6913 OP *
6914 Perl_ck_index(pTHX_ OP *o)
6915 {
6916     if (o->op_flags & OPf_KIDS) {
6917         OP *kid = cLISTOPo->op_first->op_sibling;       /* get past pushmark */
6918         if (kid)
6919             kid = kid->op_sibling;                      /* get past "big" */
6920         if (kid && kid->op_type == OP_CONST)
6921             fbm_compile(((SVOP*)kid)->op_sv, 0);
6922     }
6923     return ck_fun(o);
6924 }
6925
6926 OP *
6927 Perl_ck_lengthconst(pTHX_ OP *o)
6928 {
6929     /* XXX length optimization goes here */
6930     return ck_fun(o);
6931 }
6932
6933 OP *
6934 Perl_ck_lfun(pTHX_ OP *o)
6935 {
6936     const OPCODE type = o->op_type;
6937     return modkids(ck_fun(o), type);
6938 }
6939
6940 OP *
6941 Perl_ck_defined(pTHX_ OP *o)            /* 19990527 MJD */
6942 {
6943     if ((o->op_flags & OPf_KIDS) && ckWARN2(WARN_DEPRECATED, WARN_SYNTAX)) {
6944         switch (cUNOPo->op_first->op_type) {
6945         case OP_RV2AV:
6946             /* This is needed for
6947                if (defined %stash::)
6948                to work.   Do not break Tk.
6949                */
6950             break;                      /* Globals via GV can be undef */
6951         case OP_PADAV:
6952         case OP_AASSIGN:                /* Is this a good idea? */
6953             Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
6954                         "defined(@array) is deprecated");
6955             Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
6956                         "\t(Maybe you should just omit the defined()?)\n");
6957         break;
6958         case OP_RV2HV:
6959             /* This is needed for
6960                if (defined %stash::)
6961                to work.   Do not break Tk.
6962                */
6963             break;                      /* Globals via GV can be undef */
6964         case OP_PADHV:
6965             Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
6966                         "defined(%%hash) is deprecated");
6967             Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
6968                         "\t(Maybe you should just omit the defined()?)\n");
6969             break;
6970         default:
6971             /* no warning */
6972             break;
6973         }
6974     }
6975     return ck_rfun(o);
6976 }
6977
6978 OP *
6979 Perl_ck_readline(pTHX_ OP *o)
6980 {
6981     if (!(o->op_flags & OPf_KIDS)) {
6982         OP * const newop
6983             = newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, PL_argvgv));
6984 #ifdef PERL_MAD
6985         op_getmad(o,newop,'O');
6986 #else
6987         op_free(o);
6988 #endif
6989         return newop;
6990     }
6991     return o;
6992 }
6993
6994 OP *
6995 Perl_ck_rfun(pTHX_ OP *o)
6996 {
6997     const OPCODE type = o->op_type;
6998     return refkids(ck_fun(o), type);
6999 }
7000
7001 OP *
7002 Perl_ck_listiob(pTHX_ OP *o)
7003 {
7004     register OP *kid;
7005
7006     kid = cLISTOPo->op_first;
7007     if (!kid) {
7008         o = force_list(o);
7009         kid = cLISTOPo->op_first;
7010     }
7011     if (kid->op_type == OP_PUSHMARK)
7012         kid = kid->op_sibling;
7013     if (kid && o->op_flags & OPf_STACKED)
7014         kid = kid->op_sibling;
7015     else if (kid && !kid->op_sibling) {         /* print HANDLE; */
7016         if (kid->op_type == OP_CONST && kid->op_private & OPpCONST_BARE) {
7017             o->op_flags |= OPf_STACKED; /* make it a filehandle */
7018             kid = newUNOP(OP_RV2GV, OPf_REF, scalar(kid));
7019             cLISTOPo->op_first->op_sibling = kid;
7020             cLISTOPo->op_last = kid;
7021             kid = kid->op_sibling;
7022         }
7023     }
7024
7025     if (!kid)
7026         append_elem(o->op_type, o, newDEFSVOP());
7027
7028     return listkids(o);
7029 }
7030
7031 OP *
7032 Perl_ck_smartmatch(pTHX_ OP *o)
7033 {
7034     dVAR;
7035     if (0 == (o->op_flags & OPf_SPECIAL)) {
7036         OP *first  = cBINOPo->op_first;
7037         OP *second = first->op_sibling;
7038         
7039         /* Implicitly take a reference to an array or hash */
7040         first->op_sibling = NULL;
7041         first = cBINOPo->op_first = ref_array_or_hash(first);
7042         second = first->op_sibling = ref_array_or_hash(second);
7043         
7044         /* Implicitly take a reference to a regular expression */
7045         if (first->op_type == OP_MATCH) {
7046             first->op_type = OP_QR;
7047             first->op_ppaddr = PL_ppaddr[OP_QR];
7048         }
7049         if (second->op_type == OP_MATCH) {
7050             second->op_type = OP_QR;
7051             second->op_ppaddr = PL_ppaddr[OP_QR];
7052         }
7053     }
7054     
7055     return o;
7056 }
7057
7058
7059 OP *
7060 Perl_ck_sassign(pTHX_ OP *o)
7061 {
7062     dVAR;
7063     OP * const kid = cLISTOPo->op_first;
7064     /* has a disposable target? */
7065     if ((PL_opargs[kid->op_type] & OA_TARGLEX)
7066         && !(kid->op_flags & OPf_STACKED)
7067         /* Cannot steal the second time! */
7068         && !(kid->op_private & OPpTARGET_MY)
7069         /* Keep the full thing for madskills */
7070         && !PL_madskills
7071         )
7072     {
7073         OP * const kkid = kid->op_sibling;
7074
7075         /* Can just relocate the target. */
7076         if (kkid && kkid->op_type == OP_PADSV
7077             && !(kkid->op_private & OPpLVAL_INTRO))
7078         {
7079             kid->op_targ = kkid->op_targ;
7080             kkid->op_targ = 0;
7081             /* Now we do not need PADSV and SASSIGN. */
7082             kid->op_sibling = o->op_sibling;    /* NULL */
7083             cLISTOPo->op_first = NULL;
7084             op_free(o);
7085             op_free(kkid);
7086             kid->op_private |= OPpTARGET_MY;    /* Used for context settings */
7087             return kid;
7088         }
7089     }
7090     if (kid->op_sibling) {
7091         OP *kkid = kid->op_sibling;
7092         if (kkid->op_type == OP_PADSV
7093                 && (kkid->op_private & OPpLVAL_INTRO)
7094                 && SvPAD_STATE(*av_fetch(PL_comppad_name, kkid->op_targ, FALSE))) {
7095             const PADOFFSET target = kkid->op_targ;
7096             OP *const other = newOP(OP_PADSV,
7097                                     kkid->op_flags
7098                                     | ((kkid->op_private & ~OPpLVAL_INTRO) << 8));
7099             OP *const first = newOP(OP_NULL, 0);
7100             OP *const nullop = newCONDOP(0, first, o, other);
7101             OP *const condop = first->op_next;
7102             /* hijacking PADSTALE for uninitialized state variables */
7103             SvPADSTALE_on(PAD_SVl(target));
7104
7105             condop->op_type = OP_ONCE;
7106             condop->op_ppaddr = PL_ppaddr[OP_ONCE];
7107             condop->op_targ = target;
7108             other->op_targ = target;
7109
7110             /* Because we change the type of the op here, we will skip the
7111                assinment binop->op_last = binop->op_first->op_sibling; at the
7112                end of Perl_newBINOP(). So need to do it here. */
7113             cBINOPo->op_last = cBINOPo->op_first->op_sibling;
7114
7115             return nullop;
7116         }
7117     }
7118     return o;
7119 }
7120
7121 OP *
7122 Perl_ck_match(pTHX_ OP *o)
7123 {
7124     dVAR;
7125     if (o->op_type != OP_QR && PL_compcv) {
7126         const PADOFFSET offset = pad_findmy("$_");
7127         if (offset != NOT_IN_PAD && !(PAD_COMPNAME_FLAGS_isOUR(offset))) {
7128             o->op_targ = offset;
7129             o->op_private |= OPpTARGET_MY;
7130         }
7131     }
7132     if (o->op_type == OP_MATCH || o->op_type == OP_QR)
7133         o->op_private |= OPpRUNTIME;
7134     return o;
7135 }
7136
7137 OP *
7138 Perl_ck_method(pTHX_ OP *o)
7139 {
7140     OP * const kid = cUNOPo->op_first;
7141     if (kid->op_type == OP_CONST) {
7142         SV* sv = kSVOP->op_sv;
7143         const char * const method = SvPVX_const(sv);
7144         if (!(strchr(method, ':') || strchr(method, '\''))) {
7145             OP *cmop;
7146             if (!SvREADONLY(sv) || !SvFAKE(sv)) {
7147                 sv = newSVpvn_share(method, SvCUR(sv), 0);
7148             }
7149             else {
7150                 kSVOP->op_sv = NULL;
7151             }
7152             cmop = newSVOP(OP_METHOD_NAMED, 0, sv);
7153 #ifdef PERL_MAD
7154             op_getmad(o,cmop,'O');
7155 #else
7156             op_free(o);
7157 #endif
7158             return cmop;
7159         }
7160     }
7161     return o;
7162 }
7163
7164 OP *
7165 Perl_ck_null(pTHX_ OP *o)
7166 {
7167     PERL_UNUSED_CONTEXT;
7168     return o;
7169 }
7170
7171 OP *
7172 Perl_ck_open(pTHX_ OP *o)
7173 {
7174     dVAR;
7175     HV * const table = GvHV(PL_hintgv);
7176     if (table) {
7177         SV **svp = hv_fetchs(table, "open_IN", FALSE);
7178         if (svp && *svp) {
7179             const I32 mode = mode_from_discipline(*svp);
7180             if (mode & O_BINARY)
7181                 o->op_private |= OPpOPEN_IN_RAW;
7182             else if (mode & O_TEXT)
7183                 o->op_private |= OPpOPEN_IN_CRLF;
7184         }
7185
7186         svp = hv_fetchs(table, "open_OUT", FALSE);
7187         if (svp && *svp) {
7188             const I32 mode = mode_from_discipline(*svp);
7189             if (mode & O_BINARY)
7190                 o->op_private |= OPpOPEN_OUT_RAW;
7191             else if (mode & O_TEXT)
7192                 o->op_private |= OPpOPEN_OUT_CRLF;
7193         }
7194     }
7195     if (o->op_type == OP_BACKTICK) {
7196         if (!(o->op_flags & OPf_KIDS)) {
7197             OP * const newop = newUNOP(OP_BACKTICK, 0, newDEFSVOP());
7198 #ifdef PERL_MAD
7199             op_getmad(o,newop,'O');
7200 #else
7201             op_free(o);
7202 #endif
7203             return newop;
7204         }
7205         return o;
7206     }
7207     {
7208          /* In case of three-arg dup open remove strictness
7209           * from the last arg if it is a bareword. */
7210          OP * const first = cLISTOPx(o)->op_first; /* The pushmark. */
7211          OP * const last  = cLISTOPx(o)->op_last;  /* The bareword. */
7212          OP *oa;
7213          const char *mode;
7214
7215          if ((last->op_type == OP_CONST) &&             /* The bareword. */
7216              (last->op_private & OPpCONST_BARE) &&
7217              (last->op_private & OPpCONST_STRICT) &&
7218              (oa = first->op_sibling) &&                /* The fh. */
7219              (oa = oa->op_sibling) &&                   /* The mode. */
7220              (oa->op_type == OP_CONST) &&
7221              SvPOK(((SVOP*)oa)->op_sv) &&
7222              (mode = SvPVX_const(((SVOP*)oa)->op_sv)) &&
7223              mode[0] == '>' && mode[1] == '&' &&        /* A dup open. */
7224              (last == oa->op_sibling))                  /* The bareword. */
7225               last->op_private &= ~OPpCONST_STRICT;
7226     }
7227     return ck_fun(o);
7228 }
7229
7230 OP *
7231 Perl_ck_repeat(pTHX_ OP *o)
7232 {
7233     if (cBINOPo->op_first->op_flags & OPf_PARENS) {
7234         o->op_private |= OPpREPEAT_DOLIST;
7235         cBINOPo->op_first = force_list(cBINOPo->op_first);
7236     }
7237     else
7238         scalar(o);
7239     return o;
7240 }
7241
7242 OP *
7243 Perl_ck_require(pTHX_ OP *o)
7244 {
7245     dVAR;
7246     GV* gv = NULL;
7247
7248     if (o->op_flags & OPf_KIDS) {       /* Shall we supply missing .pm? */
7249         SVOP * const kid = (SVOP*)cUNOPo->op_first;
7250
7251         if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) {
7252             SV * const sv = kid->op_sv;
7253             U32 was_readonly = SvREADONLY(sv);
7254             char *s;
7255             STRLEN len;
7256             const char *end;
7257
7258             if (was_readonly) {
7259                 if (SvFAKE(sv)) {
7260                     sv_force_normal_flags(sv, 0);
7261                     assert(!SvREADONLY(sv));
7262                     was_readonly = 0;
7263                 } else {
7264                     SvREADONLY_off(sv);
7265                 }
7266             }   
7267
7268             s = SvPVX(sv);
7269             len = SvCUR(sv);
7270             end = s + len;
7271             for (; s < end; s++) {
7272                 if (*s == ':' && s[1] == ':') {
7273                     *s = '/';
7274                     Move(s+2, s+1, end - s - 1, char);
7275                     --end;
7276                 }
7277             }
7278             SvEND_set(sv, end);
7279             sv_catpvs(sv, ".pm");
7280             SvFLAGS(sv) |= was_readonly;
7281         }
7282     }
7283
7284     if (!(o->op_flags & OPf_SPECIAL)) { /* Wasn't written as CORE::require */
7285         /* handle override, if any */
7286         gv = gv_fetchpvs("require", GV_NOTQUAL, SVt_PVCV);
7287         if (!(gv && GvCVu(gv) && GvIMPORTED_CV(gv))) {
7288             GV * const * const gvp = (GV**)hv_fetchs(PL_globalstash, "require", FALSE);
7289             gv = gvp ? *gvp : NULL;
7290         }
7291     }
7292
7293     if (gv && GvCVu(gv) && GvIMPORTED_CV(gv)) {
7294         OP * const kid = cUNOPo->op_first;
7295         OP * newop;
7296
7297         cUNOPo->op_first = 0;
7298 #ifndef PERL_MAD
7299         op_free(o);
7300 #endif
7301         newop = ck_subr(newUNOP(OP_ENTERSUB, OPf_STACKED,
7302                                 append_elem(OP_LIST, kid,
7303                                             scalar(newUNOP(OP_RV2CV, 0,
7304                                                            newGVOP(OP_GV, 0,
7305                                                                    gv))))));
7306         op_getmad(o,newop,'O');
7307         return newop;
7308     }
7309
7310     return ck_fun(o);
7311 }
7312
7313 OP *
7314 Perl_ck_return(pTHX_ OP *o)
7315 {
7316     dVAR;
7317     if (CvLVALUE(PL_compcv)) {
7318         OP *kid;
7319         for (kid = cLISTOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
7320             mod(kid, OP_LEAVESUBLV);
7321     }
7322     return o;
7323 }
7324
7325 OP *
7326 Perl_ck_select(pTHX_ OP *o)
7327 {
7328     dVAR;
7329     OP* kid;
7330     if (o->op_flags & OPf_KIDS) {
7331         kid = cLISTOPo->op_first->op_sibling;   /* get past pushmark */
7332         if (kid && kid->op_sibling) {
7333             o->op_type = OP_SSELECT;
7334             o->op_ppaddr = PL_ppaddr[OP_SSELECT];
7335             o = ck_fun(o);
7336             return fold_constants(o);
7337         }
7338     }
7339     o = ck_fun(o);
7340     kid = cLISTOPo->op_first->op_sibling;    /* get past pushmark */
7341     if (kid && kid->op_type == OP_RV2GV)
7342         kid->op_private &= ~HINT_STRICT_REFS;
7343     return o;
7344 }
7345
7346 OP *
7347 Perl_ck_shift(pTHX_ OP *o)
7348 {
7349     dVAR;
7350     const I32 type = o->op_type;
7351
7352     if (!(o->op_flags & OPf_KIDS)) {
7353         OP *argop;
7354         /* FIXME - this can be refactored to reduce code in #ifdefs  */
7355 #ifdef PERL_MAD
7356         OP * const oldo = o;
7357 #else
7358         op_free(o);
7359 #endif
7360         argop = newUNOP(OP_RV2AV, 0,
7361             scalar(newGVOP(OP_GV, 0, CvUNIQUE(PL_compcv) ? PL_argvgv : PL_defgv)));
7362 #ifdef PERL_MAD
7363         o = newUNOP(type, 0, scalar(argop));
7364         op_getmad(oldo,o,'O');
7365         return o;
7366 #else
7367         return newUNOP(type, 0, scalar(argop));
7368 #endif
7369     }
7370     return scalar(modkids(ck_fun(o), type));
7371 }
7372
7373 OP *
7374 Perl_ck_sort(pTHX_ OP *o)
7375 {
7376     dVAR;
7377     OP *firstkid;
7378
7379     if (o->op_type == OP_SORT && (PL_hints & HINT_LOCALIZE_HH) != 0) {
7380         HV * const hinthv = GvHV(PL_hintgv);
7381         if (hinthv) {
7382             SV ** const svp = hv_fetchs(hinthv, "sort", FALSE);
7383             if (svp) {
7384                 const I32 sorthints = (I32)SvIV(*svp);
7385                 if ((sorthints & HINT_SORT_QUICKSORT) != 0)
7386                     o->op_private |= OPpSORT_QSORT;
7387                 if ((sorthints & HINT_SORT_STABLE) != 0)
7388                     o->op_private |= OPpSORT_STABLE;
7389             }
7390         }
7391     }
7392
7393     if (o->op_type == OP_SORT && o->op_flags & OPf_STACKED)
7394         simplify_sort(o);
7395     firstkid = cLISTOPo->op_first->op_sibling;          /* get past pushmark */
7396     if (o->op_flags & OPf_STACKED) {                    /* may have been cleared */
7397         OP *k = NULL;
7398         OP *kid = cUNOPx(firstkid)->op_first;           /* get past null */
7399
7400         if (kid->op_type == OP_SCOPE || kid->op_type == OP_LEAVE) {
7401             linklist(kid);
7402             if (kid->op_type == OP_SCOPE) {
7403                 k = kid->op_next;
7404                 kid->op_next = 0;
7405             }
7406             else if (kid->op_type == OP_LEAVE) {
7407                 if (o->op_type == OP_SORT) {
7408                     op_null(kid);                       /* wipe out leave */
7409                     kid->op_next = kid;
7410
7411                     for (k = kLISTOP->op_first->op_next; k; k = k->op_next) {
7412                         if (k->op_next == kid)
7413                             k->op_next = 0;
7414                         /* don't descend into loops */
7415                         else if (k->op_type == OP_ENTERLOOP
7416                                  || k->op_type == OP_ENTERITER)
7417                         {
7418                             k = cLOOPx(k)->op_lastop;
7419                         }
7420                     }
7421                 }
7422                 else
7423                     kid->op_next = 0;           /* just disconnect the leave */
7424                 k = kLISTOP->op_first;
7425             }
7426             CALL_PEEP(k);
7427
7428             kid = firstkid;
7429             if (o->op_type == OP_SORT) {
7430                 /* provide scalar context for comparison function/block */
7431                 kid = scalar(kid);
7432                 kid->op_next = kid;
7433             }
7434             else
7435                 kid->op_next = k;
7436             o->op_flags |= OPf_SPECIAL;
7437         }
7438         else if (kid->op_type == OP_RV2SV || kid->op_type == OP_PADSV)
7439             op_null(firstkid);
7440
7441         firstkid = firstkid->op_sibling;
7442     }
7443
7444     /* provide list context for arguments */
7445     if (o->op_type == OP_SORT)
7446         list(firstkid);
7447
7448     return o;
7449 }
7450
7451 STATIC void
7452 S_simplify_sort(pTHX_ OP *o)
7453 {
7454     dVAR;
7455     register OP *kid = cLISTOPo->op_first->op_sibling;  /* get past pushmark */
7456     OP *k;
7457     int descending;
7458     GV *gv;
7459     const char *gvname;
7460     if (!(o->op_flags & OPf_STACKED))
7461         return;
7462     GvMULTI_on(gv_fetchpvs("a", GV_ADD|GV_NOTQUAL, SVt_PV));
7463     GvMULTI_on(gv_fetchpvs("b", GV_ADD|GV_NOTQUAL, SVt_PV));
7464     kid = kUNOP->op_first;                              /* get past null */
7465     if (kid->op_type != OP_SCOPE)
7466         return;
7467     kid = kLISTOP->op_last;                             /* get past scope */
7468     switch(kid->op_type) {
7469         case OP_NCMP:
7470         case OP_I_NCMP:
7471         case OP_SCMP:
7472             break;
7473         default:
7474             return;
7475     }
7476     k = kid;                                            /* remember this node*/
7477     if (kBINOP->op_first->op_type != OP_RV2SV)
7478         return;
7479     kid = kBINOP->op_first;                             /* get past cmp */
7480     if (kUNOP->op_first->op_type != OP_GV)
7481         return;
7482     kid = kUNOP->op_first;                              /* get past rv2sv */
7483     gv = kGVOP_gv;
7484     if (GvSTASH(gv) != PL_curstash)
7485         return;
7486     gvname = GvNAME(gv);
7487     if (*gvname == 'a' && gvname[1] == '\0')
7488         descending = 0;
7489     else if (*gvname == 'b' && gvname[1] == '\0')
7490         descending = 1;
7491     else
7492         return;
7493
7494     kid = k;                                            /* back to cmp */
7495     if (kBINOP->op_last->op_type != OP_RV2SV)
7496         return;
7497     kid = kBINOP->op_last;                              /* down to 2nd arg */
7498     if (kUNOP->op_first->op_type != OP_GV)
7499         return;
7500     kid = kUNOP->op_first;                              /* get past rv2sv */
7501     gv = kGVOP_gv;
7502     if (GvSTASH(gv) != PL_curstash)
7503         return;
7504     gvname = GvNAME(gv);
7505     if ( descending
7506          ? !(*gvname == 'a' && gvname[1] == '\0')
7507          : !(*gvname == 'b' && gvname[1] == '\0'))
7508         return;
7509     o->op_flags &= ~(OPf_STACKED | OPf_SPECIAL);
7510     if (descending)
7511         o->op_private |= OPpSORT_DESCEND;
7512     if (k->op_type == OP_NCMP)
7513         o->op_private |= OPpSORT_NUMERIC;
7514     if (k->op_type == OP_I_NCMP)
7515         o->op_private |= OPpSORT_NUMERIC | OPpSORT_INTEGER;
7516     kid = cLISTOPo->op_first->op_sibling;
7517     cLISTOPo->op_first->op_sibling = kid->op_sibling; /* bypass old block */
7518 #ifdef PERL_MAD
7519     op_getmad(kid,o,'S');                             /* then delete it */
7520 #else
7521     op_free(kid);                                     /* then delete it */
7522 #endif
7523 }
7524
7525 OP *
7526 Perl_ck_split(pTHX_ OP *o)
7527 {
7528     dVAR;
7529     register OP *kid;
7530
7531     if (o->op_flags & OPf_STACKED)
7532         return no_fh_allowed(o);
7533
7534     kid = cLISTOPo->op_first;
7535     if (kid->op_type != OP_NULL)
7536         Perl_croak(aTHX_ "panic: ck_split");
7537     kid = kid->op_sibling;
7538     op_free(cLISTOPo->op_first);
7539     cLISTOPo->op_first = kid;
7540     if (!kid) {
7541         cLISTOPo->op_first = kid = newSVOP(OP_CONST, 0, newSVpvs(" "));
7542         cLISTOPo->op_last = kid; /* There was only one element previously */
7543     }
7544
7545     if (kid->op_type != OP_MATCH || kid->op_flags & OPf_STACKED) {
7546         OP * const sibl = kid->op_sibling;
7547         kid->op_sibling = 0;
7548         kid = pmruntime( newPMOP(OP_MATCH, OPf_SPECIAL), kid, 0);
7549         if (cLISTOPo->op_first == cLISTOPo->op_last)
7550             cLISTOPo->op_last = kid;
7551         cLISTOPo->op_first = kid;
7552         kid->op_sibling = sibl;
7553     }
7554
7555     kid->op_type = OP_PUSHRE;
7556     kid->op_ppaddr = PL_ppaddr[OP_PUSHRE];
7557     scalar(kid);
7558     if (((PMOP *)kid)->op_pmflags & PMf_GLOBAL && ckWARN(WARN_REGEXP)) {
7559       Perl_warner(aTHX_ packWARN(WARN_REGEXP),
7560                   "Use of /g modifier is meaningless in split");
7561     }
7562
7563     if (!kid->op_sibling)
7564         append_elem(OP_SPLIT, o, newDEFSVOP());
7565
7566     kid = kid->op_sibling;
7567     scalar(kid);
7568
7569     if (!kid->op_sibling)
7570         append_elem(OP_SPLIT, o, newSVOP(OP_CONST, 0, newSViv(0)));
7571     assert(kid->op_sibling);
7572
7573     kid = kid->op_sibling;
7574     scalar(kid);
7575
7576     if (kid->op_sibling)
7577         return too_many_arguments(o,OP_DESC(o));
7578
7579     return o;
7580 }
7581
7582 OP *
7583 Perl_ck_join(pTHX_ OP *o)
7584 {
7585     const OP * const kid = cLISTOPo->op_first->op_sibling;
7586     if (kid && kid->op_type == OP_MATCH) {
7587         if (ckWARN(WARN_SYNTAX)) {
7588             const REGEXP *re = PM_GETRE(kPMOP);
7589             const char *pmstr = re ? RX_PRECOMP(re) : "STRING";
7590             const STRLEN len = re ? RX_PRELEN(re) : 6;
7591             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7592                         "/%.*s/ should probably be written as \"%.*s\"",
7593                         (int)len, pmstr, (int)len, pmstr);
7594         }
7595     }
7596     return ck_fun(o);
7597 }
7598
7599 OP *
7600 Perl_ck_subr(pTHX_ OP *o)
7601 {
7602     dVAR;
7603     OP *prev = ((cUNOPo->op_first->op_sibling)
7604              ? cUNOPo : ((UNOP*)cUNOPo->op_first))->op_first;
7605     OP *o2 = prev->op_sibling;
7606     OP *cvop;
7607     const char *proto = NULL;
7608     const char *proto_end = NULL;
7609     CV *cv = NULL;
7610     GV *namegv = NULL;
7611     int optional = 0;
7612     I32 arg = 0;
7613     I32 contextclass = 0;
7614     const char *e = NULL;
7615     bool delete_op = 0;
7616
7617     o->op_private |= OPpENTERSUB_HASTARG;
7618     for (cvop = o2; cvop->op_sibling; cvop = cvop->op_sibling) ;
7619     if (cvop->op_type == OP_RV2CV) {
7620         SVOP* tmpop;
7621         o->op_private |= (cvop->op_private & OPpENTERSUB_AMPER);
7622         op_null(cvop);          /* disable rv2cv */
7623         tmpop = (SVOP*)((UNOP*)cvop)->op_first;
7624         if (tmpop->op_type == OP_GV && !(o->op_private & OPpENTERSUB_AMPER)) {
7625             GV *gv = cGVOPx_gv(tmpop);
7626             cv = GvCVu(gv);
7627             if (!cv)
7628                 tmpop->op_private |= OPpEARLY_CV;
7629             else {
7630                 if (SvPOK(cv)) {
7631                     STRLEN len;
7632                     namegv = CvANON(cv) ? gv : CvGV(cv);
7633                     proto = SvPV((SV*)cv, len);
7634                     proto_end = proto + len;
7635                 }
7636             }
7637         }
7638     }
7639     else if (cvop->op_type == OP_METHOD || cvop->op_type == OP_METHOD_NAMED) {
7640         if (o2->op_type == OP_CONST)
7641             o2->op_private &= ~OPpCONST_STRICT;
7642         else if (o2->op_type == OP_LIST) {
7643             OP * const sib = ((UNOP*)o2)->op_first->op_sibling;
7644             if (sib && sib->op_type == OP_CONST)
7645                 sib->op_private &= ~OPpCONST_STRICT;
7646         }
7647     }
7648     o->op_private |= (PL_hints & HINT_STRICT_REFS);
7649     if (PERLDB_SUB && PL_curstash != PL_debstash)
7650         o->op_private |= OPpENTERSUB_DB;
7651     while (o2 != cvop) {
7652         OP* o3;
7653         if (PL_madskills && o2->op_type == OP_STUB) {
7654             o2 = o2->op_sibling;
7655             continue;
7656         }
7657         if (PL_madskills && o2->op_type == OP_NULL)
7658             o3 = ((UNOP*)o2)->op_first;
7659         else
7660             o3 = o2;
7661         if (proto) {
7662             if (proto >= proto_end)
7663                 return too_many_arguments(o, gv_ename(namegv));
7664
7665             switch (*proto) {
7666             case ';':
7667                 optional = 1;
7668                 proto++;
7669                 continue;
7670             case '_':
7671                 /* _ must be at the end */
7672                 if (proto[1] && proto[1] != ';')
7673                     goto oops;
7674             case '$':
7675                 proto++;
7676                 arg++;
7677                 scalar(o2);
7678                 break;
7679             case '%':
7680             case '@':
7681                 list(o2);
7682                 arg++;
7683                 break;
7684             case '&':
7685                 proto++;
7686                 arg++;
7687                 if (o3->op_type != OP_REFGEN && o3->op_type != OP_UNDEF)
7688                     bad_type(arg,
7689                         arg == 1 ? "block or sub {}" : "sub {}",
7690                         gv_ename(namegv), o3);
7691                 break;
7692             case '*':
7693                 /* '*' allows any scalar type, including bareword */
7694                 proto++;
7695                 arg++;
7696                 if (o3->op_type == OP_RV2GV)
7697                     goto wrapref;       /* autoconvert GLOB -> GLOBref */
7698                 else if (o3->op_type == OP_CONST)
7699                     o3->op_private &= ~OPpCONST_STRICT;
7700                 else if (o3->op_type == OP_ENTERSUB) {
7701                     /* accidental subroutine, revert to bareword */
7702                     OP *gvop = ((UNOP*)o3)->op_first;
7703                     if (gvop && gvop->op_type == OP_NULL) {
7704                         gvop = ((UNOP*)gvop)->op_first;
7705                         if (gvop) {
7706                             for (; gvop->op_sibling; gvop = gvop->op_sibling)
7707                                 ;
7708                             if (gvop &&
7709                                 (gvop->op_private & OPpENTERSUB_NOPAREN) &&
7710                                 (gvop = ((UNOP*)gvop)->op_first) &&
7711                                 gvop->op_type == OP_GV)
7712                             {
7713                                 GV * const gv = cGVOPx_gv(gvop);
7714                                 OP * const sibling = o2->op_sibling;
7715                                 SV * const n = newSVpvs("");
7716 #ifdef PERL_MAD
7717                                 OP * const oldo2 = o2;
7718 #else
7719                                 op_free(o2);
7720 #endif
7721                                 gv_fullname4(n, gv, "", FALSE);
7722                                 o2 = newSVOP(OP_CONST, 0, n);
7723                                 op_getmad(oldo2,o2,'O');
7724                                 prev->op_sibling = o2;
7725                                 o2->op_sibling = sibling;
7726                             }
7727                         }
7728                     }
7729                 }
7730                 scalar(o2);
7731                 break;
7732             case '[': case ']':
7733                  goto oops;
7734                  break;
7735             case '\\':
7736                 proto++;
7737                 arg++;
7738             again:
7739                 switch (*proto++) {
7740                 case '[':
7741                      if (contextclass++ == 0) {
7742                           e = strchr(proto, ']');
7743                           if (!e || e == proto)
7744                                goto oops;
7745                      }
7746                      else
7747                           goto oops;
7748                      goto again;
7749                      break;
7750                 case ']':
7751                      if (contextclass) {
7752                          const char *p = proto;
7753                          const char *const end = proto;
7754                          contextclass = 0;
7755                          while (*--p != '[');
7756                          bad_type(arg, Perl_form(aTHX_ "one of %.*s",
7757                                                  (int)(end - p), p),
7758                                   gv_ename(namegv), o3);
7759                      } else
7760                           goto oops;
7761                      break;
7762                 case '*':
7763                      if (o3->op_type == OP_RV2GV)
7764                           goto wrapref;
7765                      if (!contextclass)
7766                           bad_type(arg, "symbol", gv_ename(namegv), o3);
7767                      break;
7768                 case '&':
7769                      if (o3->op_type == OP_ENTERSUB)
7770                           goto wrapref;
7771                      if (!contextclass)
7772                           bad_type(arg, "subroutine entry", gv_ename(namegv),
7773                                    o3);
7774                      break;
7775                 case '$':
7776                     if (o3->op_type == OP_RV2SV ||
7777                         o3->op_type == OP_PADSV ||
7778                         o3->op_type == OP_HELEM ||
7779                         o3->op_type == OP_AELEM)
7780                          goto wrapref;
7781                     if (!contextclass)
7782                         bad_type(arg, "scalar", gv_ename(namegv), o3);
7783                      break;
7784                 case '@':
7785                     if (o3->op_type == OP_RV2AV ||
7786                         o3->op_type == OP_PADAV)
7787                          goto wrapref;
7788                     if (!contextclass)
7789                         bad_type(arg, "array", gv_ename(namegv), o3);
7790                     break;
7791                 case '%':
7792                     if (o3->op_type == OP_RV2HV ||
7793                         o3->op_type == OP_PADHV)
7794                          goto wrapref;
7795                     if (!contextclass)
7796                          bad_type(arg, "hash", gv_ename(namegv), o3);
7797                     break;
7798                 wrapref:
7799                     {
7800                         OP* const kid = o2;
7801                         OP* const sib = kid->op_sibling;
7802                         kid->op_sibling = 0;
7803                         o2 = newUNOP(OP_REFGEN, 0, kid);
7804                         o2->op_sibling = sib;
7805                         prev->op_sibling = o2;
7806                     }
7807                     if (contextclass && e) {
7808                          proto = e + 1;
7809                          contextclass = 0;
7810                     }
7811                     break;
7812                 default: goto oops;
7813                 }
7814                 if (contextclass)
7815                      goto again;
7816                 break;
7817             case ' ':
7818                 proto++;
7819                 continue;
7820             default:
7821               oops:
7822                 Perl_croak(aTHX_ "Malformed prototype for %s: %"SVf,
7823                            gv_ename(namegv), SVfARG(cv));
7824             }
7825         }
7826         else
7827             list(o2);
7828         mod(o2, OP_ENTERSUB);
7829         prev = o2;
7830         o2 = o2->op_sibling;
7831     } /* while */
7832     if (o2 == cvop && proto && *proto == '_') {
7833         /* generate an access to $_ */
7834         o2 = newDEFSVOP();
7835         o2->op_sibling = prev->op_sibling;
7836         prev->op_sibling = o2; /* instead of cvop */
7837     }
7838     if (proto && !optional && proto_end > proto &&
7839         (*proto != '@' && *proto != '%' && *proto != ';' && *proto != '_'))
7840         return too_few_arguments(o, gv_ename(namegv));
7841     if(delete_op) {
7842 #ifdef PERL_MAD
7843         OP * const oldo = o;
7844 #else
7845         op_free(o);
7846 #endif
7847         o=newSVOP(OP_CONST, 0, newSViv(0));
7848         op_getmad(oldo,o,'O');
7849     }
7850     return o;
7851 }
7852
7853 OP *
7854 Perl_ck_svconst(pTHX_ OP *o)
7855 {
7856     PERL_UNUSED_CONTEXT;
7857     SvREADONLY_on(cSVOPo->op_sv);
7858     return o;
7859 }
7860
7861 OP *
7862 Perl_ck_chdir(pTHX_ OP *o)
7863 {
7864     if (o->op_flags & OPf_KIDS) {
7865         SVOP * const kid = (SVOP*)cUNOPo->op_first;
7866
7867         if (kid && kid->op_type == OP_CONST &&
7868             (kid->op_private & OPpCONST_BARE))
7869         {
7870             o->op_flags |= OPf_SPECIAL;
7871             kid->op_private &= ~OPpCONST_STRICT;
7872         }
7873     }
7874     return ck_fun(o);
7875 }
7876
7877 OP *
7878 Perl_ck_trunc(pTHX_ OP *o)
7879 {
7880     if (o->op_flags & OPf_KIDS) {
7881         SVOP *kid = (SVOP*)cUNOPo->op_first;
7882
7883         if (kid->op_type == OP_NULL)
7884             kid = (SVOP*)kid->op_sibling;
7885         if (kid && kid->op_type == OP_CONST &&
7886             (kid->op_private & OPpCONST_BARE))
7887         {
7888             o->op_flags |= OPf_SPECIAL;
7889             kid->op_private &= ~OPpCONST_STRICT;
7890         }
7891     }
7892     return ck_fun(o);
7893 }
7894
7895 OP *
7896 Perl_ck_unpack(pTHX_ OP *o)
7897 {
7898     OP *kid = cLISTOPo->op_first;
7899     if (kid->op_sibling) {
7900         kid = kid->op_sibling;
7901         if (!kid->op_sibling)
7902             kid->op_sibling = newDEFSVOP();
7903     }
7904     return ck_fun(o);
7905 }
7906
7907 OP *
7908 Perl_ck_substr(pTHX_ OP *o)
7909 {
7910     o = ck_fun(o);
7911     if ((o->op_flags & OPf_KIDS) && (o->op_private == 4)) {
7912         OP *kid = cLISTOPo->op_first;
7913
7914         if (kid->op_type == OP_NULL)
7915             kid = kid->op_sibling;
7916         if (kid)
7917             kid->op_flags |= OPf_MOD;
7918
7919     }
7920     return o;
7921 }
7922
7923 OP *
7924 Perl_ck_each(pTHX_ OP *o)
7925 {
7926     dVAR;
7927     OP *kid = cLISTOPo->op_first;
7928
7929     if (kid->op_type == OP_PADAV || kid->op_type == OP_RV2AV) {
7930         const unsigned new_type = o->op_type == OP_EACH ? OP_AEACH
7931             : o->op_type == OP_KEYS ? OP_AKEYS : OP_AVALUES;
7932         o->op_type = new_type;
7933         o->op_ppaddr = PL_ppaddr[new_type];
7934     }
7935     else if (!(kid->op_type == OP_PADHV || kid->op_type == OP_RV2HV
7936                || (kid->op_type == OP_CONST && kid->op_private & OPpCONST_BARE)
7937                )) {
7938         bad_type(1, "hash or array", PL_op_desc[o->op_type], kid);
7939         return o;
7940     }
7941     return ck_fun(o);
7942 }
7943
7944 /* A peephole optimizer.  We visit the ops in the order they're to execute.
7945  * See the comments at the top of this file for more details about when
7946  * peep() is called */
7947
7948 void
7949 Perl_peep(pTHX_ register OP *o)
7950 {
7951     dVAR;
7952     register OP* oldop = NULL;
7953
7954     if (!o || o->op_opt)
7955         return;
7956     ENTER;
7957     SAVEOP();
7958     SAVEVPTR(PL_curcop);
7959     for (; o; o = o->op_next) {
7960         if (o->op_opt)
7961             break;
7962         /* By default, this op has now been optimised. A couple of cases below
7963            clear this again.  */
7964         o->op_opt = 1;
7965         PL_op = o;
7966         switch (o->op_type) {
7967         case OP_SETSTATE:
7968         case OP_NEXTSTATE:
7969         case OP_DBSTATE:
7970             PL_curcop = ((COP*)o);              /* for warnings */
7971             break;
7972
7973         case OP_CONST:
7974             if (cSVOPo->op_private & OPpCONST_STRICT)
7975                 no_bareword_allowed(o);
7976 #ifdef USE_ITHREADS
7977         case OP_METHOD_NAMED:
7978             /* Relocate sv to the pad for thread safety.
7979              * Despite being a "constant", the SV is written to,
7980              * for reference counts, sv_upgrade() etc. */
7981             if (cSVOP->op_sv) {
7982                 const PADOFFSET ix = pad_alloc(OP_CONST, SVs_PADTMP);
7983                 if (o->op_type == OP_CONST && SvPADTMP(cSVOPo->op_sv)) {
7984                     /* If op_sv is already a PADTMP then it is being used by
7985                      * some pad, so make a copy. */
7986                     sv_setsv(PAD_SVl(ix),cSVOPo->op_sv);
7987                     SvREADONLY_on(PAD_SVl(ix));
7988                     SvREFCNT_dec(cSVOPo->op_sv);
7989                 }
7990                 else if (o->op_type == OP_CONST
7991                          && cSVOPo->op_sv == &PL_sv_undef) {
7992                     /* PL_sv_undef is hack - it's unsafe to store it in the
7993                        AV that is the pad, because av_fetch treats values of
7994                        PL_sv_undef as a "free" AV entry and will merrily
7995                        replace them with a new SV, causing pad_alloc to think
7996                        that this pad slot is free. (When, clearly, it is not)
7997                     */
7998                     SvOK_off(PAD_SVl(ix));
7999                     SvPADTMP_on(PAD_SVl(ix));
8000                     SvREADONLY_on(PAD_SVl(ix));
8001                 }
8002                 else {
8003                     SvREFCNT_dec(PAD_SVl(ix));
8004                     SvPADTMP_on(cSVOPo->op_sv);
8005                     PAD_SETSV(ix, cSVOPo->op_sv);
8006                     /* XXX I don't know how this isn't readonly already. */
8007                     SvREADONLY_on(PAD_SVl(ix));
8008                 }
8009                 cSVOPo->op_sv = NULL;
8010                 o->op_targ = ix;
8011             }
8012 #endif
8013             break;
8014
8015         case OP_CONCAT:
8016             if (o->op_next && o->op_next->op_type == OP_STRINGIFY) {
8017                 if (o->op_next->op_private & OPpTARGET_MY) {
8018                     if (o->op_flags & OPf_STACKED) /* chained concats */
8019                         break; /* ignore_optimization */
8020                     else {
8021                         /* assert(PL_opargs[o->op_type] & OA_TARGLEX); */
8022                         o->op_targ = o->op_next->op_targ;
8023                         o->op_next->op_targ = 0;
8024                         o->op_private |= OPpTARGET_MY;
8025                     }
8026                 }
8027                 op_null(o->op_next);
8028             }
8029             break;
8030         case OP_STUB:
8031             if ((o->op_flags & OPf_WANT) != OPf_WANT_LIST) {
8032                 break; /* Scalar stub must produce undef.  List stub is noop */
8033             }
8034             goto nothin;
8035         case OP_NULL:
8036             if (o->op_targ == OP_NEXTSTATE
8037                 || o->op_targ == OP_DBSTATE
8038                 || o->op_targ == OP_SETSTATE)
8039             {
8040                 PL_curcop = ((COP*)o);
8041             }
8042             /* XXX: We avoid setting op_seq here to prevent later calls
8043                to peep() from mistakenly concluding that optimisation
8044                has already occurred. This doesn't fix the real problem,
8045                though (See 20010220.007). AMS 20010719 */
8046             /* op_seq functionality is now replaced by op_opt */
8047             o->op_opt = 0;
8048             /* FALL THROUGH */
8049         case OP_SCALAR:
8050         case OP_LINESEQ:
8051         case OP_SCOPE:
8052         nothin:
8053             if (oldop && o->op_next) {
8054                 oldop->op_next = o->op_next;
8055                 o->op_opt = 0;
8056                 continue;
8057             }
8058             break;
8059
8060         case OP_PADAV:
8061         case OP_GV:
8062             if (o->op_type == OP_PADAV || o->op_next->op_type == OP_RV2AV) {
8063                 OP* const pop = (o->op_type == OP_PADAV) ?
8064                             o->op_next : o->op_next->op_next;
8065                 IV i;
8066                 if (pop && pop->op_type == OP_CONST &&
8067                     ((PL_op = pop->op_next)) &&
8068                     pop->op_next->op_type == OP_AELEM &&
8069                     !(pop->op_next->op_private &
8070                       (OPpLVAL_INTRO|OPpLVAL_DEFER|OPpDEREF|OPpMAYBE_LVSUB)) &&
8071                     (i = SvIV(((SVOP*)pop)->op_sv) - CopARYBASE_get(PL_curcop))
8072                                 <= 255 &&
8073                     i >= 0)
8074                 {
8075                     GV *gv;
8076                     if (cSVOPx(pop)->op_private & OPpCONST_STRICT)
8077                         no_bareword_allowed(pop);
8078                     if (o->op_type == OP_GV)
8079                         op_null(o->op_next);
8080                     op_null(pop->op_next);
8081                     op_null(pop);
8082                     o->op_flags |= pop->op_next->op_flags & OPf_MOD;
8083                     o->op_next = pop->op_next->op_next;
8084                     o->op_ppaddr = PL_ppaddr[OP_AELEMFAST];
8085                     o->op_private = (U8)i;
8086                     if (o->op_type == OP_GV) {
8087                         gv = cGVOPo_gv;
8088                         GvAVn(gv);
8089                     }
8090                     else
8091                         o->op_flags |= OPf_SPECIAL;
8092                     o->op_type = OP_AELEMFAST;
8093                 }
8094                 break;
8095             }
8096
8097             if (o->op_next->op_type == OP_RV2SV) {
8098                 if (!(o->op_next->op_private & OPpDEREF)) {
8099                     op_null(o->op_next);
8100                     o->op_private |= o->op_next->op_private & (OPpLVAL_INTRO
8101                                                                | OPpOUR_INTRO);
8102                     o->op_next = o->op_next->op_next;
8103                     o->op_type = OP_GVSV;
8104                     o->op_ppaddr = PL_ppaddr[OP_GVSV];
8105                 }
8106             }
8107             else if ((o->op_private & OPpEARLY_CV) && ckWARN(WARN_PROTOTYPE)) {
8108                 GV * const gv = cGVOPo_gv;
8109                 if (SvTYPE(gv) == SVt_PVGV && GvCV(gv) && SvPVX_const(GvCV(gv))) {
8110                     /* XXX could check prototype here instead of just carping */
8111                     SV * const sv = sv_newmortal();
8112                     gv_efullname3(sv, gv, NULL);
8113                     Perl_warner(aTHX_ packWARN(WARN_PROTOTYPE),
8114                                 "%"SVf"() called too early to check prototype",
8115                                 SVfARG(sv));
8116                 }
8117             }
8118             else if (o->op_next->op_type == OP_READLINE
8119                     && o->op_next->op_next->op_type == OP_CONCAT
8120                     && (o->op_next->op_next->op_flags & OPf_STACKED))
8121             {
8122                 /* Turn "$a .= <FH>" into an OP_RCATLINE. AMS 20010917 */
8123                 o->op_type   = OP_RCATLINE;
8124                 o->op_flags |= OPf_STACKED;
8125                 o->op_ppaddr = PL_ppaddr[OP_RCATLINE];
8126                 op_null(o->op_next->op_next);
8127                 op_null(o->op_next);
8128             }
8129
8130             break;
8131
8132         case OP_MAPWHILE:
8133         case OP_GREPWHILE:
8134         case OP_AND:
8135         case OP_OR:
8136         case OP_DOR:
8137         case OP_ANDASSIGN:
8138         case OP_ORASSIGN:
8139         case OP_DORASSIGN:
8140         case OP_COND_EXPR:
8141         case OP_RANGE:
8142         case OP_ONCE:
8143             while (cLOGOP->op_other->op_type == OP_NULL)
8144                 cLOGOP->op_other = cLOGOP->op_other->op_next;
8145             peep(cLOGOP->op_other); /* Recursive calls are not replaced by fptr calls */
8146             break;
8147
8148         case OP_ENTERLOOP:
8149         case OP_ENTERITER:
8150             while (cLOOP->op_redoop->op_type == OP_NULL)
8151                 cLOOP->op_redoop = cLOOP->op_redoop->op_next;
8152             peep(cLOOP->op_redoop);
8153             while (cLOOP->op_nextop->op_type == OP_NULL)
8154                 cLOOP->op_nextop = cLOOP->op_nextop->op_next;
8155             peep(cLOOP->op_nextop);
8156             while (cLOOP->op_lastop->op_type == OP_NULL)
8157                 cLOOP->op_lastop = cLOOP->op_lastop->op_next;
8158             peep(cLOOP->op_lastop);
8159             break;
8160
8161         case OP_SUBST:
8162             assert(!(cPMOP->op_pmflags & PMf_ONCE));
8163             while (cPMOP->op_pmstashstartu.op_pmreplstart &&
8164                    cPMOP->op_pmstashstartu.op_pmreplstart->op_type == OP_NULL)
8165                 cPMOP->op_pmstashstartu.op_pmreplstart
8166                     = cPMOP->op_pmstashstartu.op_pmreplstart->op_next;
8167             peep(cPMOP->op_pmstashstartu.op_pmreplstart);
8168             break;
8169
8170         case OP_EXEC:
8171             if (o->op_next && o->op_next->op_type == OP_NEXTSTATE
8172                 && ckWARN(WARN_SYNTAX))
8173             {
8174                 if (o->op_next->op_sibling) {
8175                     const OPCODE type = o->op_next->op_sibling->op_type;
8176                     if (type != OP_EXIT && type != OP_WARN && type != OP_DIE) {
8177                         const line_t oldline = CopLINE(PL_curcop);
8178                         CopLINE_set(PL_curcop, CopLINE((COP*)o->op_next));
8179                         Perl_warner(aTHX_ packWARN(WARN_EXEC),
8180                                     "Statement unlikely to be reached");
8181                         Perl_warner(aTHX_ packWARN(WARN_EXEC),
8182                                     "\t(Maybe you meant system() when you said exec()?)\n");
8183                         CopLINE_set(PL_curcop, oldline);
8184                     }
8185                 }
8186             }
8187             break;
8188
8189         case OP_HELEM: {
8190             UNOP *rop;
8191             SV *lexname;
8192             GV **fields;
8193             SV **svp, *sv;
8194             const char *key = NULL;
8195             STRLEN keylen;
8196
8197             if (((BINOP*)o)->op_last->op_type != OP_CONST)
8198                 break;
8199
8200             /* Make the CONST have a shared SV */
8201             svp = cSVOPx_svp(((BINOP*)o)->op_last);
8202             if ((!SvFAKE(sv = *svp) || !SvREADONLY(sv)) && !IS_PADCONST(sv)) {
8203                 key = SvPV_const(sv, keylen);
8204                 lexname = newSVpvn_share(key,
8205                                          SvUTF8(sv) ? -(I32)keylen : (I32)keylen,
8206                                          0);
8207                 SvREFCNT_dec(sv);
8208                 *svp = lexname;
8209             }
8210
8211             if ((o->op_private & (OPpLVAL_INTRO)))
8212                 break;
8213
8214             rop = (UNOP*)((BINOP*)o)->op_first;
8215             if (rop->op_type != OP_RV2HV || rop->op_first->op_type != OP_PADSV)
8216                 break;
8217             lexname = *av_fetch(PL_comppad_name, rop->op_first->op_targ, TRUE);
8218             if (!SvPAD_TYPED(lexname))
8219                 break;
8220             fields = (GV**)hv_fetchs(SvSTASH(lexname), "FIELDS", FALSE);
8221             if (!fields || !GvHV(*fields))
8222                 break;
8223             key = SvPV_const(*svp, keylen);
8224             if (!hv_fetch(GvHV(*fields), key,
8225                         SvUTF8(*svp) ? -(I32)keylen : (I32)keylen, FALSE))
8226             {
8227                 Perl_croak(aTHX_ "No such class field \"%s\" " 
8228                            "in variable %s of type %s", 
8229                       key, SvPV_nolen_const(lexname), HvNAME_get(SvSTASH(lexname)));
8230             }
8231
8232             break;
8233         }
8234
8235         case OP_HSLICE: {
8236             UNOP *rop;
8237             SV *lexname;
8238             GV **fields;
8239             SV **svp;
8240             const char *key;
8241             STRLEN keylen;
8242             SVOP *first_key_op, *key_op;
8243
8244             if ((o->op_private & (OPpLVAL_INTRO))
8245                 /* I bet there's always a pushmark... */
8246                 || ((LISTOP*)o)->op_first->op_sibling->op_type != OP_LIST)
8247                 /* hmmm, no optimization if list contains only one key. */
8248                 break;
8249             rop = (UNOP*)((LISTOP*)o)->op_last;
8250             if (rop->op_type != OP_RV2HV)
8251                 break;
8252             if (rop->op_first->op_type == OP_PADSV)
8253                 /* @$hash{qw(keys here)} */
8254                 rop = (UNOP*)rop->op_first;
8255             else {
8256                 /* @{$hash}{qw(keys here)} */
8257                 if (rop->op_first->op_type == OP_SCOPE 
8258                     && cLISTOPx(rop->op_first)->op_last->op_type == OP_PADSV)
8259                 {
8260                     rop = (UNOP*)cLISTOPx(rop->op_first)->op_last;
8261                 }
8262                 else
8263                     break;
8264             }
8265                     
8266             lexname = *av_fetch(PL_comppad_name, rop->op_targ, TRUE);
8267             if (!SvPAD_TYPED(lexname))
8268                 break;
8269             fields = (GV**)hv_fetchs(SvSTASH(lexname), "FIELDS", FALSE);
8270             if (!fields || !GvHV(*fields))
8271                 break;
8272             /* Again guessing that the pushmark can be jumped over.... */
8273             first_key_op = (SVOP*)((LISTOP*)((LISTOP*)o)->op_first->op_sibling)
8274                 ->op_first->op_sibling;
8275             for (key_op = first_key_op; key_op;
8276                  key_op = (SVOP*)key_op->op_sibling) {
8277                 if (key_op->op_type != OP_CONST)
8278                     continue;
8279                 svp = cSVOPx_svp(key_op);
8280                 key = SvPV_const(*svp, keylen);
8281                 if (!hv_fetch(GvHV(*fields), key, 
8282                             SvUTF8(*svp) ? -(I32)keylen : (I32)keylen, FALSE))
8283                 {
8284                     Perl_croak(aTHX_ "No such class field \"%s\" "
8285                                "in variable %s of type %s",
8286                           key, SvPV_nolen(lexname), HvNAME_get(SvSTASH(lexname)));
8287                 }
8288             }
8289             break;
8290         }
8291
8292         case OP_SORT: {
8293             /* will point to RV2AV or PADAV op on LHS/RHS of assign */
8294             OP *oleft;
8295             OP *o2;
8296
8297             /* check that RHS of sort is a single plain array */
8298             OP *oright = cUNOPo->op_first;
8299             if (!oright || oright->op_type != OP_PUSHMARK)
8300                 break;
8301
8302             /* reverse sort ... can be optimised.  */
8303             if (!cUNOPo->op_sibling) {
8304                 /* Nothing follows us on the list. */
8305                 OP * const reverse = o->op_next;
8306
8307                 if (reverse->op_type == OP_REVERSE &&
8308                     (reverse->op_flags & OPf_WANT) == OPf_WANT_LIST) {
8309                     OP * const pushmark = cUNOPx(reverse)->op_first;
8310                     if (pushmark && (pushmark->op_type == OP_PUSHMARK)
8311                         && (cUNOPx(pushmark)->op_sibling == o)) {
8312                         /* reverse -> pushmark -> sort */
8313                         o->op_private |= OPpSORT_REVERSE;
8314                         op_null(reverse);
8315                         pushmark->op_next = oright->op_next;
8316                         op_null(oright);
8317                     }
8318                 }
8319             }
8320
8321             /* make @a = sort @a act in-place */
8322
8323             oright = cUNOPx(oright)->op_sibling;
8324             if (!oright)
8325                 break;
8326             if (oright->op_type == OP_NULL) { /* skip sort block/sub */
8327                 oright = cUNOPx(oright)->op_sibling;
8328             }
8329
8330             if (!oright ||
8331                 (oright->op_type != OP_RV2AV && oright->op_type != OP_PADAV)
8332                 || oright->op_next != o
8333                 || (oright->op_private & OPpLVAL_INTRO)
8334             )
8335                 break;
8336
8337             /* o2 follows the chain of op_nexts through the LHS of the
8338              * assign (if any) to the aassign op itself */
8339             o2 = o->op_next;
8340             if (!o2 || o2->op_type != OP_NULL)
8341                 break;
8342             o2 = o2->op_next;
8343             if (!o2 || o2->op_type != OP_PUSHMARK)
8344                 break;
8345             o2 = o2->op_next;
8346             if (o2 && o2->op_type == OP_GV)
8347                 o2 = o2->op_next;
8348             if (!o2
8349                 || (o2->op_type != OP_PADAV && o2->op_type != OP_RV2AV)
8350                 || (o2->op_private & OPpLVAL_INTRO)
8351             )
8352                 break;
8353             oleft = o2;
8354             o2 = o2->op_next;
8355             if (!o2 || o2->op_type != OP_NULL)
8356                 break;
8357             o2 = o2->op_next;
8358             if (!o2 || o2->op_type != OP_AASSIGN
8359                     || (o2->op_flags & OPf_WANT) != OPf_WANT_VOID)
8360                 break;
8361
8362             /* check that the sort is the first arg on RHS of assign */
8363
8364             o2 = cUNOPx(o2)->op_first;
8365             if (!o2 || o2->op_type != OP_NULL)
8366                 break;
8367             o2 = cUNOPx(o2)->op_first;
8368             if (!o2 || o2->op_type != OP_PUSHMARK)
8369                 break;
8370             if (o2->op_sibling != o)
8371                 break;
8372
8373             /* check the array is the same on both sides */
8374             if (oleft->op_type == OP_RV2AV) {
8375                 if (oright->op_type != OP_RV2AV
8376                     || !cUNOPx(oright)->op_first
8377                     || cUNOPx(oright)->op_first->op_type != OP_GV
8378                     ||  cGVOPx_gv(cUNOPx(oleft)->op_first) !=
8379                         cGVOPx_gv(cUNOPx(oright)->op_first)
8380                 )
8381                     break;
8382             }
8383             else if (oright->op_type != OP_PADAV
8384                 || oright->op_targ != oleft->op_targ
8385             )
8386                 break;
8387
8388             /* transfer MODishness etc from LHS arg to RHS arg */
8389             oright->op_flags = oleft->op_flags;
8390             o->op_private |= OPpSORT_INPLACE;
8391
8392             /* excise push->gv->rv2av->null->aassign */
8393             o2 = o->op_next->op_next;
8394             op_null(o2); /* PUSHMARK */
8395             o2 = o2->op_next;
8396             if (o2->op_type == OP_GV) {
8397                 op_null(o2); /* GV */
8398                 o2 = o2->op_next;
8399             }
8400             op_null(o2); /* RV2AV or PADAV */
8401             o2 = o2->op_next->op_next;
8402             op_null(o2); /* AASSIGN */
8403
8404             o->op_next = o2->op_next;
8405
8406             break;
8407         }
8408
8409         case OP_REVERSE: {
8410             OP *ourmark, *theirmark, *ourlast, *iter, *expushmark, *rv2av;
8411             OP *gvop = NULL;
8412             LISTOP *enter, *exlist;
8413
8414             enter = (LISTOP *) o->op_next;
8415             if (!enter)
8416                 break;
8417             if (enter->op_type == OP_NULL) {
8418                 enter = (LISTOP *) enter->op_next;
8419                 if (!enter)
8420                     break;
8421             }
8422             /* for $a (...) will have OP_GV then OP_RV2GV here.
8423                for (...) just has an OP_GV.  */
8424             if (enter->op_type == OP_GV) {
8425                 gvop = (OP *) enter;
8426                 enter = (LISTOP *) enter->op_next;
8427                 if (!enter)
8428                     break;
8429                 if (enter->op_type == OP_RV2GV) {
8430                   enter = (LISTOP *) enter->op_next;
8431                   if (!enter)
8432                     break;
8433                 }
8434             }
8435
8436             if (enter->op_type != OP_ENTERITER)
8437                 break;
8438
8439             iter = enter->op_next;
8440             if (!iter || iter->op_type != OP_ITER)
8441                 break;
8442             
8443             expushmark = enter->op_first;
8444             if (!expushmark || expushmark->op_type != OP_NULL
8445                 || expushmark->op_targ != OP_PUSHMARK)
8446                 break;
8447
8448             exlist = (LISTOP *) expushmark->op_sibling;
8449             if (!exlist || exlist->op_type != OP_NULL
8450                 || exlist->op_targ != OP_LIST)
8451                 break;
8452
8453             if (exlist->op_last != o) {
8454                 /* Mmm. Was expecting to point back to this op.  */
8455                 break;
8456             }
8457             theirmark = exlist->op_first;
8458             if (!theirmark || theirmark->op_type != OP_PUSHMARK)
8459                 break;
8460
8461             if (theirmark->op_sibling != o) {
8462                 /* There's something between the mark and the reverse, eg
8463                    for (1, reverse (...))
8464                    so no go.  */
8465                 break;
8466             }
8467
8468             ourmark = ((LISTOP *)o)->op_first;
8469             if (!ourmark || ourmark->op_type != OP_PUSHMARK)
8470                 break;
8471
8472             ourlast = ((LISTOP *)o)->op_last;
8473             if (!ourlast || ourlast->op_next != o)
8474                 break;
8475
8476             rv2av = ourmark->op_sibling;
8477             if (rv2av && rv2av->op_type == OP_RV2AV && rv2av->op_sibling == 0
8478                 && rv2av->op_flags == (OPf_WANT_LIST | OPf_KIDS)
8479                 && enter->op_flags == (OPf_WANT_LIST | OPf_KIDS)) {
8480                 /* We're just reversing a single array.  */
8481                 rv2av->op_flags = OPf_WANT_SCALAR | OPf_KIDS | OPf_REF;
8482                 enter->op_flags |= OPf_STACKED;
8483             }
8484
8485             /* We don't have control over who points to theirmark, so sacrifice
8486                ours.  */
8487             theirmark->op_next = ourmark->op_next;
8488             theirmark->op_flags = ourmark->op_flags;
8489             ourlast->op_next = gvop ? gvop : (OP *) enter;
8490             op_null(ourmark);
8491             op_null(o);
8492             enter->op_private |= OPpITER_REVERSED;
8493             iter->op_private |= OPpITER_REVERSED;
8494             
8495             break;
8496         }
8497
8498         case OP_SASSIGN: {
8499             OP *rv2gv;
8500             UNOP *refgen, *rv2cv;
8501             LISTOP *exlist;
8502
8503             if ((o->op_flags & OPf_WANT) != OPf_WANT_VOID)
8504                 break;
8505
8506             if ((o->op_private & ~OPpASSIGN_BACKWARDS) != 2)
8507                 break;
8508
8509             rv2gv = ((BINOP *)o)->op_last;
8510             if (!rv2gv || rv2gv->op_type != OP_RV2GV)
8511                 break;
8512
8513             refgen = (UNOP *)((BINOP *)o)->op_first;
8514
8515             if (!refgen || refgen->op_type != OP_REFGEN)
8516                 break;
8517
8518             exlist = (LISTOP *)refgen->op_first;
8519             if (!exlist || exlist->op_type != OP_NULL
8520                 || exlist->op_targ != OP_LIST)
8521                 break;
8522
8523             if (exlist->op_first->op_type != OP_PUSHMARK)
8524                 break;
8525
8526             rv2cv = (UNOP*)exlist->op_last;
8527
8528             if (rv2cv->op_type != OP_RV2CV)
8529                 break;
8530
8531             assert ((rv2gv->op_private & OPpDONT_INIT_GV) == 0);
8532             assert ((o->op_private & OPpASSIGN_CV_TO_GV) == 0);
8533             assert ((rv2cv->op_private & OPpMAY_RETURN_CONSTANT) == 0);
8534
8535             o->op_private |= OPpASSIGN_CV_TO_GV;
8536             rv2gv->op_private |= OPpDONT_INIT_GV;
8537             rv2cv->op_private |= OPpMAY_RETURN_CONSTANT;
8538
8539             break;
8540         }
8541
8542         
8543         case OP_QR:
8544         case OP_MATCH:
8545             if (!(cPMOP->op_pmflags & PMf_ONCE)) {
8546                 assert (!cPMOP->op_pmstashstartu.op_pmreplstart);
8547             }
8548             break;
8549         }
8550         oldop = o;
8551     }
8552     LEAVE;
8553 }
8554
8555 const char*
8556 Perl_custom_op_name(pTHX_ const OP* o)
8557 {
8558     dVAR;
8559     const IV index = PTR2IV(o->op_ppaddr);
8560     SV* keysv;
8561     HE* he;
8562
8563     if (!PL_custom_op_names) /* This probably shouldn't happen */
8564         return (char *)PL_op_name[OP_CUSTOM];
8565
8566     keysv = sv_2mortal(newSViv(index));
8567
8568     he = hv_fetch_ent(PL_custom_op_names, keysv, 0, 0);
8569     if (!he)
8570         return (char *)PL_op_name[OP_CUSTOM]; /* Don't know who you are */
8571
8572     return SvPV_nolen(HeVAL(he));
8573 }
8574
8575 const char*
8576 Perl_custom_op_desc(pTHX_ const OP* o)
8577 {
8578     dVAR;
8579     const IV index = PTR2IV(o->op_ppaddr);
8580     SV* keysv;
8581     HE* he;
8582
8583     if (!PL_custom_op_descs)
8584         return (char *)PL_op_desc[OP_CUSTOM];
8585
8586     keysv = sv_2mortal(newSViv(index));
8587
8588     he = hv_fetch_ent(PL_custom_op_descs, keysv, 0, 0);
8589     if (!he)
8590         return (char *)PL_op_desc[OP_CUSTOM];
8591
8592     return SvPV_nolen(HeVAL(he));
8593 }
8594
8595 #include "XSUB.h"
8596
8597 /* Efficient sub that returns a constant scalar value. */
8598 static void
8599 const_sv_xsub(pTHX_ CV* cv)
8600 {
8601     dVAR;
8602     dXSARGS;
8603     if (items != 0) {
8604         NOOP;
8605 #if 0
8606         Perl_croak(aTHX_ "usage: %s::%s()",
8607                    HvNAME_get(GvSTASH(CvGV(cv))), GvNAME(CvGV(cv)));
8608 #endif
8609     }
8610     EXTEND(sp, 1);
8611     ST(0) = (SV*)XSANY.any_ptr;
8612     XSRETURN(1);
8613 }
8614
8615 /*
8616  * Local variables:
8617  * c-indentation-style: bsd
8618  * c-basic-offset: 4
8619  * indent-tabs-mode: t
8620  * End:
8621  *
8622  * ex: set ts=8 sts=4 sw=4 noet:
8623  */