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