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