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