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