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