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