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