This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
48b2a36fa11648c1d3bcf84289caf6d10b245ce7
[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
2315     pad_block_start(full);
2316     SAVEHINTS();
2317     PL_hints &= ~HINT_BLOCK_SCOPE;
2318     SAVECOMPILEWARNINGS();
2319     PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
2320
2321     CALL_BLOCK_HOOKS(start, full);
2322
2323     return retval;
2324 }
2325
2326 OP*
2327 Perl_block_end(pTHX_ I32 floor, OP *seq)
2328 {
2329     dVAR;
2330     const int needblockscope = PL_hints & HINT_BLOCK_SCOPE;
2331     OP* retval = scalarseq(seq);
2332
2333     CALL_BLOCK_HOOKS(pre_end, &retval);
2334
2335     LEAVE_SCOPE(floor);
2336     CopHINTS_set(&PL_compiling, PL_hints);
2337     if (needblockscope)
2338         PL_hints |= HINT_BLOCK_SCOPE; /* propagate out */
2339     pad_leavemy();
2340
2341     CALL_BLOCK_HOOKS(post_end, &retval);
2342
2343     return retval;
2344 }
2345
2346 /*
2347 =head1 Compile-time scope hooks
2348
2349 =for apidoc Ao||blockhook_register
2350
2351 Register a set of hooks to be called when the Perl lexical scope changes
2352 at compile time. See L<perlguts/"Compile-time scope hooks">.
2353
2354 =cut
2355 */
2356
2357 void
2358 Perl_blockhook_register(pTHX_ BHK *hk)
2359 {
2360     PERL_ARGS_ASSERT_BLOCKHOOK_REGISTER;
2361
2362     Perl_av_create_and_push(aTHX_ &PL_blockhooks, newSViv(PTR2IV(hk)));
2363 }
2364
2365 STATIC OP *
2366 S_newDEFSVOP(pTHX)
2367 {
2368     dVAR;
2369     const PADOFFSET offset = Perl_pad_findmy(aTHX_ STR_WITH_LEN("$_"), 0);
2370     if (offset == NOT_IN_PAD || PAD_COMPNAME_FLAGS_isOUR(offset)) {
2371         return newSVREF(newGVOP(OP_GV, 0, PL_defgv));
2372     }
2373     else {
2374         OP * const o = newOP(OP_PADSV, 0);
2375         o->op_targ = offset;
2376         return o;
2377     }
2378 }
2379
2380 void
2381 Perl_newPROG(pTHX_ OP *o)
2382 {
2383     dVAR;
2384
2385     PERL_ARGS_ASSERT_NEWPROG;
2386
2387     if (PL_in_eval) {
2388         if (PL_eval_root)
2389                 return;
2390         PL_eval_root = newUNOP(OP_LEAVEEVAL,
2391                                ((PL_in_eval & EVAL_KEEPERR)
2392                                 ? OPf_SPECIAL : 0), o);
2393         PL_eval_start = linklist(PL_eval_root);
2394         PL_eval_root->op_private |= OPpREFCOUNTED;
2395         OpREFCNT_set(PL_eval_root, 1);
2396         PL_eval_root->op_next = 0;
2397         CALL_PEEP(PL_eval_start);
2398     }
2399     else {
2400         if (o->op_type == OP_STUB) {
2401             PL_comppad_name = 0;
2402             PL_compcv = 0;
2403             S_op_destroy(aTHX_ o);
2404             return;
2405         }
2406         PL_main_root = scope(sawparens(scalarvoid(o)));
2407         PL_curcop = &PL_compiling;
2408         PL_main_start = LINKLIST(PL_main_root);
2409         PL_main_root->op_private |= OPpREFCOUNTED;
2410         OpREFCNT_set(PL_main_root, 1);
2411         PL_main_root->op_next = 0;
2412         CALL_PEEP(PL_main_start);
2413         PL_compcv = 0;
2414
2415         /* Register with debugger */
2416         if (PERLDB_INTER) {
2417             CV * const cv = get_cvs("DB::postponed", 0);
2418             if (cv) {
2419                 dSP;
2420                 PUSHMARK(SP);
2421                 XPUSHs(MUTABLE_SV(CopFILEGV(&PL_compiling)));
2422                 PUTBACK;
2423                 call_sv(MUTABLE_SV(cv), G_DISCARD);
2424             }
2425         }
2426     }
2427 }
2428
2429 OP *
2430 Perl_localize(pTHX_ OP *o, I32 lex)
2431 {
2432     dVAR;
2433
2434     PERL_ARGS_ASSERT_LOCALIZE;
2435
2436     if (o->op_flags & OPf_PARENS)
2437 /* [perl #17376]: this appears to be premature, and results in code such as
2438    C< our(%x); > executing in list mode rather than void mode */
2439 #if 0
2440         list(o);
2441 #else
2442         NOOP;
2443 #endif
2444     else {
2445         if ( PL_parser->bufptr > PL_parser->oldbufptr
2446             && PL_parser->bufptr[-1] == ','
2447             && ckWARN(WARN_PARENTHESIS))
2448         {
2449             char *s = PL_parser->bufptr;
2450             bool sigil = FALSE;
2451
2452             /* some heuristics to detect a potential error */
2453             while (*s && (strchr(", \t\n", *s)))
2454                 s++;
2455
2456             while (1) {
2457                 if (*s && strchr("@$%*", *s) && *++s
2458                        && (isALNUM(*s) || UTF8_IS_CONTINUED(*s))) {
2459                     s++;
2460                     sigil = TRUE;
2461                     while (*s && (isALNUM(*s) || UTF8_IS_CONTINUED(*s)))
2462                         s++;
2463                     while (*s && (strchr(", \t\n", *s)))
2464                         s++;
2465                 }
2466                 else
2467                     break;
2468             }
2469             if (sigil && (*s == ';' || *s == '=')) {
2470                 Perl_warner(aTHX_ packWARN(WARN_PARENTHESIS),
2471                                 "Parentheses missing around \"%s\" list",
2472                                 lex
2473                                     ? (PL_parser->in_my == KEY_our
2474                                         ? "our"
2475                                         : PL_parser->in_my == KEY_state
2476                                             ? "state"
2477                                             : "my")
2478                                     : "local");
2479             }
2480         }
2481     }
2482     if (lex)
2483         o = my(o);
2484     else
2485         o = mod(o, OP_NULL);            /* a bit kludgey */
2486     PL_parser->in_my = FALSE;
2487     PL_parser->in_my_stash = NULL;
2488     return o;
2489 }
2490
2491 OP *
2492 Perl_jmaybe(pTHX_ OP *o)
2493 {
2494     PERL_ARGS_ASSERT_JMAYBE;
2495
2496     if (o->op_type == OP_LIST) {
2497         OP * const o2
2498             = newSVREF(newGVOP(OP_GV, 0, gv_fetchpvs(";", GV_ADD|GV_NOTQUAL, SVt_PV)));
2499         o = convert(OP_JOIN, 0, prepend_elem(OP_LIST, o2, o));
2500     }
2501     return o;
2502 }
2503
2504 static OP *
2505 S_fold_constants(pTHX_ register OP *o)
2506 {
2507     dVAR;
2508     register OP * VOL curop;
2509     OP *newop;
2510     VOL I32 type = o->op_type;
2511     SV * VOL sv = NULL;
2512     int ret = 0;
2513     I32 oldscope;
2514     OP *old_next;
2515     SV * const oldwarnhook = PL_warnhook;
2516     SV * const olddiehook  = PL_diehook;
2517     COP not_compiling;
2518     dJMPENV;
2519
2520     PERL_ARGS_ASSERT_FOLD_CONSTANTS;
2521
2522     if (PL_opargs[type] & OA_RETSCALAR)
2523         scalar(o);
2524     if (PL_opargs[type] & OA_TARGET && !o->op_targ)
2525         o->op_targ = pad_alloc(type, SVs_PADTMP);
2526
2527     /* integerize op, unless it happens to be C<-foo>.
2528      * XXX should pp_i_negate() do magic string negation instead? */
2529     if ((PL_opargs[type] & OA_OTHERINT) && (PL_hints & HINT_INTEGER)
2530         && !(type == OP_NEGATE && cUNOPo->op_first->op_type == OP_CONST
2531              && (cUNOPo->op_first->op_private & OPpCONST_BARE)))
2532     {
2533         o->op_ppaddr = PL_ppaddr[type = ++(o->op_type)];
2534     }
2535
2536     if (!(PL_opargs[type] & OA_FOLDCONST))
2537         goto nope;
2538
2539     switch (type) {
2540     case OP_NEGATE:
2541         /* XXX might want a ck_negate() for this */
2542         cUNOPo->op_first->op_private &= ~OPpCONST_STRICT;
2543         break;
2544     case OP_UCFIRST:
2545     case OP_LCFIRST:
2546     case OP_UC:
2547     case OP_LC:
2548     case OP_SLT:
2549     case OP_SGT:
2550     case OP_SLE:
2551     case OP_SGE:
2552     case OP_SCMP:
2553         /* XXX what about the numeric ops? */
2554         if (PL_hints & HINT_LOCALE)
2555             goto nope;
2556         break;
2557     }
2558
2559     if (PL_parser && PL_parser->error_count)
2560         goto nope;              /* Don't try to run w/ errors */
2561
2562     for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
2563         const OPCODE type = curop->op_type;
2564         if ((type != OP_CONST || (curop->op_private & OPpCONST_BARE)) &&
2565             type != OP_LIST &&
2566             type != OP_SCALAR &&
2567             type != OP_NULL &&
2568             type != OP_PUSHMARK)
2569         {
2570             goto nope;
2571         }
2572     }
2573
2574     curop = LINKLIST(o);
2575     old_next = o->op_next;
2576     o->op_next = 0;
2577     PL_op = curop;
2578
2579     oldscope = PL_scopestack_ix;
2580     create_eval_scope(G_FAKINGEVAL);
2581
2582     /* Verify that we don't need to save it:  */
2583     assert(PL_curcop == &PL_compiling);
2584     StructCopy(&PL_compiling, &not_compiling, COP);
2585     PL_curcop = &not_compiling;
2586     /* The above ensures that we run with all the correct hints of the
2587        currently compiling COP, but that IN_PERL_RUNTIME is not true. */
2588     assert(IN_PERL_RUNTIME);
2589     PL_warnhook = PERL_WARNHOOK_FATAL;
2590     PL_diehook  = NULL;
2591     JMPENV_PUSH(ret);
2592
2593     switch (ret) {
2594     case 0:
2595         CALLRUNOPS(aTHX);
2596         sv = *(PL_stack_sp--);
2597         if (o->op_targ && sv == PAD_SV(o->op_targ))     /* grab pad temp? */
2598             pad_swipe(o->op_targ,  FALSE);
2599         else if (SvTEMP(sv)) {                  /* grab mortal temp? */
2600             SvREFCNT_inc_simple_void(sv);
2601             SvTEMP_off(sv);
2602         }
2603         break;
2604     case 3:
2605         /* Something tried to die.  Abandon constant folding.  */
2606         /* Pretend the error never happened.  */
2607         CLEAR_ERRSV();
2608         o->op_next = old_next;
2609         break;
2610     default:
2611         JMPENV_POP;
2612         /* Don't expect 1 (setjmp failed) or 2 (something called my_exit)  */
2613         PL_warnhook = oldwarnhook;
2614         PL_diehook  = olddiehook;
2615         /* XXX note that this croak may fail as we've already blown away
2616          * the stack - eg any nested evals */
2617         Perl_croak(aTHX_ "panic: fold_constants JMPENV_PUSH returned %d", ret);
2618     }
2619     JMPENV_POP;
2620     PL_warnhook = oldwarnhook;
2621     PL_diehook  = olddiehook;
2622     PL_curcop = &PL_compiling;
2623
2624     if (PL_scopestack_ix > oldscope)
2625         delete_eval_scope();
2626
2627     if (ret)
2628         goto nope;
2629
2630 #ifndef PERL_MAD
2631     op_free(o);
2632 #endif
2633     assert(sv);
2634     if (type == OP_RV2GV)
2635         newop = newGVOP(OP_GV, 0, MUTABLE_GV(sv));
2636     else
2637         newop = newSVOP(OP_CONST, 0, MUTABLE_SV(sv));
2638     op_getmad(o,newop,'f');
2639     return newop;
2640
2641  nope:
2642     return o;
2643 }
2644
2645 static OP *
2646 S_gen_constant_list(pTHX_ register OP *o)
2647 {
2648     dVAR;
2649     register OP *curop;
2650     const I32 oldtmps_floor = PL_tmps_floor;
2651
2652     list(o);
2653     if (PL_parser && PL_parser->error_count)
2654         return o;               /* Don't attempt to run with errors */
2655
2656     PL_op = curop = LINKLIST(o);
2657     o->op_next = 0;
2658     CALL_PEEP(curop);
2659     pp_pushmark();
2660     CALLRUNOPS(aTHX);
2661     PL_op = curop;
2662     assert (!(curop->op_flags & OPf_SPECIAL));
2663     assert(curop->op_type == OP_RANGE);
2664     pp_anonlist();
2665     PL_tmps_floor = oldtmps_floor;
2666
2667     o->op_type = OP_RV2AV;
2668     o->op_ppaddr = PL_ppaddr[OP_RV2AV];
2669     o->op_flags &= ~OPf_REF;    /* treat \(1..2) like an ordinary list */
2670     o->op_flags |= OPf_PARENS;  /* and flatten \(1..2,3) */
2671     o->op_opt = 0;              /* needs to be revisited in peep() */
2672     curop = ((UNOP*)o)->op_first;
2673     ((UNOP*)o)->op_first = newSVOP(OP_CONST, 0, SvREFCNT_inc_NN(*PL_stack_sp--));
2674 #ifdef PERL_MAD
2675     op_getmad(curop,o,'O');
2676 #else
2677     op_free(curop);
2678 #endif
2679     linklist(o);
2680     return list(o);
2681 }
2682
2683 OP *
2684 Perl_convert(pTHX_ I32 type, I32 flags, OP *o)
2685 {
2686     dVAR;
2687     if (!o || o->op_type != OP_LIST)
2688         o = newLISTOP(OP_LIST, 0, o, NULL);
2689     else
2690         o->op_flags &= ~OPf_WANT;
2691
2692     if (!(PL_opargs[type] & OA_MARK))
2693         op_null(cLISTOPo->op_first);
2694
2695     o->op_type = (OPCODE)type;
2696     o->op_ppaddr = PL_ppaddr[type];
2697     o->op_flags |= flags;
2698
2699     o = CHECKOP(type, o);
2700     if (o->op_type != (unsigned)type)
2701         return o;
2702
2703     return fold_constants(o);
2704 }
2705
2706 /* List constructors */
2707
2708 OP *
2709 Perl_append_elem(pTHX_ I32 type, OP *first, OP *last)
2710 {
2711     if (!first)
2712         return last;
2713
2714     if (!last)
2715         return first;
2716
2717     if (first->op_type != (unsigned)type
2718         || (type == OP_LIST && (first->op_flags & OPf_PARENS)))
2719     {
2720         return newLISTOP(type, 0, first, last);
2721     }
2722
2723     if (first->op_flags & OPf_KIDS)
2724         ((LISTOP*)first)->op_last->op_sibling = last;
2725     else {
2726         first->op_flags |= OPf_KIDS;
2727         ((LISTOP*)first)->op_first = last;
2728     }
2729     ((LISTOP*)first)->op_last = last;
2730     return first;
2731 }
2732
2733 OP *
2734 Perl_append_list(pTHX_ I32 type, LISTOP *first, LISTOP *last)
2735 {
2736     if (!first)
2737         return (OP*)last;
2738
2739     if (!last)
2740         return (OP*)first;
2741
2742     if (first->op_type != (unsigned)type)
2743         return prepend_elem(type, (OP*)first, (OP*)last);
2744
2745     if (last->op_type != (unsigned)type)
2746         return append_elem(type, (OP*)first, (OP*)last);
2747
2748     first->op_last->op_sibling = last->op_first;
2749     first->op_last = last->op_last;
2750     first->op_flags |= (last->op_flags & OPf_KIDS);
2751
2752 #ifdef PERL_MAD
2753     if (last->op_first && first->op_madprop) {
2754         MADPROP *mp = last->op_first->op_madprop;
2755         if (mp) {
2756             while (mp->mad_next)
2757                 mp = mp->mad_next;
2758             mp->mad_next = first->op_madprop;
2759         }
2760         else {
2761             last->op_first->op_madprop = first->op_madprop;
2762         }
2763     }
2764     first->op_madprop = last->op_madprop;
2765     last->op_madprop = 0;
2766 #endif
2767
2768     S_op_destroy(aTHX_ (OP*)last);
2769
2770     return (OP*)first;
2771 }
2772
2773 OP *
2774 Perl_prepend_elem(pTHX_ I32 type, OP *first, OP *last)
2775 {
2776     if (!first)
2777         return last;
2778
2779     if (!last)
2780         return first;
2781
2782     if (last->op_type == (unsigned)type) {
2783         if (type == OP_LIST) {  /* already a PUSHMARK there */
2784             first->op_sibling = ((LISTOP*)last)->op_first->op_sibling;
2785             ((LISTOP*)last)->op_first->op_sibling = first;
2786             if (!(first->op_flags & OPf_PARENS))
2787                 last->op_flags &= ~OPf_PARENS;
2788         }
2789         else {
2790             if (!(last->op_flags & OPf_KIDS)) {
2791                 ((LISTOP*)last)->op_last = first;
2792                 last->op_flags |= OPf_KIDS;
2793             }
2794             first->op_sibling = ((LISTOP*)last)->op_first;
2795             ((LISTOP*)last)->op_first = first;
2796         }
2797         last->op_flags |= OPf_KIDS;
2798         return last;
2799     }
2800
2801     return newLISTOP(type, 0, first, last);
2802 }
2803
2804 /* Constructors */
2805
2806 #ifdef PERL_MAD
2807  
2808 TOKEN *
2809 Perl_newTOKEN(pTHX_ I32 optype, YYSTYPE lval, MADPROP* madprop)
2810 {
2811     TOKEN *tk;
2812     Newxz(tk, 1, TOKEN);
2813     tk->tk_type = (OPCODE)optype;
2814     tk->tk_type = 12345;
2815     tk->tk_lval = lval;
2816     tk->tk_mad = madprop;
2817     return tk;
2818 }
2819
2820 void
2821 Perl_token_free(pTHX_ TOKEN* tk)
2822 {
2823     PERL_ARGS_ASSERT_TOKEN_FREE;
2824
2825     if (tk->tk_type != 12345)
2826         return;
2827     mad_free(tk->tk_mad);
2828     Safefree(tk);
2829 }
2830
2831 void
2832 Perl_token_getmad(pTHX_ TOKEN* tk, OP* o, char slot)
2833 {
2834     MADPROP* mp;
2835     MADPROP* tm;
2836
2837     PERL_ARGS_ASSERT_TOKEN_GETMAD;
2838
2839     if (tk->tk_type != 12345) {
2840         Perl_warner(aTHX_ packWARN(WARN_MISC),
2841              "Invalid TOKEN object ignored");
2842         return;
2843     }
2844     tm = tk->tk_mad;
2845     if (!tm)
2846         return;
2847
2848     /* faked up qw list? */
2849     if (slot == '(' &&
2850         tm->mad_type == MAD_SV &&
2851         SvPVX((SV *)tm->mad_val)[0] == 'q')
2852             slot = 'x';
2853
2854     if (o) {
2855         mp = o->op_madprop;
2856         if (mp) {
2857             for (;;) {
2858                 /* pretend constant fold didn't happen? */
2859                 if (mp->mad_key == 'f' &&
2860                     (o->op_type == OP_CONST ||
2861                      o->op_type == OP_GV) )
2862                 {
2863                     token_getmad(tk,(OP*)mp->mad_val,slot);
2864                     return;
2865                 }
2866                 if (!mp->mad_next)
2867                     break;
2868                 mp = mp->mad_next;
2869             }
2870             mp->mad_next = tm;
2871             mp = mp->mad_next;
2872         }
2873         else {
2874             o->op_madprop = tm;
2875             mp = o->op_madprop;
2876         }
2877         if (mp->mad_key == 'X')
2878             mp->mad_key = slot; /* just change the first one */
2879
2880         tk->tk_mad = 0;
2881     }
2882     else
2883         mad_free(tm);
2884     Safefree(tk);
2885 }
2886
2887 void
2888 Perl_op_getmad_weak(pTHX_ OP* from, OP* o, char slot)
2889 {
2890     MADPROP* mp;
2891     if (!from)
2892         return;
2893     if (o) {
2894         mp = o->op_madprop;
2895         if (mp) {
2896             for (;;) {
2897                 /* pretend constant fold didn't happen? */
2898                 if (mp->mad_key == 'f' &&
2899                     (o->op_type == OP_CONST ||
2900                      o->op_type == OP_GV) )
2901                 {
2902                     op_getmad(from,(OP*)mp->mad_val,slot);
2903                     return;
2904                 }
2905                 if (!mp->mad_next)
2906                     break;
2907                 mp = mp->mad_next;
2908             }
2909             mp->mad_next = newMADPROP(slot,MAD_OP,from,0);
2910         }
2911         else {
2912             o->op_madprop = newMADPROP(slot,MAD_OP,from,0);
2913         }
2914     }
2915 }
2916
2917 void
2918 Perl_op_getmad(pTHX_ OP* from, OP* o, char slot)
2919 {
2920     MADPROP* mp;
2921     if (!from)
2922         return;
2923     if (o) {
2924         mp = o->op_madprop;
2925         if (mp) {
2926             for (;;) {
2927                 /* pretend constant fold didn't happen? */
2928                 if (mp->mad_key == 'f' &&
2929                     (o->op_type == OP_CONST ||
2930                      o->op_type == OP_GV) )
2931                 {
2932                     op_getmad(from,(OP*)mp->mad_val,slot);
2933                     return;
2934                 }
2935                 if (!mp->mad_next)
2936                     break;
2937                 mp = mp->mad_next;
2938             }
2939             mp->mad_next = newMADPROP(slot,MAD_OP,from,1);
2940         }
2941         else {
2942             o->op_madprop = newMADPROP(slot,MAD_OP,from,1);
2943         }
2944     }
2945     else {
2946         PerlIO_printf(PerlIO_stderr(),
2947                       "DESTROYING op = %0"UVxf"\n", PTR2UV(from));
2948         op_free(from);
2949     }
2950 }
2951
2952 void
2953 Perl_prepend_madprops(pTHX_ MADPROP* mp, OP* o, char slot)
2954 {
2955     MADPROP* tm;
2956     if (!mp || !o)
2957         return;
2958     if (slot)
2959         mp->mad_key = slot;
2960     tm = o->op_madprop;
2961     o->op_madprop = mp;
2962     for (;;) {
2963         if (!mp->mad_next)
2964             break;
2965         mp = mp->mad_next;
2966     }
2967     mp->mad_next = tm;
2968 }
2969
2970 void
2971 Perl_append_madprops(pTHX_ MADPROP* tm, OP* o, char slot)
2972 {
2973     if (!o)
2974         return;
2975     addmad(tm, &(o->op_madprop), slot);
2976 }
2977
2978 void
2979 Perl_addmad(pTHX_ MADPROP* tm, MADPROP** root, char slot)
2980 {
2981     MADPROP* mp;
2982     if (!tm || !root)
2983         return;
2984     if (slot)
2985         tm->mad_key = slot;
2986     mp = *root;
2987     if (!mp) {
2988         *root = tm;
2989         return;
2990     }
2991     for (;;) {
2992         if (!mp->mad_next)
2993             break;
2994         mp = mp->mad_next;
2995     }
2996     mp->mad_next = tm;
2997 }
2998
2999 MADPROP *
3000 Perl_newMADsv(pTHX_ char key, SV* sv)
3001 {
3002     PERL_ARGS_ASSERT_NEWMADSV;
3003
3004     return newMADPROP(key, MAD_SV, sv, 0);
3005 }
3006
3007 MADPROP *
3008 Perl_newMADPROP(pTHX_ char key, char type, void* val, I32 vlen)
3009 {
3010     MADPROP *mp;
3011     Newxz(mp, 1, MADPROP);
3012     mp->mad_next = 0;
3013     mp->mad_key = key;
3014     mp->mad_vlen = vlen;
3015     mp->mad_type = type;
3016     mp->mad_val = val;
3017 /*    PerlIO_printf(PerlIO_stderr(), "NEW  mp = %0x\n", mp);  */
3018     return mp;
3019 }
3020
3021 void
3022 Perl_mad_free(pTHX_ MADPROP* mp)
3023 {
3024 /*    PerlIO_printf(PerlIO_stderr(), "FREE mp = %0x\n", mp); */
3025     if (!mp)
3026         return;
3027     if (mp->mad_next)
3028         mad_free(mp->mad_next);
3029 /*    if (PL_parser && PL_parser->lex_state != LEX_NOTPARSING && mp->mad_vlen)
3030         PerlIO_printf(PerlIO_stderr(), "DESTROYING '%c'=<%s>\n", mp->mad_key & 255, mp->mad_val); */
3031     switch (mp->mad_type) {
3032     case MAD_NULL:
3033         break;
3034     case MAD_PV:
3035         Safefree((char*)mp->mad_val);
3036         break;
3037     case MAD_OP:
3038         if (mp->mad_vlen)       /* vlen holds "strong/weak" boolean */
3039             op_free((OP*)mp->mad_val);
3040         break;
3041     case MAD_SV:
3042         sv_free(MUTABLE_SV(mp->mad_val));
3043         break;
3044     default:
3045         PerlIO_printf(PerlIO_stderr(), "Unrecognized mad\n");
3046         break;
3047     }
3048     Safefree(mp);
3049 }
3050
3051 #endif
3052
3053 OP *
3054 Perl_newNULLLIST(pTHX)
3055 {
3056     return newOP(OP_STUB, 0);
3057 }
3058
3059 static OP *
3060 S_force_list(pTHX_ OP *o)
3061 {
3062     if (!o || o->op_type != OP_LIST)
3063         o = newLISTOP(OP_LIST, 0, o, NULL);
3064     op_null(o);
3065     return o;
3066 }
3067
3068 OP *
3069 Perl_newLISTOP(pTHX_ I32 type, I32 flags, OP *first, OP *last)
3070 {
3071     dVAR;
3072     LISTOP *listop;
3073
3074     assert((PL_opargs[type] & OA_CLASS_MASK) == OA_LISTOP);
3075
3076     NewOp(1101, listop, 1, LISTOP);
3077
3078     listop->op_type = (OPCODE)type;
3079     listop->op_ppaddr = PL_ppaddr[type];
3080     if (first || last)
3081         flags |= OPf_KIDS;
3082     listop->op_flags = (U8)flags;
3083
3084     if (!last && first)
3085         last = first;
3086     else if (!first && last)
3087         first = last;
3088     else if (first)
3089         first->op_sibling = last;
3090     listop->op_first = first;
3091     listop->op_last = last;
3092     if (type == OP_LIST) {
3093         OP* const pushop = newOP(OP_PUSHMARK, 0);
3094         pushop->op_sibling = first;
3095         listop->op_first = pushop;
3096         listop->op_flags |= OPf_KIDS;
3097         if (!last)
3098             listop->op_last = pushop;
3099     }
3100
3101     return CHECKOP(type, listop);
3102 }
3103
3104 OP *
3105 Perl_newOP(pTHX_ I32 type, I32 flags)
3106 {
3107     dVAR;
3108     OP *o;
3109
3110     assert((PL_opargs[type] & OA_CLASS_MASK) == OA_BASEOP
3111         || (PL_opargs[type] & OA_CLASS_MASK) == OA_BASEOP_OR_UNOP
3112         || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP
3113         || (PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP);
3114
3115     NewOp(1101, o, 1, OP);
3116     o->op_type = (OPCODE)type;
3117     o->op_ppaddr = PL_ppaddr[type];
3118     o->op_flags = (U8)flags;
3119     o->op_latefree = 0;
3120     o->op_latefreed = 0;
3121     o->op_attached = 0;
3122
3123     o->op_next = o;
3124     o->op_private = (U8)(0 | (flags >> 8));
3125     if (PL_opargs[type] & OA_RETSCALAR)
3126         scalar(o);
3127     if (PL_opargs[type] & OA_TARGET)
3128         o->op_targ = pad_alloc(type, SVs_PADTMP);
3129     return CHECKOP(type, o);
3130 }
3131
3132 OP *
3133 Perl_newUNOP(pTHX_ I32 type, I32 flags, OP *first)
3134 {
3135     dVAR;
3136     UNOP *unop;
3137
3138     assert((PL_opargs[type] & OA_CLASS_MASK) == OA_UNOP
3139         || (PL_opargs[type] & OA_CLASS_MASK) == OA_BASEOP_OR_UNOP
3140         || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP
3141         || (PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP
3142         || type == OP_SASSIGN
3143         || type == OP_ENTERTRY
3144         || type == OP_NULL );
3145
3146     if (!first)
3147         first = newOP(OP_STUB, 0);
3148     if (PL_opargs[type] & OA_MARK)
3149         first = force_list(first);
3150
3151     NewOp(1101, unop, 1, UNOP);
3152     unop->op_type = (OPCODE)type;
3153     unop->op_ppaddr = PL_ppaddr[type];
3154     unop->op_first = first;
3155     unop->op_flags = (U8)(flags | OPf_KIDS);
3156     unop->op_private = (U8)(1 | (flags >> 8));
3157     unop = (UNOP*) CHECKOP(type, unop);
3158     if (unop->op_next)
3159         return (OP*)unop;
3160
3161     return fold_constants((OP *) unop);
3162 }
3163
3164 OP *
3165 Perl_newBINOP(pTHX_ I32 type, I32 flags, OP *first, OP *last)
3166 {
3167     dVAR;
3168     BINOP *binop;
3169
3170     assert((PL_opargs[type] & OA_CLASS_MASK) == OA_BINOP
3171         || type == OP_SASSIGN || type == OP_NULL );
3172
3173     NewOp(1101, binop, 1, BINOP);
3174
3175     if (!first)
3176         first = newOP(OP_NULL, 0);
3177
3178     binop->op_type = (OPCODE)type;
3179     binop->op_ppaddr = PL_ppaddr[type];
3180     binop->op_first = first;
3181     binop->op_flags = (U8)(flags | OPf_KIDS);
3182     if (!last) {
3183         last = first;
3184         binop->op_private = (U8)(1 | (flags >> 8));
3185     }
3186     else {
3187         binop->op_private = (U8)(2 | (flags >> 8));
3188         first->op_sibling = last;
3189     }
3190
3191     binop = (BINOP*)CHECKOP(type, binop);
3192     if (binop->op_next || binop->op_type != (OPCODE)type)
3193         return (OP*)binop;
3194
3195     binop->op_last = binop->op_first->op_sibling;
3196
3197     return fold_constants((OP *)binop);
3198 }
3199
3200 static int uvcompare(const void *a, const void *b)
3201     __attribute__nonnull__(1)
3202     __attribute__nonnull__(2)
3203     __attribute__pure__;
3204 static int uvcompare(const void *a, const void *b)
3205 {
3206     if (*((const UV *)a) < (*(const UV *)b))
3207         return -1;
3208     if (*((const UV *)a) > (*(const UV *)b))
3209         return 1;
3210     if (*((const UV *)a+1) < (*(const UV *)b+1))
3211         return -1;
3212     if (*((const UV *)a+1) > (*(const UV *)b+1))
3213         return 1;
3214     return 0;
3215 }
3216
3217 static OP *
3218 S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
3219 {
3220     dVAR;
3221     SV * const tstr = ((SVOP*)expr)->op_sv;
3222     SV * const rstr =
3223 #ifdef PERL_MAD
3224                         (repl->op_type == OP_NULL)
3225                             ? ((SVOP*)((LISTOP*)repl)->op_first)->op_sv :
3226 #endif
3227                               ((SVOP*)repl)->op_sv;
3228     STRLEN tlen;
3229     STRLEN rlen;
3230     const U8 *t = (U8*)SvPV_const(tstr, tlen);
3231     const U8 *r = (U8*)SvPV_const(rstr, rlen);
3232     register I32 i;
3233     register I32 j;
3234     I32 grows = 0;
3235     register short *tbl;
3236
3237     const I32 complement = o->op_private & OPpTRANS_COMPLEMENT;
3238     const I32 squash     = o->op_private & OPpTRANS_SQUASH;
3239     I32 del              = o->op_private & OPpTRANS_DELETE;
3240     SV* swash;
3241
3242     PERL_ARGS_ASSERT_PMTRANS;
3243
3244     PL_hints |= HINT_BLOCK_SCOPE;
3245
3246     if (SvUTF8(tstr))
3247         o->op_private |= OPpTRANS_FROM_UTF;
3248
3249     if (SvUTF8(rstr))
3250         o->op_private |= OPpTRANS_TO_UTF;
3251
3252     if (o->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF)) {
3253         SV* const listsv = newSVpvs("# comment\n");
3254         SV* transv = NULL;
3255         const U8* tend = t + tlen;
3256         const U8* rend = r + rlen;
3257         STRLEN ulen;
3258         UV tfirst = 1;
3259         UV tlast = 0;
3260         IV tdiff;
3261         UV rfirst = 1;
3262         UV rlast = 0;
3263         IV rdiff;
3264         IV diff;
3265         I32 none = 0;
3266         U32 max = 0;
3267         I32 bits;
3268         I32 havefinal = 0;
3269         U32 final = 0;
3270         const I32 from_utf  = o->op_private & OPpTRANS_FROM_UTF;
3271         const I32 to_utf    = o->op_private & OPpTRANS_TO_UTF;
3272         U8* tsave = NULL;
3273         U8* rsave = NULL;
3274         const U32 flags = UTF8_ALLOW_DEFAULT;
3275
3276         if (!from_utf) {
3277             STRLEN len = tlen;
3278             t = tsave = bytes_to_utf8(t, &len);
3279             tend = t + len;
3280         }
3281         if (!to_utf && rlen) {
3282             STRLEN len = rlen;
3283             r = rsave = bytes_to_utf8(r, &len);
3284             rend = r + len;
3285         }
3286
3287 /* There are several snags with this code on EBCDIC:
3288    1. 0xFF is a legal UTF-EBCDIC byte (there are no illegal bytes).
3289    2. scan_const() in toke.c has encoded chars in native encoding which makes
3290       ranges at least in EBCDIC 0..255 range the bottom odd.
3291 */
3292
3293         if (complement) {
3294             U8 tmpbuf[UTF8_MAXBYTES+1];
3295             UV *cp;
3296             UV nextmin = 0;
3297             Newx(cp, 2*tlen, UV);
3298             i = 0;
3299             transv = newSVpvs("");
3300             while (t < tend) {
3301                 cp[2*i] = utf8n_to_uvuni(t, tend-t, &ulen, flags);
3302                 t += ulen;
3303                 if (t < tend && NATIVE_TO_UTF(*t) == 0xff) {
3304                     t++;
3305                     cp[2*i+1] = utf8n_to_uvuni(t, tend-t, &ulen, flags);
3306                     t += ulen;
3307                 }
3308                 else {
3309                  cp[2*i+1] = cp[2*i];
3310                 }
3311                 i++;
3312             }
3313             qsort(cp, i, 2*sizeof(UV), uvcompare);
3314             for (j = 0; j < i; j++) {
3315                 UV  val = cp[2*j];
3316                 diff = val - nextmin;
3317                 if (diff > 0) {
3318                     t = uvuni_to_utf8(tmpbuf,nextmin);
3319                     sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
3320                     if (diff > 1) {
3321                         U8  range_mark = UTF_TO_NATIVE(0xff);
3322                         t = uvuni_to_utf8(tmpbuf, val - 1);
3323                         sv_catpvn(transv, (char *)&range_mark, 1);
3324                         sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
3325                     }
3326                 }
3327                 val = cp[2*j+1];
3328                 if (val >= nextmin)
3329                     nextmin = val + 1;
3330             }
3331             t = uvuni_to_utf8(tmpbuf,nextmin);
3332             sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
3333             {
3334                 U8 range_mark = UTF_TO_NATIVE(0xff);
3335                 sv_catpvn(transv, (char *)&range_mark, 1);
3336             }
3337             t = uvuni_to_utf8_flags(tmpbuf, 0x7fffffff,
3338                                     UNICODE_ALLOW_SUPER);
3339             sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
3340             t = (const U8*)SvPVX_const(transv);
3341             tlen = SvCUR(transv);
3342             tend = t + tlen;
3343             Safefree(cp);
3344         }
3345         else if (!rlen && !del) {
3346             r = t; rlen = tlen; rend = tend;
3347         }
3348         if (!squash) {
3349                 if ((!rlen && !del) || t == r ||
3350                     (tlen == rlen && memEQ((char *)t, (char *)r, tlen)))
3351                 {
3352                     o->op_private |= OPpTRANS_IDENTICAL;
3353                 }
3354         }
3355
3356         while (t < tend || tfirst <= tlast) {
3357             /* see if we need more "t" chars */
3358             if (tfirst > tlast) {
3359                 tfirst = (I32)utf8n_to_uvuni(t, tend - t, &ulen, flags);
3360                 t += ulen;
3361                 if (t < tend && NATIVE_TO_UTF(*t) == 0xff) {    /* illegal utf8 val indicates range */
3362                     t++;
3363                     tlast = (I32)utf8n_to_uvuni(t, tend - t, &ulen, flags);
3364                     t += ulen;
3365                 }
3366                 else
3367                     tlast = tfirst;
3368             }
3369
3370             /* now see if we need more "r" chars */
3371             if (rfirst > rlast) {
3372                 if (r < rend) {
3373                     rfirst = (I32)utf8n_to_uvuni(r, rend - r, &ulen, flags);
3374                     r += ulen;
3375                     if (r < rend && NATIVE_TO_UTF(*r) == 0xff) {        /* illegal utf8 val indicates range */
3376                         r++;
3377                         rlast = (I32)utf8n_to_uvuni(r, rend - r, &ulen, flags);
3378                         r += ulen;
3379                     }
3380                     else
3381                         rlast = rfirst;
3382                 }
3383                 else {
3384                     if (!havefinal++)
3385                         final = rlast;
3386                     rfirst = rlast = 0xffffffff;
3387                 }
3388             }
3389
3390             /* now see which range will peter our first, if either. */
3391             tdiff = tlast - tfirst;
3392             rdiff = rlast - rfirst;
3393
3394             if (tdiff <= rdiff)
3395                 diff = tdiff;
3396             else
3397                 diff = rdiff;
3398
3399             if (rfirst == 0xffffffff) {
3400                 diff = tdiff;   /* oops, pretend rdiff is infinite */
3401                 if (diff > 0)
3402                     Perl_sv_catpvf(aTHX_ listsv, "%04lx\t%04lx\tXXXX\n",
3403                                    (long)tfirst, (long)tlast);
3404                 else
3405                     Perl_sv_catpvf(aTHX_ listsv, "%04lx\t\tXXXX\n", (long)tfirst);
3406             }
3407             else {
3408                 if (diff > 0)
3409                     Perl_sv_catpvf(aTHX_ listsv, "%04lx\t%04lx\t%04lx\n",
3410                                    (long)tfirst, (long)(tfirst + diff),
3411                                    (long)rfirst);
3412                 else
3413                     Perl_sv_catpvf(aTHX_ listsv, "%04lx\t\t%04lx\n",
3414                                    (long)tfirst, (long)rfirst);
3415
3416                 if (rfirst + diff > max)
3417                     max = rfirst + diff;
3418                 if (!grows)
3419                     grows = (tfirst < rfirst &&
3420                              UNISKIP(tfirst) < UNISKIP(rfirst + diff));
3421                 rfirst += diff + 1;
3422             }
3423             tfirst += diff + 1;
3424         }
3425
3426         none = ++max;
3427         if (del)
3428             del = ++max;
3429
3430         if (max > 0xffff)
3431             bits = 32;
3432         else if (max > 0xff)
3433             bits = 16;
3434         else
3435             bits = 8;
3436
3437         PerlMemShared_free(cPVOPo->op_pv);
3438         cPVOPo->op_pv = NULL;
3439
3440         swash = MUTABLE_SV(swash_init("utf8", "", listsv, bits, none));
3441 #ifdef USE_ITHREADS
3442         cPADOPo->op_padix = pad_alloc(OP_TRANS, SVs_PADTMP);
3443         SvREFCNT_dec(PAD_SVl(cPADOPo->op_padix));
3444         PAD_SETSV(cPADOPo->op_padix, swash);
3445         SvPADTMP_on(swash);
3446         SvREADONLY_on(swash);
3447 #else
3448         cSVOPo->op_sv = swash;
3449 #endif
3450         SvREFCNT_dec(listsv);
3451         SvREFCNT_dec(transv);
3452
3453         if (!del && havefinal && rlen)
3454             (void)hv_store(MUTABLE_HV(SvRV(swash)), "FINAL", 5,
3455                            newSVuv((UV)final), 0);
3456
3457         if (grows)
3458             o->op_private |= OPpTRANS_GROWS;
3459
3460         Safefree(tsave);
3461         Safefree(rsave);
3462
3463 #ifdef PERL_MAD
3464         op_getmad(expr,o,'e');
3465         op_getmad(repl,o,'r');
3466 #else
3467         op_free(expr);
3468         op_free(repl);
3469 #endif
3470         return o;
3471     }
3472
3473     tbl = (short*)cPVOPo->op_pv;
3474     if (complement) {
3475         Zero(tbl, 256, short);
3476         for (i = 0; i < (I32)tlen; i++)
3477             tbl[t[i]] = -1;
3478         for (i = 0, j = 0; i < 256; i++) {
3479             if (!tbl[i]) {
3480                 if (j >= (I32)rlen) {
3481                     if (del)
3482                         tbl[i] = -2;
3483                     else if (rlen)
3484                         tbl[i] = r[j-1];
3485                     else
3486                         tbl[i] = (short)i;
3487                 }
3488                 else {
3489                     if (i < 128 && r[j] >= 128)
3490                         grows = 1;
3491                     tbl[i] = r[j++];
3492                 }
3493             }
3494         }
3495         if (!del) {
3496             if (!rlen) {
3497                 j = rlen;
3498                 if (!squash)
3499                     o->op_private |= OPpTRANS_IDENTICAL;
3500             }
3501             else if (j >= (I32)rlen)
3502                 j = rlen - 1;
3503             else {
3504                 tbl = 
3505                     (short *)
3506                     PerlMemShared_realloc(tbl,
3507                                           (0x101+rlen-j) * sizeof(short));
3508                 cPVOPo->op_pv = (char*)tbl;
3509             }
3510             tbl[0x100] = (short)(rlen - j);
3511             for (i=0; i < (I32)rlen - j; i++)
3512                 tbl[0x101+i] = r[j+i];
3513         }
3514     }
3515     else {
3516         if (!rlen && !del) {
3517             r = t; rlen = tlen;
3518             if (!squash)
3519                 o->op_private |= OPpTRANS_IDENTICAL;
3520         }
3521         else if (!squash && rlen == tlen && memEQ((char*)t, (char*)r, tlen)) {
3522             o->op_private |= OPpTRANS_IDENTICAL;
3523         }
3524         for (i = 0; i < 256; i++)
3525             tbl[i] = -1;
3526         for (i = 0, j = 0; i < (I32)tlen; i++,j++) {
3527             if (j >= (I32)rlen) {
3528                 if (del) {
3529                     if (tbl[t[i]] == -1)
3530                         tbl[t[i]] = -2;
3531                     continue;
3532                 }
3533                 --j;
3534             }
3535             if (tbl[t[i]] == -1) {
3536                 if (t[i] < 128 && r[j] >= 128)
3537                     grows = 1;
3538                 tbl[t[i]] = r[j];
3539             }
3540         }
3541     }
3542
3543     if(del && rlen == tlen) {
3544         Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Useless use of /d modifier in transliteration operator"); 
3545     } else if(rlen > tlen) {
3546         Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Replacement list is longer than search list");
3547     }
3548
3549     if (grows)
3550         o->op_private |= OPpTRANS_GROWS;
3551 #ifdef PERL_MAD
3552     op_getmad(expr,o,'e');
3553     op_getmad(repl,o,'r');
3554 #else
3555     op_free(expr);
3556     op_free(repl);
3557 #endif
3558
3559     return o;
3560 }
3561
3562 OP *
3563 Perl_newPMOP(pTHX_ I32 type, I32 flags)
3564 {
3565     dVAR;
3566     PMOP *pmop;
3567
3568     assert((PL_opargs[type] & OA_CLASS_MASK) == OA_PMOP);
3569
3570     NewOp(1101, pmop, 1, PMOP);
3571     pmop->op_type = (OPCODE)type;
3572     pmop->op_ppaddr = PL_ppaddr[type];
3573     pmop->op_flags = (U8)flags;
3574     pmop->op_private = (U8)(0 | (flags >> 8));
3575
3576     if (PL_hints & HINT_RE_TAINT)
3577         pmop->op_pmflags |= PMf_RETAINT;
3578     if (PL_hints & HINT_LOCALE)
3579         pmop->op_pmflags |= PMf_LOCALE;
3580
3581
3582 #ifdef USE_ITHREADS
3583     assert(SvPOK(PL_regex_pad[0]));
3584     if (SvCUR(PL_regex_pad[0])) {
3585         /* Pop off the "packed" IV from the end.  */
3586         SV *const repointer_list = PL_regex_pad[0];
3587         const char *p = SvEND(repointer_list) - sizeof(IV);
3588         const IV offset = *((IV*)p);
3589
3590         assert(SvCUR(repointer_list) % sizeof(IV) == 0);
3591
3592         SvEND_set(repointer_list, p);
3593
3594         pmop->op_pmoffset = offset;
3595         /* This slot should be free, so assert this:  */
3596         assert(PL_regex_pad[offset] == &PL_sv_undef);
3597     } else {
3598         SV * const repointer = &PL_sv_undef;
3599         av_push(PL_regex_padav, repointer);
3600         pmop->op_pmoffset = av_len(PL_regex_padav);
3601         PL_regex_pad = AvARRAY(PL_regex_padav);
3602     }
3603 #endif
3604
3605     return CHECKOP(type, pmop);
3606 }
3607
3608 /* Given some sort of match op o, and an expression expr containing a
3609  * pattern, either compile expr into a regex and attach it to o (if it's
3610  * constant), or convert expr into a runtime regcomp op sequence (if it's
3611  * not)
3612  *
3613  * isreg indicates that the pattern is part of a regex construct, eg
3614  * $x =~ /pattern/ or split /pattern/, as opposed to $x =~ $pattern or
3615  * split "pattern", which aren't. In the former case, expr will be a list
3616  * if the pattern contains more than one term (eg /a$b/) or if it contains
3617  * a replacement, ie s/// or tr///.
3618  */
3619
3620 OP *
3621 Perl_pmruntime(pTHX_ OP *o, OP *expr, bool isreg)
3622 {
3623     dVAR;
3624     PMOP *pm;
3625     LOGOP *rcop;
3626     I32 repl_has_vars = 0;
3627     OP* repl = NULL;
3628     bool reglist;
3629
3630     PERL_ARGS_ASSERT_PMRUNTIME;
3631
3632     if (o->op_type == OP_SUBST || o->op_type == OP_TRANS) {
3633         /* last element in list is the replacement; pop it */
3634         OP* kid;
3635         repl = cLISTOPx(expr)->op_last;
3636         kid = cLISTOPx(expr)->op_first;
3637         while (kid->op_sibling != repl)
3638             kid = kid->op_sibling;
3639         kid->op_sibling = NULL;
3640         cLISTOPx(expr)->op_last = kid;
3641     }
3642
3643     if (isreg && expr->op_type == OP_LIST &&
3644         cLISTOPx(expr)->op_first->op_sibling == cLISTOPx(expr)->op_last)
3645     {
3646         /* convert single element list to element */
3647         OP* const oe = expr;
3648         expr = cLISTOPx(oe)->op_first->op_sibling;
3649         cLISTOPx(oe)->op_first->op_sibling = NULL;
3650         cLISTOPx(oe)->op_last = NULL;
3651         op_free(oe);
3652     }
3653
3654     if (o->op_type == OP_TRANS) {
3655         return pmtrans(o, expr, repl);
3656     }
3657
3658     reglist = isreg && expr->op_type == OP_LIST;
3659     if (reglist)
3660         op_null(expr);
3661
3662     PL_hints |= HINT_BLOCK_SCOPE;
3663     pm = (PMOP*)o;
3664
3665     if (expr->op_type == OP_CONST) {
3666         SV *pat = ((SVOP*)expr)->op_sv;
3667         U32 pm_flags = pm->op_pmflags & PMf_COMPILETIME;
3668
3669         if (o->op_flags & OPf_SPECIAL)
3670             pm_flags |= RXf_SPLIT;
3671
3672         if (DO_UTF8(pat)) {
3673             assert (SvUTF8(pat));
3674         } else if (SvUTF8(pat)) {
3675             /* Not doing UTF-8, despite what the SV says. Is this only if we're
3676                trapped in use 'bytes'?  */
3677             /* Make a copy of the octet sequence, but without the flag on, as
3678                the compiler now honours the SvUTF8 flag on pat.  */
3679             STRLEN len;
3680             const char *const p = SvPV(pat, len);
3681             pat = newSVpvn_flags(p, len, SVs_TEMP);
3682         }
3683
3684         PM_SETRE(pm, CALLREGCOMP(pat, pm_flags));
3685
3686 #ifdef PERL_MAD
3687         op_getmad(expr,(OP*)pm,'e');
3688 #else
3689         op_free(expr);
3690 #endif
3691     }
3692     else {
3693         if (pm->op_pmflags & PMf_KEEP || !(PL_hints & HINT_RE_EVAL))
3694             expr = newUNOP((!(PL_hints & HINT_RE_EVAL)
3695                             ? OP_REGCRESET
3696                             : OP_REGCMAYBE),0,expr);
3697
3698         NewOp(1101, rcop, 1, LOGOP);
3699         rcop->op_type = OP_REGCOMP;
3700         rcop->op_ppaddr = PL_ppaddr[OP_REGCOMP];
3701         rcop->op_first = scalar(expr);
3702         rcop->op_flags |= OPf_KIDS
3703                             | ((PL_hints & HINT_RE_EVAL) ? OPf_SPECIAL : 0)
3704                             | (reglist ? OPf_STACKED : 0);
3705         rcop->op_private = 1;
3706         rcop->op_other = o;
3707         if (reglist)
3708             rcop->op_targ = pad_alloc(rcop->op_type, SVs_PADTMP);
3709
3710         /* /$x/ may cause an eval, since $x might be qr/(?{..})/  */
3711         PL_cv_has_eval = 1;
3712
3713         /* establish postfix order */
3714         if (pm->op_pmflags & PMf_KEEP || !(PL_hints & HINT_RE_EVAL)) {
3715             LINKLIST(expr);
3716             rcop->op_next = expr;
3717             ((UNOP*)expr)->op_first->op_next = (OP*)rcop;
3718         }
3719         else {
3720             rcop->op_next = LINKLIST(expr);
3721             expr->op_next = (OP*)rcop;
3722         }
3723
3724         prepend_elem(o->op_type, scalar((OP*)rcop), o);
3725     }
3726
3727     if (repl) {
3728         OP *curop;
3729         if (pm->op_pmflags & PMf_EVAL) {
3730             curop = NULL;
3731             if (CopLINE(PL_curcop) < (line_t)PL_parser->multi_end)
3732                 CopLINE_set(PL_curcop, (line_t)PL_parser->multi_end);
3733         }
3734         else if (repl->op_type == OP_CONST)
3735             curop = repl;
3736         else {
3737             OP *lastop = NULL;
3738             for (curop = LINKLIST(repl); curop!=repl; curop = LINKLIST(curop)) {
3739                 if (curop->op_type == OP_SCOPE
3740                         || curop->op_type == OP_LEAVE
3741                         || (PL_opargs[curop->op_type] & OA_DANGEROUS)) {
3742                     if (curop->op_type == OP_GV) {
3743                         GV * const gv = cGVOPx_gv(curop);
3744                         repl_has_vars = 1;
3745                         if (strchr("&`'123456789+-\016\022", *GvENAME(gv)))
3746                             break;
3747                     }
3748                     else if (curop->op_type == OP_RV2CV)
3749                         break;
3750                     else if (curop->op_type == OP_RV2SV ||
3751                              curop->op_type == OP_RV2AV ||
3752                              curop->op_type == OP_RV2HV ||
3753                              curop->op_type == OP_RV2GV) {
3754                         if (lastop && lastop->op_type != OP_GV) /*funny deref?*/
3755                             break;
3756                     }
3757                     else if (curop->op_type == OP_PADSV ||
3758                              curop->op_type == OP_PADAV ||
3759                              curop->op_type == OP_PADHV ||
3760                              curop->op_type == OP_PADANY)
3761                     {
3762                         repl_has_vars = 1;
3763                     }
3764                     else if (curop->op_type == OP_PUSHRE)
3765                         NOOP; /* Okay here, dangerous in newASSIGNOP */
3766                     else
3767                         break;
3768                 }
3769                 lastop = curop;
3770             }
3771         }
3772         if (curop == repl
3773             && !(repl_has_vars
3774                  && (!PM_GETRE(pm)
3775                      || RX_EXTFLAGS(PM_GETRE(pm)) & RXf_EVAL_SEEN)))
3776         {
3777             pm->op_pmflags |= PMf_CONST;        /* const for long enough */
3778             prepend_elem(o->op_type, scalar(repl), o);
3779         }
3780         else {
3781             if (curop == repl && !PM_GETRE(pm)) { /* Has variables. */
3782                 pm->op_pmflags |= PMf_MAYBE_CONST;
3783             }
3784             NewOp(1101, rcop, 1, LOGOP);
3785             rcop->op_type = OP_SUBSTCONT;
3786             rcop->op_ppaddr = PL_ppaddr[OP_SUBSTCONT];
3787             rcop->op_first = scalar(repl);
3788             rcop->op_flags |= OPf_KIDS;
3789             rcop->op_private = 1;
3790             rcop->op_other = o;
3791
3792             /* establish postfix order */
3793             rcop->op_next = LINKLIST(repl);
3794             repl->op_next = (OP*)rcop;
3795
3796             pm->op_pmreplrootu.op_pmreplroot = scalar((OP*)rcop);
3797             assert(!(pm->op_pmflags & PMf_ONCE));
3798             pm->op_pmstashstartu.op_pmreplstart = LINKLIST(rcop);
3799             rcop->op_next = 0;
3800         }
3801     }
3802
3803     return (OP*)pm;
3804 }
3805
3806 OP *
3807 Perl_newSVOP(pTHX_ I32 type, I32 flags, SV *sv)
3808 {
3809     dVAR;
3810     SVOP *svop;
3811
3812     PERL_ARGS_ASSERT_NEWSVOP;
3813
3814     assert((PL_opargs[type] & OA_CLASS_MASK) == OA_SVOP
3815         || (PL_opargs[type] & OA_CLASS_MASK) == OA_PVOP_OR_SVOP
3816         || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP);
3817
3818     NewOp(1101, svop, 1, SVOP);
3819     svop->op_type = (OPCODE)type;
3820     svop->op_ppaddr = PL_ppaddr[type];
3821     svop->op_sv = sv;
3822     svop->op_next = (OP*)svop;
3823     svop->op_flags = (U8)flags;
3824     if (PL_opargs[type] & OA_RETSCALAR)
3825         scalar((OP*)svop);
3826     if (PL_opargs[type] & OA_TARGET)
3827         svop->op_targ = pad_alloc(type, SVs_PADTMP);
3828     return CHECKOP(type, svop);
3829 }
3830
3831 #ifdef USE_ITHREADS
3832 OP *
3833 Perl_newPADOP(pTHX_ I32 type, I32 flags, SV *sv)
3834 {
3835     dVAR;
3836     PADOP *padop;
3837
3838     PERL_ARGS_ASSERT_NEWPADOP;
3839
3840     assert((PL_opargs[type] & OA_CLASS_MASK) == OA_SVOP
3841         || (PL_opargs[type] & OA_CLASS_MASK) == OA_PVOP_OR_SVOP
3842         || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP);
3843
3844     NewOp(1101, padop, 1, PADOP);
3845     padop->op_type = (OPCODE)type;
3846     padop->op_ppaddr = PL_ppaddr[type];
3847     padop->op_padix = pad_alloc(type, SVs_PADTMP);
3848     SvREFCNT_dec(PAD_SVl(padop->op_padix));
3849     PAD_SETSV(padop->op_padix, sv);
3850     assert(sv);
3851     SvPADTMP_on(sv);
3852     padop->op_next = (OP*)padop;
3853     padop->op_flags = (U8)flags;
3854     if (PL_opargs[type] & OA_RETSCALAR)
3855         scalar((OP*)padop);
3856     if (PL_opargs[type] & OA_TARGET)
3857         padop->op_targ = pad_alloc(type, SVs_PADTMP);
3858     return CHECKOP(type, padop);
3859 }
3860 #endif
3861
3862 OP *
3863 Perl_newGVOP(pTHX_ I32 type, I32 flags, GV *gv)
3864 {
3865     dVAR;
3866
3867     PERL_ARGS_ASSERT_NEWGVOP;
3868
3869 #ifdef USE_ITHREADS
3870     GvIN_PAD_on(gv);
3871     return newPADOP(type, flags, SvREFCNT_inc_simple_NN(gv));
3872 #else
3873     return newSVOP(type, flags, SvREFCNT_inc_simple_NN(gv));
3874 #endif
3875 }
3876
3877 OP *
3878 Perl_newPVOP(pTHX_ I32 type, I32 flags, char *pv)
3879 {
3880     dVAR;
3881     PVOP *pvop;
3882
3883     assert((PL_opargs[type] & OA_CLASS_MASK) == OA_PVOP_OR_SVOP
3884         || (PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP);
3885
3886     NewOp(1101, pvop, 1, PVOP);
3887     pvop->op_type = (OPCODE)type;
3888     pvop->op_ppaddr = PL_ppaddr[type];
3889     pvop->op_pv = pv;
3890     pvop->op_next = (OP*)pvop;
3891     pvop->op_flags = (U8)flags;
3892     if (PL_opargs[type] & OA_RETSCALAR)
3893         scalar((OP*)pvop);
3894     if (PL_opargs[type] & OA_TARGET)
3895         pvop->op_targ = pad_alloc(type, SVs_PADTMP);
3896     return CHECKOP(type, pvop);
3897 }
3898
3899 #ifdef PERL_MAD
3900 OP*
3901 #else
3902 void
3903 #endif
3904 Perl_package(pTHX_ OP *o)
3905 {
3906     dVAR;
3907     SV *const sv = cSVOPo->op_sv;
3908 #ifdef PERL_MAD
3909     OP *pegop;
3910 #endif
3911
3912     PERL_ARGS_ASSERT_PACKAGE;
3913
3914     save_hptr(&PL_curstash);
3915     save_item(PL_curstname);
3916
3917     PL_curstash = gv_stashsv(sv, GV_ADD);
3918
3919     sv_setsv(PL_curstname, sv);
3920
3921     PL_hints |= HINT_BLOCK_SCOPE;
3922     PL_parser->copline = NOLINE;
3923     PL_parser->expect = XSTATE;
3924
3925 #ifndef PERL_MAD
3926     op_free(o);
3927 #else
3928     if (!PL_madskills) {
3929         op_free(o);
3930         return NULL;
3931     }
3932
3933     pegop = newOP(OP_NULL,0);
3934     op_getmad(o,pegop,'P');
3935     return pegop;
3936 #endif
3937 }
3938
3939 void
3940 Perl_package_version( pTHX_ OP *v )
3941 {
3942     dVAR;
3943     U32 savehints = PL_hints;
3944     PERL_ARGS_ASSERT_PACKAGE_VERSION;
3945     PL_hints &= ~HINT_STRICT_VARS;
3946     sv_setsv( GvSV(gv_fetchpvs("VERSION", GV_ADDMULTI, SVt_PV)), cSVOPx(v)->op_sv );
3947     PL_hints = savehints;
3948     op_free(v);
3949 }
3950
3951 #ifdef PERL_MAD
3952 OP*
3953 #else
3954 void
3955 #endif
3956 Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg)
3957 {
3958     dVAR;
3959     OP *pack;
3960     OP *imop;
3961     OP *veop;
3962 #ifdef PERL_MAD
3963     OP *pegop = newOP(OP_NULL,0);
3964 #endif
3965
3966     PERL_ARGS_ASSERT_UTILIZE;
3967
3968     if (idop->op_type != OP_CONST)
3969         Perl_croak(aTHX_ "Module name must be constant");
3970
3971     if (PL_madskills)
3972         op_getmad(idop,pegop,'U');
3973
3974     veop = NULL;
3975
3976     if (version) {
3977         SV * const vesv = ((SVOP*)version)->op_sv;
3978
3979         if (PL_madskills)
3980             op_getmad(version,pegop,'V');
3981         if (!arg && !SvNIOKp(vesv)) {
3982             arg = version;
3983         }
3984         else {
3985             OP *pack;
3986             SV *meth;
3987
3988             if (version->op_type != OP_CONST || !SvNIOKp(vesv))
3989                 Perl_croak(aTHX_ "Version number must be a constant number");
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 VERSION */
3995             meth = newSVpvs_share("VERSION");
3996             veop = convert(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL,
3997                             append_elem(OP_LIST,
3998                                         prepend_elem(OP_LIST, pack, list(version)),
3999                                         newSVOP(OP_METHOD_NAMED, 0, meth)));
4000         }
4001     }
4002
4003     /* Fake up an import/unimport */
4004     if (arg && arg->op_type == OP_STUB) {
4005         if (PL_madskills)
4006             op_getmad(arg,pegop,'S');
4007         imop = arg;             /* no import on explicit () */
4008     }
4009     else if (SvNIOKp(((SVOP*)idop)->op_sv)) {
4010         imop = NULL;            /* use 5.0; */
4011         if (!aver)
4012             idop->op_private |= OPpCONST_NOVER;
4013     }
4014     else {
4015         SV *meth;
4016
4017         if (PL_madskills)
4018             op_getmad(arg,pegop,'A');
4019
4020         /* Make copy of idop so we don't free it twice */
4021         pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)idop)->op_sv));
4022
4023         /* Fake up a method call to import/unimport */
4024         meth = aver
4025             ? newSVpvs_share("import") : newSVpvs_share("unimport");
4026         imop = convert(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL,
4027                        append_elem(OP_LIST,
4028                                    prepend_elem(OP_LIST, pack, list(arg)),
4029                                    newSVOP(OP_METHOD_NAMED, 0, meth)));
4030     }
4031
4032     /* Fake up the BEGIN {}, which does its thing immediately. */
4033     newATTRSUB(floor,
4034         newSVOP(OP_CONST, 0, newSVpvs_share("BEGIN")),
4035         NULL,
4036         NULL,
4037         append_elem(OP_LINESEQ,
4038             append_elem(OP_LINESEQ,
4039                 newSTATEOP(0, NULL, newUNOP(OP_REQUIRE, 0, idop)),
4040                 newSTATEOP(0, NULL, veop)),
4041             newSTATEOP(0, NULL, imop) ));
4042
4043     /* The "did you use incorrect case?" warning used to be here.
4044      * The problem is that on case-insensitive filesystems one
4045      * might get false positives for "use" (and "require"):
4046      * "use Strict" or "require CARP" will work.  This causes
4047      * portability problems for the script: in case-strict
4048      * filesystems the script will stop working.
4049      *
4050      * The "incorrect case" warning checked whether "use Foo"
4051      * imported "Foo" to your namespace, but that is wrong, too:
4052      * there is no requirement nor promise in the language that
4053      * a Foo.pm should or would contain anything in package "Foo".
4054      *
4055      * There is very little Configure-wise that can be done, either:
4056      * the case-sensitivity of the build filesystem of Perl does not
4057      * help in guessing the case-sensitivity of the runtime environment.
4058      */
4059
4060     PL_hints |= HINT_BLOCK_SCOPE;
4061     PL_parser->copline = NOLINE;
4062     PL_parser->expect = XSTATE;
4063     PL_cop_seqmax++; /* Purely for B::*'s benefit */
4064
4065 #ifdef PERL_MAD
4066     if (!PL_madskills) {
4067         /* FIXME - don't allocate pegop if !PL_madskills */
4068         op_free(pegop);
4069         return NULL;
4070     }
4071     return pegop;
4072 #endif
4073 }
4074
4075 /*
4076 =head1 Embedding Functions
4077
4078 =for apidoc load_module
4079
4080 Loads the module whose name is pointed to by the string part of name.
4081 Note that the actual module name, not its filename, should be given.
4082 Eg, "Foo::Bar" instead of "Foo/Bar.pm".  flags can be any of
4083 PERL_LOADMOD_DENY, PERL_LOADMOD_NOIMPORT, or PERL_LOADMOD_IMPORT_OPS
4084 (or 0 for no flags). ver, if specified, provides version semantics
4085 similar to C<use Foo::Bar VERSION>.  The optional trailing SV*
4086 arguments can be used to specify arguments to the module's import()
4087 method, similar to C<use Foo::Bar VERSION LIST>.  They must be
4088 terminated with a final NULL pointer.  Note that this list can only
4089 be omitted when the PERL_LOADMOD_NOIMPORT flag has been used.
4090 Otherwise at least a single NULL pointer to designate the default
4091 import list is required.
4092
4093 =cut */
4094
4095 void
4096 Perl_load_module(pTHX_ U32 flags, SV *name, SV *ver, ...)
4097 {
4098     va_list args;
4099
4100     PERL_ARGS_ASSERT_LOAD_MODULE;
4101
4102     va_start(args, ver);
4103     vload_module(flags, name, ver, &args);
4104     va_end(args);
4105 }
4106
4107 #ifdef PERL_IMPLICIT_CONTEXT
4108 void
4109 Perl_load_module_nocontext(U32 flags, SV *name, SV *ver, ...)
4110 {
4111     dTHX;
4112     va_list args;
4113     PERL_ARGS_ASSERT_LOAD_MODULE_NOCONTEXT;
4114     va_start(args, ver);
4115     vload_module(flags, name, ver, &args);
4116     va_end(args);
4117 }
4118 #endif
4119
4120 void
4121 Perl_vload_module(pTHX_ U32 flags, SV *name, SV *ver, va_list *args)
4122 {
4123     dVAR;
4124     OP *veop, *imop;
4125     OP * const modname = newSVOP(OP_CONST, 0, name);
4126
4127     PERL_ARGS_ASSERT_VLOAD_MODULE;
4128
4129     modname->op_private |= OPpCONST_BARE;
4130     if (ver) {
4131         veop = newSVOP(OP_CONST, 0, ver);
4132     }
4133     else
4134         veop = NULL;
4135     if (flags & PERL_LOADMOD_NOIMPORT) {
4136         imop = sawparens(newNULLLIST());
4137     }
4138     else if (flags & PERL_LOADMOD_IMPORT_OPS) {
4139         imop = va_arg(*args, OP*);
4140     }
4141     else {
4142         SV *sv;
4143         imop = NULL;
4144         sv = va_arg(*args, SV*);
4145         while (sv) {
4146             imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv));
4147             sv = va_arg(*args, SV*);
4148         }
4149     }
4150
4151     /* utilize() fakes up a BEGIN { require ..; import ... }, so make sure
4152      * that it has a PL_parser to play with while doing that, and also
4153      * that it doesn't mess with any existing parser, by creating a tmp
4154      * new parser with lex_start(). This won't actually be used for much,
4155      * since pp_require() will create another parser for the real work. */
4156
4157     ENTER;
4158     SAVEVPTR(PL_curcop);
4159     lex_start(NULL, NULL, FALSE);
4160     utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0),
4161             veop, modname, imop);
4162     LEAVE;
4163 }
4164
4165 OP *
4166 Perl_dofile(pTHX_ OP *term, I32 force_builtin)
4167 {
4168     dVAR;
4169     OP *doop;
4170     GV *gv = NULL;
4171
4172     PERL_ARGS_ASSERT_DOFILE;
4173
4174     if (!force_builtin) {
4175         gv = gv_fetchpvs("do", GV_NOTQUAL, SVt_PVCV);
4176         if (!(gv && GvCVu(gv) && GvIMPORTED_CV(gv))) {
4177             GV * const * const gvp = (GV**)hv_fetchs(PL_globalstash, "do", FALSE);
4178             gv = gvp ? *gvp : NULL;
4179         }
4180     }
4181
4182     if (gv && GvCVu(gv) && GvIMPORTED_CV(gv)) {
4183         doop = ck_subr(newUNOP(OP_ENTERSUB, OPf_STACKED,
4184                                append_elem(OP_LIST, term,
4185                                            scalar(newUNOP(OP_RV2CV, 0,
4186                                                           newGVOP(OP_GV, 0, gv))))));
4187     }
4188     else {
4189         doop = newUNOP(OP_DOFILE, 0, scalar(term));
4190     }
4191     return doop;
4192 }
4193
4194 OP *
4195 Perl_newSLICEOP(pTHX_ I32 flags, OP *subscript, OP *listval)
4196 {
4197     return newBINOP(OP_LSLICE, flags,
4198             list(force_list(subscript)),
4199             list(force_list(listval)) );
4200 }
4201
4202 STATIC I32
4203 S_is_list_assignment(pTHX_ register const OP *o)
4204 {
4205     unsigned type;
4206     U8 flags;
4207
4208     if (!o)
4209         return TRUE;
4210
4211     if ((o->op_type == OP_NULL) && (o->op_flags & OPf_KIDS))
4212         o = cUNOPo->op_first;
4213
4214     flags = o->op_flags;
4215     type = o->op_type;
4216     if (type == OP_COND_EXPR) {
4217         const I32 t = is_list_assignment(cLOGOPo->op_first->op_sibling);
4218         const I32 f = is_list_assignment(cLOGOPo->op_first->op_sibling->op_sibling);
4219
4220         if (t && f)
4221             return TRUE;
4222         if (t || f)
4223             yyerror("Assignment to both a list and a scalar");
4224         return FALSE;
4225     }
4226
4227     if (type == OP_LIST &&
4228         (flags & OPf_WANT) == OPf_WANT_SCALAR &&
4229         o->op_private & OPpLVAL_INTRO)
4230         return FALSE;
4231
4232     if (type == OP_LIST || flags & OPf_PARENS ||
4233         type == OP_RV2AV || type == OP_RV2HV ||
4234         type == OP_ASLICE || type == OP_HSLICE)
4235         return TRUE;
4236
4237     if (type == OP_PADAV || type == OP_PADHV)
4238         return TRUE;
4239
4240     if (type == OP_RV2SV)
4241         return FALSE;
4242
4243     return FALSE;
4244 }
4245
4246 OP *
4247 Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
4248 {
4249     dVAR;
4250     OP *o;
4251
4252     if (optype) {
4253         if (optype == OP_ANDASSIGN || optype == OP_ORASSIGN || optype == OP_DORASSIGN) {
4254             return newLOGOP(optype, 0,
4255                 mod(scalar(left), optype),
4256                 newUNOP(OP_SASSIGN, 0, scalar(right)));
4257         }
4258         else {
4259             return newBINOP(optype, OPf_STACKED,
4260                 mod(scalar(left), optype), scalar(right));
4261         }
4262     }
4263
4264     if (is_list_assignment(left)) {
4265         static const char no_list_state[] = "Initialization of state variables"
4266             " in list context currently forbidden";
4267         OP *curop;
4268         bool maybe_common_vars = TRUE;
4269
4270         PL_modcount = 0;
4271         /* Grandfathering $[ assignment here.  Bletch.*/
4272         /* Only simple assignments like C<< ($[) = 1 >> are allowed */
4273         PL_eval_start = (left->op_type == OP_CONST) ? right : NULL;
4274         left = mod(left, OP_AASSIGN);
4275         if (PL_eval_start)
4276             PL_eval_start = 0;
4277         else if (left->op_type == OP_CONST) {
4278             deprecate("assignment to $[");
4279             /* FIXME for MAD */
4280             /* Result of assignment is always 1 (or we'd be dead already) */
4281             return newSVOP(OP_CONST, 0, newSViv(1));
4282         }
4283         curop = list(force_list(left));
4284         o = newBINOP(OP_AASSIGN, flags, list(force_list(right)), curop);
4285         o->op_private = (U8)(0 | (flags >> 8));
4286
4287         if ((left->op_type == OP_LIST
4288              || (left->op_type == OP_NULL && left->op_targ == OP_LIST)))
4289         {
4290             OP* lop = ((LISTOP*)left)->op_first;
4291             maybe_common_vars = FALSE;
4292             while (lop) {
4293                 if (lop->op_type == OP_PADSV ||
4294                     lop->op_type == OP_PADAV ||
4295                     lop->op_type == OP_PADHV ||
4296                     lop->op_type == OP_PADANY) {
4297                     if (!(lop->op_private & OPpLVAL_INTRO))
4298                         maybe_common_vars = TRUE;
4299
4300                     if (lop->op_private & OPpPAD_STATE) {
4301                         if (left->op_private & OPpLVAL_INTRO) {
4302                             /* Each variable in state($a, $b, $c) = ... */
4303                         }
4304                         else {
4305                             /* Each state variable in
4306                                (state $a, my $b, our $c, $d, undef) = ... */
4307                         }
4308                         yyerror(no_list_state);
4309                     } else {
4310                         /* Each my variable in
4311                            (state $a, my $b, our $c, $d, undef) = ... */
4312                     }
4313                 } else if (lop->op_type == OP_UNDEF ||
4314                            lop->op_type == OP_PUSHMARK) {
4315                     /* undef may be interesting in
4316                        (state $a, undef, state $c) */
4317                 } else {
4318                     /* Other ops in the list. */
4319                     maybe_common_vars = TRUE;
4320                 }
4321                 lop = lop->op_sibling;
4322             }
4323         }
4324         else if ((left->op_private & OPpLVAL_INTRO)
4325                 && (   left->op_type == OP_PADSV
4326                     || left->op_type == OP_PADAV
4327                     || left->op_type == OP_PADHV
4328                     || left->op_type == OP_PADANY))
4329         {
4330             if (left->op_type == OP_PADSV) maybe_common_vars = FALSE;
4331             if (left->op_private & OPpPAD_STATE) {
4332                 /* All single variable list context state assignments, hence
4333                    state ($a) = ...
4334                    (state $a) = ...
4335                    state @a = ...
4336                    state (@a) = ...
4337                    (state @a) = ...
4338                    state %a = ...
4339                    state (%a) = ...
4340                    (state %a) = ...
4341                 */
4342                 yyerror(no_list_state);
4343             }
4344         }
4345
4346         /* PL_generation sorcery:
4347          * an assignment like ($a,$b) = ($c,$d) is easier than
4348          * ($a,$b) = ($c,$a), since there is no need for temporary vars.
4349          * To detect whether there are common vars, the global var
4350          * PL_generation is incremented for each assign op we compile.
4351          * Then, while compiling the assign op, we run through all the
4352          * variables on both sides of the assignment, setting a spare slot
4353          * in each of them to PL_generation. If any of them already have
4354          * that value, we know we've got commonality.  We could use a
4355          * single bit marker, but then we'd have to make 2 passes, first
4356          * to clear the flag, then to test and set it.  To find somewhere
4357          * to store these values, evil chicanery is done with SvUVX().
4358          */
4359
4360         if (maybe_common_vars) {
4361             OP *lastop = o;
4362             PL_generation++;
4363             for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
4364                 if (PL_opargs[curop->op_type] & OA_DANGEROUS) {
4365                     if (curop->op_type == OP_GV) {
4366                         GV *gv = cGVOPx_gv(curop);
4367                         if (gv == PL_defgv
4368                             || (int)GvASSIGN_GENERATION(gv) == PL_generation)
4369                             break;
4370                         GvASSIGN_GENERATION_set(gv, PL_generation);
4371                     }
4372                     else if (curop->op_type == OP_PADSV ||
4373                              curop->op_type == OP_PADAV ||
4374                              curop->op_type == OP_PADHV ||
4375                              curop->op_type == OP_PADANY)
4376                     {
4377                         if (PAD_COMPNAME_GEN(curop->op_targ)
4378                                                     == (STRLEN)PL_generation)
4379                             break;
4380                         PAD_COMPNAME_GEN_set(curop->op_targ, PL_generation);
4381
4382                     }
4383                     else if (curop->op_type == OP_RV2CV)
4384                         break;
4385                     else if (curop->op_type == OP_RV2SV ||
4386                              curop->op_type == OP_RV2AV ||
4387                              curop->op_type == OP_RV2HV ||
4388                              curop->op_type == OP_RV2GV) {
4389                         if (lastop->op_type != OP_GV)   /* funny deref? */
4390                             break;
4391                     }
4392                     else if (curop->op_type == OP_PUSHRE) {
4393 #ifdef USE_ITHREADS
4394                         if (((PMOP*)curop)->op_pmreplrootu.op_pmtargetoff) {
4395                             GV *const gv = MUTABLE_GV(PAD_SVl(((PMOP*)curop)->op_pmreplrootu.op_pmtargetoff));
4396                             if (gv == PL_defgv
4397                                 || (int)GvASSIGN_GENERATION(gv) == PL_generation)
4398                                 break;
4399                             GvASSIGN_GENERATION_set(gv, PL_generation);
4400                         }
4401 #else
4402                         GV *const gv
4403                             = ((PMOP*)curop)->op_pmreplrootu.op_pmtargetgv;
4404                         if (gv) {
4405                             if (gv == PL_defgv
4406                                 || (int)GvASSIGN_GENERATION(gv) == PL_generation)
4407                                 break;
4408                             GvASSIGN_GENERATION_set(gv, PL_generation);
4409                         }
4410 #endif
4411                     }
4412                     else
4413                         break;
4414                 }
4415                 lastop = curop;
4416             }
4417             if (curop != o)
4418                 o->op_private |= OPpASSIGN_COMMON;
4419         }
4420
4421         if (right && right->op_type == OP_SPLIT && !PL_madskills) {
4422             OP* tmpop = ((LISTOP*)right)->op_first;
4423             if (tmpop && (tmpop->op_type == OP_PUSHRE)) {
4424                 PMOP * const pm = (PMOP*)tmpop;
4425                 if (left->op_type == OP_RV2AV &&
4426                     !(left->op_private & OPpLVAL_INTRO) &&
4427                     !(o->op_private & OPpASSIGN_COMMON) )
4428                 {
4429                     tmpop = ((UNOP*)left)->op_first;
4430                     if (tmpop->op_type == OP_GV
4431 #ifdef USE_ITHREADS
4432                         && !pm->op_pmreplrootu.op_pmtargetoff
4433 #else
4434                         && !pm->op_pmreplrootu.op_pmtargetgv
4435 #endif
4436                         ) {
4437 #ifdef USE_ITHREADS
4438                         pm->op_pmreplrootu.op_pmtargetoff
4439                             = cPADOPx(tmpop)->op_padix;
4440                         cPADOPx(tmpop)->op_padix = 0;   /* steal it */
4441 #else
4442                         pm->op_pmreplrootu.op_pmtargetgv
4443                             = MUTABLE_GV(cSVOPx(tmpop)->op_sv);
4444                         cSVOPx(tmpop)->op_sv = NULL;    /* steal it */
4445 #endif
4446                         pm->op_pmflags |= PMf_ONCE;
4447                         tmpop = cUNOPo->op_first;       /* to list (nulled) */
4448                         tmpop = ((UNOP*)tmpop)->op_first; /* to pushmark */
4449                         tmpop->op_sibling = NULL;       /* don't free split */
4450                         right->op_next = tmpop->op_next;  /* fix starting loc */
4451                         op_free(o);                     /* blow off assign */
4452                         right->op_flags &= ~OPf_WANT;
4453                                 /* "I don't know and I don't care." */
4454                         return right;
4455                     }
4456                 }
4457                 else {
4458                    if (PL_modcount < RETURN_UNLIMITED_NUMBER &&
4459                       ((LISTOP*)right)->op_last->op_type == OP_CONST)
4460                     {
4461                         SV *sv = ((SVOP*)((LISTOP*)right)->op_last)->op_sv;
4462                         if (SvIOK(sv) && SvIVX(sv) == 0)
4463                             sv_setiv(sv, PL_modcount+1);
4464                     }
4465                 }
4466             }
4467         }
4468         return o;
4469     }
4470     if (!right)
4471         right = newOP(OP_UNDEF, 0);
4472     if (right->op_type == OP_READLINE) {
4473         right->op_flags |= OPf_STACKED;
4474         return newBINOP(OP_NULL, flags, mod(scalar(left), OP_SASSIGN), scalar(right));
4475     }
4476     else {
4477         PL_eval_start = right;  /* Grandfathering $[ assignment here.  Bletch.*/
4478         o = newBINOP(OP_SASSIGN, flags,
4479             scalar(right), mod(scalar(left), OP_SASSIGN) );
4480         if (PL_eval_start)
4481             PL_eval_start = 0;
4482         else {
4483             if (!PL_madskills) { /* assignment to $[ is ignored when making a mad dump */
4484                 deprecate("assignment to $[");
4485                 op_free(o);
4486                 o = newSVOP(OP_CONST, 0, newSViv(CopARYBASE_get(&PL_compiling)));
4487                 o->op_private |= OPpCONST_ARYBASE;
4488             }
4489         }
4490     }
4491     return o;
4492 }
4493
4494 OP *
4495 Perl_newSTATEOP(pTHX_ I32 flags, char *label, OP *o)
4496 {
4497     dVAR;
4498     const U32 seq = intro_my();
4499     register COP *cop;
4500
4501     NewOp(1101, cop, 1, COP);
4502     if (PERLDB_LINE && CopLINE(PL_curcop) && PL_curstash != PL_debstash) {
4503         cop->op_type = OP_DBSTATE;
4504         cop->op_ppaddr = PL_ppaddr[ OP_DBSTATE ];
4505     }
4506     else {
4507         cop->op_type = OP_NEXTSTATE;
4508         cop->op_ppaddr = PL_ppaddr[ OP_NEXTSTATE ];
4509     }
4510     cop->op_flags = (U8)flags;
4511     CopHINTS_set(cop, PL_hints);
4512 #ifdef NATIVE_HINTS
4513     cop->op_private |= NATIVE_HINTS;
4514 #endif
4515     CopHINTS_set(&PL_compiling, CopHINTS_get(cop));
4516     cop->op_next = (OP*)cop;
4517
4518     cop->cop_seq = seq;
4519     /* CopARYBASE is now "virtual", in that it's stored as a flag bit in
4520        CopHINTS and a possible value in cop_hints_hash, so no need to copy it.
4521     */
4522     cop->cop_warnings = DUP_WARNINGS(PL_curcop->cop_warnings);
4523     cop->cop_hints_hash = PL_curcop->cop_hints_hash;
4524     if (cop->cop_hints_hash) {
4525         HINTS_REFCNT_LOCK;
4526         cop->cop_hints_hash->refcounted_he_refcnt++;
4527         HINTS_REFCNT_UNLOCK;
4528     }
4529     if (label) {
4530         cop->cop_hints_hash
4531             = Perl_store_cop_label(aTHX_ cop->cop_hints_hash, label);
4532                                                      
4533         PL_hints |= HINT_BLOCK_SCOPE;
4534         /* It seems that we need to defer freeing this pointer, as other parts
4535            of the grammar end up wanting to copy it after this op has been
4536            created. */
4537         SAVEFREEPV(label);
4538     }
4539
4540     if (PL_parser && PL_parser->copline == NOLINE)
4541         CopLINE_set(cop, CopLINE(PL_curcop));
4542     else {
4543         CopLINE_set(cop, PL_parser->copline);
4544         if (PL_parser)
4545             PL_parser->copline = NOLINE;
4546     }
4547 #ifdef USE_ITHREADS
4548     CopFILE_set(cop, CopFILE(PL_curcop));       /* XXX share in a pvtable? */
4549 #else
4550     CopFILEGV_set(cop, CopFILEGV(PL_curcop));
4551 #endif
4552     CopSTASH_set(cop, PL_curstash);
4553
4554     if ((PERLDB_LINE || PERLDB_SAVESRC) && PL_curstash != PL_debstash) {
4555         /* this line can have a breakpoint - store the cop in IV */
4556         AV *av = CopFILEAVx(PL_curcop);
4557         if (av) {
4558             SV * const * const svp = av_fetch(av, (I32)CopLINE(cop), FALSE);
4559             if (svp && *svp != &PL_sv_undef ) {
4560                 (void)SvIOK_on(*svp);
4561                 SvIV_set(*svp, PTR2IV(cop));
4562             }
4563         }
4564     }
4565
4566     if (flags & OPf_SPECIAL)
4567         op_null((OP*)cop);
4568     return prepend_elem(OP_LINESEQ, (OP*)cop, o);
4569 }
4570
4571
4572 OP *
4573 Perl_newLOGOP(pTHX_ I32 type, I32 flags, OP *first, OP *other)
4574 {
4575     dVAR;
4576
4577     PERL_ARGS_ASSERT_NEWLOGOP;
4578
4579     return new_logop(type, flags, &first, &other);
4580 }
4581
4582 STATIC OP *
4583 S_search_const(pTHX_ OP *o)
4584 {
4585     PERL_ARGS_ASSERT_SEARCH_CONST;
4586
4587     switch (o->op_type) {
4588         case OP_CONST:
4589             return o;
4590         case OP_NULL:
4591             if (o->op_flags & OPf_KIDS)
4592                 return search_const(cUNOPo->op_first);
4593             break;
4594         case OP_LEAVE:
4595         case OP_SCOPE:
4596         case OP_LINESEQ:
4597         {
4598             OP *kid;
4599             if (!(o->op_flags & OPf_KIDS))
4600                 return NULL;
4601             kid = cLISTOPo->op_first;
4602             do {
4603                 switch (kid->op_type) {
4604                     case OP_ENTER:
4605                     case OP_NULL:
4606                     case OP_NEXTSTATE:
4607                         kid = kid->op_sibling;
4608                         break;
4609                     default:
4610                         if (kid != cLISTOPo->op_last)
4611                             return NULL;
4612                         goto last;
4613                 }
4614             } while (kid);
4615             if (!kid)
4616                 kid = cLISTOPo->op_last;
4617 last:
4618             return search_const(kid);
4619         }
4620     }
4621
4622     return NULL;
4623 }
4624
4625 STATIC OP *
4626 S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp)
4627 {
4628     dVAR;
4629     LOGOP *logop;
4630     OP *o;
4631     OP *first;
4632     OP *other;
4633     OP *cstop = NULL;
4634     int prepend_not = 0;
4635
4636     PERL_ARGS_ASSERT_NEW_LOGOP;
4637
4638     first = *firstp;
4639     other = *otherp;
4640
4641     if (type == OP_XOR)         /* Not short circuit, but here by precedence. */
4642         return newBINOP(type, flags, scalar(first), scalar(other));
4643
4644     assert((PL_opargs[type] & OA_CLASS_MASK) == OA_LOGOP);
4645
4646     scalarboolean(first);
4647     /* optimize AND and OR ops that have NOTs as children */
4648     if (first->op_type == OP_NOT
4649         && (first->op_flags & OPf_KIDS)
4650         && ((first->op_flags & OPf_SPECIAL) /* unless ($x) { } */
4651             || (other->op_type == OP_NOT))  /* if (!$x && !$y) { } */
4652         && !PL_madskills) {
4653         if (type == OP_AND || type == OP_OR) {
4654             if (type == OP_AND)
4655                 type = OP_OR;
4656             else
4657                 type = OP_AND;
4658             op_null(first);
4659             if (other->op_type == OP_NOT) { /* !a AND|OR !b => !(a OR|AND b) */
4660                 op_null(other);
4661                 prepend_not = 1; /* prepend a NOT op later */
4662             }
4663         }
4664     }
4665     /* search for a constant op that could let us fold the test */
4666     if ((cstop = search_const(first))) {
4667         if (cstop->op_private & OPpCONST_STRICT)
4668             no_bareword_allowed(cstop);
4669         else if ((cstop->op_private & OPpCONST_BARE))
4670                 Perl_ck_warner(aTHX_ packWARN(WARN_BAREWORD), "Bareword found in conditional");
4671         if ((type == OP_AND &&  SvTRUE(((SVOP*)cstop)->op_sv)) ||
4672             (type == OP_OR  && !SvTRUE(((SVOP*)cstop)->op_sv)) ||
4673             (type == OP_DOR && !SvOK(((SVOP*)cstop)->op_sv))) {
4674             *firstp = NULL;
4675             if (other->op_type == OP_CONST)
4676                 other->op_private |= OPpCONST_SHORTCIRCUIT;
4677             if (PL_madskills) {
4678                 OP *newop = newUNOP(OP_NULL, 0, other);
4679                 op_getmad(first, newop, '1');
4680                 newop->op_targ = type;  /* set "was" field */
4681                 return newop;
4682             }
4683             op_free(first);
4684             if (other->op_type == OP_LEAVE)
4685                 other = newUNOP(OP_NULL, OPf_SPECIAL, other);
4686             return other;
4687         }
4688         else {
4689             /* check for C<my $x if 0>, or C<my($x,$y) if 0> */
4690             const OP *o2 = other;
4691             if ( ! (o2->op_type == OP_LIST
4692                     && (( o2 = cUNOPx(o2)->op_first))
4693                     && o2->op_type == OP_PUSHMARK
4694                     && (( o2 = o2->op_sibling)) )
4695             )
4696                 o2 = other;
4697             if ((o2->op_type == OP_PADSV || o2->op_type == OP_PADAV
4698                         || o2->op_type == OP_PADHV)
4699                 && o2->op_private & OPpLVAL_INTRO
4700                 && !(o2->op_private & OPpPAD_STATE))
4701             {
4702                 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
4703                                  "Deprecated use of my() in false conditional");
4704             }
4705
4706             *otherp = NULL;
4707             if (first->op_type == OP_CONST)
4708                 first->op_private |= OPpCONST_SHORTCIRCUIT;
4709             if (PL_madskills) {
4710                 first = newUNOP(OP_NULL, 0, first);
4711                 op_getmad(other, first, '2');
4712                 first->op_targ = type;  /* set "was" field */
4713             }
4714             else
4715                 op_free(other);
4716             return first;
4717         }
4718     }
4719     else if ((first->op_flags & OPf_KIDS) && type != OP_DOR
4720         && ckWARN(WARN_MISC)) /* [#24076] Don't warn for <FH> err FOO. */
4721     {
4722         const OP * const k1 = ((UNOP*)first)->op_first;
4723         const OP * const k2 = k1->op_sibling;
4724         OPCODE warnop = 0;
4725         switch (first->op_type)
4726         {
4727         case OP_NULL:
4728             if (k2 && k2->op_type == OP_READLINE
4729                   && (k2->op_flags & OPf_STACKED)
4730                   && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
4731             {
4732                 warnop = k2->op_type;
4733             }
4734             break;
4735
4736         case OP_SASSIGN:
4737             if (k1->op_type == OP_READDIR
4738                   || k1->op_type == OP_GLOB
4739                   || (k1->op_type == OP_NULL && k1->op_targ == OP_GLOB)
4740                   || k1->op_type == OP_EACH)
4741             {
4742                 warnop = ((k1->op_type == OP_NULL)
4743                           ? (OPCODE)k1->op_targ : k1->op_type);
4744             }
4745             break;
4746         }
4747         if (warnop) {
4748             const line_t oldline = CopLINE(PL_curcop);
4749             CopLINE_set(PL_curcop, PL_parser->copline);
4750             Perl_warner(aTHX_ packWARN(WARN_MISC),
4751                  "Value of %s%s can be \"0\"; test with defined()",
4752                  PL_op_desc[warnop],
4753                  ((warnop == OP_READLINE || warnop == OP_GLOB)
4754                   ? " construct" : "() operator"));
4755             CopLINE_set(PL_curcop, oldline);
4756         }
4757     }
4758
4759     if (!other)
4760         return first;
4761
4762     if (type == OP_ANDASSIGN || type == OP_ORASSIGN || type == OP_DORASSIGN)
4763         other->op_private |= OPpASSIGN_BACKWARDS;  /* other is an OP_SASSIGN */
4764
4765     NewOp(1101, logop, 1, LOGOP);
4766
4767     logop->op_type = (OPCODE)type;
4768     logop->op_ppaddr = PL_ppaddr[type];
4769     logop->op_first = first;
4770     logop->op_flags = (U8)(flags | OPf_KIDS);
4771     logop->op_other = LINKLIST(other);
4772     logop->op_private = (U8)(1 | (flags >> 8));
4773
4774     /* establish postfix order */
4775     logop->op_next = LINKLIST(first);
4776     first->op_next = (OP*)logop;
4777     first->op_sibling = other;
4778
4779     CHECKOP(type,logop);
4780
4781     o = newUNOP(prepend_not ? OP_NOT : OP_NULL, 0, (OP*)logop);
4782     other->op_next = o;
4783
4784     return o;
4785 }
4786
4787 OP *
4788 Perl_newCONDOP(pTHX_ I32 flags, OP *first, OP *trueop, OP *falseop)
4789 {
4790     dVAR;
4791     LOGOP *logop;
4792     OP *start;
4793     OP *o;
4794     OP *cstop;
4795
4796     PERL_ARGS_ASSERT_NEWCONDOP;
4797
4798     if (!falseop)
4799         return newLOGOP(OP_AND, 0, first, trueop);
4800     if (!trueop)
4801         return newLOGOP(OP_OR, 0, first, falseop);
4802
4803     scalarboolean(first);
4804     if ((cstop = search_const(first))) {
4805         /* Left or right arm of the conditional?  */
4806         const bool left = SvTRUE(((SVOP*)cstop)->op_sv);
4807         OP *live = left ? trueop : falseop;
4808         OP *const dead = left ? falseop : trueop;
4809         if (cstop->op_private & OPpCONST_BARE &&
4810             cstop->op_private & OPpCONST_STRICT) {
4811             no_bareword_allowed(cstop);
4812         }
4813         if (PL_madskills) {
4814             /* This is all dead code when PERL_MAD is not defined.  */
4815             live = newUNOP(OP_NULL, 0, live);
4816             op_getmad(first, live, 'C');
4817             op_getmad(dead, live, left ? 'e' : 't');
4818         } else {
4819             op_free(first);
4820             op_free(dead);
4821         }
4822         if (live->op_type == OP_LEAVE)
4823             live = newUNOP(OP_NULL, OPf_SPECIAL, live);
4824         return live;
4825     }
4826     NewOp(1101, logop, 1, LOGOP);
4827     logop->op_type = OP_COND_EXPR;
4828     logop->op_ppaddr = PL_ppaddr[OP_COND_EXPR];
4829     logop->op_first = first;
4830     logop->op_flags = (U8)(flags | OPf_KIDS);
4831     logop->op_private = (U8)(1 | (flags >> 8));
4832     logop->op_other = LINKLIST(trueop);
4833     logop->op_next = LINKLIST(falseop);
4834
4835     CHECKOP(OP_COND_EXPR, /* that's logop->op_type */
4836             logop);
4837
4838     /* establish postfix order */
4839     start = LINKLIST(first);
4840     first->op_next = (OP*)logop;
4841
4842     first->op_sibling = trueop;
4843     trueop->op_sibling = falseop;
4844     o = newUNOP(OP_NULL, 0, (OP*)logop);
4845
4846     trueop->op_next = falseop->op_next = o;
4847
4848     o->op_next = start;
4849     return o;
4850 }
4851
4852 OP *
4853 Perl_newRANGE(pTHX_ I32 flags, OP *left, OP *right)
4854 {
4855     dVAR;
4856     LOGOP *range;
4857     OP *flip;
4858     OP *flop;
4859     OP *leftstart;
4860     OP *o;
4861
4862     PERL_ARGS_ASSERT_NEWRANGE;
4863
4864     NewOp(1101, range, 1, LOGOP);
4865
4866     range->op_type = OP_RANGE;
4867     range->op_ppaddr = PL_ppaddr[OP_RANGE];
4868     range->op_first = left;
4869     range->op_flags = OPf_KIDS;
4870     leftstart = LINKLIST(left);
4871     range->op_other = LINKLIST(right);
4872     range->op_private = (U8)(1 | (flags >> 8));
4873
4874     left->op_sibling = right;
4875
4876     range->op_next = (OP*)range;
4877     flip = newUNOP(OP_FLIP, flags, (OP*)range);
4878     flop = newUNOP(OP_FLOP, 0, flip);
4879     o = newUNOP(OP_NULL, 0, flop);
4880     linklist(flop);
4881     range->op_next = leftstart;
4882
4883     left->op_next = flip;
4884     right->op_next = flop;
4885
4886     range->op_targ = pad_alloc(OP_RANGE, SVs_PADMY);
4887     sv_upgrade(PAD_SV(range->op_targ), SVt_PVNV);
4888     flip->op_targ = pad_alloc(OP_RANGE, SVs_PADMY);
4889     sv_upgrade(PAD_SV(flip->op_targ), SVt_PVNV);
4890
4891     flip->op_private =  left->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
4892     flop->op_private = right->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
4893
4894     flip->op_next = o;
4895     if (!flip->op_private || !flop->op_private)
4896         linklist(o);            /* blow off optimizer unless constant */
4897
4898     return o;
4899 }
4900
4901 OP *
4902 Perl_newLOOPOP(pTHX_ I32 flags, I32 debuggable, OP *expr, OP *block)
4903 {
4904     dVAR;
4905     OP* listop;
4906     OP* o;
4907     const bool once = block && block->op_flags & OPf_SPECIAL &&
4908       (block->op_type == OP_ENTERSUB || block->op_type == OP_NULL);
4909
4910     PERL_UNUSED_ARG(debuggable);
4911
4912     if (expr) {
4913         if (once && expr->op_type == OP_CONST && !SvTRUE(((SVOP*)expr)->op_sv))
4914             return block;       /* do {} while 0 does once */
4915         if (expr->op_type == OP_READLINE
4916             || expr->op_type == OP_READDIR
4917             || expr->op_type == OP_GLOB
4918             || (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB)) {
4919             expr = newUNOP(OP_DEFINED, 0,
4920                 newASSIGNOP(0, newDEFSVOP(), 0, expr) );
4921         } else if (expr->op_flags & OPf_KIDS) {
4922             const OP * const k1 = ((UNOP*)expr)->op_first;
4923             const OP * const k2 = k1 ? k1->op_sibling : NULL;
4924             switch (expr->op_type) {
4925               case OP_NULL:
4926                 if (k2 && (k2->op_type == OP_READLINE || k2->op_type == OP_READDIR)
4927                       && (k2->op_flags & OPf_STACKED)
4928                       && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
4929                     expr = newUNOP(OP_DEFINED, 0, expr);
4930                 break;
4931
4932               case OP_SASSIGN:
4933                 if (k1 && (k1->op_type == OP_READDIR
4934                       || k1->op_type == OP_GLOB
4935                       || (k1->op_type == OP_NULL && k1->op_targ == OP_GLOB)
4936                       || k1->op_type == OP_EACH))
4937                     expr = newUNOP(OP_DEFINED, 0, expr);
4938                 break;
4939             }
4940         }
4941     }
4942
4943     /* if block is null, the next append_elem() would put UNSTACK, a scalar
4944      * op, in listop. This is wrong. [perl #27024] */
4945     if (!block)
4946         block = newOP(OP_NULL, 0);
4947     listop = append_elem(OP_LINESEQ, block, newOP(OP_UNSTACK, 0));
4948     o = new_logop(OP_AND, 0, &expr, &listop);
4949
4950     if (listop)
4951         ((LISTOP*)listop)->op_last->op_next = LINKLIST(o);
4952
4953     if (once && o != listop)
4954         o->op_next = ((LOGOP*)cUNOPo->op_first)->op_other;
4955
4956     if (o == listop)
4957         o = newUNOP(OP_NULL, 0, o);     /* or do {} while 1 loses outer block */
4958
4959     o->op_flags |= flags;
4960     o = scope(o);
4961     o->op_flags |= OPf_SPECIAL; /* suppress POPBLOCK curpm restoration*/
4962     return o;
4963 }
4964
4965 OP *
4966 Perl_newWHILEOP(pTHX_ I32 flags, I32 debuggable, LOOP *loop, I32
4967 whileline, OP *expr, OP *block, OP *cont, I32 has_my)
4968 {
4969     dVAR;
4970     OP *redo;
4971     OP *next = NULL;
4972     OP *listop;
4973     OP *o;
4974     U8 loopflags = 0;
4975
4976     PERL_UNUSED_ARG(debuggable);
4977
4978     if (expr) {
4979         if (expr->op_type == OP_READLINE
4980          || expr->op_type == OP_READDIR
4981          || expr->op_type == OP_GLOB
4982                      || (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB)) {
4983             expr = newUNOP(OP_DEFINED, 0,
4984                 newASSIGNOP(0, newDEFSVOP(), 0, expr) );
4985         } else if (expr->op_flags & OPf_KIDS) {
4986             const OP * const k1 = ((UNOP*)expr)->op_first;
4987             const OP * const k2 = (k1) ? k1->op_sibling : NULL;
4988             switch (expr->op_type) {
4989               case OP_NULL:
4990                 if (k2 && (k2->op_type == OP_READLINE || k2->op_type == OP_READDIR)
4991                       && (k2->op_flags & OPf_STACKED)
4992                       && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
4993                     expr = newUNOP(OP_DEFINED, 0, expr);
4994                 break;
4995
4996               case OP_SASSIGN:
4997                 if (k1 && (k1->op_type == OP_READDIR
4998                       || k1->op_type == OP_GLOB
4999                       || (k1->op_type == OP_NULL && k1->op_targ == OP_GLOB)
5000                       || k1->op_type == OP_EACH))
5001                     expr = newUNOP(OP_DEFINED, 0, expr);
5002                 break;
5003             }
5004         }
5005     }
5006
5007     if (!block)
5008         block = newOP(OP_NULL, 0);
5009     else if (cont || has_my) {
5010         block = scope(block);
5011     }
5012
5013     if (cont) {
5014         next = LINKLIST(cont);
5015     }
5016     if (expr) {
5017         OP * const unstack = newOP(OP_UNSTACK, 0);
5018         if (!next)
5019             next = unstack;
5020         cont = append_elem(OP_LINESEQ, cont, unstack);
5021     }
5022
5023     assert(block);
5024     listop = append_list(OP_LINESEQ, (LISTOP*)block, (LISTOP*)cont);
5025     assert(listop);
5026     redo = LINKLIST(listop);
5027
5028     if (expr) {
5029         PL_parser->copline = (line_t)whileline;
5030         scalar(listop);
5031         o = new_logop(OP_AND, 0, &expr, &listop);
5032         if (o == expr && o->op_type == OP_CONST && !SvTRUE(cSVOPo->op_sv)) {
5033             op_free(expr);              /* oops, it's a while (0) */
5034             op_free((OP*)loop);
5035             return NULL;                /* listop already freed by new_logop */
5036         }
5037         if (listop)
5038             ((LISTOP*)listop)->op_last->op_next =
5039                 (o == listop ? redo : LINKLIST(o));
5040     }
5041     else
5042         o = listop;
5043
5044     if (!loop) {
5045         NewOp(1101,loop,1,LOOP);
5046         loop->op_type = OP_ENTERLOOP;
5047         loop->op_ppaddr = PL_ppaddr[OP_ENTERLOOP];
5048         loop->op_private = 0;
5049         loop->op_next = (OP*)loop;
5050     }
5051
5052     o = newBINOP(OP_LEAVELOOP, 0, (OP*)loop, o);
5053
5054     loop->op_redoop = redo;
5055     loop->op_lastop = o;
5056     o->op_private |= loopflags;
5057
5058     if (next)
5059         loop->op_nextop = next;
5060     else
5061         loop->op_nextop = o;
5062
5063     o->op_flags |= flags;
5064     o->op_private |= (flags >> 8);
5065     return o;
5066 }
5067
5068 OP *
5069 Perl_newFOROP(pTHX_ I32 flags, char *label, line_t forline, OP *sv, OP *expr, OP *block, OP *cont)
5070 {
5071     dVAR;
5072     LOOP *loop;
5073     OP *wop;
5074     PADOFFSET padoff = 0;
5075     I32 iterflags = 0;
5076     I32 iterpflags = 0;
5077     OP *madsv = NULL;
5078
5079     PERL_ARGS_ASSERT_NEWFOROP;
5080
5081     if (sv) {
5082         if (sv->op_type == OP_RV2SV) {  /* symbol table variable */
5083             iterpflags = sv->op_private & OPpOUR_INTRO; /* for our $x () */
5084             sv->op_type = OP_RV2GV;
5085             sv->op_ppaddr = PL_ppaddr[OP_RV2GV];
5086
5087             /* The op_type check is needed to prevent a possible segfault
5088              * if the loop variable is undeclared and 'strict vars' is in
5089              * effect. This is illegal but is nonetheless parsed, so we
5090              * may reach this point with an OP_CONST where we're expecting
5091              * an OP_GV.
5092              */
5093             if (cUNOPx(sv)->op_first->op_type == OP_GV
5094              && cGVOPx_gv(cUNOPx(sv)->op_first) == PL_defgv)
5095                 iterpflags |= OPpITER_DEF;
5096         }
5097         else if (sv->op_type == OP_PADSV) { /* private variable */
5098             iterpflags = sv->op_private & OPpLVAL_INTRO; /* for my $x () */
5099             padoff = sv->op_targ;
5100             if (PL_madskills)
5101                 madsv = sv;
5102             else {
5103                 sv->op_targ = 0;
5104                 op_free(sv);
5105             }
5106             sv = NULL;
5107         }
5108         else
5109             Perl_croak(aTHX_ "Can't use %s for loop variable", PL_op_desc[sv->op_type]);
5110         if (padoff) {
5111             SV *const namesv = PAD_COMPNAME_SV(padoff);
5112             STRLEN len;
5113             const char *const name = SvPV_const(namesv, len);
5114
5115             if (len == 2 && name[0] == '$' && name[1] == '_')
5116                 iterpflags |= OPpITER_DEF;
5117         }
5118     }
5119     else {
5120         const PADOFFSET offset = Perl_pad_findmy(aTHX_ STR_WITH_LEN("$_"), 0);
5121         if (offset == NOT_IN_PAD || PAD_COMPNAME_FLAGS_isOUR(offset)) {
5122             sv = newGVOP(OP_GV, 0, PL_defgv);
5123         }
5124         else {
5125             padoff = offset;
5126         }
5127         iterpflags |= OPpITER_DEF;
5128     }
5129     if (expr->op_type == OP_RV2AV || expr->op_type == OP_PADAV) {
5130         expr = mod(force_list(scalar(ref(expr, OP_ITER))), OP_GREPSTART);
5131         iterflags |= OPf_STACKED;
5132     }
5133     else if (expr->op_type == OP_NULL &&
5134              (expr->op_flags & OPf_KIDS) &&
5135              ((BINOP*)expr)->op_first->op_type == OP_FLOP)
5136     {
5137         /* Basically turn for($x..$y) into the same as for($x,$y), but we
5138          * set the STACKED flag to indicate that these values are to be
5139          * treated as min/max values by 'pp_iterinit'.
5140          */
5141         const UNOP* const flip = (UNOP*)((UNOP*)((BINOP*)expr)->op_first)->op_first;
5142         LOGOP* const range = (LOGOP*) flip->op_first;
5143         OP* const left  = range->op_first;
5144         OP* const right = left->op_sibling;
5145         LISTOP* listop;
5146
5147         range->op_flags &= ~OPf_KIDS;
5148         range->op_first = NULL;
5149
5150         listop = (LISTOP*)newLISTOP(OP_LIST, 0, left, right);
5151         listop->op_first->op_next = range->op_next;
5152         left->op_next = range->op_other;
5153         right->op_next = (OP*)listop;
5154         listop->op_next = listop->op_first;
5155
5156 #ifdef PERL_MAD
5157         op_getmad(expr,(OP*)listop,'O');
5158 #else
5159         op_free(expr);
5160 #endif
5161         expr = (OP*)(listop);
5162         op_null(expr);
5163         iterflags |= OPf_STACKED;
5164     }
5165     else {
5166         expr = mod(force_list(expr), OP_GREPSTART);
5167     }
5168
5169     loop = (LOOP*)list(convert(OP_ENTERITER, iterflags,
5170                                append_elem(OP_LIST, expr, scalar(sv))));
5171     assert(!loop->op_next);
5172     /* for my  $x () sets OPpLVAL_INTRO;
5173      * for our $x () sets OPpOUR_INTRO */
5174     loop->op_private = (U8)iterpflags;
5175 #ifdef PL_OP_SLAB_ALLOC
5176     {
5177         LOOP *tmp;
5178         NewOp(1234,tmp,1,LOOP);
5179         Copy(loop,tmp,1,LISTOP);
5180         S_op_destroy(aTHX_ (OP*)loop);
5181         loop = tmp;
5182     }
5183 #else
5184     loop = (LOOP*)PerlMemShared_realloc(loop, sizeof(LOOP));
5185 #endif
5186     loop->op_targ = padoff;
5187     wop = newWHILEOP(flags, 1, loop, forline, newOP(OP_ITER, 0), block, cont, 0);
5188     if (madsv)
5189         op_getmad(madsv, (OP*)loop, 'v');
5190     PL_parser->copline = forline;
5191     return newSTATEOP(0, label, wop);
5192 }
5193
5194 OP*
5195 Perl_newLOOPEX(pTHX_ I32 type, OP *label)
5196 {
5197     dVAR;
5198     OP *o;
5199
5200     PERL_ARGS_ASSERT_NEWLOOPEX;
5201
5202     assert((PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP);
5203
5204     if (type != OP_GOTO || label->op_type == OP_CONST) {
5205         /* "last()" means "last" */
5206         if (label->op_type == OP_STUB && (label->op_flags & OPf_PARENS))
5207             o = newOP(type, OPf_SPECIAL);
5208         else {
5209             o = newPVOP(type, 0, savesharedpv(label->op_type == OP_CONST
5210                                         ? SvPV_nolen_const(((SVOP*)label)->op_sv)
5211                                         : ""));
5212         }
5213 #ifdef PERL_MAD
5214         op_getmad(label,o,'L');
5215 #else
5216         op_free(label);
5217 #endif
5218     }
5219     else {
5220         /* Check whether it's going to be a goto &function */
5221         if (label->op_type == OP_ENTERSUB
5222                 && !(label->op_flags & OPf_STACKED))
5223             label = newUNOP(OP_REFGEN, 0, mod(label, OP_REFGEN));
5224         o = newUNOP(type, OPf_STACKED, label);
5225     }
5226     PL_hints |= HINT_BLOCK_SCOPE;
5227     return o;
5228 }
5229
5230 /* if the condition is a literal array or hash
5231    (or @{ ... } etc), make a reference to it.
5232  */
5233 STATIC OP *
5234 S_ref_array_or_hash(pTHX_ OP *cond)
5235 {
5236     if (cond
5237     && (cond->op_type == OP_RV2AV
5238     ||  cond->op_type == OP_PADAV
5239     ||  cond->op_type == OP_RV2HV
5240     ||  cond->op_type == OP_PADHV))
5241
5242         return newUNOP(OP_REFGEN,
5243             0, mod(cond, OP_REFGEN));
5244
5245     else
5246         return cond;
5247 }
5248
5249 /* These construct the optree fragments representing given()
5250    and when() blocks.
5251
5252    entergiven and enterwhen are LOGOPs; the op_other pointer
5253    points up to the associated leave op. We need this so we
5254    can put it in the context and make break/continue work.
5255    (Also, of course, pp_enterwhen will jump straight to
5256    op_other if the match fails.)
5257  */
5258
5259 STATIC OP *
5260 S_newGIVWHENOP(pTHX_ OP *cond, OP *block,
5261                    I32 enter_opcode, I32 leave_opcode,
5262                    PADOFFSET entertarg)
5263 {
5264     dVAR;
5265     LOGOP *enterop;
5266     OP *o;
5267
5268     PERL_ARGS_ASSERT_NEWGIVWHENOP;
5269
5270     NewOp(1101, enterop, 1, LOGOP);
5271     enterop->op_type = (Optype)enter_opcode;
5272     enterop->op_ppaddr = PL_ppaddr[enter_opcode];
5273     enterop->op_flags =  (U8) OPf_KIDS;
5274     enterop->op_targ = ((entertarg == NOT_IN_PAD) ? 0 : entertarg);
5275     enterop->op_private = 0;
5276
5277     o = newUNOP(leave_opcode, 0, (OP *) enterop);
5278
5279     if (cond) {
5280         enterop->op_first = scalar(cond);
5281         cond->op_sibling = block;
5282
5283         o->op_next = LINKLIST(cond);
5284         cond->op_next = (OP *) enterop;
5285     }
5286     else {
5287         /* This is a default {} block */
5288         enterop->op_first = block;
5289         enterop->op_flags |= OPf_SPECIAL;
5290
5291         o->op_next = (OP *) enterop;
5292     }
5293
5294     CHECKOP(enter_opcode, enterop); /* Currently does nothing, since
5295                                        entergiven and enterwhen both
5296                                        use ck_null() */
5297
5298     enterop->op_next = LINKLIST(block);
5299     block->op_next = enterop->op_other = o;
5300
5301     return o;
5302 }
5303
5304 /* Does this look like a boolean operation? For these purposes
5305    a boolean operation is:
5306      - a subroutine call [*]
5307      - a logical connective
5308      - a comparison operator
5309      - a filetest operator, with the exception of -s -M -A -C
5310      - defined(), exists() or eof()
5311      - /$re/ or $foo =~ /$re/
5312    
5313    [*] possibly surprising
5314  */
5315 STATIC bool
5316 S_looks_like_bool(pTHX_ const OP *o)
5317 {
5318     dVAR;
5319
5320     PERL_ARGS_ASSERT_LOOKS_LIKE_BOOL;
5321
5322     switch(o->op_type) {
5323         case OP_OR:
5324         case OP_DOR:
5325             return looks_like_bool(cLOGOPo->op_first);
5326
5327         case OP_AND:
5328             return (
5329                 looks_like_bool(cLOGOPo->op_first)
5330              && looks_like_bool(cLOGOPo->op_first->op_sibling));
5331
5332         case OP_NULL:
5333         case OP_SCALAR:
5334             return (
5335                 o->op_flags & OPf_KIDS
5336             && looks_like_bool(cUNOPo->op_first));
5337
5338         case OP_ENTERSUB:
5339
5340         case OP_NOT:    case OP_XOR:
5341
5342         case OP_EQ:     case OP_NE:     case OP_LT:
5343         case OP_GT:     case OP_LE:     case OP_GE:
5344
5345         case OP_I_EQ:   case OP_I_NE:   case OP_I_LT:
5346         case OP_I_GT:   case OP_I_LE:   case OP_I_GE:
5347
5348         case OP_SEQ:    case OP_SNE:    case OP_SLT:
5349         case OP_SGT:    case OP_SLE:    case OP_SGE:
5350         
5351         case OP_SMARTMATCH:
5352         
5353         case OP_FTRREAD:  case OP_FTRWRITE: case OP_FTREXEC:
5354         case OP_FTEREAD:  case OP_FTEWRITE: case OP_FTEEXEC:
5355         case OP_FTIS:     case OP_FTEOWNED: case OP_FTROWNED:
5356         case OP_FTZERO:   case OP_FTSOCK:   case OP_FTCHR:
5357         case OP_FTBLK:    case OP_FTFILE:   case OP_FTDIR:
5358         case OP_FTPIPE:   case OP_FTLINK:   case OP_FTSUID:
5359         case OP_FTSGID:   case OP_FTSVTX:   case OP_FTTTY:
5360         case OP_FTTEXT:   case OP_FTBINARY:
5361         
5362         case OP_DEFINED: case OP_EXISTS:
5363         case OP_MATCH:   case OP_EOF:
5364
5365         case OP_FLOP:
5366
5367             return TRUE;
5368         
5369         case OP_CONST:
5370             /* Detect comparisons that have been optimized away */
5371             if (cSVOPo->op_sv == &PL_sv_yes
5372             ||  cSVOPo->op_sv == &PL_sv_no)
5373             
5374                 return TRUE;
5375             else
5376                 return FALSE;
5377
5378         /* FALL THROUGH */
5379         default:
5380             return FALSE;
5381     }
5382 }
5383
5384 OP *
5385 Perl_newGIVENOP(pTHX_ OP *cond, OP *block, PADOFFSET defsv_off)
5386 {
5387     dVAR;
5388     PERL_ARGS_ASSERT_NEWGIVENOP;
5389     return newGIVWHENOP(
5390         ref_array_or_hash(cond),
5391         block,
5392         OP_ENTERGIVEN, OP_LEAVEGIVEN,
5393         defsv_off);
5394 }
5395
5396 /* If cond is null, this is a default {} block */
5397 OP *
5398 Perl_newWHENOP(pTHX_ OP *cond, OP *block)
5399 {
5400     const bool cond_llb = (!cond || looks_like_bool(cond));
5401     OP *cond_op;
5402
5403     PERL_ARGS_ASSERT_NEWWHENOP;
5404
5405     if (cond_llb)
5406         cond_op = cond;
5407     else {
5408         cond_op = newBINOP(OP_SMARTMATCH, OPf_SPECIAL,
5409                 newDEFSVOP(),
5410                 scalar(ref_array_or_hash(cond)));
5411     }
5412     
5413     return newGIVWHENOP(
5414         cond_op,
5415         append_elem(block->op_type, block, newOP(OP_BREAK, OPf_SPECIAL)),
5416         OP_ENTERWHEN, OP_LEAVEWHEN, 0);
5417 }
5418
5419 /*
5420 =for apidoc cv_undef
5421
5422 Clear out all the active components of a CV. This can happen either
5423 by an explicit C<undef &foo>, or by the reference count going to zero.
5424 In the former case, we keep the CvOUTSIDE pointer, so that any anonymous
5425 children can still follow the full lexical scope chain.
5426
5427 =cut
5428 */
5429
5430 void
5431 Perl_cv_undef(pTHX_ CV *cv)
5432 {
5433     dVAR;
5434
5435     PERL_ARGS_ASSERT_CV_UNDEF;
5436
5437     DEBUG_X(PerlIO_printf(Perl_debug_log,
5438           "CV undef: cv=0x%"UVxf" comppad=0x%"UVxf"\n",
5439             PTR2UV(cv), PTR2UV(PL_comppad))
5440     );
5441
5442 #ifdef USE_ITHREADS
5443     if (CvFILE(cv) && !CvISXSUB(cv)) {
5444         /* for XSUBs CvFILE point directly to static memory; __FILE__ */
5445         Safefree(CvFILE(cv));
5446     }
5447     CvFILE(cv) = NULL;
5448 #endif
5449
5450     if (!CvISXSUB(cv) && CvROOT(cv)) {
5451         if (SvTYPE(cv) == SVt_PVCV && CvDEPTH(cv))
5452             Perl_croak(aTHX_ "Can't undef active subroutine");
5453         ENTER;
5454
5455         PAD_SAVE_SETNULLPAD();
5456
5457         op_free(CvROOT(cv));
5458         CvROOT(cv) = NULL;
5459         CvSTART(cv) = NULL;
5460         LEAVE;
5461     }
5462     SvPOK_off(MUTABLE_SV(cv));          /* forget prototype */
5463     CvGV_set(cv, NULL);
5464
5465     pad_undef(cv);
5466
5467     /* remove CvOUTSIDE unless this is an undef rather than a free */
5468     if (!SvREFCNT(cv) && CvOUTSIDE(cv)) {
5469         if (!CvWEAKOUTSIDE(cv))
5470             SvREFCNT_dec(CvOUTSIDE(cv));
5471         CvOUTSIDE(cv) = NULL;
5472     }
5473     if (CvCONST(cv)) {
5474         SvREFCNT_dec(MUTABLE_SV(CvXSUBANY(cv).any_ptr));
5475         CvCONST_off(cv);
5476     }
5477     if (CvISXSUB(cv) && CvXSUB(cv)) {
5478         CvXSUB(cv) = NULL;
5479     }
5480     /* delete all flags except WEAKOUTSIDE and CVGV_RC, which indicate the
5481      * ref status of CvOUTSIDE and CvGV */
5482     CvFLAGS(cv) &= (CVf_WEAKOUTSIDE|CVf_CVGV_RC);
5483 }
5484
5485 void
5486 Perl_cv_ckproto_len(pTHX_ const CV *cv, const GV *gv, const char *p,
5487                     const STRLEN len)
5488 {
5489     PERL_ARGS_ASSERT_CV_CKPROTO_LEN;
5490
5491     /* Can't just use a strcmp on the prototype, as CONSTSUBs "cheat" by
5492        relying on SvCUR, and doubling up the buffer to hold CvFILE().  */
5493     if (((!p != !SvPOK(cv)) /* One has prototype, one has not.  */
5494          || (p && (len != SvCUR(cv) /* Not the same length.  */
5495                    || memNE(p, SvPVX_const(cv), len))))
5496          && ckWARN_d(WARN_PROTOTYPE)) {
5497         SV* const msg = sv_newmortal();
5498         SV* name = NULL;
5499
5500         if (gv)
5501             gv_efullname3(name = sv_newmortal(), gv, NULL);
5502         sv_setpvs(msg, "Prototype mismatch:");
5503         if (name)
5504             Perl_sv_catpvf(aTHX_ msg, " sub %"SVf, SVfARG(name));
5505         if (SvPOK(cv))
5506             Perl_sv_catpvf(aTHX_ msg, " (%"SVf")", SVfARG(cv));
5507         else
5508             sv_catpvs(msg, ": none");
5509         sv_catpvs(msg, " vs ");
5510         if (p)
5511             Perl_sv_catpvf(aTHX_ msg, "(%.*s)", (int) len, p);
5512         else
5513             sv_catpvs(msg, "none");
5514         Perl_warner(aTHX_ packWARN(WARN_PROTOTYPE), "%"SVf, SVfARG(msg));
5515     }
5516 }
5517
5518 static void const_sv_xsub(pTHX_ CV* cv);
5519
5520 /*
5521
5522 =head1 Optree Manipulation Functions
5523
5524 =for apidoc cv_const_sv
5525
5526 If C<cv> is a constant sub eligible for inlining. returns the constant
5527 value returned by the sub.  Otherwise, returns NULL.
5528
5529 Constant subs can be created with C<newCONSTSUB> or as described in
5530 L<perlsub/"Constant Functions">.
5531
5532 =cut
5533 */
5534 SV *
5535 Perl_cv_const_sv(pTHX_ const CV *const cv)
5536 {
5537     PERL_UNUSED_CONTEXT;
5538     if (!cv)
5539         return NULL;
5540     if (!(SvTYPE(cv) == SVt_PVCV || SvTYPE(cv) == SVt_PVFM))
5541         return NULL;
5542     return CvCONST(cv) ? MUTABLE_SV(CvXSUBANY(cv).any_ptr) : NULL;
5543 }
5544
5545 /* op_const_sv:  examine an optree to determine whether it's in-lineable.
5546  * Can be called in 3 ways:
5547  *
5548  * !cv
5549  *      look for a single OP_CONST with attached value: return the value
5550  *
5551  * cv && CvCLONE(cv) && !CvCONST(cv)
5552  *
5553  *      examine the clone prototype, and if contains only a single
5554  *      OP_CONST referencing a pad const, or a single PADSV referencing
5555  *      an outer lexical, return a non-zero value to indicate the CV is
5556  *      a candidate for "constizing" at clone time
5557  *
5558  * cv && CvCONST(cv)
5559  *
5560  *      We have just cloned an anon prototype that was marked as a const
5561  *      candidiate. Try to grab the current value, and in the case of
5562  *      PADSV, ignore it if it has multiple references. Return the value.
5563  */
5564
5565 SV *
5566 Perl_op_const_sv(pTHX_ const OP *o, CV *cv)
5567 {
5568     dVAR;
5569     SV *sv = NULL;
5570
5571     if (PL_madskills)
5572         return NULL;
5573
5574     if (!o)
5575         return NULL;
5576
5577     if (o->op_type == OP_LINESEQ && cLISTOPo->op_first)
5578         o = cLISTOPo->op_first->op_sibling;
5579
5580     for (; o; o = o->op_next) {
5581         const OPCODE type = o->op_type;
5582
5583         if (sv && o->op_next == o)
5584             return sv;
5585         if (o->op_next != o) {
5586             if (type == OP_NEXTSTATE || type == OP_NULL || type == OP_PUSHMARK)
5587                 continue;
5588             if (type == OP_DBSTATE)
5589                 continue;
5590         }
5591         if (type == OP_LEAVESUB || type == OP_RETURN)
5592             break;
5593         if (sv)
5594             return NULL;
5595         if (type == OP_CONST && cSVOPo->op_sv)
5596             sv = cSVOPo->op_sv;
5597         else if (cv && type == OP_CONST) {
5598             sv = PAD_BASE_SV(CvPADLIST(cv), o->op_targ);
5599             if (!sv)
5600                 return NULL;
5601         }
5602         else if (cv && type == OP_PADSV) {
5603             if (CvCONST(cv)) { /* newly cloned anon */
5604                 sv = PAD_BASE_SV(CvPADLIST(cv), o->op_targ);
5605                 /* the candidate should have 1 ref from this pad and 1 ref
5606                  * from the parent */
5607                 if (!sv || SvREFCNT(sv) != 2)
5608                     return NULL;
5609                 sv = newSVsv(sv);
5610                 SvREADONLY_on(sv);
5611                 return sv;
5612             }
5613             else {
5614                 if (PAD_COMPNAME_FLAGS(o->op_targ) & SVf_FAKE)
5615                     sv = &PL_sv_undef; /* an arbitrary non-null value */
5616             }
5617         }
5618         else {
5619             return NULL;
5620         }
5621     }
5622     return sv;
5623 }
5624
5625 #ifdef PERL_MAD
5626 OP *
5627 #else
5628 void
5629 #endif
5630 Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
5631 {
5632 #if 0
5633     /* This would be the return value, but the return cannot be reached.  */
5634     OP* pegop = newOP(OP_NULL, 0);
5635 #endif
5636
5637     PERL_UNUSED_ARG(floor);
5638
5639     if (o)
5640         SAVEFREEOP(o);
5641     if (proto)
5642         SAVEFREEOP(proto);
5643     if (attrs)
5644         SAVEFREEOP(attrs);
5645     if (block)
5646         SAVEFREEOP(block);
5647     Perl_croak(aTHX_ "\"my sub\" not yet implemented");
5648 #ifdef PERL_MAD
5649     NORETURN_FUNCTION_END;
5650 #endif
5651 }
5652
5653 CV *
5654 Perl_newSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *block)
5655 {
5656     return Perl_newATTRSUB(aTHX_ floor, o, proto, NULL, block);
5657 }
5658
5659 CV *
5660 Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
5661 {
5662     dVAR;
5663     GV *gv;
5664     const char *ps;
5665     STRLEN ps_len = 0; /* init it to avoid false uninit warning from icc */
5666     register CV *cv = NULL;
5667     SV *const_sv;
5668     /* If the subroutine has no body, no attributes, and no builtin attributes
5669        then it's just a sub declaration, and we may be able to get away with
5670        storing with a placeholder scalar in the symbol table, rather than a
5671        full GV and CV.  If anything is present then it will take a full CV to
5672        store it.  */
5673     const I32 gv_fetch_flags
5674         = (block || attrs || (CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS)
5675            || PL_madskills)
5676         ? GV_ADDMULTI : GV_ADDMULTI | GV_NOINIT;
5677     const char * const name = o ? SvPV_nolen_const(cSVOPo->op_sv) : NULL;
5678     bool has_name;
5679
5680     if (proto) {
5681         assert(proto->op_type == OP_CONST);
5682         ps = SvPV_const(((SVOP*)proto)->op_sv, ps_len);
5683     }
5684     else
5685         ps = NULL;
5686
5687     if (name) {
5688         gv = gv_fetchsv(cSVOPo->op_sv, gv_fetch_flags, SVt_PVCV);
5689         has_name = TRUE;
5690     } else if (PERLDB_NAMEANON && CopLINE(PL_curcop)) {
5691         SV * const sv = sv_newmortal();
5692         Perl_sv_setpvf(aTHX_ sv, "%s[%s:%"IVdf"]",
5693                        PL_curstash ? "__ANON__" : "__ANON__::__ANON__",
5694                        CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
5695         gv = gv_fetchsv(sv, gv_fetch_flags, SVt_PVCV);
5696         has_name = TRUE;
5697     } else if (PL_curstash) {
5698         gv = gv_fetchpvs("__ANON__", gv_fetch_flags, SVt_PVCV);
5699         has_name = FALSE;
5700     } else {
5701         gv = gv_fetchpvs("__ANON__::__ANON__", gv_fetch_flags, SVt_PVCV);
5702         has_name = FALSE;
5703     }
5704
5705     if (!PL_madskills) {
5706         if (o)
5707             SAVEFREEOP(o);
5708         if (proto)
5709             SAVEFREEOP(proto);
5710         if (attrs)
5711             SAVEFREEOP(attrs);
5712     }
5713
5714     if (SvTYPE(gv) != SVt_PVGV) {       /* Maybe prototype now, and had at
5715                                            maximum a prototype before. */
5716         if (SvTYPE(gv) > SVt_NULL) {
5717             if (!SvPOK((const SV *)gv)
5718                 && !(SvIOK((const SV *)gv) && SvIVX((const SV *)gv) == -1))
5719             {
5720                 Perl_ck_warner_d(aTHX_ packWARN(WARN_PROTOTYPE), "Runaway prototype");
5721             }
5722             cv_ckproto_len((const CV *)gv, NULL, ps, ps_len);
5723         }
5724         if (ps)
5725             sv_setpvn(MUTABLE_SV(gv), ps, ps_len);
5726         else
5727             sv_setiv(MUTABLE_SV(gv), -1);
5728
5729         SvREFCNT_dec(PL_compcv);
5730         cv = PL_compcv = NULL;
5731         goto done;
5732     }
5733
5734     cv = (!name || GvCVGEN(gv)) ? NULL : GvCV(gv);
5735
5736     if (!block || !ps || *ps || attrs
5737         || (CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS)
5738 #ifdef PERL_MAD
5739         || block->op_type == OP_NULL
5740 #endif
5741         )
5742         const_sv = NULL;
5743     else
5744         const_sv = op_const_sv(block, NULL);
5745
5746     if (cv) {
5747         const bool exists = CvROOT(cv) || CvXSUB(cv);
5748
5749         /* if the subroutine doesn't exist and wasn't pre-declared
5750          * with a prototype, assume it will be AUTOLOADed,
5751          * skipping the prototype check
5752          */
5753         if (exists || SvPOK(cv))
5754             cv_ckproto_len(cv, gv, ps, ps_len);
5755         /* already defined (or promised)? */
5756         if (exists || GvASSUMECV(gv)) {
5757             if ((!block
5758 #ifdef PERL_MAD
5759                  || block->op_type == OP_NULL
5760 #endif
5761                  )&& !attrs) {
5762                 if (CvFLAGS(PL_compcv)) {
5763                     /* might have had built-in attrs applied */
5764                     if (CvLVALUE(PL_compcv) && ! CvLVALUE(cv) && ckWARN(WARN_MISC))
5765                         Perl_warner(aTHX_ packWARN(WARN_MISC), "lvalue attribute ignored after the subroutine has been defined");
5766                     CvFLAGS(cv) |= (CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS & ~CVf_LVALUE);
5767                 }
5768                 /* just a "sub foo;" when &foo is already defined */
5769                 SAVEFREESV(PL_compcv);
5770                 goto done;
5771             }
5772             if (block
5773 #ifdef PERL_MAD
5774                 && block->op_type != OP_NULL
5775 #endif
5776                 ) {
5777                 if (ckWARN(WARN_REDEFINE)
5778                     || (CvCONST(cv)
5779                         && (!const_sv || sv_cmp(cv_const_sv(cv), const_sv))))
5780                 {
5781                     const line_t oldline = CopLINE(PL_curcop);
5782                     if (PL_parser && PL_parser->copline != NOLINE)
5783                         CopLINE_set(PL_curcop, PL_parser->copline);
5784                     Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
5785                         CvCONST(cv) ? "Constant subroutine %s redefined"
5786                                     : "Subroutine %s redefined", name);
5787                     CopLINE_set(PL_curcop, oldline);
5788                 }
5789 #ifdef PERL_MAD
5790                 if (!PL_minus_c)        /* keep old one around for madskills */
5791 #endif
5792                     {
5793                         /* (PL_madskills unset in used file.) */
5794                         SvREFCNT_dec(cv);
5795                     }
5796                 cv = NULL;
5797             }
5798         }
5799     }
5800     if (const_sv) {
5801         SvREFCNT_inc_simple_void_NN(const_sv);
5802         if (cv) {
5803             assert(!CvROOT(cv) && !CvCONST(cv));
5804             sv_setpvs(MUTABLE_SV(cv), "");  /* prototype is "" */
5805             CvXSUBANY(cv).any_ptr = const_sv;
5806             CvXSUB(cv) = const_sv_xsub;
5807             CvCONST_on(cv);
5808             CvISXSUB_on(cv);
5809         }
5810         else {
5811             GvCV(gv) = NULL;
5812             cv = newCONSTSUB(NULL, name, const_sv);
5813         }
5814         mro_method_changed_in( /* sub Foo::Bar () { 123 } */
5815             (CvGV(cv) && GvSTASH(CvGV(cv)))
5816                 ? GvSTASH(CvGV(cv))
5817                 : CvSTASH(cv)
5818                     ? CvSTASH(cv)
5819                     : PL_curstash
5820         );
5821         if (PL_madskills)
5822             goto install_block;
5823         op_free(block);
5824         SvREFCNT_dec(PL_compcv);
5825         PL_compcv = NULL;
5826         goto done;
5827     }
5828     if (cv) {                           /* must reuse cv if autoloaded */
5829         /* transfer PL_compcv to cv */
5830         if (block
5831 #ifdef PERL_MAD
5832                   && block->op_type != OP_NULL
5833 #endif
5834         ) {
5835             cv_flags_t existing_builtin_attrs = CvFLAGS(cv) & CVf_BUILTIN_ATTRS;
5836             cv_undef(cv);
5837             CvFLAGS(cv) = CvFLAGS(PL_compcv) | existing_builtin_attrs;
5838             if (!CvWEAKOUTSIDE(cv))
5839                 SvREFCNT_dec(CvOUTSIDE(cv));
5840             CvOUTSIDE(cv) = CvOUTSIDE(PL_compcv);
5841             CvOUTSIDE_SEQ(cv) = CvOUTSIDE_SEQ(PL_compcv);
5842             CvOUTSIDE(PL_compcv) = 0;
5843             CvPADLIST(cv) = CvPADLIST(PL_compcv);
5844             CvPADLIST(PL_compcv) = 0;
5845             /* inner references to PL_compcv must be fixed up ... */
5846             pad_fixup_inner_anons(CvPADLIST(cv), PL_compcv, cv);
5847             if (PERLDB_INTER)/* Advice debugger on the new sub. */
5848               ++PL_sub_generation;
5849             if (CvSTASH(cv))
5850                 sv_del_backref(MUTABLE_SV(CvSTASH(cv)), MUTABLE_SV(cv));
5851         }
5852         else {
5853             /* Might have had built-in attributes applied -- propagate them. */
5854             CvFLAGS(cv) |= (CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS);
5855         }
5856         /* ... before we throw it away */
5857         SvREFCNT_dec(PL_compcv);
5858         PL_compcv = cv;
5859     }
5860     else {
5861         cv = PL_compcv;
5862         if (name) {
5863             GvCV(gv) = cv;
5864             if (PL_madskills) {
5865                 if (strEQ(name, "import")) {
5866                     PL_formfeed = MUTABLE_SV(cv);
5867                     /* diag_listed_as: SKIPME */
5868                     Perl_warner(aTHX_ packWARN(WARN_VOID), "0x%"UVxf"\n", PTR2UV(cv));
5869                 }
5870             }
5871             GvCVGEN(gv) = 0;
5872             mro_method_changed_in(GvSTASH(gv)); /* sub Foo::bar { (shift)+1 } */
5873         }
5874     }
5875     if (!CvGV(cv)) {
5876         CvGV_set(cv, gv);
5877         CvFILE_set_from_cop(cv, PL_curcop);
5878         CvSTASH(cv) = PL_curstash;
5879         if (PL_curstash)
5880             Perl_sv_add_backref(aTHX_ MUTABLE_SV(PL_curstash), MUTABLE_SV(cv));
5881     }
5882     if (attrs) {
5883         /* Need to do a C<use attributes $stash_of_cv,\&cv,@attrs>. */
5884         HV *stash = name && GvSTASH(CvGV(cv)) ? GvSTASH(CvGV(cv)) : PL_curstash;
5885         apply_attrs(stash, MUTABLE_SV(cv), attrs, FALSE);
5886     }
5887
5888     if (ps)
5889         sv_setpvn(MUTABLE_SV(cv), ps, ps_len);
5890
5891     if (PL_parser && PL_parser->error_count) {
5892         op_free(block);
5893         block = NULL;
5894         if (name) {
5895             const char *s = strrchr(name, ':');
5896             s = s ? s+1 : name;
5897             if (strEQ(s, "BEGIN")) {
5898                 const char not_safe[] =
5899                     "BEGIN not safe after errors--compilation aborted";
5900                 if (PL_in_eval & EVAL_KEEPERR)
5901                     Perl_croak(aTHX_ not_safe);
5902                 else {
5903                     /* force display of errors found but not reported */
5904                     sv_catpv(ERRSV, not_safe);
5905                     Perl_croak(aTHX_ "%"SVf, SVfARG(ERRSV));
5906                 }
5907             }
5908         }
5909     }
5910  install_block:
5911     if (!block)
5912         goto done;
5913
5914     /* If we assign an optree to a PVCV, then we've defined a subroutine that
5915        the debugger could be able to set a breakpoint in, so signal to
5916        pp_entereval that it should not throw away any saved lines at scope
5917        exit.  */
5918        
5919     PL_breakable_sub_gen++;
5920     if (CvLVALUE(cv)) {
5921         CvROOT(cv) = newUNOP(OP_LEAVESUBLV, 0,
5922                              mod(scalarseq(block), OP_LEAVESUBLV));
5923         block->op_attached = 1;
5924     }
5925     else {
5926         /* This makes sub {}; work as expected.  */
5927         if (block->op_type == OP_STUB) {
5928             OP* const newblock = newSTATEOP(0, NULL, 0);
5929 #ifdef PERL_MAD
5930             op_getmad(block,newblock,'B');
5931 #else
5932             op_free(block);
5933 #endif
5934             block = newblock;
5935         }
5936         else
5937             block->op_attached = 1;
5938         CvROOT(cv) = newUNOP(OP_LEAVESUB, 0, scalarseq(block));
5939     }
5940     CvROOT(cv)->op_private |= OPpREFCOUNTED;
5941     OpREFCNT_set(CvROOT(cv), 1);
5942     CvSTART(cv) = LINKLIST(CvROOT(cv));
5943     CvROOT(cv)->op_next = 0;
5944     CALL_PEEP(CvSTART(cv));
5945
5946     /* now that optimizer has done its work, adjust pad values */
5947
5948     pad_tidy(CvCLONE(cv) ? padtidy_SUBCLONE : padtidy_SUB);
5949
5950     if (CvCLONE(cv)) {
5951         assert(!CvCONST(cv));
5952         if (ps && !*ps && op_const_sv(block, cv))
5953             CvCONST_on(cv);
5954     }
5955
5956     if (has_name) {
5957         if (PERLDB_SUBLINE && PL_curstash != PL_debstash) {
5958             SV * const tmpstr = sv_newmortal();
5959             GV * const db_postponed = gv_fetchpvs("DB::postponed",
5960                                                   GV_ADDMULTI, SVt_PVHV);
5961             HV *hv;
5962             SV * const sv = Perl_newSVpvf(aTHX_ "%s:%ld-%ld",
5963                                           CopFILE(PL_curcop),
5964                                           (long)PL_subline,
5965                                           (long)CopLINE(PL_curcop));
5966             gv_efullname3(tmpstr, gv, NULL);
5967             (void)hv_store(GvHV(PL_DBsub), SvPVX_const(tmpstr),
5968                     SvCUR(tmpstr), sv, 0);
5969             hv = GvHVn(db_postponed);
5970             if (HvTOTALKEYS(hv) > 0 && hv_exists(hv, SvPVX_const(tmpstr), SvCUR(tmpstr))) {
5971                 CV * const pcv = GvCV(db_postponed);
5972                 if (pcv) {
5973                     dSP;
5974                     PUSHMARK(SP);
5975                     XPUSHs(tmpstr);
5976                     PUTBACK;
5977                     call_sv(MUTABLE_SV(pcv), G_DISCARD);
5978                 }
5979             }
5980         }
5981
5982         if (name && ! (PL_parser && PL_parser->error_count))
5983             process_special_blocks(name, gv, cv);
5984     }
5985
5986   done:
5987     if (PL_parser)
5988         PL_parser->copline = NOLINE;
5989     LEAVE_SCOPE(floor);
5990     return cv;
5991 }
5992
5993 STATIC void
5994 S_process_special_blocks(pTHX_ const char *const fullname, GV *const gv,
5995                          CV *const cv)
5996 {
5997     const char *const colon = strrchr(fullname,':');
5998     const char *const name = colon ? colon + 1 : fullname;
5999
6000     PERL_ARGS_ASSERT_PROCESS_SPECIAL_BLOCKS;
6001
6002     if (*name == 'B') {
6003         if (strEQ(name, "BEGIN")) {
6004             const I32 oldscope = PL_scopestack_ix;
6005             ENTER;
6006             SAVECOPFILE(&PL_compiling);
6007             SAVECOPLINE(&PL_compiling);
6008
6009             DEBUG_x( dump_sub(gv) );
6010             Perl_av_create_and_push(aTHX_ &PL_beginav, MUTABLE_SV(cv));
6011             GvCV(gv) = 0;               /* cv has been hijacked */
6012             call_list(oldscope, PL_beginav);
6013
6014             PL_curcop = &PL_compiling;
6015             CopHINTS_set(&PL_compiling, PL_hints);
6016             LEAVE;
6017         }
6018         else
6019             return;
6020     } else {
6021         if (*name == 'E') {
6022             if strEQ(name, "END") {
6023                 DEBUG_x( dump_sub(gv) );
6024                 Perl_av_create_and_unshift_one(aTHX_ &PL_endav, MUTABLE_SV(cv));
6025             } else
6026                 return;
6027         } else if (*name == 'U') {
6028             if (strEQ(name, "UNITCHECK")) {
6029                 /* It's never too late to run a unitcheck block */
6030                 Perl_av_create_and_unshift_one(aTHX_ &PL_unitcheckav, MUTABLE_SV(cv));
6031             }
6032             else
6033                 return;
6034         } else if (*name == 'C') {
6035             if (strEQ(name, "CHECK")) {
6036                 if (PL_main_start)
6037                     Perl_ck_warner(aTHX_ packWARN(WARN_VOID),
6038                                    "Too late to run CHECK block");
6039                 Perl_av_create_and_unshift_one(aTHX_ &PL_checkav, MUTABLE_SV(cv));
6040             }
6041             else
6042                 return;
6043         } else if (*name == 'I') {
6044             if (strEQ(name, "INIT")) {
6045                 if (PL_main_start)
6046                     Perl_ck_warner(aTHX_ packWARN(WARN_VOID),
6047                                    "Too late to run INIT block");
6048                 Perl_av_create_and_push(aTHX_ &PL_initav, MUTABLE_SV(cv));
6049             }
6050             else
6051                 return;
6052         } else
6053             return;
6054         DEBUG_x( dump_sub(gv) );
6055         GvCV(gv) = 0;           /* cv has been hijacked */
6056     }
6057 }
6058
6059 /*
6060 =for apidoc newCONSTSUB
6061
6062 Creates a constant sub equivalent to Perl C<sub FOO () { 123 }> which is
6063 eligible for inlining at compile-time.
6064
6065 Passing NULL for SV creates a constant sub equivalent to C<sub BAR () {}>,
6066 which won't be called if used as a destructor, but will suppress the overhead
6067 of a call to C<AUTOLOAD>.  (This form, however, isn't eligible for inlining at
6068 compile time.)
6069
6070 =cut
6071 */
6072
6073 CV *
6074 Perl_newCONSTSUB(pTHX_ HV *stash, const char *name, SV *sv)
6075 {
6076     dVAR;
6077     CV* cv;
6078 #ifdef USE_ITHREADS
6079     const char *const file = CopFILE(PL_curcop);
6080 #else
6081     SV *const temp_sv = CopFILESV(PL_curcop);
6082     const char *const file = temp_sv ? SvPV_nolen_const(temp_sv) : NULL;
6083 #endif
6084
6085     ENTER;
6086
6087     if (IN_PERL_RUNTIME) {
6088         /* at runtime, it's not safe to manipulate PL_curcop: it may be
6089          * an op shared between threads. Use a non-shared COP for our
6090          * dirty work */
6091          SAVEVPTR(PL_curcop);
6092          PL_curcop = &PL_compiling;
6093     }
6094     SAVECOPLINE(PL_curcop);
6095     CopLINE_set(PL_curcop, PL_parser ? PL_parser->copline : NOLINE);
6096
6097     SAVEHINTS();
6098     PL_hints &= ~HINT_BLOCK_SCOPE;
6099
6100     if (stash) {
6101         SAVESPTR(PL_curstash);
6102         SAVECOPSTASH(PL_curcop);
6103         PL_curstash = stash;
6104         CopSTASH_set(PL_curcop,stash);
6105     }
6106
6107     /* file becomes the CvFILE. For an XS, it's supposed to be static storage,
6108        and so doesn't get free()d.  (It's expected to be from the C pre-
6109        processor __FILE__ directive). But we need a dynamically allocated one,
6110        and we need it to get freed.  */
6111     cv = newXS_flags(name, const_sv_xsub, file ? file : "", "",
6112                      XS_DYNAMIC_FILENAME);
6113     CvXSUBANY(cv).any_ptr = sv;
6114     CvCONST_on(cv);
6115
6116 #ifdef USE_ITHREADS
6117     if (stash)
6118         CopSTASH_free(PL_curcop);
6119 #endif
6120     LEAVE;
6121
6122     return cv;
6123 }
6124
6125 CV *
6126 Perl_newXS_flags(pTHX_ const char *name, XSUBADDR_t subaddr,
6127                  const char *const filename, const char *const proto,
6128                  U32 flags)
6129 {
6130     CV *cv = newXS(name, subaddr, filename);
6131
6132     PERL_ARGS_ASSERT_NEWXS_FLAGS;
6133
6134     if (flags & XS_DYNAMIC_FILENAME) {
6135         /* We need to "make arrangements" (ie cheat) to ensure that the
6136            filename lasts as long as the PVCV we just created, but also doesn't
6137            leak  */
6138         STRLEN filename_len = strlen(filename);
6139         STRLEN proto_and_file_len = filename_len;
6140         char *proto_and_file;
6141         STRLEN proto_len;
6142
6143         if (proto) {
6144             proto_len = strlen(proto);
6145             proto_and_file_len += proto_len;
6146
6147             Newx(proto_and_file, proto_and_file_len + 1, char);
6148             Copy(proto, proto_and_file, proto_len, char);
6149             Copy(filename, proto_and_file + proto_len, filename_len + 1, char);
6150         } else {
6151             proto_len = 0;
6152             proto_and_file = savepvn(filename, filename_len);
6153         }
6154
6155         /* This gets free()d.  :-)  */
6156         sv_usepvn_flags(MUTABLE_SV(cv), proto_and_file, proto_and_file_len,
6157                         SV_HAS_TRAILING_NUL);
6158         if (proto) {
6159             /* This gives us the correct prototype, rather than one with the
6160                file name appended.  */
6161             SvCUR_set(cv, proto_len);
6162         } else {
6163             SvPOK_off(cv);
6164         }
6165         CvFILE(cv) = proto_and_file + proto_len;
6166     } else {
6167         sv_setpv(MUTABLE_SV(cv), proto);
6168     }
6169     return cv;
6170 }
6171
6172 /*
6173 =for apidoc U||newXS
6174
6175 Used by C<xsubpp> to hook up XSUBs as Perl subs.  I<filename> needs to be
6176 static storage, as it is used directly as CvFILE(), without a copy being made.
6177
6178 =cut
6179 */
6180
6181 CV *
6182 Perl_newXS(pTHX_ const char *name, XSUBADDR_t subaddr, const char *filename)
6183 {
6184     dVAR;
6185     GV * const gv = gv_fetchpv(name ? name :
6186                         (PL_curstash ? "__ANON__" : "__ANON__::__ANON__"),
6187                         GV_ADDMULTI, SVt_PVCV);
6188     register CV *cv;
6189
6190     PERL_ARGS_ASSERT_NEWXS;
6191
6192     if (!subaddr)
6193         Perl_croak(aTHX_ "panic: no address for '%s' in '%s'", name, filename);
6194
6195     if ((cv = (name ? GvCV(gv) : NULL))) {
6196         if (GvCVGEN(gv)) {
6197             /* just a cached method */
6198             SvREFCNT_dec(cv);
6199             cv = NULL;
6200         }
6201         else if (CvROOT(cv) || CvXSUB(cv) || GvASSUMECV(gv)) {
6202             /* already defined (or promised) */
6203             /* XXX It's possible for this HvNAME_get to return null, and get passed into strEQ */
6204             if (ckWARN(WARN_REDEFINE)) {
6205                 GV * const gvcv = CvGV(cv);
6206                 if (gvcv) {
6207                     HV * const stash = GvSTASH(gvcv);
6208                     if (stash) {
6209                         const char *redefined_name = HvNAME_get(stash);
6210                         if ( strEQ(redefined_name,"autouse") ) {
6211                             const line_t oldline = CopLINE(PL_curcop);
6212                             if (PL_parser && PL_parser->copline != NOLINE)
6213                                 CopLINE_set(PL_curcop, PL_parser->copline);
6214                             Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
6215                                         CvCONST(cv) ? "Constant subroutine %s redefined"
6216                                                     : "Subroutine %s redefined"
6217                                         ,name);
6218                             CopLINE_set(PL_curcop, oldline);
6219                         }
6220                     }
6221                 }
6222             }
6223             SvREFCNT_dec(cv);
6224             cv = NULL;
6225         }
6226     }
6227
6228     if (cv)                             /* must reuse cv if autoloaded */
6229         cv_undef(cv);
6230     else {
6231         cv = MUTABLE_CV(newSV_type(SVt_PVCV));
6232         if (name) {
6233             GvCV(gv) = cv;
6234             GvCVGEN(gv) = 0;
6235             mro_method_changed_in(GvSTASH(gv)); /* newXS */
6236         }
6237     }
6238     if (!name)
6239         CvANON_on(cv);
6240     CvGV_set(cv, gv);
6241     (void)gv_fetchfile(filename);
6242     CvFILE(cv) = (char *)filename; /* NOTE: not copied, as it is expected to be
6243                                    an external constant string */
6244     CvISXSUB_on(cv);
6245     CvXSUB(cv) = subaddr;
6246
6247     if (name)
6248         process_special_blocks(name, gv, cv);
6249
6250     return cv;
6251 }
6252
6253 #ifdef PERL_MAD
6254 OP *
6255 #else
6256 void
6257 #endif
6258 Perl_newFORM(pTHX_ I32 floor, OP *o, OP *block)
6259 {
6260     dVAR;
6261     register CV *cv;
6262 #ifdef PERL_MAD
6263     OP* pegop = newOP(OP_NULL, 0);
6264 #endif
6265
6266     GV * const gv = o
6267         ? gv_fetchsv(cSVOPo->op_sv, GV_ADD, SVt_PVFM)
6268         : gv_fetchpvs("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVFM);
6269
6270     GvMULTI_on(gv);
6271     if ((cv = GvFORM(gv))) {
6272         if (ckWARN(WARN_REDEFINE)) {
6273             const line_t oldline = CopLINE(PL_curcop);
6274             if (PL_parser && PL_parser->copline != NOLINE)
6275                 CopLINE_set(PL_curcop, PL_parser->copline);
6276             if (o) {
6277                 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
6278                             "Format %"SVf" redefined", SVfARG(cSVOPo->op_sv));
6279             } else {
6280                 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
6281                             "Format STDOUT redefined");
6282             }
6283             CopLINE_set(PL_curcop, oldline);
6284         }
6285         SvREFCNT_dec(cv);
6286     }
6287     cv = PL_compcv;
6288     GvFORM(gv) = cv;
6289     CvGV_set(cv, gv);
6290     CvFILE_set_from_cop(cv, PL_curcop);
6291
6292
6293     pad_tidy(padtidy_FORMAT);
6294     CvROOT(cv) = newUNOP(OP_LEAVEWRITE, 0, scalarseq(block));
6295     CvROOT(cv)->op_private |= OPpREFCOUNTED;
6296     OpREFCNT_set(CvROOT(cv), 1);
6297     CvSTART(cv) = LINKLIST(CvROOT(cv));
6298     CvROOT(cv)->op_next = 0;
6299     CALL_PEEP(CvSTART(cv));
6300 #ifdef PERL_MAD
6301     op_getmad(o,pegop,'n');
6302     op_getmad_weak(block, pegop, 'b');
6303 #else
6304     op_free(o);
6305 #endif
6306     if (PL_parser)
6307         PL_parser->copline = NOLINE;
6308     LEAVE_SCOPE(floor);
6309 #ifdef PERL_MAD
6310     return pegop;
6311 #endif
6312 }
6313
6314 OP *
6315 Perl_newANONLIST(pTHX_ OP *o)
6316 {
6317     return convert(OP_ANONLIST, OPf_SPECIAL, o);
6318 }
6319
6320 OP *
6321 Perl_newANONHASH(pTHX_ OP *o)
6322 {
6323     return convert(OP_ANONHASH, OPf_SPECIAL, o);
6324 }
6325
6326 OP *
6327 Perl_newANONSUB(pTHX_ I32 floor, OP *proto, OP *block)
6328 {
6329     return newANONATTRSUB(floor, proto, NULL, block);
6330 }
6331
6332 OP *
6333 Perl_newANONATTRSUB(pTHX_ I32 floor, OP *proto, OP *attrs, OP *block)
6334 {
6335     return newUNOP(OP_REFGEN, 0,
6336         newSVOP(OP_ANONCODE, 0,
6337                 MUTABLE_SV(newATTRSUB(floor, 0, proto, attrs, block))));
6338 }
6339
6340 OP *
6341 Perl_oopsAV(pTHX_ OP *o)
6342 {
6343     dVAR;
6344
6345     PERL_ARGS_ASSERT_OOPSAV;
6346
6347     switch (o->op_type) {
6348     case OP_PADSV:
6349         o->op_type = OP_PADAV;
6350         o->op_ppaddr = PL_ppaddr[OP_PADAV];
6351         return ref(o, OP_RV2AV);
6352
6353     case OP_RV2SV:
6354         o->op_type = OP_RV2AV;
6355         o->op_ppaddr = PL_ppaddr[OP_RV2AV];
6356         ref(o, OP_RV2AV);
6357         break;
6358
6359     default:
6360         Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL), "oops: oopsAV");
6361         break;
6362     }
6363     return o;
6364 }
6365
6366 OP *
6367 Perl_oopsHV(pTHX_ OP *o)
6368 {
6369     dVAR;
6370
6371     PERL_ARGS_ASSERT_OOPSHV;
6372
6373     switch (o->op_type) {
6374     case OP_PADSV:
6375     case OP_PADAV:
6376         o->op_type = OP_PADHV;
6377         o->op_ppaddr = PL_ppaddr[OP_PADHV];
6378         return ref(o, OP_RV2HV);
6379
6380     case OP_RV2SV:
6381     case OP_RV2AV:
6382         o->op_type = OP_RV2HV;
6383         o->op_ppaddr = PL_ppaddr[OP_RV2HV];
6384         ref(o, OP_RV2HV);
6385         break;
6386
6387     default:
6388         Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL), "oops: oopsHV");
6389         break;
6390     }
6391     return o;
6392 }
6393
6394 OP *
6395 Perl_newAVREF(pTHX_ OP *o)
6396 {
6397     dVAR;
6398
6399     PERL_ARGS_ASSERT_NEWAVREF;
6400
6401     if (o->op_type == OP_PADANY) {
6402         o->op_type = OP_PADAV;
6403         o->op_ppaddr = PL_ppaddr[OP_PADAV];
6404         return o;
6405     }
6406     else if ((o->op_type == OP_RV2AV || o->op_type == OP_PADAV)) {
6407         Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
6408                        "Using an array as a reference is deprecated");
6409     }
6410     return newUNOP(OP_RV2AV, 0, scalar(o));
6411 }
6412
6413 OP *
6414 Perl_newGVREF(pTHX_ I32 type, OP *o)
6415 {
6416     if (type == OP_MAPSTART || type == OP_GREPSTART || type == OP_SORT)
6417         return newUNOP(OP_NULL, 0, o);
6418     return ref(newUNOP(OP_RV2GV, OPf_REF, o), type);
6419 }
6420
6421 OP *
6422 Perl_newHVREF(pTHX_ OP *o)
6423 {
6424     dVAR;
6425
6426     PERL_ARGS_ASSERT_NEWHVREF;
6427
6428     if (o->op_type == OP_PADANY) {
6429         o->op_type = OP_PADHV;
6430         o->op_ppaddr = PL_ppaddr[OP_PADHV];
6431         return o;
6432     }
6433     else if ((o->op_type == OP_RV2HV || o->op_type == OP_PADHV)) {
6434         Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
6435                        "Using a hash as a reference is deprecated");
6436     }
6437     return newUNOP(OP_RV2HV, 0, scalar(o));
6438 }
6439
6440 OP *
6441 Perl_newCVREF(pTHX_ I32 flags, OP *o)
6442 {
6443     return newUNOP(OP_RV2CV, flags, scalar(o));
6444 }
6445
6446 OP *
6447 Perl_newSVREF(pTHX_ OP *o)
6448 {
6449     dVAR;
6450
6451     PERL_ARGS_ASSERT_NEWSVREF;
6452
6453     if (o->op_type == OP_PADANY) {
6454         o->op_type = OP_PADSV;
6455         o->op_ppaddr = PL_ppaddr[OP_PADSV];
6456         return o;
6457     }
6458     return newUNOP(OP_RV2SV, 0, scalar(o));
6459 }
6460
6461 /* Check routines. See the comments at the top of this file for details
6462  * on when these are called */
6463
6464 OP *
6465 Perl_ck_anoncode(pTHX_ OP *o)
6466 {
6467     PERL_ARGS_ASSERT_CK_ANONCODE;
6468
6469     cSVOPo->op_targ = pad_add_anon(cSVOPo->op_sv, o->op_type);
6470     if (!PL_madskills)
6471         cSVOPo->op_sv = NULL;
6472     return o;
6473 }
6474
6475 OP *
6476 Perl_ck_bitop(pTHX_ OP *o)
6477 {
6478     dVAR;
6479
6480     PERL_ARGS_ASSERT_CK_BITOP;
6481
6482 #define OP_IS_NUMCOMPARE(op) \
6483         ((op) == OP_LT   || (op) == OP_I_LT || \
6484          (op) == OP_GT   || (op) == OP_I_GT || \
6485          (op) == OP_LE   || (op) == OP_I_LE || \
6486          (op) == OP_GE   || (op) == OP_I_GE || \
6487          (op) == OP_EQ   || (op) == OP_I_EQ || \
6488          (op) == OP_NE   || (op) == OP_I_NE || \
6489          (op) == OP_NCMP || (op) == OP_I_NCMP)
6490     o->op_private = (U8)(PL_hints & HINT_INTEGER);
6491     if (!(o->op_flags & OPf_STACKED) /* Not an assignment */
6492             && (o->op_type == OP_BIT_OR
6493              || o->op_type == OP_BIT_AND
6494              || o->op_type == OP_BIT_XOR))
6495     {
6496         const OP * const left = cBINOPo->op_first;
6497         const OP * const right = left->op_sibling;
6498         if ((OP_IS_NUMCOMPARE(left->op_type) &&
6499                 (left->op_flags & OPf_PARENS) == 0) ||
6500             (OP_IS_NUMCOMPARE(right->op_type) &&
6501                 (right->op_flags & OPf_PARENS) == 0))
6502             Perl_ck_warner(aTHX_ packWARN(WARN_PRECEDENCE),
6503                            "Possible precedence problem on bitwise %c operator",
6504                            o->op_type == OP_BIT_OR ? '|'
6505                            : o->op_type == OP_BIT_AND ? '&' : '^'
6506                            );
6507     }
6508     return o;
6509 }
6510
6511 OP *
6512 Perl_ck_concat(pTHX_ OP *o)
6513 {
6514     const OP * const kid = cUNOPo->op_first;
6515
6516     PERL_ARGS_ASSERT_CK_CONCAT;
6517     PERL_UNUSED_CONTEXT;
6518
6519     if (kid->op_type == OP_CONCAT && !(kid->op_private & OPpTARGET_MY) &&
6520             !(kUNOP->op_first->op_flags & OPf_MOD))
6521         o->op_flags |= OPf_STACKED;
6522     return o;
6523 }
6524
6525 OP *
6526 Perl_ck_spair(pTHX_ OP *o)
6527 {
6528     dVAR;
6529
6530     PERL_ARGS_ASSERT_CK_SPAIR;
6531
6532     if (o->op_flags & OPf_KIDS) {
6533         OP* newop;
6534         OP* kid;
6535         const OPCODE type = o->op_type;
6536         o = modkids(ck_fun(o), type);
6537         kid = cUNOPo->op_first;
6538         newop = kUNOP->op_first->op_sibling;
6539         if (newop) {
6540             const OPCODE type = newop->op_type;
6541             if (newop->op_sibling || !(PL_opargs[type] & OA_RETSCALAR) ||
6542                     type == OP_PADAV || type == OP_PADHV ||
6543                     type == OP_RV2AV || type == OP_RV2HV)
6544                 return o;
6545         }
6546 #ifdef PERL_MAD
6547         op_getmad(kUNOP->op_first,newop,'K');
6548 #else
6549         op_free(kUNOP->op_first);
6550 #endif
6551         kUNOP->op_first = newop;
6552     }
6553     o->op_ppaddr = PL_ppaddr[++o->op_type];
6554     return ck_fun(o);
6555 }
6556
6557 OP *
6558 Perl_ck_delete(pTHX_ OP *o)
6559 {
6560     PERL_ARGS_ASSERT_CK_DELETE;
6561
6562     o = ck_fun(o);
6563     o->op_private = 0;
6564     if (o->op_flags & OPf_KIDS) {
6565         OP * const kid = cUNOPo->op_first;
6566         switch (kid->op_type) {
6567         case OP_ASLICE:
6568             o->op_flags |= OPf_SPECIAL;
6569             /* FALL THROUGH */
6570         case OP_HSLICE:
6571             o->op_private |= OPpSLICE;
6572             break;
6573         case OP_AELEM:
6574             o->op_flags |= OPf_SPECIAL;
6575             /* FALL THROUGH */
6576         case OP_HELEM:
6577             break;
6578         default:
6579             Perl_croak(aTHX_ "%s argument is not a HASH or ARRAY element or slice",
6580                   OP_DESC(o));
6581         }
6582         if (kid->op_private & OPpLVAL_INTRO)
6583             o->op_private |= OPpLVAL_INTRO;
6584         op_null(kid);
6585     }
6586     return o;
6587 }
6588
6589 OP *
6590 Perl_ck_die(pTHX_ OP *o)
6591 {
6592     PERL_ARGS_ASSERT_CK_DIE;
6593
6594 #ifdef VMS
6595     if (VMSISH_HUSHED) o->op_private |= OPpHUSH_VMSISH;
6596 #endif
6597     return ck_fun(o);
6598 }
6599
6600 OP *
6601 Perl_ck_eof(pTHX_ OP *o)
6602 {
6603     dVAR;
6604
6605     PERL_ARGS_ASSERT_CK_EOF;
6606
6607     if (o->op_flags & OPf_KIDS) {
6608         if (cLISTOPo->op_first->op_type == OP_STUB) {
6609             OP * const newop
6610                 = newUNOP(o->op_type, OPf_SPECIAL, newGVOP(OP_GV, 0, PL_argvgv));
6611 #ifdef PERL_MAD
6612             op_getmad(o,newop,'O');
6613 #else
6614             op_free(o);
6615 #endif
6616             o = newop;
6617         }
6618         return ck_fun(o);
6619     }
6620     return o;
6621 }
6622
6623 OP *
6624 Perl_ck_eval(pTHX_ OP *o)
6625 {
6626     dVAR;
6627
6628     PERL_ARGS_ASSERT_CK_EVAL;
6629
6630     PL_hints |= HINT_BLOCK_SCOPE;
6631     if (o->op_flags & OPf_KIDS) {
6632         SVOP * const kid = (SVOP*)cUNOPo->op_first;
6633
6634         if (!kid) {
6635             o->op_flags &= ~OPf_KIDS;
6636             op_null(o);
6637         }
6638         else if (kid->op_type == OP_LINESEQ || kid->op_type == OP_STUB) {
6639             LOGOP *enter;
6640 #ifdef PERL_MAD
6641             OP* const oldo = o;
6642 #endif
6643
6644             cUNOPo->op_first = 0;
6645 #ifndef PERL_MAD
6646             op_free(o);
6647 #endif
6648
6649             NewOp(1101, enter, 1, LOGOP);
6650             enter->op_type = OP_ENTERTRY;
6651             enter->op_ppaddr = PL_ppaddr[OP_ENTERTRY];
6652             enter->op_private = 0;
6653
6654             /* establish postfix order */
6655             enter->op_next = (OP*)enter;
6656
6657             o = prepend_elem(OP_LINESEQ, (OP*)enter, (OP*)kid);
6658             o->op_type = OP_LEAVETRY;
6659             o->op_ppaddr = PL_ppaddr[OP_LEAVETRY];
6660             enter->op_other = o;
6661             op_getmad(oldo,o,'O');
6662             return o;
6663         }
6664         else {
6665             scalar((OP*)kid);
6666             PL_cv_has_eval = 1;
6667         }
6668     }
6669     else {
6670 #ifdef PERL_MAD
6671         OP* const oldo = o;
6672 #else
6673         op_free(o);
6674 #endif
6675         o = newUNOP(OP_ENTEREVAL, 0, newDEFSVOP());
6676         op_getmad(oldo,o,'O');
6677     }
6678     o->op_targ = (PADOFFSET)PL_hints;
6679     if ((PL_hints & HINT_LOCALIZE_HH) != 0 && GvHV(PL_hintgv)) {
6680         /* Store a copy of %^H that pp_entereval can pick up. */
6681         OP *hhop = newSVOP(OP_HINTSEVAL, 0,
6682                            MUTABLE_SV(Perl_hv_copy_hints_hv(aTHX_ GvHV(PL_hintgv))));
6683         cUNOPo->op_first->op_sibling = hhop;
6684         o->op_private |= OPpEVAL_HAS_HH;
6685     }
6686     return o;
6687 }
6688
6689 OP *
6690 Perl_ck_exit(pTHX_ OP *o)
6691 {
6692     PERL_ARGS_ASSERT_CK_EXIT;
6693
6694 #ifdef VMS
6695     HV * const table = GvHV(PL_hintgv);
6696     if (table) {
6697        SV * const * const svp = hv_fetchs(table, "vmsish_exit", FALSE);
6698        if (svp && *svp && SvTRUE(*svp))
6699            o->op_private |= OPpEXIT_VMSISH;
6700     }
6701     if (VMSISH_HUSHED) o->op_private |= OPpHUSH_VMSISH;
6702 #endif
6703     return ck_fun(o);
6704 }
6705
6706 OP *
6707 Perl_ck_exec(pTHX_ OP *o)
6708 {
6709     PERL_ARGS_ASSERT_CK_EXEC;
6710
6711     if (o->op_flags & OPf_STACKED) {
6712         OP *kid;
6713         o = ck_fun(o);
6714         kid = cUNOPo->op_first->op_sibling;
6715         if (kid->op_type == OP_RV2GV)
6716             op_null(kid);
6717     }
6718     else
6719         o = listkids(o);
6720     return o;
6721 }
6722
6723 OP *
6724 Perl_ck_exists(pTHX_ OP *o)
6725 {
6726     dVAR;
6727
6728     PERL_ARGS_ASSERT_CK_EXISTS;
6729
6730     o = ck_fun(o);
6731     if (o->op_flags & OPf_KIDS) {
6732         OP * const kid = cUNOPo->op_first;
6733         if (kid->op_type == OP_ENTERSUB) {
6734             (void) ref(kid, o->op_type);
6735             if (kid->op_type != OP_RV2CV
6736                         && !(PL_parser && PL_parser->error_count))
6737                 Perl_croak(aTHX_ "%s argument is not a subroutine name",
6738                             OP_DESC(o));
6739             o->op_private |= OPpEXISTS_SUB;
6740         }
6741         else if (kid->op_type == OP_AELEM)
6742             o->op_flags |= OPf_SPECIAL;
6743         else if (kid->op_type != OP_HELEM)
6744             Perl_croak(aTHX_ "%s argument is not a HASH or ARRAY element or a subroutine",
6745                         OP_DESC(o));
6746         op_null(kid);
6747     }
6748     return o;
6749 }
6750
6751 OP *
6752 Perl_ck_rvconst(pTHX_ register OP *o)
6753 {
6754     dVAR;
6755     SVOP * const kid = (SVOP*)cUNOPo->op_first;
6756
6757     PERL_ARGS_ASSERT_CK_RVCONST;
6758
6759     o->op_private |= (PL_hints & HINT_STRICT_REFS);
6760     if (o->op_type == OP_RV2CV)
6761         o->op_private &= ~1;
6762
6763     if (kid->op_type == OP_CONST) {
6764         int iscv;
6765         GV *gv;
6766         SV * const kidsv = kid->op_sv;
6767
6768         /* Is it a constant from cv_const_sv()? */
6769         if (SvROK(kidsv) && SvREADONLY(kidsv)) {
6770             SV * const rsv = SvRV(kidsv);
6771             const svtype type = SvTYPE(rsv);
6772             const char *badtype = NULL;
6773
6774             switch (o->op_type) {
6775             case OP_RV2SV:
6776                 if (type > SVt_PVMG)
6777                     badtype = "a SCALAR";
6778                 break;
6779             case OP_RV2AV:
6780                 if (type != SVt_PVAV)
6781                     badtype = "an ARRAY";
6782                 break;
6783             case OP_RV2HV:
6784                 if (type != SVt_PVHV)
6785                     badtype = "a HASH";
6786                 break;
6787             case OP_RV2CV:
6788                 if (type != SVt_PVCV)
6789                     badtype = "a CODE";
6790                 break;
6791             }
6792             if (badtype)
6793                 Perl_croak(aTHX_ "Constant is not %s reference", badtype);
6794             return o;
6795         }
6796         if ((o->op_private & HINT_STRICT_REFS) && (kid->op_private & OPpCONST_BARE)) {
6797             const char *badthing;
6798             switch (o->op_type) {
6799             case OP_RV2SV:
6800                 badthing = "a SCALAR";
6801                 break;
6802             case OP_RV2AV:
6803                 badthing = "an ARRAY";
6804                 break;
6805             case OP_RV2HV:
6806                 badthing = "a HASH";
6807                 break;
6808             default:
6809                 badthing = NULL;
6810                 break;
6811             }
6812             if (badthing)
6813                 Perl_croak(aTHX_
6814                            "Can't use bareword (\"%"SVf"\") as %s ref while \"strict refs\" in use",
6815                            SVfARG(kidsv), badthing);
6816         }
6817         /*
6818          * This is a little tricky.  We only want to add the symbol if we
6819          * didn't add it in the lexer.  Otherwise we get duplicate strict
6820          * warnings.  But if we didn't add it in the lexer, we must at
6821          * least pretend like we wanted to add it even if it existed before,
6822          * or we get possible typo warnings.  OPpCONST_ENTERED says
6823          * whether the lexer already added THIS instance of this symbol.
6824          */
6825         iscv = (o->op_type == OP_RV2CV) * 2;
6826         do {
6827             gv = gv_fetchsv(kidsv,
6828                 iscv | !(kid->op_private & OPpCONST_ENTERED),
6829                 iscv
6830                     ? SVt_PVCV
6831                     : o->op_type == OP_RV2SV
6832                         ? SVt_PV
6833                         : o->op_type == OP_RV2AV
6834                             ? SVt_PVAV
6835                             : o->op_type == OP_RV2HV
6836                                 ? SVt_PVHV
6837                                 : SVt_PVGV);
6838         } while (!gv && !(kid->op_private & OPpCONST_ENTERED) && !iscv++);
6839         if (gv) {
6840             kid->op_type = OP_GV;
6841             SvREFCNT_dec(kid->op_sv);
6842 #ifdef USE_ITHREADS
6843             /* XXX hack: dependence on sizeof(PADOP) <= sizeof(SVOP) */
6844             kPADOP->op_padix = pad_alloc(OP_GV, SVs_PADTMP);
6845             SvREFCNT_dec(PAD_SVl(kPADOP->op_padix));
6846             GvIN_PAD_on(gv);
6847             PAD_SETSV(kPADOP->op_padix, MUTABLE_SV(SvREFCNT_inc_simple_NN(gv)));
6848 #else
6849             kid->op_sv = SvREFCNT_inc_simple_NN(gv);
6850 #endif
6851             kid->op_private = 0;
6852             kid->op_ppaddr = PL_ppaddr[OP_GV];
6853         }
6854     }
6855     return o;
6856 }
6857
6858 OP *
6859 Perl_ck_ftst(pTHX_ OP *o)
6860 {
6861     dVAR;
6862     const I32 type = o->op_type;
6863
6864     PERL_ARGS_ASSERT_CK_FTST;
6865
6866     if (o->op_flags & OPf_REF) {
6867         NOOP;
6868     }
6869     else if (o->op_flags & OPf_KIDS && cUNOPo->op_first->op_type != OP_STUB) {
6870         SVOP * const kid = (SVOP*)cUNOPo->op_first;
6871         const OPCODE kidtype = kid->op_type;
6872
6873         if (kidtype == OP_CONST && (kid->op_private & OPpCONST_BARE)) {
6874             OP * const newop = newGVOP(type, OPf_REF,
6875                 gv_fetchsv(kid->op_sv, GV_ADD, SVt_PVIO));
6876 #ifdef PERL_MAD
6877             op_getmad(o,newop,'O');
6878 #else
6879             op_free(o);
6880 #endif
6881             return newop;
6882         }
6883         if ((PL_hints & HINT_FILETEST_ACCESS) && OP_IS_FILETEST_ACCESS(o->op_type))
6884             o->op_private |= OPpFT_ACCESS;
6885         if (PL_check[kidtype] == MEMBER_TO_FPTR(Perl_ck_ftst)
6886                 && kidtype != OP_STAT && kidtype != OP_LSTAT)
6887             o->op_private |= OPpFT_STACKED;
6888     }
6889     else {
6890 #ifdef PERL_MAD
6891         OP* const oldo = o;
6892 #else
6893         op_free(o);
6894 #endif
6895         if (type == OP_FTTTY)
6896             o = newGVOP(type, OPf_REF, PL_stdingv);
6897         else
6898             o = newUNOP(type, 0, newDEFSVOP());
6899         op_getmad(oldo,o,'O');
6900     }
6901     return o;
6902 }
6903
6904 OP *
6905 Perl_ck_fun(pTHX_ OP *o)
6906 {
6907     dVAR;
6908     const int type = o->op_type;
6909     register I32 oa = PL_opargs[type] >> OASHIFT;
6910
6911     PERL_ARGS_ASSERT_CK_FUN;
6912
6913     if (o->op_flags & OPf_STACKED) {
6914         if ((oa & OA_OPTIONAL) && (oa >> 4) && !((oa >> 4) & OA_OPTIONAL))
6915             oa &= ~OA_OPTIONAL;
6916         else
6917             return no_fh_allowed(o);
6918     }
6919
6920     if (o->op_flags & OPf_KIDS) {
6921         OP **tokid = &cLISTOPo->op_first;
6922         register OP *kid = cLISTOPo->op_first;
6923         OP *sibl;
6924         I32 numargs = 0;
6925
6926         if (kid->op_type == OP_PUSHMARK ||
6927             (kid->op_type == OP_NULL && kid->op_targ == OP_PUSHMARK))
6928         {
6929             tokid = &kid->op_sibling;
6930             kid = kid->op_sibling;
6931         }
6932         if (!kid && PL_opargs[type] & OA_DEFGV)
6933             *tokid = kid = newDEFSVOP();
6934
6935         while (oa && kid) {
6936             numargs++;
6937             sibl = kid->op_sibling;
6938 #ifdef PERL_MAD
6939             if (!sibl && kid->op_type == OP_STUB) {
6940                 numargs--;
6941                 break;
6942             }
6943 #endif
6944             switch (oa & 7) {
6945             case OA_SCALAR:
6946                 /* list seen where single (scalar) arg expected? */
6947                 if (numargs == 1 && !(oa >> 4)
6948                     && kid->op_type == OP_LIST && type != OP_SCALAR)
6949                 {
6950                     return too_many_arguments(o,PL_op_desc[type]);
6951                 }
6952                 scalar(kid);
6953                 break;
6954             case OA_LIST:
6955                 if (oa < 16) {
6956                     kid = 0;
6957                     continue;
6958                 }
6959                 else
6960                     list(kid);
6961                 break;
6962             case OA_AVREF:
6963                 if ((type == OP_PUSH || type == OP_UNSHIFT)
6964                     && !kid->op_sibling)
6965                     Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
6966                                    "Useless use of %s with no values",
6967                                    PL_op_desc[type]);
6968
6969                 if (kid->op_type == OP_CONST &&
6970                     (kid->op_private & OPpCONST_BARE))
6971                 {
6972                     OP * const newop = newAVREF(newGVOP(OP_GV, 0,
6973                         gv_fetchsv(((SVOP*)kid)->op_sv, GV_ADD, SVt_PVAV) ));
6974                     Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
6975                                    "Array @%"SVf" missing the @ in argument %"IVdf" of %s()",
6976                                    SVfARG(((SVOP*)kid)->op_sv), (IV)numargs, PL_op_desc[type]);
6977 #ifdef PERL_MAD
6978                     op_getmad(kid,newop,'K');
6979 #else
6980                     op_free(kid);
6981 #endif
6982                     kid = newop;
6983                     kid->op_sibling = sibl;
6984                     *tokid = kid;
6985                 }
6986                 else if (kid->op_type != OP_RV2AV && kid->op_type != OP_PADAV)
6987                     bad_type(numargs, "array", PL_op_desc[type], kid);
6988                 mod(kid, type);
6989                 break;
6990             case OA_HVREF:
6991                 if (kid->op_type == OP_CONST &&
6992                     (kid->op_private & OPpCONST_BARE))
6993                 {
6994                     OP * const newop = newHVREF(newGVOP(OP_GV, 0,
6995                         gv_fetchsv(((SVOP*)kid)->op_sv, GV_ADD, SVt_PVHV) ));
6996                     Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
6997                                    "Hash %%%"SVf" missing the %% in argument %"IVdf" of %s()",
6998                                    SVfARG(((SVOP*)kid)->op_sv), (IV)numargs, PL_op_desc[type]);
6999 #ifdef PERL_MAD
7000                     op_getmad(kid,newop,'K');
7001 #else
7002                     op_free(kid);
7003 #endif
7004                     kid = newop;
7005                     kid->op_sibling = sibl;
7006                     *tokid = kid;
7007                 }
7008                 else if (kid->op_type != OP_RV2HV && kid->op_type != OP_PADHV)
7009                     bad_type(numargs, "hash", PL_op_desc[type], kid);
7010                 mod(kid, type);
7011                 break;
7012             case OA_CVREF:
7013                 {
7014                     OP * const newop = newUNOP(OP_NULL, 0, kid);
7015                     kid->op_sibling = 0;
7016                     linklist(kid);
7017                     newop->op_next = newop;
7018                     kid = newop;
7019                     kid->op_sibling = sibl;
7020                     *tokid = kid;
7021                 }
7022                 break;
7023             case OA_FILEREF:
7024                 if (kid->op_type != OP_GV && kid->op_type != OP_RV2GV) {
7025                     if (kid->op_type == OP_CONST &&
7026                         (kid->op_private & OPpCONST_BARE))
7027                     {
7028                         OP * const newop = newGVOP(OP_GV, 0,
7029                             gv_fetchsv(((SVOP*)kid)->op_sv, GV_ADD, SVt_PVIO));
7030                         if (!(o->op_private & 1) && /* if not unop */
7031                             kid == cLISTOPo->op_last)
7032                             cLISTOPo->op_last = newop;
7033 #ifdef PERL_MAD
7034                         op_getmad(kid,newop,'K');
7035 #else
7036                         op_free(kid);
7037 #endif
7038                         kid = newop;
7039                     }
7040                     else if (kid->op_type == OP_READLINE) {
7041                         /* neophyte patrol: open(<FH>), close(<FH>) etc. */
7042                         bad_type(numargs, "HANDLE", OP_DESC(o), kid);
7043                     }
7044                     else {
7045                         I32 flags = OPf_SPECIAL;
7046                         I32 priv = 0;
7047                         PADOFFSET targ = 0;
7048
7049                         /* is this op a FH constructor? */
7050                         if (is_handle_constructor(o,numargs)) {
7051                             const char *name = NULL;
7052                             STRLEN len = 0;
7053
7054                             flags = 0;
7055                             /* Set a flag to tell rv2gv to vivify
7056                              * need to "prove" flag does not mean something
7057                              * else already - NI-S 1999/05/07
7058                              */
7059                             priv = OPpDEREF;
7060                             if (kid->op_type == OP_PADSV) {
7061                                 SV *const namesv
7062                                     = PAD_COMPNAME_SV(kid->op_targ);
7063                                 name = SvPV_const(namesv, len);
7064                             }
7065                             else if (kid->op_type == OP_RV2SV
7066                                      && kUNOP->op_first->op_type == OP_GV)
7067                             {
7068                                 GV * const gv = cGVOPx_gv(kUNOP->op_first);
7069                                 name = GvNAME(gv);
7070                                 len = GvNAMELEN(gv);
7071                             }
7072                             else if (kid->op_type == OP_AELEM
7073                                      || kid->op_type == OP_HELEM)
7074                             {
7075                                  OP *firstop;
7076                                  OP *op = ((BINOP*)kid)->op_first;
7077                                  name = NULL;
7078                                  if (op) {
7079                                       SV *tmpstr = NULL;
7080                                       const char * const a =
7081                                            kid->op_type == OP_AELEM ?
7082                                            "[]" : "{}";
7083                                       if (((op->op_type == OP_RV2AV) ||
7084                                            (op->op_type == OP_RV2HV)) &&
7085                                           (firstop = ((UNOP*)op)->op_first) &&
7086                                           (firstop->op_type == OP_GV)) {
7087                                            /* packagevar $a[] or $h{} */
7088                                            GV * const gv = cGVOPx_gv(firstop);
7089                                            if (gv)
7090                                                 tmpstr =
7091                                                      Perl_newSVpvf(aTHX_
7092                                                                    "%s%c...%c",
7093                                                                    GvNAME(gv),
7094                                                                    a[0], a[1]);
7095                                       }
7096                                       else if (op->op_type == OP_PADAV
7097                                                || op->op_type == OP_PADHV) {
7098                                            /* lexicalvar $a[] or $h{} */
7099                                            const char * const padname =
7100                                                 PAD_COMPNAME_PV(op->op_targ);
7101                                            if (padname)
7102                                                 tmpstr =
7103                                                      Perl_newSVpvf(aTHX_
7104                                                                    "%s%c...%c",
7105                                                                    padname + 1,
7106                                                                    a[0], a[1]);
7107                                       }
7108                                       if (tmpstr) {
7109                                            name = SvPV_const(tmpstr, len);
7110                                            sv_2mortal(tmpstr);
7111                                       }
7112                                  }
7113                                  if (!name) {
7114                                       name = "__ANONIO__";
7115                                       len = 10;
7116                                  }
7117                                  mod(kid, type);
7118                             }
7119                             if (name) {
7120                                 SV *namesv;
7121                                 targ = pad_alloc(OP_RV2GV, SVs_PADTMP);
7122                                 namesv = PAD_SVl(targ);
7123                                 SvUPGRADE(namesv, SVt_PV);
7124                                 if (*name != '$')
7125                                     sv_setpvs(namesv, "$");
7126                                 sv_catpvn(namesv, name, len);
7127                             }
7128                         }
7129                         kid->op_sibling = 0;
7130                         kid = newUNOP(OP_RV2GV, flags, scalar(kid));
7131                         kid->op_targ = targ;
7132                         kid->op_private |= priv;
7133                     }
7134                     kid->op_sibling = sibl;
7135                     *tokid = kid;
7136                 }
7137                 scalar(kid);
7138                 break;
7139             case OA_SCALARREF:
7140                 mod(scalar(kid), type);
7141                 break;
7142             }
7143             oa >>= 4;
7144             tokid = &kid->op_sibling;
7145             kid = kid->op_sibling;
7146         }
7147 #ifdef PERL_MAD
7148         if (kid && kid->op_type != OP_STUB)
7149             return too_many_arguments(o,OP_DESC(o));
7150         o->op_private |= numargs;
7151 #else
7152         /* FIXME - should the numargs move as for the PERL_MAD case?  */
7153         o->op_private |= numargs;
7154         if (kid)
7155             return too_many_arguments(o,OP_DESC(o));
7156 #endif
7157         listkids(o);
7158     }
7159     else if (PL_opargs[type] & OA_DEFGV) {
7160 #ifdef PERL_MAD
7161         OP *newop = newUNOP(type, 0, newDEFSVOP());
7162         op_getmad(o,newop,'O');
7163         return newop;
7164 #else
7165         /* Ordering of these two is important to keep f_map.t passing.  */
7166         op_free(o);
7167         return newUNOP(type, 0, newDEFSVOP());
7168 #endif
7169     }
7170
7171     if (oa) {
7172         while (oa & OA_OPTIONAL)
7173             oa >>= 4;
7174         if (oa && oa != OA_LIST)
7175             return too_few_arguments(o,OP_DESC(o));
7176     }
7177     return o;
7178 }
7179
7180 OP *
7181 Perl_ck_glob(pTHX_ OP *o)
7182 {
7183     dVAR;
7184     GV *gv;
7185
7186     PERL_ARGS_ASSERT_CK_GLOB;
7187
7188     o = ck_fun(o);
7189     if ((o->op_flags & OPf_KIDS) && !cLISTOPo->op_first->op_sibling)
7190         append_elem(OP_GLOB, o, newDEFSVOP());
7191
7192     if (!((gv = gv_fetchpvs("glob", GV_NOTQUAL, SVt_PVCV))
7193           && GvCVu(gv) && GvIMPORTED_CV(gv)))
7194     {
7195         gv = gv_fetchpvs("CORE::GLOBAL::glob", 0, SVt_PVCV);
7196     }
7197
7198 #if !defined(PERL_EXTERNAL_GLOB)
7199     /* XXX this can be tightened up and made more failsafe. */
7200     if (!(gv && GvCVu(gv) && GvIMPORTED_CV(gv))) {
7201         GV *glob_gv;
7202         ENTER;
7203         Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT,
7204                 newSVpvs("File::Glob"), NULL, NULL, NULL);
7205         if((glob_gv = gv_fetchpvs("File::Glob::csh_glob", 0, SVt_PVCV))) {
7206             gv = gv_fetchpvs("CORE::GLOBAL::glob", 0, SVt_PVCV);
7207             GvCV(gv) = GvCV(glob_gv);
7208             SvREFCNT_inc_void(MUTABLE_SV(GvCV(gv)));
7209             GvIMPORTED_CV_on(gv);
7210         }
7211         LEAVE;
7212     }
7213 #endif /* PERL_EXTERNAL_GLOB */
7214
7215     if (gv && GvCVu(gv) && GvIMPORTED_CV(gv)) {
7216         append_elem(OP_GLOB, o,
7217                     newSVOP(OP_CONST, 0, newSViv(PL_glob_index++)));
7218         o->op_type = OP_LIST;
7219         o->op_ppaddr = PL_ppaddr[OP_LIST];
7220         cLISTOPo->op_first->op_type = OP_PUSHMARK;
7221         cLISTOPo->op_first->op_ppaddr = PL_ppaddr[OP_PUSHMARK];
7222         cLISTOPo->op_first->op_targ = 0;
7223         o = newUNOP(OP_ENTERSUB, OPf_STACKED,
7224                     append_elem(OP_LIST, o,
7225                                 scalar(newUNOP(OP_RV2CV, 0,
7226                                                newGVOP(OP_GV, 0, gv)))));
7227         o = newUNOP(OP_NULL, 0, ck_subr(o));
7228         o->op_targ = OP_GLOB;           /* hint at what it used to be */
7229         return o;
7230     }
7231     gv = newGVgen("main");
7232     gv_IOadd(gv);
7233     append_elem(OP_GLOB, o, newGVOP(OP_GV, 0, gv));
7234     scalarkids(o);
7235     return o;
7236 }
7237
7238 OP *
7239 Perl_ck_grep(pTHX_ OP *o)
7240 {
7241     dVAR;
7242     LOGOP *gwop = NULL;
7243     OP *kid;
7244     const OPCODE type = o->op_type == OP_GREPSTART ? OP_GREPWHILE : OP_MAPWHILE;
7245     PADOFFSET offset;
7246
7247     PERL_ARGS_ASSERT_CK_GREP;
7248
7249     o->op_ppaddr = PL_ppaddr[OP_GREPSTART];
7250     /* don't allocate gwop here, as we may leak it if PL_parser->error_count > 0 */
7251
7252     if (o->op_flags & OPf_STACKED) {
7253         OP* k;
7254         o = ck_sort(o);
7255         kid = cUNOPx(cLISTOPo->op_first->op_sibling)->op_first;
7256         if (kid->op_type != OP_SCOPE && kid->op_type != OP_LEAVE)
7257             return no_fh_allowed(o);
7258         for (k = kid; k; k = k->op_next) {
7259             kid = k;
7260         }
7261         NewOp(1101, gwop, 1, LOGOP);
7262         kid->op_next = (OP*)gwop;
7263         o->op_flags &= ~OPf_STACKED;
7264     }
7265     kid = cLISTOPo->op_first->op_sibling;
7266     if (type == OP_MAPWHILE)
7267         list(kid);
7268     else
7269         scalar(kid);
7270     o = ck_fun(o);
7271     if (PL_parser && PL_parser->error_count)
7272         return o;
7273     kid = cLISTOPo->op_first->op_sibling;
7274     if (kid->op_type != OP_NULL)
7275         Perl_croak(aTHX_ "panic: ck_grep");
7276     kid = kUNOP->op_first;
7277
7278     if (!gwop)
7279         NewOp(1101, gwop, 1, LOGOP);
7280     gwop->op_type = type;
7281     gwop->op_ppaddr = PL_ppaddr[type];
7282     gwop->op_first = listkids(o);
7283     gwop->op_flags |= OPf_KIDS;
7284     gwop->op_other = LINKLIST(kid);
7285     kid->op_next = (OP*)gwop;
7286     offset = Perl_pad_findmy(aTHX_ STR_WITH_LEN("$_"), 0);
7287     if (offset == NOT_IN_PAD || PAD_COMPNAME_FLAGS_isOUR(offset)) {
7288         o->op_private = gwop->op_private = 0;
7289         gwop->op_targ = pad_alloc(type, SVs_PADTMP);
7290     }
7291     else {
7292         o->op_private = gwop->op_private = OPpGREP_LEX;
7293         gwop->op_targ = o->op_targ = offset;
7294     }
7295
7296     kid = cLISTOPo->op_first->op_sibling;
7297     if (!kid || !kid->op_sibling)
7298         return too_few_arguments(o,OP_DESC(o));
7299     for (kid = kid->op_sibling; kid; kid = kid->op_sibling)
7300         mod(kid, OP_GREPSTART);
7301
7302     return (OP*)gwop;
7303 }
7304
7305 OP *
7306 Perl_ck_index(pTHX_ OP *o)
7307 {
7308     PERL_ARGS_ASSERT_CK_INDEX;
7309
7310     if (o->op_flags & OPf_KIDS) {
7311         OP *kid = cLISTOPo->op_first->op_sibling;       /* get past pushmark */
7312         if (kid)
7313             kid = kid->op_sibling;                      /* get past "big" */
7314         if (kid && kid->op_type == OP_CONST)
7315             fbm_compile(((SVOP*)kid)->op_sv, 0);
7316     }
7317     return ck_fun(o);
7318 }
7319
7320 OP *
7321 Perl_ck_lfun(pTHX_ OP *o)
7322 {
7323     const OPCODE type = o->op_type;
7324
7325     PERL_ARGS_ASSERT_CK_LFUN;
7326
7327     return modkids(ck_fun(o), type);
7328 }
7329
7330 OP *
7331 Perl_ck_defined(pTHX_ OP *o)            /* 19990527 MJD */
7332 {
7333     PERL_ARGS_ASSERT_CK_DEFINED;
7334
7335     if ((o->op_flags & OPf_KIDS)) {
7336         switch (cUNOPo->op_first->op_type) {
7337         case OP_RV2AV:
7338             /* This is needed for
7339                if (defined %stash::)
7340                to work.   Do not break Tk.
7341                */
7342             break;                      /* Globals via GV can be undef */
7343         case OP_PADAV:
7344         case OP_AASSIGN:                /* Is this a good idea? */
7345             Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
7346                            "defined(@array) is deprecated");
7347             Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
7348                            "\t(Maybe you should just omit the defined()?)\n");
7349         break;
7350         case OP_RV2HV:
7351         case OP_PADHV:
7352             Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
7353                            "defined(%%hash) is deprecated");
7354             Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
7355                            "\t(Maybe you should just omit the defined()?)\n");
7356             break;
7357         default:
7358             /* no warning */
7359             break;
7360         }
7361     }
7362     return ck_rfun(o);
7363 }
7364
7365 OP *
7366 Perl_ck_readline(pTHX_ OP *o)
7367 {
7368     PERL_ARGS_ASSERT_CK_READLINE;
7369
7370     if (!(o->op_flags & OPf_KIDS)) {
7371         OP * const newop
7372             = newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, PL_argvgv));
7373 #ifdef PERL_MAD
7374         op_getmad(o,newop,'O');
7375 #else
7376         op_free(o);
7377 #endif
7378         return newop;
7379     }
7380     return o;
7381 }
7382
7383 OP *
7384 Perl_ck_rfun(pTHX_ OP *o)
7385 {
7386     const OPCODE type = o->op_type;
7387
7388     PERL_ARGS_ASSERT_CK_RFUN;
7389
7390     return refkids(ck_fun(o), type);
7391 }
7392
7393 OP *
7394 Perl_ck_listiob(pTHX_ OP *o)
7395 {
7396     register OP *kid;
7397
7398     PERL_ARGS_ASSERT_CK_LISTIOB;
7399
7400     kid = cLISTOPo->op_first;
7401     if (!kid) {
7402         o = force_list(o);
7403         kid = cLISTOPo->op_first;
7404     }
7405     if (kid->op_type == OP_PUSHMARK)
7406         kid = kid->op_sibling;
7407     if (kid && o->op_flags & OPf_STACKED)
7408         kid = kid->op_sibling;
7409     else if (kid && !kid->op_sibling) {         /* print HANDLE; */
7410         if (kid->op_type == OP_CONST && kid->op_private & OPpCONST_BARE) {
7411             o->op_flags |= OPf_STACKED; /* make it a filehandle */
7412             kid = newUNOP(OP_RV2GV, OPf_REF, scalar(kid));
7413             cLISTOPo->op_first->op_sibling = kid;
7414             cLISTOPo->op_last = kid;
7415             kid = kid->op_sibling;
7416         }
7417     }
7418
7419     if (!kid)
7420         append_elem(o->op_type, o, newDEFSVOP());
7421
7422     return listkids(o);
7423 }
7424
7425 OP *
7426 Perl_ck_smartmatch(pTHX_ OP *o)
7427 {
7428     dVAR;
7429     if (0 == (o->op_flags & OPf_SPECIAL)) {
7430         OP *first  = cBINOPo->op_first;
7431         OP *second = first->op_sibling;
7432         
7433         /* Implicitly take a reference to an array or hash */
7434         first->op_sibling = NULL;
7435         first = cBINOPo->op_first = ref_array_or_hash(first);
7436         second = first->op_sibling = ref_array_or_hash(second);
7437         
7438         /* Implicitly take a reference to a regular expression */
7439         if (first->op_type == OP_MATCH) {
7440             first->op_type = OP_QR;
7441             first->op_ppaddr = PL_ppaddr[OP_QR];
7442         }
7443         if (second->op_type == OP_MATCH) {
7444             second->op_type = OP_QR;
7445             second->op_ppaddr = PL_ppaddr[OP_QR];
7446         }
7447     }
7448     
7449     return o;
7450 }
7451
7452
7453 OP *
7454 Perl_ck_sassign(pTHX_ OP *o)
7455 {
7456     dVAR;
7457     OP * const kid = cLISTOPo->op_first;
7458
7459     PERL_ARGS_ASSERT_CK_SASSIGN;
7460
7461     /* has a disposable target? */
7462     if ((PL_opargs[kid->op_type] & OA_TARGLEX)
7463         && !(kid->op_flags & OPf_STACKED)
7464         /* Cannot steal the second time! */
7465         && !(kid->op_private & OPpTARGET_MY)
7466         /* Keep the full thing for madskills */
7467         && !PL_madskills
7468         )
7469     {
7470         OP * const kkid = kid->op_sibling;
7471
7472         /* Can just relocate the target. */
7473         if (kkid && kkid->op_type == OP_PADSV
7474             && !(kkid->op_private & OPpLVAL_INTRO))
7475         {
7476             kid->op_targ = kkid->op_targ;
7477             kkid->op_targ = 0;
7478             /* Now we do not need PADSV and SASSIGN. */
7479             kid->op_sibling = o->op_sibling;    /* NULL */
7480             cLISTOPo->op_first = NULL;
7481             op_free(o);
7482             op_free(kkid);
7483             kid->op_private |= OPpTARGET_MY;    /* Used for context settings */
7484             return kid;
7485         }
7486     }
7487     if (kid->op_sibling) {
7488         OP *kkid = kid->op_sibling;
7489         if (kkid->op_type == OP_PADSV
7490                 && (kkid->op_private & OPpLVAL_INTRO)
7491                 && SvPAD_STATE(*av_fetch(PL_comppad_name, kkid->op_targ, FALSE))) {
7492             const PADOFFSET target = kkid->op_targ;
7493             OP *const other = newOP(OP_PADSV,
7494                                     kkid->op_flags
7495                                     | ((kkid->op_private & ~OPpLVAL_INTRO) << 8));
7496             OP *const first = newOP(OP_NULL, 0);
7497             OP *const nullop = newCONDOP(0, first, o, other);
7498             OP *const condop = first->op_next;
7499             /* hijacking PADSTALE for uninitialized state variables */
7500             SvPADSTALE_on(PAD_SVl(target));
7501
7502             condop->op_type = OP_ONCE;
7503             condop->op_ppaddr = PL_ppaddr[OP_ONCE];
7504             condop->op_targ = target;
7505             other->op_targ = target;
7506
7507             /* Because we change the type of the op here, we will skip the
7508                assinment binop->op_last = binop->op_first->op_sibling; at the
7509                end of Perl_newBINOP(). So need to do it here. */
7510             cBINOPo->op_last = cBINOPo->op_first->op_sibling;
7511
7512             return nullop;
7513         }
7514     }
7515     return o;
7516 }
7517
7518 OP *
7519 Perl_ck_match(pTHX_ OP *o)
7520 {
7521     dVAR;
7522
7523     PERL_ARGS_ASSERT_CK_MATCH;
7524
7525     if (o->op_type != OP_QR && PL_compcv) {
7526         const PADOFFSET offset = Perl_pad_findmy(aTHX_ STR_WITH_LEN("$_"), 0);
7527         if (offset != NOT_IN_PAD && !(PAD_COMPNAME_FLAGS_isOUR(offset))) {
7528             o->op_targ = offset;
7529             o->op_private |= OPpTARGET_MY;
7530         }
7531     }
7532     if (o->op_type == OP_MATCH || o->op_type == OP_QR)
7533         o->op_private |= OPpRUNTIME;
7534     return o;
7535 }
7536
7537 OP *
7538 Perl_ck_method(pTHX_ OP *o)
7539 {
7540     OP * const kid = cUNOPo->op_first;
7541
7542     PERL_ARGS_ASSERT_CK_METHOD;
7543
7544     if (kid->op_type == OP_CONST) {
7545         SV* sv = kSVOP->op_sv;
7546         const char * const method = SvPVX_const(sv);
7547         if (!(strchr(method, ':') || strchr(method, '\''))) {
7548             OP *cmop;
7549             if (!SvREADONLY(sv) || !SvFAKE(sv)) {
7550                 sv = newSVpvn_share(method, SvCUR(sv), 0);
7551             }
7552             else {
7553                 kSVOP->op_sv = NULL;
7554             }
7555             cmop = newSVOP(OP_METHOD_NAMED, 0, sv);
7556 #ifdef PERL_MAD
7557             op_getmad(o,cmop,'O');
7558 #else
7559             op_free(o);
7560 #endif
7561             return cmop;
7562         }
7563     }
7564     return o;
7565 }
7566
7567 OP *
7568 Perl_ck_null(pTHX_ OP *o)
7569 {
7570     PERL_ARGS_ASSERT_CK_NULL;
7571     PERL_UNUSED_CONTEXT;
7572     return o;
7573 }
7574
7575 OP *
7576 Perl_ck_open(pTHX_ OP *o)
7577 {
7578     dVAR;
7579     HV * const table = GvHV(PL_hintgv);
7580
7581     PERL_ARGS_ASSERT_CK_OPEN;
7582
7583     if (table) {
7584         SV **svp = hv_fetchs(table, "open_IN", FALSE);
7585         if (svp && *svp) {
7586             STRLEN len = 0;
7587             const char *d = SvPV_const(*svp, len);
7588             const I32 mode = mode_from_discipline(d, len);
7589             if (mode & O_BINARY)
7590                 o->op_private |= OPpOPEN_IN_RAW;
7591             else if (mode & O_TEXT)
7592                 o->op_private |= OPpOPEN_IN_CRLF;
7593         }
7594
7595         svp = hv_fetchs(table, "open_OUT", FALSE);
7596         if (svp && *svp) {
7597             STRLEN len = 0;
7598             const char *d = SvPV_const(*svp, len);
7599             const I32 mode = mode_from_discipline(d, len);
7600             if (mode & O_BINARY)
7601                 o->op_private |= OPpOPEN_OUT_RAW;
7602             else if (mode & O_TEXT)
7603                 o->op_private |= OPpOPEN_OUT_CRLF;
7604         }
7605     }
7606     if (o->op_type == OP_BACKTICK) {
7607         if (!(o->op_flags & OPf_KIDS)) {
7608             OP * const newop = newUNOP(OP_BACKTICK, 0, newDEFSVOP());
7609 #ifdef PERL_MAD
7610             op_getmad(o,newop,'O');
7611 #else
7612             op_free(o);
7613 #endif
7614             return newop;
7615         }
7616         return o;
7617     }
7618     {
7619          /* In case of three-arg dup open remove strictness
7620           * from the last arg if it is a bareword. */
7621          OP * const first = cLISTOPx(o)->op_first; /* The pushmark. */
7622          OP * const last  = cLISTOPx(o)->op_last;  /* The bareword. */
7623          OP *oa;
7624          const char *mode;
7625
7626          if ((last->op_type == OP_CONST) &&             /* The bareword. */
7627              (last->op_private & OPpCONST_BARE) &&
7628              (last->op_private & OPpCONST_STRICT) &&
7629              (oa = first->op_sibling) &&                /* The fh. */
7630              (oa = oa->op_sibling) &&                   /* The mode. */
7631              (oa->op_type == OP_CONST) &&
7632              SvPOK(((SVOP*)oa)->op_sv) &&
7633              (mode = SvPVX_const(((SVOP*)oa)->op_sv)) &&
7634              mode[0] == '>' && mode[1] == '&' &&        /* A dup open. */
7635              (last == oa->op_sibling))                  /* The bareword. */
7636               last->op_private &= ~OPpCONST_STRICT;
7637     }
7638     return ck_fun(o);
7639 }
7640
7641 OP *
7642 Perl_ck_repeat(pTHX_ OP *o)
7643 {
7644     PERL_ARGS_ASSERT_CK_REPEAT;
7645
7646     if (cBINOPo->op_first->op_flags & OPf_PARENS) {
7647         o->op_private |= OPpREPEAT_DOLIST;
7648         cBINOPo->op_first = force_list(cBINOPo->op_first);
7649     }
7650     else
7651         scalar(o);
7652     return o;
7653 }
7654
7655 OP *
7656 Perl_ck_require(pTHX_ OP *o)
7657 {
7658     dVAR;
7659     GV* gv = NULL;
7660
7661     PERL_ARGS_ASSERT_CK_REQUIRE;
7662
7663     if (o->op_flags & OPf_KIDS) {       /* Shall we supply missing .pm? */
7664         SVOP * const kid = (SVOP*)cUNOPo->op_first;
7665
7666         if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) {
7667             SV * const sv = kid->op_sv;
7668             U32 was_readonly = SvREADONLY(sv);
7669             char *s;
7670             STRLEN len;
7671             const char *end;
7672
7673             if (was_readonly) {
7674                 if (SvFAKE(sv)) {
7675                     sv_force_normal_flags(sv, 0);
7676                     assert(!SvREADONLY(sv));
7677                     was_readonly = 0;
7678                 } else {
7679                     SvREADONLY_off(sv);
7680                 }
7681             }   
7682
7683             s = SvPVX(sv);
7684             len = SvCUR(sv);
7685             end = s + len;
7686             for (; s < end; s++) {
7687                 if (*s == ':' && s[1] == ':') {
7688                     *s = '/';
7689                     Move(s+2, s+1, end - s - 1, char);
7690                     --end;
7691                 }
7692             }
7693             SvEND_set(sv, end);
7694             sv_catpvs(sv, ".pm");
7695             SvFLAGS(sv) |= was_readonly;
7696         }
7697     }
7698
7699     if (!(o->op_flags & OPf_SPECIAL)) { /* Wasn't written as CORE::require */
7700         /* handle override, if any */
7701         gv = gv_fetchpvs("require", GV_NOTQUAL, SVt_PVCV);
7702         if (!(gv && GvCVu(gv) && GvIMPORTED_CV(gv))) {
7703             GV * const * const gvp = (GV**)hv_fetchs(PL_globalstash, "require", FALSE);
7704             gv = gvp ? *gvp : NULL;
7705         }
7706     }
7707
7708     if (gv && GvCVu(gv) && GvIMPORTED_CV(gv)) {
7709         OP * const kid = cUNOPo->op_first;
7710         OP * newop;
7711
7712         cUNOPo->op_first = 0;
7713 #ifndef PERL_MAD
7714         op_free(o);
7715 #endif
7716         newop = ck_subr(newUNOP(OP_ENTERSUB, OPf_STACKED,
7717                                 append_elem(OP_LIST, kid,
7718                                             scalar(newUNOP(OP_RV2CV, 0,
7719                                                            newGVOP(OP_GV, 0,
7720                                                                    gv))))));
7721         op_getmad(o,newop,'O');
7722         return newop;
7723     }
7724
7725     return scalar(ck_fun(o));
7726 }
7727
7728 OP *
7729 Perl_ck_return(pTHX_ OP *o)
7730 {
7731     dVAR;
7732     OP *kid;
7733
7734     PERL_ARGS_ASSERT_CK_RETURN;
7735
7736     kid = cLISTOPo->op_first->op_sibling;
7737     if (CvLVALUE(PL_compcv)) {
7738         for (; kid; kid = kid->op_sibling)
7739             mod(kid, OP_LEAVESUBLV);
7740     } else {
7741         for (; kid; kid = kid->op_sibling)
7742             if ((kid->op_type == OP_NULL)
7743                 && ((kid->op_flags & (OPf_SPECIAL|OPf_KIDS)) == (OPf_SPECIAL|OPf_KIDS))) {
7744                 /* This is a do block */
7745                 OP *op = kUNOP->op_first;
7746                 if (op->op_type == OP_LEAVE && op->op_flags & OPf_KIDS) {
7747                     op = cUNOPx(op)->op_first;
7748                     assert(op->op_type == OP_ENTER && !(op->op_flags & OPf_SPECIAL));
7749                     /* Force the use of the caller's context */
7750                     op->op_flags |= OPf_SPECIAL;
7751                 }
7752             }
7753     }
7754
7755     return o;
7756 }
7757
7758 OP *
7759 Perl_ck_select(pTHX_ OP *o)
7760 {
7761     dVAR;
7762     OP* kid;
7763
7764     PERL_ARGS_ASSERT_CK_SELECT;
7765
7766     if (o->op_flags & OPf_KIDS) {
7767         kid = cLISTOPo->op_first->op_sibling;   /* get past pushmark */
7768         if (kid && kid->op_sibling) {
7769             o->op_type = OP_SSELECT;
7770             o->op_ppaddr = PL_ppaddr[OP_SSELECT];
7771             o = ck_fun(o);
7772             return fold_constants(o);
7773         }
7774     }
7775     o = ck_fun(o);
7776     kid = cLISTOPo->op_first->op_sibling;    /* get past pushmark */
7777     if (kid && kid->op_type == OP_RV2GV)
7778         kid->op_private &= ~HINT_STRICT_REFS;
7779     return o;
7780 }
7781
7782 OP *
7783 Perl_ck_shift(pTHX_ OP *o)
7784 {
7785     dVAR;
7786     const I32 type = o->op_type;
7787
7788     PERL_ARGS_ASSERT_CK_SHIFT;
7789
7790     if (!(o->op_flags & OPf_KIDS)) {
7791         OP *argop;
7792
7793         if (!CvUNIQUE(PL_compcv)) {
7794             o->op_flags |= OPf_SPECIAL;
7795             return o;
7796         }
7797
7798         argop = newUNOP(OP_RV2AV, 0, scalar(newGVOP(OP_GV, 0, PL_argvgv)));
7799 #ifdef PERL_MAD
7800         OP * const oldo = o;
7801         o = newUNOP(type, 0, scalar(argop));
7802         op_getmad(oldo,o,'O');
7803         return o;
7804 #else
7805         op_free(o);
7806         return newUNOP(type, 0, scalar(argop));
7807 #endif
7808     }
7809     return scalar(modkids(ck_fun(o), type));
7810 }
7811
7812 OP *
7813 Perl_ck_sort(pTHX_ OP *o)
7814 {
7815     dVAR;
7816     OP *firstkid;
7817
7818     PERL_ARGS_ASSERT_CK_SORT;
7819
7820     if (o->op_type == OP_SORT && (PL_hints & HINT_LOCALIZE_HH) != 0) {
7821         HV * const hinthv = GvHV(PL_hintgv);
7822         if (hinthv) {
7823             SV ** const svp = hv_fetchs(hinthv, "sort", FALSE);
7824             if (svp) {
7825                 const I32 sorthints = (I32)SvIV(*svp);
7826                 if ((sorthints & HINT_SORT_QUICKSORT) != 0)
7827                     o->op_private |= OPpSORT_QSORT;
7828                 if ((sorthints & HINT_SORT_STABLE) != 0)
7829                     o->op_private |= OPpSORT_STABLE;
7830             }
7831         }
7832     }
7833
7834     if (o->op_type == OP_SORT && o->op_flags & OPf_STACKED)
7835         simplify_sort(o);
7836     firstkid = cLISTOPo->op_first->op_sibling;          /* get past pushmark */
7837     if (o->op_flags & OPf_STACKED) {                    /* may have been cleared */
7838         OP *k = NULL;
7839         OP *kid = cUNOPx(firstkid)->op_first;           /* get past null */
7840
7841         if (kid->op_type == OP_SCOPE || kid->op_type == OP_LEAVE) {
7842             linklist(kid);
7843             if (kid->op_type == OP_SCOPE) {
7844                 k = kid->op_next;
7845                 kid->op_next = 0;
7846             }
7847             else if (kid->op_type == OP_LEAVE) {
7848                 if (o->op_type == OP_SORT) {
7849                     op_null(kid);                       /* wipe out leave */
7850                     kid->op_next = kid;
7851
7852                     for (k = kLISTOP->op_first->op_next; k; k = k->op_next) {
7853                         if (k->op_next == kid)
7854                             k->op_next = 0;
7855                         /* don't descend into loops */
7856                         else if (k->op_type == OP_ENTERLOOP
7857                                  || k->op_type == OP_ENTERITER)
7858                         {
7859                             k = cLOOPx(k)->op_lastop;
7860                         }
7861                     }
7862                 }
7863                 else
7864                     kid->op_next = 0;           /* just disconnect the leave */
7865                 k = kLISTOP->op_first;
7866             }
7867             CALL_PEEP(k);
7868
7869             kid = firstkid;
7870             if (o->op_type == OP_SORT) {
7871                 /* provide scalar context for comparison function/block */
7872                 kid = scalar(kid);
7873                 kid->op_next = kid;
7874             }
7875             else
7876                 kid->op_next = k;
7877             o->op_flags |= OPf_SPECIAL;
7878         }
7879         else if (kid->op_type == OP_RV2SV || kid->op_type == OP_PADSV)
7880             op_null(firstkid);
7881
7882         firstkid = firstkid->op_sibling;
7883     }
7884
7885     /* provide list context for arguments */
7886     if (o->op_type == OP_SORT)
7887         list(firstkid);
7888
7889     return o;
7890 }
7891
7892 STATIC void
7893 S_simplify_sort(pTHX_ OP *o)
7894 {
7895     dVAR;
7896     register OP *kid = cLISTOPo->op_first->op_sibling;  /* get past pushmark */
7897     OP *k;
7898     int descending;
7899     GV *gv;
7900     const char *gvname;
7901
7902     PERL_ARGS_ASSERT_SIMPLIFY_SORT;
7903
7904     if (!(o->op_flags & OPf_STACKED))
7905         return;
7906     GvMULTI_on(gv_fetchpvs("a", GV_ADD|GV_NOTQUAL, SVt_PV));
7907     GvMULTI_on(gv_fetchpvs("b", GV_ADD|GV_NOTQUAL, SVt_PV));
7908     kid = kUNOP->op_first;                              /* get past null */
7909     if (kid->op_type != OP_SCOPE)
7910         return;
7911     kid = kLISTOP->op_last;                             /* get past scope */
7912     switch(kid->op_type) {
7913         case OP_NCMP:
7914         case OP_I_NCMP:
7915         case OP_SCMP:
7916             break;
7917         default:
7918             return;
7919     }
7920     k = kid;                                            /* remember this node*/
7921     if (kBINOP->op_first->op_type != OP_RV2SV)
7922         return;
7923     kid = kBINOP->op_first;                             /* get past cmp */
7924     if (kUNOP->op_first->op_type != OP_GV)
7925         return;
7926     kid = kUNOP->op_first;                              /* get past rv2sv */
7927     gv = kGVOP_gv;
7928     if (GvSTASH(gv) != PL_curstash)
7929         return;
7930     gvname = GvNAME(gv);
7931     if (*gvname == 'a' && gvname[1] == '\0')
7932         descending = 0;
7933     else if (*gvname == 'b' && gvname[1] == '\0')
7934         descending = 1;
7935     else
7936         return;
7937
7938     kid = k;                                            /* back to cmp */
7939     if (kBINOP->op_last->op_type != OP_RV2SV)
7940         return;
7941     kid = kBINOP->op_last;                              /* down to 2nd arg */
7942     if (kUNOP->op_first->op_type != OP_GV)
7943         return;
7944     kid = kUNOP->op_first;                              /* get past rv2sv */
7945     gv = kGVOP_gv;
7946     if (GvSTASH(gv) != PL_curstash)
7947         return;
7948     gvname = GvNAME(gv);
7949     if ( descending
7950          ? !(*gvname == 'a' && gvname[1] == '\0')
7951          : !(*gvname == 'b' && gvname[1] == '\0'))
7952         return;
7953     o->op_flags &= ~(OPf_STACKED | OPf_SPECIAL);
7954     if (descending)
7955         o->op_private |= OPpSORT_DESCEND;
7956     if (k->op_type == OP_NCMP)
7957         o->op_private |= OPpSORT_NUMERIC;
7958     if (k->op_type == OP_I_NCMP)
7959         o->op_private |= OPpSORT_NUMERIC | OPpSORT_INTEGER;
7960     kid = cLISTOPo->op_first->op_sibling;
7961     cLISTOPo->op_first->op_sibling = kid->op_sibling; /* bypass old block */
7962 #ifdef PERL_MAD
7963     op_getmad(kid,o,'S');                             /* then delete it */
7964 #else
7965     op_free(kid);                                     /* then delete it */
7966 #endif
7967 }
7968
7969 OP *
7970 Perl_ck_split(pTHX_ OP *o)
7971 {
7972     dVAR;
7973     register OP *kid;
7974
7975     PERL_ARGS_ASSERT_CK_SPLIT;
7976
7977     if (o->op_flags & OPf_STACKED)
7978         return no_fh_allowed(o);
7979
7980     kid = cLISTOPo->op_first;
7981     if (kid->op_type != OP_NULL)
7982         Perl_croak(aTHX_ "panic: ck_split");
7983     kid = kid->op_sibling;
7984     op_free(cLISTOPo->op_first);
7985     cLISTOPo->op_first = kid;
7986     if (!kid) {
7987         cLISTOPo->op_first = kid = newSVOP(OP_CONST, 0, newSVpvs(" "));
7988         cLISTOPo->op_last = kid; /* There was only one element previously */
7989     }
7990
7991     if (kid->op_type != OP_MATCH || kid->op_flags & OPf_STACKED) {
7992         OP * const sibl = kid->op_sibling;
7993         kid->op_sibling = 0;
7994         kid = pmruntime( newPMOP(OP_MATCH, OPf_SPECIAL), kid, 0);
7995         if (cLISTOPo->op_first == cLISTOPo->op_last)
7996             cLISTOPo->op_last = kid;
7997         cLISTOPo->op_first = kid;
7998         kid->op_sibling = sibl;
7999     }
8000
8001     kid->op_type = OP_PUSHRE;
8002     kid->op_ppaddr = PL_ppaddr[OP_PUSHRE];
8003     scalar(kid);
8004     if (((PMOP *)kid)->op_pmflags & PMf_GLOBAL) {
8005       Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP),
8006                      "Use of /g modifier is meaningless in split");
8007     }
8008
8009     if (!kid->op_sibling)
8010         append_elem(OP_SPLIT, o, newDEFSVOP());
8011
8012     kid = kid->op_sibling;
8013     scalar(kid);
8014
8015     if (!kid->op_sibling)
8016         append_elem(OP_SPLIT, o, newSVOP(OP_CONST, 0, newSViv(0)));
8017     assert(kid->op_sibling);
8018
8019     kid = kid->op_sibling;
8020     scalar(kid);
8021
8022     if (kid->op_sibling)
8023         return too_many_arguments(o,OP_DESC(o));
8024
8025     return o;
8026 }
8027
8028 OP *
8029 Perl_ck_join(pTHX_ OP *o)
8030 {
8031     const OP * const kid = cLISTOPo->op_first->op_sibling;
8032
8033     PERL_ARGS_ASSERT_CK_JOIN;
8034
8035     if (kid && kid->op_type == OP_MATCH) {
8036         if (ckWARN(WARN_SYNTAX)) {
8037             const REGEXP *re = PM_GETRE(kPMOP);
8038             const char *pmstr = re ? RX_PRECOMP_const(re) : "STRING";
8039             const STRLEN len = re ? RX_PRELEN(re) : 6;
8040             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
8041                         "/%.*s/ should probably be written as \"%.*s\"",
8042                         (int)len, pmstr, (int)len, pmstr);
8043         }
8044     }
8045     return ck_fun(o);
8046 }
8047
8048 OP *
8049 Perl_ck_subr(pTHX_ OP *o)
8050 {
8051     dVAR;
8052     OP *prev = ((cUNOPo->op_first->op_sibling)
8053              ? cUNOPo : ((UNOP*)cUNOPo->op_first))->op_first;
8054     OP *o2 = prev->op_sibling;
8055     OP *cvop;
8056     const char *proto = NULL;
8057     const char *proto_end = NULL;
8058     CV *cv = NULL;
8059     GV *namegv = NULL;
8060     int optional = 0;
8061     I32 arg = 0;
8062     I32 contextclass = 0;
8063     const char *e = NULL;
8064     bool delete_op = 0;
8065
8066     PERL_ARGS_ASSERT_CK_SUBR;
8067
8068     o->op_private |= OPpENTERSUB_HASTARG;
8069     for (cvop = o2; cvop->op_sibling; cvop = cvop->op_sibling) ;
8070     if (cvop->op_type == OP_RV2CV) {
8071         o->op_private |= (cvop->op_private & OPpENTERSUB_AMPER);
8072         op_null(cvop);          /* disable rv2cv */
8073         if (!(o->op_private & OPpENTERSUB_AMPER)) {
8074             SVOP *tmpop = (SVOP*)((UNOP*)cvop)->op_first;
8075             GV *gv = NULL;
8076             switch (tmpop->op_type) {
8077                 case OP_GV: {
8078                     gv = cGVOPx_gv(tmpop);
8079                     cv = GvCVu(gv);
8080                     if (!cv)
8081                         tmpop->op_private |= OPpEARLY_CV;
8082                 } break;
8083                 case OP_CONST: {
8084                     SV *sv = cSVOPx_sv(tmpop);
8085                     if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV)
8086                         cv = (CV*)SvRV(sv);
8087                 } break;
8088             }
8089             if (cv && SvPOK(cv)) {
8090                 STRLEN len;
8091                 namegv = gv && CvANON(cv) ? gv : CvGV(cv);
8092                 proto = SvPV(MUTABLE_SV(cv), len);
8093                 proto_end = proto + len;
8094             }
8095         }
8096     }
8097     else if (cvop->op_type == OP_METHOD || cvop->op_type == OP_METHOD_NAMED) {
8098         if (o2->op_type == OP_CONST)
8099             o2->op_private &= ~OPpCONST_STRICT;
8100         else if (o2->op_type == OP_LIST) {
8101             OP * const sib = ((UNOP*)o2)->op_first->op_sibling;
8102             if (sib && sib->op_type == OP_CONST)
8103                 sib->op_private &= ~OPpCONST_STRICT;
8104         }
8105     }
8106     o->op_private |= (PL_hints & HINT_STRICT_REFS);
8107     if (PERLDB_SUB && PL_curstash != PL_debstash)
8108         o->op_private |= OPpENTERSUB_DB;
8109     while (o2 != cvop) {
8110         OP* o3;
8111         if (PL_madskills && o2->op_type == OP_STUB) {
8112             o2 = o2->op_sibling;
8113             continue;
8114         }
8115         if (PL_madskills && o2->op_type == OP_NULL)
8116             o3 = ((UNOP*)o2)->op_first;
8117         else
8118             o3 = o2;
8119         if (proto) {
8120             if (proto >= proto_end)
8121                 return too_many_arguments(o, gv_ename(namegv));
8122
8123             switch (*proto) {
8124             case ';':
8125                 optional = 1;
8126                 proto++;
8127                 continue;
8128             case '_':
8129                 /* _ must be at the end */
8130                 if (proto[1] && proto[1] != ';')
8131                     goto oops;
8132             case '$':
8133                 proto++;
8134                 arg++;
8135                 scalar(o2);
8136                 break;
8137             case '%':
8138             case '@':
8139                 list(o2);
8140                 arg++;
8141                 break;
8142             case '&':
8143                 proto++;
8144                 arg++;
8145                 if (o3->op_type != OP_REFGEN && o3->op_type != OP_UNDEF)
8146                     bad_type(arg,
8147                         arg == 1 ? "block or sub {}" : "sub {}",
8148                         gv_ename(namegv), o3);
8149                 break;
8150             case '*':
8151                 /* '*' allows any scalar type, including bareword */
8152                 proto++;
8153                 arg++;
8154                 if (o3->op_type == OP_RV2GV)
8155                     goto wrapref;       /* autoconvert GLOB -> GLOBref */
8156                 else if (o3->op_type == OP_CONST)
8157                     o3->op_private &= ~OPpCONST_STRICT;
8158                 else if (o3->op_type == OP_ENTERSUB) {
8159                     /* accidental subroutine, revert to bareword */
8160                     OP *gvop = ((UNOP*)o3)->op_first;
8161                     if (gvop && gvop->op_type == OP_NULL) {
8162                         gvop = ((UNOP*)gvop)->op_first;
8163                         if (gvop) {
8164                             for (; gvop->op_sibling; gvop = gvop->op_sibling)
8165                                 ;
8166                             if (gvop &&
8167                                 (gvop->op_private & OPpENTERSUB_NOPAREN) &&
8168                                 (gvop = ((UNOP*)gvop)->op_first) &&
8169                                 gvop->op_type == OP_GV)
8170                             {
8171                                 GV * const gv = cGVOPx_gv(gvop);
8172                                 OP * const sibling = o2->op_sibling;
8173                                 SV * const n = newSVpvs("");
8174 #ifdef PERL_MAD
8175                                 OP * const oldo2 = o2;
8176 #else
8177                                 op_free(o2);
8178 #endif
8179                                 gv_fullname4(n, gv, "", FALSE);
8180                                 o2 = newSVOP(OP_CONST, 0, n);
8181                                 op_getmad(oldo2,o2,'O');
8182                                 prev->op_sibling = o2;
8183                                 o2->op_sibling = sibling;
8184                             }
8185                         }
8186                     }
8187                 }
8188                 scalar(o2);
8189                 break;
8190             case '[': case ']':
8191                  goto oops;
8192                  break;
8193             case '\\':
8194                 proto++;
8195                 arg++;
8196             again:
8197                 switch (*proto++) {
8198                 case '[':
8199                      if (contextclass++ == 0) {
8200                           e = strchr(proto, ']');
8201                           if (!e || e == proto)
8202                                goto oops;
8203                      }
8204                      else
8205                           goto oops;
8206                      goto again;
8207                      break;
8208                 case ']':
8209                      if (contextclass) {
8210                          const char *p = proto;
8211                          const char *const end = proto;
8212                          contextclass = 0;
8213                          while (*--p != '[') {}
8214                          bad_type(arg, Perl_form(aTHX_ "one of %.*s",
8215                                                  (int)(end - p), p),
8216                                   gv_ename(namegv), o3);
8217                      } else
8218                           goto oops;
8219                      break;
8220                 case '*':
8221                      if (o3->op_type == OP_RV2GV)
8222                           goto wrapref;
8223                      if (!contextclass)
8224                           bad_type(arg, "symbol", gv_ename(namegv), o3);
8225                      break;
8226                 case '&':
8227                      if (o3->op_type == OP_ENTERSUB)
8228                           goto wrapref;
8229                      if (!contextclass)
8230                           bad_type(arg, "subroutine entry", gv_ename(namegv),
8231                                    o3);
8232                      break;
8233                 case '$':
8234                     if (o3->op_type == OP_RV2SV ||
8235                         o3->op_type == OP_PADSV ||
8236                         o3->op_type == OP_HELEM ||
8237                         o3->op_type == OP_AELEM)
8238                          goto wrapref;
8239                     if (!contextclass)
8240                         bad_type(arg, "scalar", gv_ename(namegv), o3);
8241                      break;
8242                 case '@':
8243                     if (o3->op_type == OP_RV2AV ||
8244                         o3->op_type == OP_PADAV)
8245                          goto wrapref;
8246                     if (!contextclass)
8247                         bad_type(arg, "array", gv_ename(namegv), o3);
8248                     break;
8249                 case '%':
8250                     if (o3->op_type == OP_RV2HV ||
8251                         o3->op_type == OP_PADHV)
8252                          goto wrapref;
8253                     if (!contextclass)
8254                          bad_type(arg, "hash", gv_ename(namegv), o3);
8255                     break;
8256                 wrapref:
8257                     {
8258                         OP* const kid = o2;
8259                         OP* const sib = kid->op_sibling;
8260                         kid->op_sibling = 0;
8261                         o2 = newUNOP(OP_REFGEN, 0, kid);
8262                         o2->op_sibling = sib;
8263                         prev->op_sibling = o2;
8264                     }
8265                     if (contextclass && e) {
8266                          proto = e + 1;
8267                          contextclass = 0;
8268                     }
8269                     break;
8270                 default: goto oops;
8271                 }
8272                 if (contextclass)
8273                      goto again;
8274                 break;
8275             case ' ':
8276                 proto++;
8277                 continue;
8278             default:
8279               oops:
8280                 Perl_croak(aTHX_ "Malformed prototype for %s: %"SVf,
8281                            gv_ename(namegv), SVfARG(cv));
8282             }
8283         }
8284         else
8285             list(o2);
8286         mod(o2, OP_ENTERSUB);
8287         prev = o2;
8288         o2 = o2->op_sibling;
8289     } /* while */
8290     if (o2 == cvop && proto && *proto == '_') {
8291         /* generate an access to $_ */
8292         o2 = newDEFSVOP();
8293         o2->op_sibling = prev->op_sibling;
8294         prev->op_sibling = o2; /* instead of cvop */
8295     }
8296     if (proto && !optional && proto_end > proto &&
8297         (*proto != '@' && *proto != '%' && *proto != ';' && *proto != '_'))
8298         return too_few_arguments(o, gv_ename(namegv));
8299     if(delete_op) {
8300 #ifdef PERL_MAD
8301         OP * const oldo = o;
8302 #else
8303         op_free(o);
8304 #endif
8305         o=newSVOP(OP_CONST, 0, newSViv(0));
8306         op_getmad(oldo,o,'O');
8307     }
8308     return o;
8309 }
8310
8311 OP *
8312 Perl_ck_svconst(pTHX_ OP *o)
8313 {
8314     PERL_ARGS_ASSERT_CK_SVCONST;
8315     PERL_UNUSED_CONTEXT;
8316     SvREADONLY_on(cSVOPo->op_sv);
8317     return o;
8318 }
8319
8320 OP *
8321 Perl_ck_chdir(pTHX_ OP *o)
8322 {
8323     if (o->op_flags & OPf_KIDS) {
8324         SVOP * const kid = (SVOP*)cUNOPo->op_first;
8325
8326         if (kid && kid->op_type == OP_CONST &&
8327             (kid->op_private & OPpCONST_BARE))
8328         {
8329             o->op_flags |= OPf_SPECIAL;
8330             kid->op_private &= ~OPpCONST_STRICT;
8331         }
8332     }
8333     return ck_fun(o);
8334 }
8335
8336 OP *
8337 Perl_ck_trunc(pTHX_ OP *o)
8338 {
8339     PERL_ARGS_ASSERT_CK_TRUNC;
8340
8341     if (o->op_flags & OPf_KIDS) {
8342         SVOP *kid = (SVOP*)cUNOPo->op_first;
8343
8344         if (kid->op_type == OP_NULL)
8345             kid = (SVOP*)kid->op_sibling;
8346         if (kid && kid->op_type == OP_CONST &&
8347             (kid->op_private & OPpCONST_BARE))
8348         {
8349             o->op_flags |= OPf_SPECIAL;
8350             kid->op_private &= ~OPpCONST_STRICT;
8351         }
8352     }
8353     return ck_fun(o);
8354 }
8355
8356 OP *
8357 Perl_ck_unpack(pTHX_ OP *o)
8358 {
8359     OP *kid = cLISTOPo->op_first;
8360
8361     PERL_ARGS_ASSERT_CK_UNPACK;
8362
8363     if (kid->op_sibling) {
8364         kid = kid->op_sibling;
8365         if (!kid->op_sibling)
8366             kid->op_sibling = newDEFSVOP();
8367     }
8368     return ck_fun(o);
8369 }
8370
8371 OP *
8372 Perl_ck_substr(pTHX_ OP *o)
8373 {
8374     PERL_ARGS_ASSERT_CK_SUBSTR;
8375
8376     o = ck_fun(o);
8377     if ((o->op_flags & OPf_KIDS) && (o->op_private == 4)) {
8378         OP *kid = cLISTOPo->op_first;
8379
8380         if (kid->op_type == OP_NULL)
8381             kid = kid->op_sibling;
8382         if (kid)
8383             kid->op_flags |= OPf_MOD;
8384
8385     }
8386     return o;
8387 }
8388
8389 OP *
8390 Perl_ck_each(pTHX_ OP *o)
8391 {
8392     dVAR;
8393     OP *kid = o->op_flags & OPf_KIDS ? cLISTOPo->op_first : NULL;
8394
8395     PERL_ARGS_ASSERT_CK_EACH;
8396
8397     if (kid) {
8398         if (kid->op_type == OP_PADAV || kid->op_type == OP_RV2AV) {
8399             const unsigned new_type = o->op_type == OP_EACH ? OP_AEACH
8400                 : o->op_type == OP_KEYS ? OP_AKEYS : OP_AVALUES;
8401             o->op_type = new_type;
8402             o->op_ppaddr = PL_ppaddr[new_type];
8403         }
8404         else if (!(kid->op_type == OP_PADHV || kid->op_type == OP_RV2HV
8405                     || (kid->op_type == OP_CONST && kid->op_private & OPpCONST_BARE)
8406                   )) {
8407             bad_type(1, "hash or array", PL_op_desc[o->op_type], kid);
8408             return o;
8409         }
8410     }
8411     return ck_fun(o);
8412 }
8413
8414 /* caller is supposed to assign the return to the 
8415    container of the rep_op var */
8416 STATIC OP *
8417 S_opt_scalarhv(pTHX_ OP *rep_op) {
8418     dVAR;
8419     UNOP *unop;
8420
8421     PERL_ARGS_ASSERT_OPT_SCALARHV;
8422
8423     NewOp(1101, unop, 1, UNOP);
8424     unop->op_type = (OPCODE)OP_BOOLKEYS;
8425     unop->op_ppaddr = PL_ppaddr[OP_BOOLKEYS];
8426     unop->op_flags = (U8)(OPf_WANT_SCALAR | OPf_KIDS );
8427     unop->op_private = (U8)(1 | ((OPf_WANT_SCALAR | OPf_KIDS) >> 8));
8428     unop->op_first = rep_op;
8429     unop->op_next = rep_op->op_next;
8430     rep_op->op_next = (OP*)unop;
8431     rep_op->op_flags|=(OPf_REF | OPf_MOD);
8432     unop->op_sibling = rep_op->op_sibling;
8433     rep_op->op_sibling = NULL;
8434     /* unop->op_targ = pad_alloc(OP_BOOLKEYS, SVs_PADTMP); */
8435     if (rep_op->op_type == OP_PADHV) { 
8436         rep_op->op_flags &= ~OPf_WANT_SCALAR;
8437         rep_op->op_flags |= OPf_WANT_LIST;
8438     }
8439     return (OP*)unop;
8440 }                        
8441
8442 /* Checks if o acts as an in-place operator on an array. oright points to the
8443  * beginning of the right-hand side. Returns the left-hand side of the
8444  * assignment if o acts in-place, or NULL otherwise. */
8445
8446 STATIC OP *
8447 S_is_inplace_av(pTHX_ OP *o, OP *oright) {
8448     OP *o2;
8449     OP *oleft = NULL;
8450
8451     PERL_ARGS_ASSERT_IS_INPLACE_AV;
8452
8453     if (!oright ||
8454         (oright->op_type != OP_RV2AV && oright->op_type != OP_PADAV)
8455         || oright->op_next != o
8456         || (oright->op_private & OPpLVAL_INTRO)
8457     )
8458         return NULL;
8459
8460     /* o2 follows the chain of op_nexts through the LHS of the
8461      * assign (if any) to the aassign op itself */
8462     o2 = o->op_next;
8463     if (!o2 || o2->op_type != OP_NULL)
8464         return NULL;
8465     o2 = o2->op_next;
8466     if (!o2 || o2->op_type != OP_PUSHMARK)
8467         return NULL;
8468     o2 = o2->op_next;
8469     if (o2 && o2->op_type == OP_GV)
8470         o2 = o2->op_next;
8471     if (!o2
8472         || (o2->op_type != OP_PADAV && o2->op_type != OP_RV2AV)
8473         || (o2->op_private & OPpLVAL_INTRO)
8474     )
8475         return NULL;
8476     oleft = o2;
8477     o2 = o2->op_next;
8478     if (!o2 || o2->op_type != OP_NULL)
8479         return NULL;
8480     o2 = o2->op_next;
8481     if (!o2 || o2->op_type != OP_AASSIGN
8482             || (o2->op_flags & OPf_WANT) != OPf_WANT_VOID)
8483         return NULL;
8484
8485     /* check that the sort is the first arg on RHS of assign */
8486
8487     o2 = cUNOPx(o2)->op_first;
8488     if (!o2 || o2->op_type != OP_NULL)
8489         return NULL;
8490     o2 = cUNOPx(o2)->op_first;
8491     if (!o2 || o2->op_type != OP_PUSHMARK)
8492         return NULL;
8493     if (o2->op_sibling != o)
8494         return NULL;
8495
8496     /* check the array is the same on both sides */
8497     if (oleft->op_type == OP_RV2AV) {
8498         if (oright->op_type != OP_RV2AV
8499             || !cUNOPx(oright)->op_first
8500             || cUNOPx(oright)->op_first->op_type != OP_GV
8501             || cGVOPx_gv(cUNOPx(oleft)->op_first) !=
8502                cGVOPx_gv(cUNOPx(oright)->op_first)
8503         )
8504             return NULL;
8505     }
8506     else if (oright->op_type != OP_PADAV
8507         || oright->op_targ != oleft->op_targ
8508     )
8509         return NULL;
8510
8511     return oleft;
8512 }
8513
8514 /* A peephole optimizer.  We visit the ops in the order they're to execute.
8515  * See the comments at the top of this file for more details about when
8516  * peep() is called */
8517
8518 void
8519 Perl_peep(pTHX_ register OP *o)
8520 {
8521     dVAR;
8522     register OP* oldop = NULL;
8523
8524     if (!o || o->op_opt)
8525         return;
8526     ENTER;
8527     SAVEOP();
8528     SAVEVPTR(PL_curcop);
8529     for (; o; o = o->op_next) {
8530         if (o->op_opt)
8531             break;
8532         /* By default, this op has now been optimised. A couple of cases below
8533            clear this again.  */
8534         o->op_opt = 1;
8535         PL_op = o;
8536         switch (o->op_type) {
8537         case OP_NEXTSTATE:
8538         case OP_DBSTATE:
8539             PL_curcop = ((COP*)o);              /* for warnings */
8540             break;
8541
8542         case OP_CONST:
8543             if (cSVOPo->op_private & OPpCONST_STRICT)
8544                 no_bareword_allowed(o);
8545 #ifdef USE_ITHREADS
8546         case OP_HINTSEVAL:
8547         case OP_METHOD_NAMED:
8548             /* Relocate sv to the pad for thread safety.
8549              * Despite being a "constant", the SV is written to,
8550              * for reference counts, sv_upgrade() etc. */
8551             if (cSVOP->op_sv) {
8552                 const PADOFFSET ix = pad_alloc(OP_CONST, SVs_PADTMP);
8553                 if (o->op_type != OP_METHOD_NAMED && SvPADTMP(cSVOPo->op_sv)) {
8554                     /* If op_sv is already a PADTMP then it is being used by
8555                      * some pad, so make a copy. */
8556                     sv_setsv(PAD_SVl(ix),cSVOPo->op_sv);
8557                     SvREADONLY_on(PAD_SVl(ix));
8558                     SvREFCNT_dec(cSVOPo->op_sv);
8559                 }
8560                 else if (o->op_type != OP_METHOD_NAMED
8561                          && cSVOPo->op_sv == &PL_sv_undef) {
8562                     /* PL_sv_undef is hack - it's unsafe to store it in the
8563                        AV that is the pad, because av_fetch treats values of
8564                        PL_sv_undef as a "free" AV entry and will merrily
8565                        replace them with a new SV, causing pad_alloc to think
8566                        that this pad slot is free. (When, clearly, it is not)
8567                     */
8568                     SvOK_off(PAD_SVl(ix));
8569                     SvPADTMP_on(PAD_SVl(ix));
8570                     SvREADONLY_on(PAD_SVl(ix));
8571                 }
8572                 else {
8573                     SvREFCNT_dec(PAD_SVl(ix));
8574                     SvPADTMP_on(cSVOPo->op_sv);
8575                     PAD_SETSV(ix, cSVOPo->op_sv);
8576                     /* XXX I don't know how this isn't readonly already. */
8577                     SvREADONLY_on(PAD_SVl(ix));
8578                 }
8579                 cSVOPo->op_sv = NULL;
8580                 o->op_targ = ix;
8581             }
8582 #endif
8583             break;
8584
8585         case OP_CONCAT:
8586             if (o->op_next && o->op_next->op_type == OP_STRINGIFY) {
8587                 if (o->op_next->op_private & OPpTARGET_MY) {
8588                     if (o->op_flags & OPf_STACKED) /* chained concats */
8589                         break; /* ignore_optimization */
8590                     else {
8591                         /* assert(PL_opargs[o->op_type] & OA_TARGLEX); */
8592                         o->op_targ = o->op_next->op_targ;
8593                         o->op_next->op_targ = 0;
8594                         o->op_private |= OPpTARGET_MY;
8595                     }
8596                 }
8597                 op_null(o->op_next);
8598             }
8599             break;
8600         case OP_STUB:
8601             if ((o->op_flags & OPf_WANT) != OPf_WANT_LIST) {
8602                 break; /* Scalar stub must produce undef.  List stub is noop */
8603             }
8604             goto nothin;
8605         case OP_NULL:
8606             if (o->op_targ == OP_NEXTSTATE
8607                 || o->op_targ == OP_DBSTATE)
8608             {
8609                 PL_curcop = ((COP*)o);
8610             }
8611             /* XXX: We avoid setting op_seq here to prevent later calls
8612                to peep() from mistakenly concluding that optimisation
8613                has already occurred. This doesn't fix the real problem,
8614                though (See 20010220.007). AMS 20010719 */
8615             /* op_seq functionality is now replaced by op_opt */
8616             o->op_opt = 0;
8617             /* FALL THROUGH */
8618         case OP_SCALAR:
8619         case OP_LINESEQ:
8620         case OP_SCOPE:
8621         nothin:
8622             if (oldop && o->op_next) {
8623                 oldop->op_next = o->op_next;
8624                 o->op_opt = 0;
8625                 continue;
8626             }
8627             break;
8628
8629         case OP_PADAV:
8630         case OP_GV:
8631             if (o->op_type == OP_PADAV || o->op_next->op_type == OP_RV2AV) {
8632                 OP* const pop = (o->op_type == OP_PADAV) ?
8633                             o->op_next : o->op_next->op_next;
8634                 IV i;
8635                 if (pop && pop->op_type == OP_CONST &&
8636                     ((PL_op = pop->op_next)) &&
8637                     pop->op_next->op_type == OP_AELEM &&
8638                     !(pop->op_next->op_private &
8639                       (OPpLVAL_INTRO|OPpLVAL_DEFER|OPpDEREF|OPpMAYBE_LVSUB)) &&
8640                     (i = SvIV(((SVOP*)pop)->op_sv) - CopARYBASE_get(PL_curcop))
8641                                 <= 255 &&
8642                     i >= 0)
8643                 {
8644                     GV *gv;
8645                     if (cSVOPx(pop)->op_private & OPpCONST_STRICT)
8646                         no_bareword_allowed(pop);
8647                     if (o->op_type == OP_GV)
8648                         op_null(o->op_next);
8649                     op_null(pop->op_next);
8650                     op_null(pop);
8651                     o->op_flags |= pop->op_next->op_flags & OPf_MOD;
8652                     o->op_next = pop->op_next->op_next;
8653                     o->op_ppaddr = PL_ppaddr[OP_AELEMFAST];
8654                     o->op_private = (U8)i;
8655                     if (o->op_type == OP_GV) {
8656                         gv = cGVOPo_gv;
8657                         GvAVn(gv);
8658                     }
8659                     else
8660                         o->op_flags |= OPf_SPECIAL;
8661                     o->op_type = OP_AELEMFAST;
8662                 }
8663                 break;
8664             }
8665
8666             if (o->op_next->op_type == OP_RV2SV) {
8667                 if (!(o->op_next->op_private & OPpDEREF)) {
8668                     op_null(o->op_next);
8669                     o->op_private |= o->op_next->op_private & (OPpLVAL_INTRO
8670                                                                | OPpOUR_INTRO);
8671                     o->op_next = o->op_next->op_next;
8672                     o->op_type = OP_GVSV;
8673                     o->op_ppaddr = PL_ppaddr[OP_GVSV];
8674                 }
8675             }
8676             else if ((o->op_private & OPpEARLY_CV) && ckWARN(WARN_PROTOTYPE)) {
8677                 GV * const gv = cGVOPo_gv;
8678                 if (SvTYPE(gv) == SVt_PVGV && GvCV(gv) && SvPVX_const(GvCV(gv))) {
8679                     /* XXX could check prototype here instead of just carping */
8680                     SV * const sv = sv_newmortal();
8681                     gv_efullname3(sv, gv, NULL);
8682                     Perl_warner(aTHX_ packWARN(WARN_PROTOTYPE),
8683                                 "%"SVf"() called too early to check prototype",
8684                                 SVfARG(sv));
8685                 }
8686             }
8687             else if (o->op_next->op_type == OP_READLINE
8688                     && o->op_next->op_next->op_type == OP_CONCAT
8689                     && (o->op_next->op_next->op_flags & OPf_STACKED))
8690             {
8691                 /* Turn "$a .= <FH>" into an OP_RCATLINE. AMS 20010917 */
8692                 o->op_type   = OP_RCATLINE;
8693                 o->op_flags |= OPf_STACKED;
8694                 o->op_ppaddr = PL_ppaddr[OP_RCATLINE];
8695                 op_null(o->op_next->op_next);
8696                 op_null(o->op_next);
8697             }
8698
8699             break;
8700         
8701         {
8702             OP *fop;
8703             OP *sop;
8704             
8705         case OP_NOT:
8706             fop = cUNOP->op_first;
8707             sop = NULL;
8708             goto stitch_keys;
8709             break;
8710
8711         case OP_AND:
8712         case OP_OR:
8713         case OP_DOR:
8714             fop = cLOGOP->op_first;
8715             sop = fop->op_sibling;
8716             while (cLOGOP->op_other->op_type == OP_NULL)
8717                 cLOGOP->op_other = cLOGOP->op_other->op_next;
8718             peep(cLOGOP->op_other); /* Recursive calls are not replaced by fptr calls */
8719           
8720           stitch_keys:      
8721             o->op_opt = 1;
8722             if ((fop->op_type == OP_PADHV || fop->op_type == OP_RV2HV)
8723                 || ( sop && 
8724                      (sop->op_type == OP_PADHV || sop->op_type == OP_RV2HV)
8725                     )
8726             ){  
8727                 OP * nop = o;
8728                 OP * lop = o;
8729                 if (!((nop->op_flags & OPf_WANT) == OPf_WANT_VOID)) {
8730                     while (nop && nop->op_next) {
8731                         switch (nop->op_next->op_type) {
8732                             case OP_NOT:
8733                             case OP_AND:
8734                             case OP_OR:
8735                             case OP_DOR:
8736                                 lop = nop = nop->op_next;
8737                                 break;
8738                             case OP_NULL:
8739                                 nop = nop->op_next;
8740                                 break;
8741                             default:
8742                                 nop = NULL;
8743                                 break;
8744                         }
8745                     }            
8746                 }
8747                 if ((lop->op_flags & OPf_WANT) == OPf_WANT_VOID) {
8748                     if (fop->op_type == OP_PADHV || fop->op_type == OP_RV2HV) 
8749                         cLOGOP->op_first = opt_scalarhv(fop);
8750                     if (sop && (sop->op_type == OP_PADHV || sop->op_type == OP_RV2HV)) 
8751                         cLOGOP->op_first->op_sibling = opt_scalarhv(sop);
8752                 }                                        
8753             }                  
8754             
8755             
8756             break;
8757         }    
8758         
8759         case OP_MAPWHILE:
8760         case OP_GREPWHILE:
8761         case OP_ANDASSIGN:
8762         case OP_ORASSIGN:
8763         case OP_DORASSIGN:
8764         case OP_COND_EXPR:
8765         case OP_RANGE:
8766         case OP_ONCE:
8767             while (cLOGOP->op_other->op_type == OP_NULL)
8768                 cLOGOP->op_other = cLOGOP->op_other->op_next;
8769             peep(cLOGOP->op_other); /* Recursive calls are not replaced by fptr calls */
8770             break;
8771
8772         case OP_ENTERLOOP:
8773         case OP_ENTERITER:
8774             while (cLOOP->op_redoop->op_type == OP_NULL)
8775                 cLOOP->op_redoop = cLOOP->op_redoop->op_next;
8776             peep(cLOOP->op_redoop);
8777             while (cLOOP->op_nextop->op_type == OP_NULL)
8778                 cLOOP->op_nextop = cLOOP->op_nextop->op_next;
8779             peep(cLOOP->op_nextop);
8780             while (cLOOP->op_lastop->op_type == OP_NULL)
8781                 cLOOP->op_lastop = cLOOP->op_lastop->op_next;
8782             peep(cLOOP->op_lastop);
8783             break;
8784
8785         case OP_SUBST:
8786             assert(!(cPMOP->op_pmflags & PMf_ONCE));
8787             while (cPMOP->op_pmstashstartu.op_pmreplstart &&
8788                    cPMOP->op_pmstashstartu.op_pmreplstart->op_type == OP_NULL)
8789                 cPMOP->op_pmstashstartu.op_pmreplstart
8790                     = cPMOP->op_pmstashstartu.op_pmreplstart->op_next;
8791             peep(cPMOP->op_pmstashstartu.op_pmreplstart);
8792             break;
8793
8794         case OP_EXEC:
8795             if (o->op_next && o->op_next->op_type == OP_NEXTSTATE
8796                 && ckWARN(WARN_SYNTAX))
8797             {
8798                 if (o->op_next->op_sibling) {
8799                     const OPCODE type = o->op_next->op_sibling->op_type;
8800                     if (type != OP_EXIT && type != OP_WARN && type != OP_DIE) {
8801                         const line_t oldline = CopLINE(PL_curcop);
8802                         CopLINE_set(PL_curcop, CopLINE((COP*)o->op_next));
8803                         Perl_warner(aTHX_ packWARN(WARN_EXEC),
8804                                     "Statement unlikely to be reached");
8805                         Perl_warner(aTHX_ packWARN(WARN_EXEC),
8806                                     "\t(Maybe you meant system() when you said exec()?)\n");
8807                         CopLINE_set(PL_curcop, oldline);
8808                     }
8809                 }
8810             }
8811             break;
8812
8813         case OP_HELEM: {
8814             UNOP *rop;
8815             SV *lexname;
8816             GV **fields;
8817             SV **svp, *sv;
8818             const char *key = NULL;
8819             STRLEN keylen;
8820
8821             if (((BINOP*)o)->op_last->op_type != OP_CONST)
8822                 break;
8823
8824             /* Make the CONST have a shared SV */
8825             svp = cSVOPx_svp(((BINOP*)o)->op_last);
8826             if (!SvFAKE(sv = *svp) || !SvREADONLY(sv)) {
8827                 key = SvPV_const(sv, keylen);
8828                 lexname = newSVpvn_share(key,
8829                                          SvUTF8(sv) ? -(I32)keylen : (I32)keylen,
8830                                          0);
8831                 SvREFCNT_dec(sv);
8832                 *svp = lexname;
8833             }
8834
8835             if ((o->op_private & (OPpLVAL_INTRO)))
8836                 break;
8837
8838             rop = (UNOP*)((BINOP*)o)->op_first;
8839             if (rop->op_type != OP_RV2HV || rop->op_first->op_type != OP_PADSV)
8840                 break;
8841             lexname = *av_fetch(PL_comppad_name, rop->op_first->op_targ, TRUE);
8842             if (!SvPAD_TYPED(lexname))
8843                 break;
8844             fields = (GV**)hv_fetchs(SvSTASH(lexname), "FIELDS", FALSE);
8845             if (!fields || !GvHV(*fields))
8846                 break;
8847             key = SvPV_const(*svp, keylen);
8848             if (!hv_fetch(GvHV(*fields), key,
8849                         SvUTF8(*svp) ? -(I32)keylen : (I32)keylen, FALSE))
8850             {
8851                 Perl_croak(aTHX_ "No such class field \"%s\" " 
8852                            "in variable %s of type %s", 
8853                       key, SvPV_nolen_const(lexname), HvNAME_get(SvSTASH(lexname)));
8854             }
8855
8856             break;
8857         }
8858
8859         case OP_HSLICE: {
8860             UNOP *rop;
8861             SV *lexname;
8862             GV **fields;
8863             SV **svp;
8864             const char *key;
8865             STRLEN keylen;
8866             SVOP *first_key_op, *key_op;
8867
8868             if ((o->op_private & (OPpLVAL_INTRO))
8869                 /* I bet there's always a pushmark... */
8870                 || ((LISTOP*)o)->op_first->op_sibling->op_type != OP_LIST)
8871                 /* hmmm, no optimization if list contains only one key. */
8872                 break;
8873             rop = (UNOP*)((LISTOP*)o)->op_last;
8874             if (rop->op_type != OP_RV2HV)
8875                 break;
8876             if (rop->op_first->op_type == OP_PADSV)
8877                 /* @$hash{qw(keys here)} */
8878                 rop = (UNOP*)rop->op_first;
8879             else {
8880                 /* @{$hash}{qw(keys here)} */
8881                 if (rop->op_first->op_type == OP_SCOPE 
8882                     && cLISTOPx(rop->op_first)->op_last->op_type == OP_PADSV)
8883                 {
8884                     rop = (UNOP*)cLISTOPx(rop->op_first)->op_last;
8885                 }
8886                 else
8887                     break;
8888             }
8889                     
8890             lexname = *av_fetch(PL_comppad_name, rop->op_targ, TRUE);
8891             if (!SvPAD_TYPED(lexname))
8892                 break;
8893             fields = (GV**)hv_fetchs(SvSTASH(lexname), "FIELDS", FALSE);
8894             if (!fields || !GvHV(*fields))
8895                 break;
8896             /* Again guessing that the pushmark can be jumped over.... */
8897             first_key_op = (SVOP*)((LISTOP*)((LISTOP*)o)->op_first->op_sibling)
8898                 ->op_first->op_sibling;
8899             for (key_op = first_key_op; key_op;
8900                  key_op = (SVOP*)key_op->op_sibling) {
8901                 if (key_op->op_type != OP_CONST)
8902                     continue;
8903                 svp = cSVOPx_svp(key_op);
8904                 key = SvPV_const(*svp, keylen);
8905                 if (!hv_fetch(GvHV(*fields), key, 
8906                             SvUTF8(*svp) ? -(I32)keylen : (I32)keylen, FALSE))
8907                 {
8908                     Perl_croak(aTHX_ "No such class field \"%s\" "
8909                                "in variable %s of type %s",
8910                           key, SvPV_nolen(lexname), HvNAME_get(SvSTASH(lexname)));
8911                 }
8912             }
8913             break;
8914         }
8915         case OP_RV2SV:
8916         case OP_RV2AV:
8917         case OP_RV2HV:
8918             if (oldop
8919                  && (  oldop->op_type == OP_AELEM
8920                     || oldop->op_type == OP_PADSV
8921                     || oldop->op_type == OP_RV2SV
8922                     || oldop->op_type == OP_RV2GV
8923                     || oldop->op_type == OP_HELEM
8924                     )
8925                  && (oldop->op_private & OPpDEREF)
8926             ) {
8927                 o->op_private |= OPpDEREFed;
8928             }
8929
8930         case OP_SORT: {
8931             /* will point to RV2AV or PADAV op on LHS/RHS of assign */
8932             OP *oleft;
8933             OP *o2;
8934
8935             /* check that RHS of sort is a single plain array */
8936             OP *oright = cUNOPo->op_first;
8937             if (!oright || oright->op_type != OP_PUSHMARK)
8938                 break;
8939
8940             /* reverse sort ... can be optimised.  */
8941             if (!cUNOPo->op_sibling) {
8942                 /* Nothing follows us on the list. */
8943                 OP * const reverse = o->op_next;
8944
8945                 if (reverse->op_type == OP_REVERSE &&
8946                     (reverse->op_flags & OPf_WANT) == OPf_WANT_LIST) {
8947                     OP * const pushmark = cUNOPx(reverse)->op_first;
8948                     if (pushmark && (pushmark->op_type == OP_PUSHMARK)
8949                         && (cUNOPx(pushmark)->op_sibling == o)) {
8950                         /* reverse -> pushmark -> sort */
8951                         o->op_private |= OPpSORT_REVERSE;
8952                         op_null(reverse);
8953                         pushmark->op_next = oright->op_next;
8954                         op_null(oright);
8955                     }
8956                 }
8957             }
8958
8959             /* make @a = sort @a act in-place */
8960
8961             oright = cUNOPx(oright)->op_sibling;
8962             if (!oright)
8963                 break;
8964             if (oright->op_type == OP_NULL) { /* skip sort block/sub */
8965                 oright = cUNOPx(oright)->op_sibling;
8966             }
8967
8968             oleft = is_inplace_av(o, oright);
8969             if (!oleft)
8970                 break;
8971
8972             /* transfer MODishness etc from LHS arg to RHS arg */
8973             oright->op_flags = oleft->op_flags;
8974             o->op_private |= OPpSORT_INPLACE;
8975
8976             /* excise push->gv->rv2av->null->aassign */
8977             o2 = o->op_next->op_next;
8978             op_null(o2); /* PUSHMARK */
8979             o2 = o2->op_next;
8980             if (o2->op_type == OP_GV) {
8981                 op_null(o2); /* GV */
8982                 o2 = o2->op_next;
8983             }
8984             op_null(o2); /* RV2AV or PADAV */
8985             o2 = o2->op_next->op_next;
8986             op_null(o2); /* AASSIGN */
8987
8988             o->op_next = o2->op_next;
8989
8990             break;
8991         }
8992
8993         case OP_REVERSE: {
8994             OP *ourmark, *theirmark, *ourlast, *iter, *expushmark, *rv2av;
8995             OP *gvop = NULL;
8996             OP *oleft, *oright;
8997             LISTOP *enter, *exlist;
8998
8999             /* @a = reverse @a */
9000             if ((oright = cLISTOPo->op_first)
9001                     && (oright->op_type == OP_PUSHMARK)
9002                     && (oright = oright->op_sibling)
9003                     && (oleft = is_inplace_av(o, oright))) {
9004                 OP *o2;
9005
9006                 /* transfer MODishness etc from LHS arg to RHS arg */
9007                 oright->op_flags = oleft->op_flags;
9008                 o->op_private |= OPpREVERSE_INPLACE;
9009
9010                 /* excise push->gv->rv2av->null->aassign */
9011                 o2 = o->op_next->op_next;
9012                 op_null(o2); /* PUSHMARK */
9013                 o2 = o2->op_next;
9014                 if (o2->op_type == OP_GV) {
9015                     op_null(o2); /* GV */
9016                     o2 = o2->op_next;
9017                 }
9018                 op_null(o2); /* RV2AV or PADAV */
9019                 o2 = o2->op_next->op_next;
9020                 op_null(o2); /* AASSIGN */
9021
9022                 o->op_next = o2->op_next;
9023                 break;
9024             }
9025
9026             enter = (LISTOP *) o->op_next;
9027             if (!enter)
9028                 break;
9029             if (enter->op_type == OP_NULL) {
9030                 enter = (LISTOP *) enter->op_next;
9031                 if (!enter)
9032                     break;
9033             }
9034             /* for $a (...) will have OP_GV then OP_RV2GV here.
9035                for (...) just has an OP_GV.  */
9036             if (enter->op_type == OP_GV) {
9037                 gvop = (OP *) enter;
9038                 enter = (LISTOP *) enter->op_next;
9039                 if (!enter)
9040                     break;
9041                 if (enter->op_type == OP_RV2GV) {
9042                   enter = (LISTOP *) enter->op_next;
9043                   if (!enter)
9044                     break;
9045                 }
9046             }
9047
9048             if (enter->op_type != OP_ENTERITER)
9049                 break;
9050
9051             iter = enter->op_next;
9052             if (!iter || iter->op_type != OP_ITER)
9053                 break;
9054             
9055             expushmark = enter->op_first;
9056             if (!expushmark || expushmark->op_type != OP_NULL
9057                 || expushmark->op_targ != OP_PUSHMARK)
9058                 break;
9059
9060             exlist = (LISTOP *) expushmark->op_sibling;
9061             if (!exlist || exlist->op_type != OP_NULL
9062                 || exlist->op_targ != OP_LIST)
9063                 break;
9064
9065             if (exlist->op_last != o) {
9066                 /* Mmm. Was expecting to point back to this op.  */
9067                 break;
9068             }
9069             theirmark = exlist->op_first;
9070             if (!theirmark || theirmark->op_type != OP_PUSHMARK)
9071                 break;
9072
9073             if (theirmark->op_sibling != o) {
9074                 /* There's something between the mark and the reverse, eg
9075                    for (1, reverse (...))
9076                    so no go.  */
9077                 break;
9078             }
9079
9080             ourmark = ((LISTOP *)o)->op_first;
9081             if (!ourmark || ourmark->op_type != OP_PUSHMARK)
9082                 break;
9083
9084             ourlast = ((LISTOP *)o)->op_last;
9085             if (!ourlast || ourlast->op_next != o)
9086                 break;
9087
9088             rv2av = ourmark->op_sibling;
9089             if (rv2av && rv2av->op_type == OP_RV2AV && rv2av->op_sibling == 0
9090                 && rv2av->op_flags == (OPf_WANT_LIST | OPf_KIDS)
9091                 && enter->op_flags == (OPf_WANT_LIST | OPf_KIDS)) {
9092                 /* We're just reversing a single array.  */
9093                 rv2av->op_flags = OPf_WANT_SCALAR | OPf_KIDS | OPf_REF;
9094                 enter->op_flags |= OPf_STACKED;
9095             }
9096
9097             /* We don't have control over who points to theirmark, so sacrifice
9098                ours.  */
9099             theirmark->op_next = ourmark->op_next;
9100             theirmark->op_flags = ourmark->op_flags;
9101             ourlast->op_next = gvop ? gvop : (OP *) enter;
9102             op_null(ourmark);
9103             op_null(o);
9104             enter->op_private |= OPpITER_REVERSED;
9105             iter->op_private |= OPpITER_REVERSED;
9106             
9107             break;
9108         }
9109
9110         case OP_SASSIGN: {
9111             OP *rv2gv;
9112             UNOP *refgen, *rv2cv;
9113             LISTOP *exlist;
9114
9115             if ((o->op_flags & OPf_WANT) != OPf_WANT_VOID)
9116                 break;
9117
9118             if ((o->op_private & ~OPpASSIGN_BACKWARDS) != 2)
9119                 break;
9120
9121             rv2gv = ((BINOP *)o)->op_last;
9122             if (!rv2gv || rv2gv->op_type != OP_RV2GV)
9123                 break;
9124
9125             refgen = (UNOP *)((BINOP *)o)->op_first;
9126
9127             if (!refgen || refgen->op_type != OP_REFGEN)
9128                 break;
9129
9130             exlist = (LISTOP *)refgen->op_first;
9131             if (!exlist || exlist->op_type != OP_NULL
9132                 || exlist->op_targ != OP_LIST)
9133                 break;
9134
9135             if (exlist->op_first->op_type != OP_PUSHMARK)
9136                 break;
9137
9138             rv2cv = (UNOP*)exlist->op_last;
9139
9140             if (rv2cv->op_type != OP_RV2CV)
9141                 break;
9142
9143             assert ((rv2gv->op_private & OPpDONT_INIT_GV) == 0);
9144             assert ((o->op_private & OPpASSIGN_CV_TO_GV) == 0);
9145             assert ((rv2cv->op_private & OPpMAY_RETURN_CONSTANT) == 0);
9146
9147             o->op_private |= OPpASSIGN_CV_TO_GV;
9148             rv2gv->op_private |= OPpDONT_INIT_GV;
9149             rv2cv->op_private |= OPpMAY_RETURN_CONSTANT;
9150
9151             break;
9152         }
9153
9154         
9155         case OP_QR:
9156         case OP_MATCH:
9157             if (!(cPMOP->op_pmflags & PMf_ONCE)) {
9158                 assert (!cPMOP->op_pmstashstartu.op_pmreplstart);
9159             }
9160             break;
9161         }
9162         oldop = o;
9163     }
9164     LEAVE;
9165 }
9166
9167 const char*
9168 Perl_custom_op_name(pTHX_ const OP* o)
9169 {
9170     dVAR;
9171     const IV index = PTR2IV(o->op_ppaddr);
9172     SV* keysv;
9173     HE* he;
9174
9175     PERL_ARGS_ASSERT_CUSTOM_OP_NAME;
9176
9177     if (!PL_custom_op_names) /* This probably shouldn't happen */
9178         return (char *)PL_op_name[OP_CUSTOM];
9179
9180     keysv = sv_2mortal(newSViv(index));
9181
9182     he = hv_fetch_ent(PL_custom_op_names, keysv, 0, 0);
9183     if (!he)
9184         return (char *)PL_op_name[OP_CUSTOM]; /* Don't know who you are */
9185
9186     return SvPV_nolen(HeVAL(he));
9187 }
9188
9189 const char*
9190 Perl_custom_op_desc(pTHX_ const OP* o)
9191 {
9192     dVAR;
9193     const IV index = PTR2IV(o->op_ppaddr);
9194     SV* keysv;
9195     HE* he;
9196
9197     PERL_ARGS_ASSERT_CUSTOM_OP_DESC;
9198
9199     if (!PL_custom_op_descs)
9200         return (char *)PL_op_desc[OP_CUSTOM];
9201
9202     keysv = sv_2mortal(newSViv(index));
9203
9204     he = hv_fetch_ent(PL_custom_op_descs, keysv, 0, 0);
9205     if (!he)
9206         return (char *)PL_op_desc[OP_CUSTOM];
9207
9208     return SvPV_nolen(HeVAL(he));
9209 }
9210
9211 #include "XSUB.h"
9212
9213 /* Efficient sub that returns a constant scalar value. */
9214 static void
9215 const_sv_xsub(pTHX_ CV* cv)
9216 {
9217     dVAR;
9218     dXSARGS;
9219     SV *const sv = MUTABLE_SV(XSANY.any_ptr);
9220     if (items != 0) {
9221         NOOP;
9222 #if 0
9223         /* diag_listed_as: SKIPME */
9224         Perl_croak(aTHX_ "usage: %s::%s()",
9225                    HvNAME_get(GvSTASH(CvGV(cv))), GvNAME(CvGV(cv)));
9226 #endif
9227     }
9228     if (!sv) {
9229         XSRETURN(0);
9230     }
9231     EXTEND(sp, 1);
9232     ST(0) = sv;
9233     XSRETURN(1);
9234 }
9235
9236 /*
9237  * Local variables:
9238  * c-indentation-style: bsd
9239  * c-basic-offset: 4
9240  * indent-tabs-mode: t
9241  * End:
9242  *
9243  * ex: set ts=8 sts=4 sw=4 noet:
9244  */