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