This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Filter patch to toke.c:
[perl5.git] / op.c
CommitLineData
a0d0e21e 1/* op.c
79072805 2 *
9607fc9c 3 * Copyright (c) 1991-1997, Larry Wall
79072805
LW
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 *
a0d0e21e
LW
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
79072805
LW
16 */
17
18#include "EXTERN.h"
19#include "perl.h"
20
e50aee73 21/*
5dc0d613 22 * In the following definition, the ", Nullop" is just to make the compiler
a5f75d66 23 * think the expression is of the right type: croak actually does a Siglongjmp.
e50aee73 24 */
11343788 25#define CHECKOP(type,o) \
28757baa 26 ((op_mask && op_mask[type]) \
5dc0d613 27 ? ( op_free((OP*)o), \
28757baa 28 croak("%s trapped by operation mask", op_desc[type]), \
29 Nullop ) \
11343788 30 : (*check[type])((OP*)o))
e50aee73 31
11343788 32static I32 list_assignment _((OP *o));
3bc5dc61 33static void bad_type _((I32 n, char *t, char *name, OP *kid));
11343788
MB
34static OP *modkids _((OP *o, I32 type));
35static OP *no_fh_allowed _((OP *o));
5dc0d613 36static bool scalar_mod_type _((OP *o, I32 type));
11343788
MB
37static OP *scalarboolean _((OP *o));
38static OP *too_few_arguments _((OP *o, char* name));
39static OP *too_many_arguments _((OP *o, char* name));
40static void null _((OP* o));
bbce6d69 41static PADOFFSET pad_findlex _((char* name, PADOFFSET newoff, U32 seq,
748a9306 42 CV* startcv, I32 cx_ix));
79072805 43
4633a7c4 44static char*
8ac85365 45gv_ename(GV *gv)
4633a7c4
LW
46{
47 SV* tmpsv = sv_newmortal();
46fc3d4c 48 gv_efullname3(tmpsv, gv, Nullch);
4633a7c4
LW
49 return SvPV(tmpsv,na);
50}
51
8990e307 52static OP *
8ac85365 53no_fh_allowed(OP *o)
79072805 54{
46fc3d4c 55 yyerror(form("Missing comma after first argument to %s function",
5196be3e 56 op_desc[o->op_type]));
11343788 57 return o;
79072805
LW
58}
59
8990e307 60static OP *
8ac85365 61too_few_arguments(OP *o, char *name)
79072805 62{
46fc3d4c 63 yyerror(form("Not enough arguments for %s", name));
11343788 64 return o;
79072805
LW
65}
66
8990e307 67static OP *
8ac85365 68too_many_arguments(OP *o, char *name)
79072805 69{
46fc3d4c 70 yyerror(form("Too many arguments for %s", name));
11343788 71 return o;
79072805
LW
72}
73
3bc5dc61 74static void
8ac85365 75bad_type(I32 n, char *t, char *name, OP *kid)
8990e307 76{
46fc3d4c 77 yyerror(form("Type of arg %d to %s must be %s (not %s)",
78 (int)n, name, t, op_desc[kid->op_type]));
8990e307
LW
79}
80
a0d0e21e 81void
8ac85365 82assertref(OP *o)
a0d0e21e 83{
11343788 84 int type = o->op_type;
a0d0e21e 85 if (type != OP_AELEM && type != OP_HELEM) {
46fc3d4c 86 yyerror(form("Can't use subscript on %s", op_desc[type]));
8ebc5c01 87 if (type == OP_ENTERSUB || type == OP_RV2HV || type == OP_PADHV)
748a9306 88 warn("(Did you mean $ or @ instead of %c?)\n",
8ebc5c01 89 type == OP_ENTERSUB ? '&' : '%');
a0d0e21e
LW
90 }
91}
92
79072805
LW
93/* "register" allocation */
94
95PADOFFSET
8ac85365 96pad_allocmy(char *name)
93a17b20 97{
11343788 98 dTHR;
a0d0e21e
LW
99 PADOFFSET off;
100 SV *sv;
101
102 if (!(isALPHA(name[1]) || name[1] == '_' && (int)strlen(name) > 2)) {
46fc3d4c 103 if (!isPRINT(name[1])) {
104 name[3] = '\0';
105 name[2] = toCTRL(name[1]);
106 name[1] = '^';
107 }
a0d0e21e
LW
108 croak("Can't use global %s in \"my\"",name);
109 }
fb73857a 110 if (dowarn && AvFILL(comppad_name) >= 0) {
b1cb66bf 111 SV **svp = AvARRAY(comppad_name);
112 for (off = AvFILL(comppad_name); off > comppad_name_floor; off--) {
113 if ((sv = svp[off])
114 && sv != &sv_undef
115 && SvIVX(sv) == 999999999 /* var is in open scope */
116 && strEQ(name, SvPVX(sv)))
117 {
118 warn("\"my\" variable %s masks earlier declaration in same scope", name);
119 break;
120 }
121 }
122 }
a0d0e21e
LW
123 off = pad_alloc(OP_PADSV, SVs_PADMY);
124 sv = NEWSV(1102,0);
93a17b20
LW
125 sv_upgrade(sv, SVt_PVNV);
126 sv_setpv(sv, name);
c750a3ec
MB
127 if (in_my_stash) {
128 if (*name != '$')
129 croak("Can't declare class for non-scalar %s in \"my\"",name);
130 SvOBJECT_on(sv);
131 (void)SvUPGRADE(sv, SVt_PVMG);
132 SvSTASH(sv) = (HV*)SvREFCNT_inc(in_my_stash);
133 sv_objcount++;
134 }
8990e307 135 av_store(comppad_name, off, sv);
748a9306 136 SvNVX(sv) = (double)999999999;
8990e307
LW
137 SvIVX(sv) = 0; /* Not yet introduced--see newSTATEOP */
138 if (!min_intro_pending)
139 min_intro_pending = off;
140 max_intro_pending = off;
93a17b20 141 if (*name == '@')
463ee0b2 142 av_store(comppad, off, (SV*)newAV());
93a17b20 143 else if (*name == '%')
463ee0b2 144 av_store(comppad, off, (SV*)newHV());
ed6116ce 145 SvPADMY_on(curpad[off]);
93a17b20
LW
146 return off;
147}
148
748a9306 149static PADOFFSET
e9a444f0 150#ifndef CAN_PROTOTYPE
748a9306 151pad_findlex(name, newoff, seq, startcv, cx_ix)
93a17b20 152char *name;
748a9306 153PADOFFSET newoff;
bbce6d69 154U32 seq;
748a9306
LW
155CV* startcv;
156I32 cx_ix;
e9a444f0 157#else
bbce6d69 158pad_findlex(char *name, PADOFFSET newoff, U32 seq, CV* startcv, I32 cx_ix)
e9a444f0 159#endif
93a17b20 160{
11343788 161 dTHR;
748a9306 162 CV *cv;
93a17b20
LW
163 I32 off;
164 SV *sv;
93a17b20 165 register I32 i;
c09156bb 166 register PERL_CONTEXT *cx;
a0d0e21e 167 int saweval;
93a17b20 168
748a9306 169 for (cv = startcv; cv; cv = CvOUTSIDE(cv)) {
4fdae800 170 AV *curlist = CvPADLIST(cv);
171 SV **svp = av_fetch(curlist, 0, FALSE);
748a9306 172 AV *curname;
4fdae800 173
748a9306 174 if (!svp || *svp == &sv_undef)
4633a7c4 175 continue;
748a9306
LW
176 curname = (AV*)*svp;
177 svp = AvARRAY(curname);
178 for (off = AvFILL(curname); off > 0; off--) {
179 if ((sv = svp[off]) &&
180 sv != &sv_undef &&
181 seq <= SvIVX(sv) &&
13826f2c 182 seq > I_32(SvNVX(sv)) &&
748a9306
LW
183 strEQ(SvPVX(sv), name))
184 {
5f05dabc 185 I32 depth;
186 AV *oldpad;
187 SV *oldsv;
188
189 depth = CvDEPTH(cv);
190 if (!depth) {
9607fc9c 191 if (newoff) {
192 if (SvFAKE(sv))
193 continue;
4fdae800 194 return 0; /* don't clone from inactive stack frame */
9607fc9c 195 }
5f05dabc 196 depth = 1;
197 }
198 oldpad = (AV*)*av_fetch(curlist, depth, FALSE);
199 oldsv = *av_fetch(oldpad, off, TRUE);
748a9306 200 if (!newoff) { /* Not a mere clone operation. */
9607fc9c 201 SV *namesv = NEWSV(1103,0);
748a9306 202 newoff = pad_alloc(OP_PADSV, SVs_PADMY);
9607fc9c 203 sv_upgrade(namesv, SVt_PVNV);
204 sv_setpv(namesv, name);
205 av_store(comppad_name, newoff, namesv);
206 SvNVX(namesv) = (double)curcop->cop_seq;
207 SvIVX(namesv) = 999999999; /* A ref, intro immediately */
208 SvFAKE_on(namesv); /* A ref, not a real var */
774d564b 209 if (CvANON(compcv) || SvTYPE(compcv) == SVt_PVFM) {
28757baa 210 /* "It's closures all the way down." */
211 CvCLONE_on(compcv);
54310121 212 if (cv == startcv) {
213 if (CvANON(compcv))
214 oldsv = Nullsv; /* no need to keep ref */
215 }
216 else {
28757baa 217 CV *bcv;
218 for (bcv = startcv;
219 bcv && bcv != cv && !CvCLONE(bcv);
220 bcv = CvOUTSIDE(bcv)) {
221 if (CvANON(bcv))
222 CvCLONE_on(bcv);
223 else {
774d564b 224 if (dowarn && !CvUNIQUE(cv))
44a8e56a 225 warn(
226 "Variable \"%s\" may be unavailable",
28757baa 227 name);
228 break;
229 }
230 }
231 }
232 }
44a8e56a 233 else if (!CvUNIQUE(compcv)) {
9607fc9c 234 if (dowarn && !SvFAKE(sv) && !CvUNIQUE(cv))
44a8e56a 235 warn("Variable \"%s\" will not stay shared", name);
5f05dabc 236 }
748a9306 237 }
199100c8 238 av_store(comppad, newoff, SvREFCNT_inc(oldsv));
748a9306
LW
239 return newoff;
240 }
93a17b20
LW
241 }
242 }
243
244 /* Nothing in current lexical context--try eval's context, if any.
245 * This is necessary to let the perldb get at lexically scoped variables.
246 * XXX This will also probably interact badly with eval tree caching.
247 */
248
a0d0e21e 249 saweval = 0;
748a9306 250 for (i = cx_ix; i >= 0; i--) {
93a17b20
LW
251 cx = &cxstack[i];
252 switch (cx->cx_type) {
253 default:
748a9306
LW
254 if (i == 0 && saweval) {
255 seq = cxstack[saweval].blk_oldcop->cop_seq;
256 return pad_findlex(name, newoff, seq, main_cv, 0);
257 }
93a17b20
LW
258 break;
259 case CXt_EVAL:
44a8e56a 260 switch (cx->blk_eval.old_op_type) {
261 case OP_ENTEREVAL:
262 saweval = i;
263 break;
264 case OP_REQUIRE:
265 /* require must have its own scope */
266 return 0;
267 }
93a17b20
LW
268 break;
269 case CXt_SUB:
270 if (!saweval)
271 return 0;
272 cv = cx->blk_sub.cv;
748a9306
LW
273 if (debstash && CvSTASH(cv) == debstash) { /* ignore DB'* scope */
274 saweval = i; /* so we know where we were called from */
93a17b20 275 continue;
93a17b20 276 }
748a9306
LW
277 seq = cxstack[saweval].blk_oldcop->cop_seq;
278 return pad_findlex(name, newoff, seq, cv, i-1);
93a17b20
LW
279 }
280 }
281
748a9306
LW
282 return 0;
283}
a0d0e21e 284
748a9306 285PADOFFSET
8ac85365 286pad_findmy(char *name)
748a9306 287{
11343788 288 dTHR;
748a9306 289 I32 off;
54310121 290 I32 pendoff = 0;
748a9306
LW
291 SV *sv;
292 SV **svp = AvARRAY(comppad_name);
bbce6d69 293 U32 seq = cop_seqmax;
748a9306 294
11343788
MB
295#ifdef USE_THREADS
296 /*
297 * Special case to get lexical (and hence per-thread) @_.
298 * XXX I need to find out how to tell at parse-time whether use
299 * of @_ should refer to a lexical (from a sub) or defgv (global
300 * scope and maybe weird sub-ish things like formats). See
301 * startsub in perly.y. It's possible that @_ could be lexical
302 * (at least from subs) even in non-threaded perl.
303 */
304 if (strEQ(name, "@_"))
305 return 0; /* success. (NOT_IN_PAD indicates failure) */
306#endif /* USE_THREADS */
307
748a9306 308 /* The one we're looking for is probably just before comppad_name_fill. */
4633a7c4 309 for (off = AvFILL(comppad_name); off > 0; off--) {
a0d0e21e
LW
310 if ((sv = svp[off]) &&
311 sv != &sv_undef &&
54310121 312 (!SvIVX(sv) ||
313 (seq <= SvIVX(sv) &&
314 seq > I_32(SvNVX(sv)))) &&
a0d0e21e
LW
315 strEQ(SvPVX(sv), name))
316 {
54310121 317 if (SvIVX(sv))
318 return (PADOFFSET)off;
319 pendoff = off; /* this pending def. will override import */
a0d0e21e
LW
320 }
321 }
748a9306
LW
322
323 /* See if it's in a nested scope */
324 off = pad_findlex(name, 0, seq, CvOUTSIDE(compcv), cxstack_ix);
54310121 325 if (off) {
326 /* If there is a pending local definition, this new alias must die */
327 if (pendoff)
328 SvIVX(AvARRAY(comppad_name)[off]) = seq;
11343788 329 return off; /* pad_findlex returns 0 for failure...*/
54310121 330 }
11343788 331 return NOT_IN_PAD; /* ...but we return NOT_IN_PAD for failure */
93a17b20
LW
332}
333
334void
8ac85365 335pad_leavemy(I32 fill)
93a17b20
LW
336{
337 I32 off;
8990e307 338 SV **svp = AvARRAY(comppad_name);
93a17b20 339 SV *sv;
8990e307
LW
340 if (min_intro_pending && fill < min_intro_pending) {
341 for (off = max_intro_pending; off >= min_intro_pending; off--) {
a0d0e21e 342 if ((sv = svp[off]) && sv != &sv_undef)
8990e307
LW
343 warn("%s never introduced", SvPVX(sv));
344 }
345 }
346 /* "Deintroduce" my variables that are leaving with this scope. */
347 for (off = AvFILL(comppad_name); off > fill; off--) {
748a9306 348 if ((sv = svp[off]) && sv != &sv_undef && SvIVX(sv) == 999999999)
463ee0b2 349 SvIVX(sv) = cop_seqmax;
93a17b20
LW
350 }
351}
352
353PADOFFSET
8ac85365 354pad_alloc(I32 optype, U32 tmptype)
79072805 355{
11343788 356 dTHR;
79072805
LW
357 SV *sv;
358 I32 retval;
359
360 if (AvARRAY(comppad) != curpad)
463ee0b2 361 croak("panic: pad_alloc");
a0d0e21e
LW
362 if (pad_reset_pending)
363 pad_reset();
ed6116ce 364 if (tmptype & SVs_PADMY) {
79072805
LW
365 do {
366 sv = *av_fetch(comppad, AvFILL(comppad) + 1, TRUE);
ed6116ce 367 } while (SvPADBUSY(sv)); /* need a fresh one */
79072805
LW
368 retval = AvFILL(comppad);
369 }
370 else {
bbce6d69 371 SV **names = AvARRAY(comppad_name);
372 SSize_t names_fill = AvFILL(comppad_name);
373 for (;;) {
374 /*
375 * "foreach" index vars temporarily become aliases to non-"my"
376 * values. Thus we must skip, not just pad values that are
377 * marked as current pad values, but also those with names.
378 */
379 if (++padix <= names_fill &&
380 (sv = names[padix]) && sv != &sv_undef)
381 continue;
382 sv = *av_fetch(comppad, padix, TRUE);
383 if (!(SvFLAGS(sv) & (SVs_PADTMP|SVs_PADMY)))
384 break;
385 }
79072805
LW
386 retval = padix;
387 }
8990e307 388 SvFLAGS(sv) |= tmptype;
79072805 389 curpad = AvARRAY(comppad);
11343788 390#ifdef USE_THREADS
5dc0d613
MB
391 DEBUG_X(PerlIO_printf(Perl_debug_log, "0x%lx Pad 0x%lx alloc %ld for %s\n",
392 (unsigned long) thr, (unsigned long) curpad,
393 (long) retval, op_name[optype]));
11343788 394#else
5dc0d613
MB
395 DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad alloc %ld for %s\n",
396 (long) retval, op_name[optype]));
11343788 397#endif /* USE_THREADS */
79072805
LW
398 return (PADOFFSET)retval;
399}
400
401SV *
a0d0e21e 402#ifndef CAN_PROTOTYPE
79072805
LW
403pad_sv(po)
404PADOFFSET po;
8990e307
LW
405#else
406pad_sv(PADOFFSET po)
a0d0e21e 407#endif /* CAN_PROTOTYPE */
79072805 408{
11343788
MB
409 dTHR;
410#ifdef USE_THREADS
5dc0d613
MB
411 DEBUG_X(PerlIO_printf(Perl_debug_log, "0x%lx Pad 0x%lx sv %d\n",
412 (unsigned long) thr, (unsigned long) curpad, po));
11343788 413#else
79072805 414 if (!po)
463ee0b2 415 croak("panic: pad_sv po");
5dc0d613 416 DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad sv %d\n", po));
11343788 417#endif /* USE_THREADS */
79072805
LW
418 return curpad[po]; /* eventually we'll turn this into a macro */
419}
420
421void
a0d0e21e 422#ifndef CAN_PROTOTYPE
79072805
LW
423pad_free(po)
424PADOFFSET po;
8990e307
LW
425#else
426pad_free(PADOFFSET po)
a0d0e21e 427#endif /* CAN_PROTOTYPE */
79072805 428{
11343788 429 dTHR;
a0d0e21e
LW
430 if (!curpad)
431 return;
79072805 432 if (AvARRAY(comppad) != curpad)
463ee0b2 433 croak("panic: pad_free curpad");
79072805 434 if (!po)
463ee0b2 435 croak("panic: pad_free po");
11343788 436#ifdef USE_THREADS
5dc0d613
MB
437 DEBUG_X(PerlIO_printf(Perl_debug_log, "0x%lx Pad 0x%lx free %d\n",
438 (unsigned long) thr, (unsigned long) curpad, po));
11343788 439#else
5dc0d613 440 DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad free %d\n", po));
11343788 441#endif /* USE_THREADS */
a0d0e21e 442 if (curpad[po] && curpad[po] != &sv_undef)
ed6116ce 443 SvPADTMP_off(curpad[po]);
a0d0e21e 444 if ((I32)po < padix)
79072805
LW
445 padix = po - 1;
446}
447
448void
a0d0e21e 449#ifndef CAN_PROTOTYPE
79072805
LW
450pad_swipe(po)
451PADOFFSET po;
8990e307
LW
452#else
453pad_swipe(PADOFFSET po)
a0d0e21e 454#endif /* CAN_PROTOTYPE */
79072805 455{
11343788 456 dTHR;
79072805 457 if (AvARRAY(comppad) != curpad)
463ee0b2 458 croak("panic: pad_swipe curpad");
79072805 459 if (!po)
463ee0b2 460 croak("panic: pad_swipe po");
11343788 461#ifdef USE_THREADS
5dc0d613
MB
462 DEBUG_X(PerlIO_printf(Perl_debug_log, "0x%lx Pad 0x%lx swipe %d\n",
463 (unsigned long) thr, (unsigned long) curpad, po));
11343788 464#else
5dc0d613 465 DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad swipe %d\n", po));
11343788 466#endif /* USE_THREADS */
ed6116ce 467 SvPADTMP_off(curpad[po]);
a0d0e21e
LW
468 curpad[po] = NEWSV(1107,0);
469 SvPADTMP_on(curpad[po]);
470 if ((I32)po < padix)
79072805
LW
471 padix = po - 1;
472}
473
474void
8ac85365 475pad_reset(void)
79072805 476{
11343788 477 dTHR;
79072805
LW
478 register I32 po;
479
480 if (AvARRAY(comppad) != curpad)
463ee0b2 481 croak("panic: pad_reset curpad");
11343788 482#ifdef USE_THREADS
5dc0d613
MB
483 DEBUG_X(PerlIO_printf(Perl_debug_log, "0x%lx Pad 0x%lx reset\n",
484 (unsigned long) thr, (unsigned long) curpad));
11343788 485#else
760ac839 486 DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad reset\n"));
11343788 487#endif /* USE_THREADS */
748a9306
LW
488 if (!tainting) { /* Can't mix tainted and non-tainted temporaries. */
489 for (po = AvMAX(comppad); po > padix_floor; po--) {
ff0cee69 490 if (curpad[po] && !SvIMMORTAL(curpad[po]))
748a9306
LW
491 SvPADTMP_off(curpad[po]);
492 }
493 padix = padix_floor;
79072805 494 }
a0d0e21e 495 pad_reset_pending = FALSE;
79072805
LW
496}
497
a863c7d1 498#ifdef USE_THREADS
554b3eca 499/* find_thread_magical is not reentrant */
a863c7d1 500PADOFFSET
e77eedc2 501find_thread_magical(char *name)
a863c7d1
MB
502{
503 dTHR;
504 char *p;
505 PADOFFSET key;
554b3eca 506 SV **svp;
a863c7d1
MB
507 /* We currently only handle single character magicals */
508 p = strchr(per_thread_magicals, *name);
509 if (!p)
510 return NOT_IN_PAD;
554b3eca
MB
511 key = p - per_thread_magicals;
512 svp = av_fetch(thr->magicals, key, FALSE);
513 if (!svp) {
514 SV *sv = NEWSV(0, 0);
515 av_store(thr->magicals, key, sv);
516 /*
517 * Some magic variables used to be automagically initialised
518 * in gv_fetchpv. Those which are now per-thread magicals get
519 * initialised here instead.
520 */
521 switch (*name) {
522 case ';':
523 sv_setpv(sv, "\034");
524 break;
c277df42
IZ
525 case '&':
526 case '`':
527 case '\'':
528 sawampersand = TRUE;
529 SvREADONLY_on(sv);
530 break;
554b3eca 531 }
a863c7d1
MB
532 sv_magic(sv, 0, 0, name, 1);
533 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
554b3eca
MB
534 "find_thread_magical: new SV %p for $%s%c\n",
535 sv, (*name < 32) ? "^" : "",
536 (*name < 32) ? toCTRL(*name) : *name));
a863c7d1
MB
537 }
538 return key;
539}
540#endif /* USE_THREADS */
541
79072805
LW
542/* Destructor */
543
544void
8ac85365 545op_free(OP *o)
79072805 546{
85e6fe83 547 register OP *kid, *nextkid;
79072805 548
5dc0d613 549 if (!o || o->op_seq == (U16)-1)
79072805
LW
550 return;
551
11343788
MB
552 if (o->op_flags & OPf_KIDS) {
553 for (kid = cUNOPo->op_first; kid; kid = nextkid) {
85e6fe83 554 nextkid = kid->op_sibling; /* Get before next freeing kid */
79072805 555 op_free(kid);
85e6fe83 556 }
79072805
LW
557 }
558
11343788 559 switch (o->op_type) {
8990e307 560 case OP_NULL:
11343788 561 o->op_targ = 0; /* Was holding old type, if any. */
8990e307 562 break;
a0d0e21e 563 case OP_ENTEREVAL:
11343788 564 o->op_targ = 0; /* Was holding hints. */
a0d0e21e 565 break;
554b3eca 566#ifdef USE_THREADS
2faa37cc 567 case OP_THREADSV:
554b3eca
MB
568 o->op_targ = 0; /* Was holding index into thr->magicals AV. */
569 break;
570#endif /* USE_THREADS */
a6006777 571 default:
5196be3e 572 if (!(o->op_flags & OPf_REF) || (check[o->op_type] != ck_ftst))
a6006777 573 break;
574 /* FALL THROUGH */
463ee0b2 575 case OP_GVSV:
79072805 576 case OP_GV:
a6006777 577 case OP_AELEMFAST:
11343788 578 SvREFCNT_dec(cGVOPo->op_gv);
8990e307
LW
579 break;
580 case OP_NEXTSTATE:
581 case OP_DBSTATE:
5196be3e 582 Safefree(cCOPo->cop_label);
11343788 583 SvREFCNT_dec(cCOPo->cop_filegv);
79072805
LW
584 break;
585 case OP_CONST:
11343788 586 SvREFCNT_dec(cSVOPo->op_sv);
79072805 587 break;
748a9306
LW
588 case OP_GOTO:
589 case OP_NEXT:
590 case OP_LAST:
591 case OP_REDO:
11343788 592 if (o->op_flags & (OPf_SPECIAL|OPf_STACKED|OPf_KIDS))
748a9306
LW
593 break;
594 /* FALL THROUGH */
a0d0e21e 595 case OP_TRANS:
11343788 596 Safefree(cPVOPo->op_pv);
a0d0e21e
LW
597 break;
598 case OP_SUBST:
11343788 599 op_free(cPMOPo->op_pmreplroot);
a0d0e21e 600 /* FALL THROUGH */
748a9306 601 case OP_PUSHRE:
a0d0e21e 602 case OP_MATCH:
c277df42 603 ReREFCNT_dec(cPMOPo->op_pmregexp);
a0d0e21e 604 break;
79072805
LW
605 }
606
11343788
MB
607 if (o->op_targ > 0)
608 pad_free(o->op_targ);
8990e307 609
11343788 610 Safefree(o);
79072805
LW
611}
612
8990e307 613static void
8ac85365 614null(OP *o)
8990e307 615{
11343788
MB
616 if (o->op_type != OP_NULL && o->op_targ > 0)
617 pad_free(o->op_targ);
618 o->op_targ = o->op_type;
619 o->op_type = OP_NULL;
620 o->op_ppaddr = ppaddr[OP_NULL];
8990e307
LW
621}
622
79072805
LW
623/* Contextualizers */
624
463ee0b2 625#define LINKLIST(o) ((o)->op_next ? (o)->op_next : linklist((OP*)o))
79072805
LW
626
627OP *
8ac85365 628linklist(OP *o)
79072805
LW
629{
630 register OP *kid;
631
11343788
MB
632 if (o->op_next)
633 return o->op_next;
79072805
LW
634
635 /* establish postfix order */
11343788
MB
636 if (cUNOPo->op_first) {
637 o->op_next = LINKLIST(cUNOPo->op_first);
638 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
79072805
LW
639 if (kid->op_sibling)
640 kid->op_next = LINKLIST(kid->op_sibling);
641 else
11343788 642 kid->op_next = o;
79072805
LW
643 }
644 }
645 else
11343788 646 o->op_next = o;
79072805 647
11343788 648 return o->op_next;
79072805
LW
649}
650
651OP *
8ac85365 652scalarkids(OP *o)
79072805
LW
653{
654 OP *kid;
11343788
MB
655 if (o && o->op_flags & OPf_KIDS) {
656 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
79072805
LW
657 scalar(kid);
658 }
11343788 659 return o;
79072805
LW
660}
661
a0d0e21e 662static OP *
8ac85365 663scalarboolean(OP *o)
8990e307
LW
664{
665 if (dowarn &&
11343788 666 o->op_type == OP_SASSIGN && cBINOPo->op_first->op_type == OP_CONST) {
0f15f207 667 dTHR;
a0d0e21e
LW
668 line_t oldline = curcop->cop_line;
669
670 if (copline != NOLINE)
671 curcop->cop_line = copline;
672 warn("Found = in conditional, should be ==");
673 curcop->cop_line = oldline;
674 }
11343788 675 return scalar(o);
8990e307
LW
676}
677
678OP *
8ac85365 679scalar(OP *o)
79072805
LW
680{
681 OP *kid;
682
a0d0e21e 683 /* assumes no premature commitment */
5dc0d613
MB
684 if (!o || (o->op_flags & OPf_WANT) || error_count
685 || o->op_type == OP_RETURN)
11343788 686 return o;
79072805 687
5dc0d613 688 o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_SCALAR;
79072805 689
11343788 690 switch (o->op_type) {
79072805 691 case OP_REPEAT:
11343788
MB
692 if (o->op_private & OPpREPEAT_DOLIST)
693 null(((LISTOP*)cBINOPo->op_first)->op_first);
694 scalar(cBINOPo->op_first);
8990e307 695 break;
79072805
LW
696 case OP_OR:
697 case OP_AND:
698 case OP_COND_EXPR:
11343788 699 for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
8990e307 700 scalar(kid);
79072805 701 break;
a0d0e21e 702 case OP_SPLIT:
11343788 703 if ((kid = cLISTOPo->op_first) && kid->op_type == OP_PUSHRE) {
a0d0e21e
LW
704 if (!kPMOP->op_pmreplroot)
705 deprecate("implicit split to @_");
706 }
707 /* FALL THROUGH */
79072805
LW
708 case OP_MATCH:
709 case OP_SUBST:
710 case OP_NULL:
8990e307 711 default:
11343788
MB
712 if (o->op_flags & OPf_KIDS) {
713 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
8990e307
LW
714 scalar(kid);
715 }
79072805
LW
716 break;
717 case OP_LEAVE:
718 case OP_LEAVETRY:
5dc0d613 719 kid = cLISTOPo->op_first;
54310121 720 scalar(kid);
721 while (kid = kid->op_sibling) {
722 if (kid->op_sibling)
723 scalarvoid(kid);
724 else
725 scalar(kid);
726 }
0f15f207 727 WITH_THR(curcop = &compiling);
54310121 728 break;
748a9306 729 case OP_SCOPE:
79072805 730 case OP_LINESEQ:
8990e307 731 case OP_LIST:
11343788 732 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling) {
79072805
LW
733 if (kid->op_sibling)
734 scalarvoid(kid);
735 else
736 scalar(kid);
737 }
0f15f207 738 WITH_THR(curcop = &compiling);
79072805
LW
739 break;
740 }
11343788 741 return o;
79072805
LW
742}
743
744OP *
8ac85365 745scalarvoid(OP *o)
79072805
LW
746{
747 OP *kid;
8990e307
LW
748 char* useless = 0;
749 SV* sv;
79072805 750
54310121 751 /* assumes no premature commitment */
5dc0d613
MB
752 if (!o || (o->op_flags & OPf_WANT) == OPf_WANT_LIST || error_count
753 || o->op_type == OP_RETURN)
11343788 754 return o;
79072805 755
5dc0d613 756 o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_VOID;
79072805 757
11343788 758 switch (o->op_type) {
79072805 759 default:
11343788 760 if (!(opargs[o->op_type] & OA_FOLDCONST))
8990e307 761 break;
36477c24 762 /* FALL THROUGH */
763 case OP_REPEAT:
11343788 764 if (o->op_flags & OPf_STACKED)
8990e307
LW
765 break;
766 /* FALL THROUGH */
767 case OP_GVSV:
768 case OP_WANTARRAY:
769 case OP_GV:
770 case OP_PADSV:
771 case OP_PADAV:
772 case OP_PADHV:
773 case OP_PADANY:
774 case OP_AV2ARYLEN:
8990e307 775 case OP_REF:
a0d0e21e
LW
776 case OP_REFGEN:
777 case OP_SREFGEN:
8990e307
LW
778 case OP_DEFINED:
779 case OP_HEX:
780 case OP_OCT:
781 case OP_LENGTH:
782 case OP_SUBSTR:
783 case OP_VEC:
784 case OP_INDEX:
785 case OP_RINDEX:
786 case OP_SPRINTF:
787 case OP_AELEM:
788 case OP_AELEMFAST:
789 case OP_ASLICE:
8990e307
LW
790 case OP_HELEM:
791 case OP_HSLICE:
792 case OP_UNPACK:
793 case OP_PACK:
8990e307
LW
794 case OP_JOIN:
795 case OP_LSLICE:
796 case OP_ANONLIST:
797 case OP_ANONHASH:
798 case OP_SORT:
799 case OP_REVERSE:
800 case OP_RANGE:
801 case OP_FLIP:
802 case OP_FLOP:
803 case OP_CALLER:
804 case OP_FILENO:
805 case OP_EOF:
806 case OP_TELL:
807 case OP_GETSOCKNAME:
808 case OP_GETPEERNAME:
809 case OP_READLINK:
810 case OP_TELLDIR:
811 case OP_GETPPID:
812 case OP_GETPGRP:
813 case OP_GETPRIORITY:
814 case OP_TIME:
815 case OP_TMS:
816 case OP_LOCALTIME:
817 case OP_GMTIME:
818 case OP_GHBYNAME:
819 case OP_GHBYADDR:
820 case OP_GHOSTENT:
821 case OP_GNBYNAME:
822 case OP_GNBYADDR:
823 case OP_GNETENT:
824 case OP_GPBYNAME:
825 case OP_GPBYNUMBER:
826 case OP_GPROTOENT:
827 case OP_GSBYNAME:
828 case OP_GSBYPORT:
829 case OP_GSERVENT:
830 case OP_GPWNAM:
831 case OP_GPWUID:
832 case OP_GGRNAM:
833 case OP_GGRGID:
834 case OP_GETLOGIN:
11343788
MB
835 if (!(o->op_private & OPpLVAL_INTRO))
836 useless = op_desc[o->op_type];
8990e307
LW
837 break;
838
839 case OP_RV2GV:
840 case OP_RV2SV:
841 case OP_RV2AV:
842 case OP_RV2HV:
11343788
MB
843 if (!(o->op_private & OPpLVAL_INTRO) &&
844 (!o->op_sibling || o->op_sibling->op_type != OP_READLINE))
8990e307
LW
845 useless = "a variable";
846 break;
79072805 847
93a17b20 848 case OP_NEXTSTATE:
8990e307 849 case OP_DBSTATE:
0f15f207 850 WITH_THR(curcop = ((COP*)o)); /* for warning below */
93a17b20
LW
851 break;
852
79072805 853 case OP_CONST:
11343788 854 sv = cSVOPo->op_sv;
8990e307
LW
855 if (dowarn) {
856 useless = "a constant";
857 if (SvNIOK(sv) && (SvNV(sv) == 0.0 || SvNV(sv) == 1.0))
858 useless = 0;
859 else if (SvPOK(sv)) {
860 if (strnEQ(SvPVX(sv), "di", 2) ||
a0d0e21e 861 strnEQ(SvPVX(sv), "ds", 2) ||
8990e307
LW
862 strnEQ(SvPVX(sv), "ig", 2))
863 useless = 0;
864 }
865 }
11343788 866 null(o); /* don't execute a constant */
8990e307 867 SvREFCNT_dec(sv); /* don't even remember it */
79072805
LW
868 break;
869
870 case OP_POSTINC:
11343788
MB
871 o->op_type = OP_PREINC; /* pre-increment is faster */
872 o->op_ppaddr = ppaddr[OP_PREINC];
79072805
LW
873 break;
874
875 case OP_POSTDEC:
11343788
MB
876 o->op_type = OP_PREDEC; /* pre-decrement is faster */
877 o->op_ppaddr = ppaddr[OP_PREDEC];
79072805
LW
878 break;
879
79072805
LW
880 case OP_OR:
881 case OP_AND:
882 case OP_COND_EXPR:
11343788 883 for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
79072805
LW
884 scalarvoid(kid);
885 break;
5aabfad6 886
a0d0e21e 887 case OP_NULL:
11343788 888 if (o->op_targ == OP_NEXTSTATE || o->op_targ == OP_DBSTATE)
0f15f207 889 WITH_THR(curcop = ((COP*)o)); /* for warning below */
11343788 890 if (o->op_flags & OPf_STACKED)
a0d0e21e 891 break;
5aabfad6 892 /* FALL THROUGH */
79072805
LW
893 case OP_ENTERTRY:
894 case OP_ENTER:
895 case OP_SCALAR:
11343788 896 if (!(o->op_flags & OPf_KIDS))
79072805 897 break;
54310121 898 /* FALL THROUGH */
463ee0b2 899 case OP_SCOPE:
79072805
LW
900 case OP_LEAVE:
901 case OP_LEAVETRY:
a0d0e21e 902 case OP_LEAVELOOP:
79072805 903 case OP_LINESEQ:
79072805 904 case OP_LIST:
11343788 905 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
79072805
LW
906 scalarvoid(kid);
907 break;
c90c0ff4 908 case OP_ENTEREVAL:
5196be3e 909 scalarkids(o);
c90c0ff4 910 break;
5aabfad6 911 case OP_REQUIRE:
c90c0ff4 912 /* all requires must return a boolean value */
5196be3e
MB
913 o->op_flags &= ~OPf_WANT;
914 return scalar(o);
a0d0e21e 915 case OP_SPLIT:
11343788 916 if ((kid = cLISTOPo->op_first) && kid->op_type == OP_PUSHRE) {
a0d0e21e
LW
917 if (!kPMOP->op_pmreplroot)
918 deprecate("implicit split to @_");
919 }
920 break;
79072805 921 }
8990e307
LW
922 if (useless && dowarn)
923 warn("Useless use of %s in void context", useless);
11343788 924 return o;
79072805
LW
925}
926
927OP *
8ac85365 928listkids(OP *o)
79072805
LW
929{
930 OP *kid;
11343788
MB
931 if (o && o->op_flags & OPf_KIDS) {
932 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
79072805
LW
933 list(kid);
934 }
11343788 935 return o;
79072805
LW
936}
937
938OP *
8ac85365 939list(OP *o)
79072805
LW
940{
941 OP *kid;
942
a0d0e21e 943 /* assumes no premature commitment */
5dc0d613
MB
944 if (!o || (o->op_flags & OPf_WANT) || error_count
945 || o->op_type == OP_RETURN)
11343788 946 return o;
79072805 947
5dc0d613 948 o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_LIST;
79072805 949
11343788 950 switch (o->op_type) {
79072805
LW
951 case OP_FLOP:
952 case OP_REPEAT:
11343788 953 list(cBINOPo->op_first);
79072805
LW
954 break;
955 case OP_OR:
956 case OP_AND:
957 case OP_COND_EXPR:
11343788 958 for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
79072805
LW
959 list(kid);
960 break;
961 default:
962 case OP_MATCH:
963 case OP_SUBST:
964 case OP_NULL:
11343788 965 if (!(o->op_flags & OPf_KIDS))
79072805 966 break;
11343788
MB
967 if (!o->op_next && cUNOPo->op_first->op_type == OP_FLOP) {
968 list(cBINOPo->op_first);
969 return gen_constant_list(o);
79072805
LW
970 }
971 case OP_LIST:
11343788 972 listkids(o);
79072805
LW
973 break;
974 case OP_LEAVE:
975 case OP_LEAVETRY:
5dc0d613 976 kid = cLISTOPo->op_first;
54310121 977 list(kid);
978 while (kid = kid->op_sibling) {
979 if (kid->op_sibling)
980 scalarvoid(kid);
981 else
982 list(kid);
983 }
0f15f207 984 WITH_THR(curcop = &compiling);
54310121 985 break;
748a9306 986 case OP_SCOPE:
79072805 987 case OP_LINESEQ:
11343788 988 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling) {
79072805
LW
989 if (kid->op_sibling)
990 scalarvoid(kid);
991 else
992 list(kid);
993 }
0f15f207 994 WITH_THR(curcop = &compiling);
79072805 995 break;
c90c0ff4 996 case OP_REQUIRE:
997 /* all requires must return a boolean value */
5196be3e
MB
998 o->op_flags &= ~OPf_WANT;
999 return scalar(o);
79072805 1000 }
11343788 1001 return o;
79072805
LW
1002}
1003
1004OP *
8ac85365 1005scalarseq(OP *o)
79072805
LW
1006{
1007 OP *kid;
1008
11343788
MB
1009 if (o) {
1010 if (o->op_type == OP_LINESEQ ||
1011 o->op_type == OP_SCOPE ||
1012 o->op_type == OP_LEAVE ||
1013 o->op_type == OP_LEAVETRY)
463ee0b2 1014 {
0f15f207 1015 dTHR;
11343788 1016 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling) {
ed6116ce 1017 if (kid->op_sibling) {
463ee0b2 1018 scalarvoid(kid);
ed6116ce 1019 }
463ee0b2
LW
1020 }
1021 curcop = &compiling;
79072805 1022 }
11343788 1023 o->op_flags &= ~OPf_PARENS;
85e6fe83 1024 if (hints & HINT_BLOCK_SCOPE)
11343788 1025 o->op_flags |= OPf_PARENS;
79072805 1026 }
8990e307 1027 else
11343788
MB
1028 o = newOP(OP_STUB, 0);
1029 return o;
79072805
LW
1030}
1031
a0d0e21e 1032static OP *
8ac85365 1033modkids(OP *o, I32 type)
79072805
LW
1034{
1035 OP *kid;
11343788
MB
1036 if (o && o->op_flags & OPf_KIDS) {
1037 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
463ee0b2 1038 mod(kid, type);
79072805 1039 }
11343788 1040 return o;
79072805
LW
1041}
1042
463ee0b2 1043static I32 modcount;
79072805
LW
1044
1045OP *
8ac85365 1046mod(OP *o, I32 type)
79072805 1047{
11343788 1048 dTHR;
79072805
LW
1049 OP *kid;
1050 SV *sv;
1051
11343788
MB
1052 if (!o || error_count)
1053 return o;
79072805 1054
11343788 1055 switch (o->op_type) {
68dc0745 1056 case OP_UNDEF:
3e3baf6d 1057 modcount++;
5dc0d613 1058 return o;
a0d0e21e 1059 case OP_CONST:
11343788 1060 if (!(o->op_private & (OPpCONST_ARYBASE)))
a0d0e21e
LW
1061 goto nomod;
1062 if (eval_start && eval_start->op_type == OP_CONST) {
1063 compiling.cop_arybase = (I32)SvIV(((SVOP*)eval_start)->op_sv);
1064 eval_start = 0;
1065 }
1066 else if (!type) {
1067 SAVEI32(compiling.cop_arybase);
748a9306 1068 compiling.cop_arybase = 0;
a0d0e21e
LW
1069 }
1070 else if (type == OP_REFGEN)
1071 goto nomod;
1072 else
1073 croak("That use of $[ is unsupported");
1074 break;
5f05dabc 1075 case OP_STUB:
5196be3e 1076 if (o->op_flags & OPf_PARENS)
5f05dabc 1077 break;
1078 goto nomod;
a0d0e21e
LW
1079 case OP_ENTERSUB:
1080 if ((type == OP_UNDEF || type == OP_REFGEN) &&
11343788
MB
1081 !(o->op_flags & OPf_STACKED)) {
1082 o->op_type = OP_RV2CV; /* entersub => rv2cv */
1083 o->op_ppaddr = ppaddr[OP_RV2CV];
1084 assert(cUNOPo->op_first->op_type == OP_NULL);
1085 null(((LISTOP*)cUNOPo->op_first)->op_first);/* disable pushmark */
79072805
LW
1086 break;
1087 }
1088 /* FALL THROUGH */
1089 default:
a0d0e21e
LW
1090 nomod:
1091 /* grep, foreach, subcalls, refgen */
1092 if (type == OP_GREPSTART || type == OP_ENTERSUB || type == OP_REFGEN)
1093 break;
46fc3d4c 1094 yyerror(form("Can't modify %s in %s",
5dc0d613 1095 op_desc[o->op_type],
46fc3d4c 1096 type ? op_desc[type] : "local"));
11343788 1097 return o;
79072805 1098
a0d0e21e
LW
1099 case OP_PREINC:
1100 case OP_PREDEC:
1101 case OP_POW:
1102 case OP_MULTIPLY:
1103 case OP_DIVIDE:
1104 case OP_MODULO:
1105 case OP_REPEAT:
1106 case OP_ADD:
1107 case OP_SUBTRACT:
1108 case OP_CONCAT:
1109 case OP_LEFT_SHIFT:
1110 case OP_RIGHT_SHIFT:
1111 case OP_BIT_AND:
1112 case OP_BIT_XOR:
1113 case OP_BIT_OR:
1114 case OP_I_MULTIPLY:
1115 case OP_I_DIVIDE:
1116 case OP_I_MODULO:
1117 case OP_I_ADD:
1118 case OP_I_SUBTRACT:
11343788 1119 if (!(o->op_flags & OPf_STACKED))
a0d0e21e
LW
1120 goto nomod;
1121 modcount++;
1122 break;
1123
79072805 1124 case OP_COND_EXPR:
11343788 1125 for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
463ee0b2 1126 mod(kid, type);
79072805
LW
1127 break;
1128
1129 case OP_RV2AV:
1130 case OP_RV2HV:
93af7a87 1131 if (!type && cUNOPo->op_first->op_type != OP_GV)
706a304b 1132 croak("Can't localize through a reference");
11343788 1133 if (type == OP_REFGEN && o->op_flags & OPf_PARENS) {
748a9306 1134 modcount = 10000;
11343788 1135 return o; /* Treat \(@foo) like ordinary list. */
748a9306
LW
1136 }
1137 /* FALL THROUGH */
79072805 1138 case OP_RV2GV:
5dc0d613 1139 if (scalar_mod_type(o, type))
3fe9a6f1 1140 goto nomod;
11343788 1141 ref(cUNOPo->op_first, o->op_type);
79072805
LW
1142 /* FALL THROUGH */
1143 case OP_AASSIGN:
1144 case OP_ASLICE:
1145 case OP_HSLICE:
93a17b20
LW
1146 case OP_NEXTSTATE:
1147 case OP_DBSTATE:
a0d0e21e
LW
1148 case OP_REFGEN:
1149 case OP_CHOMP:
463ee0b2 1150 modcount = 10000;
79072805 1151 break;
463ee0b2 1152 case OP_RV2SV:
11343788 1153 if (!type && cUNOPo->op_first->op_type != OP_GV)
706a304b 1154 croak("Can't localize through a reference");
aeea060c 1155 ref(cUNOPo->op_first, o->op_type);
463ee0b2 1156 /* FALL THROUGH */
79072805 1157 case OP_GV:
463ee0b2
LW
1158 case OP_AV2ARYLEN:
1159 case OP_SASSIGN:
8990e307
LW
1160 case OP_AELEMFAST:
1161 modcount++;
1162 break;
1163
748a9306
LW
1164 case OP_PADAV:
1165 case OP_PADHV:
1166 modcount = 10000;
5196be3e
MB
1167 if (type == OP_REFGEN && o->op_flags & OPf_PARENS)
1168 return o; /* Treat \(@foo) like ordinary list. */
1169 if (scalar_mod_type(o, type))
3fe9a6f1 1170 goto nomod;
748a9306
LW
1171 /* FALL THROUGH */
1172 case OP_PADSV:
1173 modcount++;
1174 if (!type)
1175 croak("Can't localize lexical variable %s",
11343788 1176 SvPV(*av_fetch(comppad_name, o->op_targ, 4), na));
463ee0b2
LW
1177 break;
1178
554b3eca 1179#ifdef USE_THREADS
2faa37cc 1180 case OP_THREADSV:
554b3eca 1181 modcount++; /* XXX ??? */
554b3eca
MB
1182 break;
1183#endif /* USE_THREADS */
1184
748a9306
LW
1185 case OP_PUSHMARK:
1186 break;
a0d0e21e 1187
69969c6f
SB
1188 case OP_KEYS:
1189 if (type != OP_SASSIGN)
1190 goto nomod;
5f05dabc 1191 /* FALL THROUGH */
a0d0e21e 1192 case OP_POS:
463ee0b2 1193 case OP_VEC:
a0d0e21e 1194 case OP_SUBSTR:
11343788
MB
1195 pad_free(o->op_targ);
1196 o->op_targ = pad_alloc(o->op_type, SVs_PADMY);
5dc0d613 1197 assert(SvTYPE(PAD_SV(o->op_targ)) == SVt_NULL);
11343788
MB
1198 if (o->op_flags & OPf_KIDS)
1199 mod(cBINOPo->op_first->op_sibling, type);
463ee0b2 1200 break;
a0d0e21e 1201
463ee0b2
LW
1202 case OP_AELEM:
1203 case OP_HELEM:
11343788 1204 ref(cBINOPo->op_first, o->op_type);
68dc0745 1205 if (type == OP_ENTERSUB &&
5dc0d613
MB
1206 !(o->op_private & (OPpLVAL_INTRO | OPpDEREF)))
1207 o->op_private |= OPpLVAL_DEFER;
a0d0e21e 1208 modcount++;
463ee0b2
LW
1209 break;
1210
1211 case OP_SCOPE:
1212 case OP_LEAVE:
1213 case OP_ENTER:
11343788
MB
1214 if (o->op_flags & OPf_KIDS)
1215 mod(cLISTOPo->op_last, type);
a0d0e21e
LW
1216 break;
1217
1218 case OP_NULL:
11343788 1219 if (!(o->op_flags & OPf_KIDS))
463ee0b2 1220 break;
11343788
MB
1221 if (o->op_targ != OP_LIST) {
1222 mod(cBINOPo->op_first, type);
a0d0e21e
LW
1223 break;
1224 }
1225 /* FALL THROUGH */
463ee0b2 1226 case OP_LIST:
11343788 1227 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
463ee0b2
LW
1228 mod(kid, type);
1229 break;
1230 }
11343788 1231 o->op_flags |= OPf_MOD;
a0d0e21e
LW
1232
1233 if (type == OP_AASSIGN || type == OP_SASSIGN)
11343788 1234 o->op_flags |= OPf_SPECIAL|OPf_REF;
a0d0e21e 1235 else if (!type) {
11343788
MB
1236 o->op_private |= OPpLVAL_INTRO;
1237 o->op_flags &= ~OPf_SPECIAL;
463ee0b2 1238 }
a0d0e21e 1239 else if (type != OP_GREPSTART && type != OP_ENTERSUB)
11343788
MB
1240 o->op_flags |= OPf_REF;
1241 return o;
463ee0b2
LW
1242}
1243
3fe9a6f1 1244static bool
8ac85365 1245scalar_mod_type(OP *o, I32 type)
3fe9a6f1 1246{
1247 switch (type) {
1248 case OP_SASSIGN:
5196be3e 1249 if (o->op_type == OP_RV2GV)
3fe9a6f1 1250 return FALSE;
1251 /* FALL THROUGH */
1252 case OP_PREINC:
1253 case OP_PREDEC:
1254 case OP_POSTINC:
1255 case OP_POSTDEC:
1256 case OP_I_PREINC:
1257 case OP_I_PREDEC:
1258 case OP_I_POSTINC:
1259 case OP_I_POSTDEC:
1260 case OP_POW:
1261 case OP_MULTIPLY:
1262 case OP_DIVIDE:
1263 case OP_MODULO:
1264 case OP_REPEAT:
1265 case OP_ADD:
1266 case OP_SUBTRACT:
1267 case OP_I_MULTIPLY:
1268 case OP_I_DIVIDE:
1269 case OP_I_MODULO:
1270 case OP_I_ADD:
1271 case OP_I_SUBTRACT:
1272 case OP_LEFT_SHIFT:
1273 case OP_RIGHT_SHIFT:
1274 case OP_BIT_AND:
1275 case OP_BIT_XOR:
1276 case OP_BIT_OR:
1277 case OP_CONCAT:
1278 case OP_SUBST:
1279 case OP_TRANS:
1280 case OP_ANDASSIGN: /* may work later */
1281 case OP_ORASSIGN: /* may work later */
1282 return TRUE;
1283 default:
1284 return FALSE;
1285 }
1286}
1287
463ee0b2 1288OP *
8ac85365 1289refkids(OP *o, I32 type)
463ee0b2
LW
1290{
1291 OP *kid;
11343788
MB
1292 if (o && o->op_flags & OPf_KIDS) {
1293 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
463ee0b2
LW
1294 ref(kid, type);
1295 }
11343788 1296 return o;
463ee0b2
LW
1297}
1298
1299OP *
8ac85365 1300ref(OP *o, I32 type)
463ee0b2
LW
1301{
1302 OP *kid;
463ee0b2 1303
11343788
MB
1304 if (!o || error_count)
1305 return o;
463ee0b2 1306
11343788 1307 switch (o->op_type) {
a0d0e21e 1308 case OP_ENTERSUB:
e55aaa0e 1309 if ((type == OP_DEFINED || type == OP_LOCK) &&
11343788
MB
1310 !(o->op_flags & OPf_STACKED)) {
1311 o->op_type = OP_RV2CV; /* entersub => rv2cv */
1312 o->op_ppaddr = ppaddr[OP_RV2CV];
1313 assert(cUNOPo->op_first->op_type == OP_NULL);
1314 null(((LISTOP*)cUNOPo->op_first)->op_first); /* disable pushmark */
1315 o->op_flags |= OPf_SPECIAL;
8990e307
LW
1316 }
1317 break;
aeea060c 1318
463ee0b2 1319 case OP_COND_EXPR:
11343788 1320 for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
463ee0b2
LW
1321 ref(kid, type);
1322 break;
8990e307 1323 case OP_RV2SV:
11343788 1324 ref(cUNOPo->op_first, o->op_type);
4633a7c4
LW
1325 /* FALL THROUGH */
1326 case OP_PADSV:
5f05dabc 1327 if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV) {
5dc0d613
MB
1328 o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV
1329 : type == OP_RV2HV ? OPpDEREF_HV
1330 : OPpDEREF_SV);
11343788 1331 o->op_flags |= OPf_MOD;
a0d0e21e 1332 }
8990e307
LW
1333 break;
1334
2faa37cc 1335 case OP_THREADSV:
a863c7d1
MB
1336 o->op_flags |= OPf_MOD; /* XXX ??? */
1337 break;
1338
463ee0b2
LW
1339 case OP_RV2AV:
1340 case OP_RV2HV:
aeea060c 1341 o->op_flags |= OPf_REF;
8990e307 1342 /* FALL THROUGH */
463ee0b2 1343 case OP_RV2GV:
11343788 1344 ref(cUNOPo->op_first, o->op_type);
463ee0b2 1345 break;
8990e307 1346
463ee0b2
LW
1347 case OP_PADAV:
1348 case OP_PADHV:
aeea060c 1349 o->op_flags |= OPf_REF;
79072805 1350 break;
aeea060c 1351
8990e307 1352 case OP_SCALAR:
79072805 1353 case OP_NULL:
11343788 1354 if (!(o->op_flags & OPf_KIDS))
463ee0b2 1355 break;
11343788 1356 ref(cBINOPo->op_first, type);
79072805
LW
1357 break;
1358 case OP_AELEM:
1359 case OP_HELEM:
11343788 1360 ref(cBINOPo->op_first, o->op_type);
5f05dabc 1361 if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV) {
5dc0d613
MB
1362 o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV
1363 : type == OP_RV2HV ? OPpDEREF_HV
1364 : OPpDEREF_SV);
11343788 1365 o->op_flags |= OPf_MOD;
8990e307 1366 }
79072805
LW
1367 break;
1368
463ee0b2 1369 case OP_SCOPE:
79072805
LW
1370 case OP_LEAVE:
1371 case OP_ENTER:
8990e307 1372 case OP_LIST:
11343788 1373 if (!(o->op_flags & OPf_KIDS))
79072805 1374 break;
11343788 1375 ref(cLISTOPo->op_last, type);
79072805 1376 break;
a0d0e21e
LW
1377 default:
1378 break;
79072805 1379 }
11343788 1380 return scalar(o);
8990e307 1381
79072805
LW
1382}
1383
1384OP *
8ac85365 1385my(OP *o)
93a17b20
LW
1386{
1387 OP *kid;
93a17b20
LW
1388 I32 type;
1389
11343788
MB
1390 if (!o || error_count)
1391 return o;
93a17b20 1392
11343788 1393 type = o->op_type;
93a17b20 1394 if (type == OP_LIST) {
11343788 1395 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
93a17b20
LW
1396 my(kid);
1397 }
1398 else if (type != OP_PADSV &&
1399 type != OP_PADAV &&
1400 type != OP_PADHV &&
1401 type != OP_PUSHMARK)
1402 {
5dc0d613 1403 yyerror(form("Can't declare %s in my", op_desc[o->op_type]));
11343788 1404 return o;
93a17b20 1405 }
11343788
MB
1406 o->op_flags |= OPf_MOD;
1407 o->op_private |= OPpLVAL_INTRO;
1408 return o;
93a17b20
LW
1409}
1410
1411OP *
8ac85365 1412sawparens(OP *o)
79072805
LW
1413{
1414 if (o)
1415 o->op_flags |= OPf_PARENS;
1416 return o;
1417}
1418
1419OP *
8ac85365 1420bind_match(I32 type, OP *left, OP *right)
79072805 1421{
11343788 1422 OP *o;
79072805 1423
2ae324a7 1424 if (dowarn &&
1425 (left->op_type == OP_RV2AV ||
1426 left->op_type == OP_RV2HV ||
1427 left->op_type == OP_PADAV ||
1428 left->op_type == OP_PADHV)) {
1429 char *desc = op_desc[(right->op_type == OP_SUBST ||
1430 right->op_type == OP_TRANS)
1431 ? right->op_type : OP_MATCH];
1432 char *sample = ((left->op_type == OP_RV2AV ||
1433 left->op_type == OP_PADAV)
1434 ? "@array" : "%hash");
1435 warn("Applying %s to %s will act on scalar(%s)", desc, sample, sample);
1436 }
1437
79072805
LW
1438 if (right->op_type == OP_MATCH ||
1439 right->op_type == OP_SUBST ||
1440 right->op_type == OP_TRANS) {
1441 right->op_flags |= OPf_STACKED;
1442 if (right->op_type != OP_MATCH)
463ee0b2 1443 left = mod(left, right->op_type);
79072805 1444 if (right->op_type == OP_TRANS)
11343788 1445 o = newBINOP(OP_NULL, OPf_STACKED, scalar(left), right);
79072805 1446 else
11343788 1447 o = prepend_elem(right->op_type, scalar(left), right);
79072805 1448 if (type == OP_NOT)
11343788
MB
1449 return newUNOP(OP_NOT, 0, scalar(o));
1450 return o;
79072805
LW
1451 }
1452 else
1453 return bind_match(type, left,
1454 pmruntime(newPMOP(OP_MATCH, 0), right, Nullop));
1455}
1456
1457OP *
8ac85365 1458invert(OP *o)
79072805 1459{
11343788
MB
1460 if (!o)
1461 return o;
79072805 1462 /* XXX need to optimize away NOT NOT here? Or do we let optimizer do it? */
11343788 1463 return newUNOP(OP_NOT, OPf_SPECIAL, scalar(o));
79072805
LW
1464}
1465
1466OP *
8ac85365 1467scope(OP *o)
79072805
LW
1468{
1469 if (o) {
84902520 1470 if (o->op_flags & OPf_PARENS || PERLDB_NOOPT || tainting) {
463ee0b2
LW
1471 o = prepend_elem(OP_LINESEQ, newOP(OP_ENTER, 0), o);
1472 o->op_type = OP_LEAVE;
1473 o->op_ppaddr = ppaddr[OP_LEAVE];
1474 }
1475 else {
1476 if (o->op_type == OP_LINESEQ) {
1477 OP *kid;
1478 o->op_type = OP_SCOPE;
1479 o->op_ppaddr = ppaddr[OP_SCOPE];
1480 kid = ((LISTOP*)o)->op_first;
748a9306
LW
1481 if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE){
1482 SvREFCNT_dec(((COP*)kid)->cop_filegv);
8990e307 1483 null(kid);
748a9306 1484 }
463ee0b2
LW
1485 }
1486 else
748a9306 1487 o = newLISTOP(OP_SCOPE, 0, o, Nullop);
463ee0b2 1488 }
79072805
LW
1489 }
1490 return o;
1491}
1492
a0d0e21e 1493int
8ac85365 1494block_start(int full)
79072805 1495{
11343788 1496 dTHR;
a0d0e21e 1497 int retval = savestack_ix;
55497cff 1498 SAVEI32(comppad_name_floor);
1499 if (full) {
1500 if ((comppad_name_fill = AvFILL(comppad_name)) > 0)
1501 comppad_name_floor = comppad_name_fill;
1502 else
1503 comppad_name_floor = 0;
1504 }
1505 SAVEI32(min_intro_pending);
1506 SAVEI32(max_intro_pending);
a0d0e21e 1507 min_intro_pending = 0;
55497cff 1508 SAVEI32(comppad_name_fill);
1509 SAVEI32(padix_floor);
a0d0e21e
LW
1510 padix_floor = padix;
1511 pad_reset_pending = FALSE;
55497cff 1512 SAVEI32(hints);
a0d0e21e
LW
1513 hints &= ~HINT_BLOCK_SCOPE;
1514 return retval;
1515}
1516
1517OP*
8ac85365 1518block_end(I32 floor, OP *seq)
a0d0e21e 1519{
11343788 1520 dTHR;
a0d0e21e
LW
1521 int needblockscope = hints & HINT_BLOCK_SCOPE;
1522 OP* retval = scalarseq(seq);
a0d0e21e
LW
1523 LEAVE_SCOPE(floor);
1524 pad_reset_pending = FALSE;
1525 if (needblockscope)
1526 hints |= HINT_BLOCK_SCOPE; /* propagate out */
1527 pad_leavemy(comppad_name_fill);
bbce6d69 1528 cop_seqmax++;
a0d0e21e
LW
1529 return retval;
1530}
1531
1532void
8ac85365 1533newPROG(OP *o)
a0d0e21e 1534{
11343788 1535 dTHR;
a0d0e21e 1536 if (in_eval) {
5dc0d613 1537 eval_root = newUNOP(OP_LEAVEEVAL, ((in_eval & 4) ? OPf_SPECIAL : 0), o);
a0d0e21e
LW
1538 eval_start = linklist(eval_root);
1539 eval_root->op_next = 0;
1540 peep(eval_start);
1541 }
1542 else {
5dc0d613 1543 if (!o)
a0d0e21e 1544 return;
11343788 1545 main_root = scope(sawparens(scalarvoid(o)));
a0d0e21e
LW
1546 curcop = &compiling;
1547 main_start = LINKLIST(main_root);
1548 main_root->op_next = 0;
1549 peep(main_start);
748a9306 1550 compcv = 0;
3841441e 1551
4fdae800 1552 /* Register with debugger */
84902520 1553 if (PERLDB_INTER) {
3841441e 1554 CV *cv = perl_get_cv("DB::postponed", FALSE);
3841441e
CS
1555 if (cv) {
1556 dSP;
1557 PUSHMARK(sp);
1558 XPUSHs((SV*)compiling.cop_filegv);
1559 PUTBACK;
1560 perl_call_sv((SV*)cv, G_DISCARD);
1561 }
1562 }
79072805 1563 }
79072805
LW
1564}
1565
1566OP *
8ac85365 1567localize(OP *o, I32 lex)
79072805
LW
1568{
1569 if (o->op_flags & OPf_PARENS)
1570 list(o);
8990e307 1571 else {
79072805 1572 scalar(o);
8990e307
LW
1573 if (dowarn && bufptr > oldbufptr && bufptr[-1] == ',') {
1574 char *s;
1575 for (s = bufptr; *s && (isALNUM(*s) || strchr("@$%, ",*s)); s++) ;
a0d0e21e 1576 if (*s == ';' || *s == '=')
8990e307
LW
1577 warn("Parens missing around \"%s\" list", lex ? "my" : "local");
1578 }
1579 }
93a17b20 1580 in_my = FALSE;
c750a3ec 1581 in_my_stash = Nullhv;
93a17b20
LW
1582 if (lex)
1583 return my(o);
1584 else
463ee0b2 1585 return mod(o, OP_NULL); /* a bit kludgey */
79072805
LW
1586}
1587
1588OP *
8ac85365 1589jmaybe(OP *o)
79072805
LW
1590{
1591 if (o->op_type == OP_LIST) {
554b3eca
MB
1592 OP *o2;
1593#ifdef USE_THREADS
2faa37cc 1594 o2 = newOP(OP_THREADSV, 0);
554b3eca
MB
1595 o2->op_targ = find_thread_magical(";");
1596#else
1597 o2 = newSVREF(newGVOP(OP_GV, 0, gv_fetchpv(";", TRUE, SVt_PV))),
1598#endif /* USE_THREADS */
1599 o = convert(OP_JOIN, 0, prepend_elem(OP_LIST, o2, o));
79072805
LW
1600 }
1601 return o;
1602}
1603
1604OP *
8ac85365 1605fold_constants(register OP *o)
79072805 1606{
11343788 1607 dTHR;
79072805
LW
1608 register OP *curop;
1609 I32 type = o->op_type;
748a9306 1610 SV *sv;
79072805
LW
1611
1612 if (opargs[type] & OA_RETSCALAR)
1613 scalar(o);
1614 if (opargs[type] & OA_TARGET)
ed6116ce 1615 o->op_targ = pad_alloc(type, SVs_PADTMP);
79072805 1616
85e6fe83 1617 if ((opargs[type] & OA_OTHERINT) && (hints & HINT_INTEGER))
a0d0e21e 1618 o->op_ppaddr = ppaddr[type = ++(o->op_type)];
85e6fe83 1619
79072805
LW
1620 if (!(opargs[type] & OA_FOLDCONST))
1621 goto nope;
1622
de939608
CS
1623 switch (type) {
1624 case OP_SPRINTF:
1625 case OP_UCFIRST:
1626 case OP_LCFIRST:
1627 case OP_UC:
1628 case OP_LC:
1629 if (o->op_private & OPpLOCALE)
1630 goto nope;
1631 }
1632
a0d0e21e
LW
1633 if (error_count)
1634 goto nope; /* Don't try to run w/ errors */
1635
79072805 1636 for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
93a17b20
LW
1637 if (curop->op_type != OP_CONST &&
1638 curop->op_type != OP_LIST &&
1639 curop->op_type != OP_SCALAR &&
a0d0e21e 1640 curop->op_type != OP_NULL &&
93a17b20 1641 curop->op_type != OP_PUSHMARK) {
79072805
LW
1642 goto nope;
1643 }
1644 }
1645
1646 curop = LINKLIST(o);
1647 o->op_next = 0;
1648 op = curop;
8da795c6 1649 runops();
748a9306
LW
1650 sv = *(stack_sp--);
1651 if (o->op_targ && sv == PAD_SV(o->op_targ)) /* grab pad temp? */
79072805 1652 pad_swipe(o->op_targ);
748a9306
LW
1653 else if (SvTEMP(sv)) { /* grab mortal temp? */
1654 (void)SvREFCNT_inc(sv);
1655 SvTEMP_off(sv);
85e6fe83 1656 }
79072805
LW
1657 op_free(o);
1658 if (type == OP_RV2GV)
b1cb66bf 1659 return newGVOP(OP_GV, 0, (GV*)sv);
748a9306
LW
1660 else {
1661 if ((SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK)) == SVf_NOK) {
1662 IV iv = SvIV(sv);
1663 if ((double)iv == SvNV(sv)) { /* can we smush double to int */
1664 SvREFCNT_dec(sv);
1665 sv = newSViv(iv);
1666 }
b1cb66bf 1667 else
1668 SvIOK_off(sv); /* undo SvIV() damage */
748a9306
LW
1669 }
1670 return newSVOP(OP_CONST, 0, sv);
1671 }
aeea060c 1672
79072805
LW
1673 nope:
1674 if (!(opargs[type] & OA_OTHERINT))
1675 return o;
79072805 1676
85e6fe83 1677 if (!(hints & HINT_INTEGER)) {
a0d0e21e 1678 if (type == OP_DIVIDE || !(o->op_flags & OPf_KIDS))
85e6fe83
LW
1679 return o;
1680
1681 for (curop = ((UNOP*)o)->op_first; curop; curop = curop->op_sibling) {
1682 if (curop->op_type == OP_CONST) {
b1cb66bf 1683 if (SvIOK(((SVOP*)curop)->op_sv))
85e6fe83
LW
1684 continue;
1685 return o;
1686 }
1687 if (opargs[curop->op_type] & OA_RETINTEGER)
79072805
LW
1688 continue;
1689 return o;
1690 }
a0d0e21e 1691 o->op_ppaddr = ppaddr[++(o->op_type)];
79072805
LW
1692 }
1693
79072805
LW
1694 return o;
1695}
1696
1697OP *
8ac85365 1698gen_constant_list(register OP *o)
79072805 1699{
11343788 1700 dTHR;
79072805 1701 register OP *curop;
79072805 1702 I32 oldtmps_floor = tmps_floor;
79072805 1703
a0d0e21e
LW
1704 list(o);
1705 if (error_count)
1706 return o; /* Don't attempt to run with errors */
1707
1708 op = curop = LINKLIST(o);
1709 o->op_next = 0;
11343788 1710 pp_pushmark(ARGS);
8da795c6 1711 runops();
a0d0e21e 1712 op = curop;
11343788 1713 pp_anonlist(ARGS);
79072805 1714 tmps_floor = oldtmps_floor;
79072805
LW
1715
1716 o->op_type = OP_RV2AV;
1717 o->op_ppaddr = ppaddr[OP_RV2AV];
79072805 1718 curop = ((UNOP*)o)->op_first;
a0d0e21e 1719 ((UNOP*)o)->op_first = newSVOP(OP_CONST, 0, SvREFCNT_inc(*stack_sp--));
79072805 1720 op_free(curop);
79072805
LW
1721 linklist(o);
1722 return list(o);
1723}
1724
1725OP *
8ac85365 1726convert(I32 type, I32 flags, OP *o)
79072805
LW
1727{
1728 OP *kid;
a0d0e21e 1729 OP *last = 0;
79072805 1730
11343788
MB
1731 if (!o || o->op_type != OP_LIST)
1732 o = newLISTOP(OP_LIST, 0, o, Nullop);
748a9306 1733 else
5dc0d613 1734 o->op_flags &= ~OPf_WANT;
79072805 1735
8990e307 1736 if (!(opargs[type] & OA_MARK))
11343788 1737 null(cLISTOPo->op_first);
8990e307 1738
11343788
MB
1739 o->op_type = type;
1740 o->op_ppaddr = ppaddr[type];
1741 o->op_flags |= flags;
79072805 1742
11343788
MB
1743 o = CHECKOP(type, o);
1744 if (o->op_type != type)
1745 return o;
79072805 1746
11343788 1747 if (cLISTOPo->op_children < 7) {
79072805 1748 /* XXX do we really need to do this if we're done appending?? */
11343788 1749 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
79072805 1750 last = kid;
11343788 1751 cLISTOPo->op_last = last; /* in case check substituted last arg */
79072805
LW
1752 }
1753
11343788 1754 return fold_constants(o);
79072805
LW
1755}
1756
1757/* List constructors */
1758
1759OP *
8ac85365 1760append_elem(I32 type, OP *first, OP *last)
79072805
LW
1761{
1762 if (!first)
1763 return last;
8990e307
LW
1764
1765 if (!last)
79072805 1766 return first;
8990e307 1767
a0d0e21e
LW
1768 if (first->op_type != type || type==OP_LIST && first->op_flags & OPf_PARENS)
1769 return newLISTOP(type, 0, first, last);
79072805 1770
a0d0e21e
LW
1771 if (first->op_flags & OPf_KIDS)
1772 ((LISTOP*)first)->op_last->op_sibling = last;
1773 else {
1774 first->op_flags |= OPf_KIDS;
1775 ((LISTOP*)first)->op_first = last;
1776 }
1777 ((LISTOP*)first)->op_last = last;
1778 ((LISTOP*)first)->op_children++;
1779 return first;
79072805
LW
1780}
1781
1782OP *
8ac85365 1783append_list(I32 type, LISTOP *first, LISTOP *last)
79072805
LW
1784{
1785 if (!first)
1786 return (OP*)last;
8990e307
LW
1787
1788 if (!last)
79072805 1789 return (OP*)first;
8990e307
LW
1790
1791 if (first->op_type != type)
79072805 1792 return prepend_elem(type, (OP*)first, (OP*)last);
8990e307
LW
1793
1794 if (last->op_type != type)
79072805
LW
1795 return append_elem(type, (OP*)first, (OP*)last);
1796
1797 first->op_last->op_sibling = last->op_first;
1798 first->op_last = last->op_last;
1799 first->op_children += last->op_children;
1800 if (first->op_children)
1801 last->op_flags |= OPf_KIDS;
1802
1803 Safefree(last);
1804 return (OP*)first;
1805}
1806
1807OP *
8ac85365 1808prepend_elem(I32 type, OP *first, OP *last)
79072805
LW
1809{
1810 if (!first)
1811 return last;
8990e307
LW
1812
1813 if (!last)
79072805 1814 return first;
8990e307
LW
1815
1816 if (last->op_type == type) {
1817 if (type == OP_LIST) { /* already a PUSHMARK there */
1818 first->op_sibling = ((LISTOP*)last)->op_first->op_sibling;
1819 ((LISTOP*)last)->op_first->op_sibling = first;
1820 }
1821 else {
1822 if (!(last->op_flags & OPf_KIDS)) {
1823 ((LISTOP*)last)->op_last = first;
1824 last->op_flags |= OPf_KIDS;
1825 }
1826 first->op_sibling = ((LISTOP*)last)->op_first;
1827 ((LISTOP*)last)->op_first = first;
79072805 1828 }
79072805
LW
1829 ((LISTOP*)last)->op_children++;
1830 return last;
1831 }
1832
1833 return newLISTOP(type, 0, first, last);
1834}
1835
1836/* Constructors */
1837
1838OP *
8ac85365 1839newNULLLIST(void)
79072805 1840{
8990e307
LW
1841 return newOP(OP_STUB, 0);
1842}
1843
1844OP *
8ac85365 1845force_list(OP *o)
8990e307 1846{
11343788
MB
1847 if (!o || o->op_type != OP_LIST)
1848 o = newLISTOP(OP_LIST, 0, o, Nullop);
1849 null(o);
1850 return o;
79072805
LW
1851}
1852
1853OP *
8ac85365 1854newLISTOP(I32 type, I32 flags, OP *first, OP *last)
79072805
LW
1855{
1856 LISTOP *listop;
1857
1858 Newz(1101, listop, 1, LISTOP);
1859
1860 listop->op_type = type;
1861 listop->op_ppaddr = ppaddr[type];
1862 listop->op_children = (first != 0) + (last != 0);
1863 listop->op_flags = flags;
79072805
LW
1864
1865 if (!last && first)
1866 last = first;
1867 else if (!first && last)
1868 first = last;
8990e307
LW
1869 else if (first)
1870 first->op_sibling = last;
79072805
LW
1871 listop->op_first = first;
1872 listop->op_last = last;
8990e307
LW
1873 if (type == OP_LIST) {
1874 OP* pushop;
1875 pushop = newOP(OP_PUSHMARK, 0);
1876 pushop->op_sibling = first;
1877 listop->op_first = pushop;
1878 listop->op_flags |= OPf_KIDS;
1879 if (!last)
1880 listop->op_last = pushop;
1881 }
1882 else if (listop->op_children)
1883 listop->op_flags |= OPf_KIDS;
79072805
LW
1884
1885 return (OP*)listop;
1886}
1887
1888OP *
8ac85365 1889newOP(I32 type, I32 flags)
79072805 1890{
11343788
MB
1891 OP *o;
1892 Newz(1101, o, 1, OP);
1893 o->op_type = type;
1894 o->op_ppaddr = ppaddr[type];
1895 o->op_flags = flags;
79072805 1896
11343788
MB
1897 o->op_next = o;
1898 o->op_private = 0 + (flags >> 8);
79072805 1899 if (opargs[type] & OA_RETSCALAR)
11343788 1900 scalar(o);
79072805 1901 if (opargs[type] & OA_TARGET)
11343788
MB
1902 o->op_targ = pad_alloc(type, SVs_PADTMP);
1903 return CHECKOP(type, o);
79072805
LW
1904}
1905
1906OP *
8ac85365 1907newUNOP(I32 type, I32 flags, OP *first)
79072805
LW
1908{
1909 UNOP *unop;
1910
93a17b20 1911 if (!first)
aeea060c 1912 first = newOP(OP_STUB, 0);
8990e307
LW
1913 if (opargs[type] & OA_MARK)
1914 first = force_list(first);
93a17b20 1915
79072805
LW
1916 Newz(1101, unop, 1, UNOP);
1917 unop->op_type = type;
1918 unop->op_ppaddr = ppaddr[type];
1919 unop->op_first = first;
1920 unop->op_flags = flags | OPf_KIDS;
c07a80fd 1921 unop->op_private = 1 | (flags >> 8);
c277df42
IZ
1922#if 1
1923 if(type == OP_STUDY && first->op_type == OP_MATCH) {
1924 first->op_type = OP_PUSHRE;
1925 first->op_ppaddr = ppaddr[OP_PUSHRE];
1926 }
1927#endif
e50aee73 1928 unop = (UNOP*) CHECKOP(type, unop);
79072805
LW
1929 if (unop->op_next)
1930 return (OP*)unop;
1931
a0d0e21e 1932 return fold_constants((OP *) unop);
79072805
LW
1933}
1934
1935OP *
8ac85365 1936newBINOP(I32 type, I32 flags, OP *first, OP *last)
79072805
LW
1937{
1938 BINOP *binop;
1939 Newz(1101, binop, 1, BINOP);
1940
1941 if (!first)
1942 first = newOP(OP_NULL, 0);
1943
1944 binop->op_type = type;
1945 binop->op_ppaddr = ppaddr[type];
1946 binop->op_first = first;
1947 binop->op_flags = flags | OPf_KIDS;
1948 if (!last) {
1949 last = first;
c07a80fd 1950 binop->op_private = 1 | (flags >> 8);
79072805
LW
1951 }
1952 else {
c07a80fd 1953 binop->op_private = 2 | (flags >> 8);
79072805
LW
1954 first->op_sibling = last;
1955 }
1956
e50aee73 1957 binop = (BINOP*)CHECKOP(type, binop);
79072805
LW
1958 if (binop->op_next)
1959 return (OP*)binop;
1960
1961 binop->op_last = last = binop->op_first->op_sibling;
1962
a0d0e21e 1963 return fold_constants((OP *)binop);
79072805
LW
1964}
1965
1966OP *
8ac85365 1967pmtrans(OP *o, OP *expr, OP *repl)
79072805 1968{
79072805
LW
1969 SV *tstr = ((SVOP*)expr)->op_sv;
1970 SV *rstr = ((SVOP*)repl)->op_sv;
463ee0b2
LW
1971 STRLEN tlen;
1972 STRLEN rlen;
ec49126f 1973 register U8 *t = (U8*)SvPV(tstr, tlen);
1974 register U8 *r = (U8*)SvPV(rstr, rlen);
79072805
LW
1975 register I32 i;
1976 register I32 j;
8ac85365 1977 I32 Delete;
79072805
LW
1978 I32 complement;
1979 register short *tbl;
1980
11343788
MB
1981 tbl = (short*)cPVOPo->op_pv;
1982 complement = o->op_private & OPpTRANS_COMPLEMENT;
8ac85365 1983 Delete = o->op_private & OPpTRANS_DELETE;
11343788 1984 /* squash = o->op_private & OPpTRANS_SQUASH; */
79072805
LW
1985
1986 if (complement) {
1987 Zero(tbl, 256, short);
1988 for (i = 0; i < tlen; i++)
ec49126f 1989 tbl[t[i]] = -1;
79072805
LW
1990 for (i = 0, j = 0; i < 256; i++) {
1991 if (!tbl[i]) {
1992 if (j >= rlen) {
8ac85365 1993 if (Delete)
79072805
LW
1994 tbl[i] = -2;
1995 else if (rlen)
ec49126f 1996 tbl[i] = r[j-1];
79072805
LW
1997 else
1998 tbl[i] = i;
1999 }
2000 else
ec49126f 2001 tbl[i] = r[j++];
79072805
LW
2002 }
2003 }
2004 }
2005 else {
8ac85365 2006 if (!rlen && !Delete) {
79072805
LW
2007 r = t; rlen = tlen;
2008 }
2009 for (i = 0; i < 256; i++)
2010 tbl[i] = -1;
2011 for (i = 0, j = 0; i < tlen; i++,j++) {
2012 if (j >= rlen) {
8ac85365 2013 if (Delete) {
ec49126f 2014 if (tbl[t[i]] == -1)
2015 tbl[t[i]] = -2;
79072805
LW
2016 continue;
2017 }
2018 --j;
2019 }
ec49126f 2020 if (tbl[t[i]] == -1)
2021 tbl[t[i]] = r[j];
79072805
LW
2022 }
2023 }
2024 op_free(expr);
2025 op_free(repl);
2026
11343788 2027 return o;
79072805
LW
2028}
2029
2030OP *
8ac85365 2031newPMOP(I32 type, I32 flags)
79072805 2032{
11343788 2033 dTHR;
79072805
LW
2034 PMOP *pmop;
2035
2036 Newz(1101, pmop, 1, PMOP);
2037 pmop->op_type = type;
2038 pmop->op_ppaddr = ppaddr[type];
2039 pmop->op_flags = flags;
c07a80fd 2040 pmop->op_private = 0 | (flags >> 8);
79072805 2041
36477c24 2042 if (hints & HINT_LOCALE)
2043 pmop->op_pmpermflags = (pmop->op_pmflags |= PMf_LOCALE);
2044
79072805 2045 /* link into pm list */
a0d0e21e 2046 if (type != OP_TRANS && curstash) {
79072805
LW
2047 pmop->op_pmnext = HvPMROOT(curstash);
2048 HvPMROOT(curstash) = pmop;
2049 }
2050
2051 return (OP*)pmop;
2052}
2053
2054OP *
8ac85365 2055pmruntime(OP *o, OP *expr, OP *repl)
79072805
LW
2056{
2057 PMOP *pm;
2058 LOGOP *rcop;
2059
11343788
MB
2060 if (o->op_type == OP_TRANS)
2061 return pmtrans(o, expr, repl);
79072805 2062
3e3baf6d 2063 hints |= HINT_BLOCK_SCOPE;
11343788 2064 pm = (PMOP*)o;
79072805
LW
2065
2066 if (expr->op_type == OP_CONST) {
463ee0b2 2067 STRLEN plen;
79072805 2068 SV *pat = ((SVOP*)expr)->op_sv;
463ee0b2 2069 char *p = SvPV(pat, plen);
11343788 2070 if ((o->op_flags & OPf_SPECIAL) && strEQ(p, " ")) {
93a17b20 2071 sv_setpvn(pat, "\\s+", 3);
463ee0b2 2072 p = SvPV(pat, plen);
79072805
LW
2073 pm->op_pmflags |= PMf_SKIPWHITE;
2074 }
e50aee73 2075 pm->op_pmregexp = pregcomp(p, p + plen, pm);
aeea060c 2076 if (strEQ("\\s+", pm->op_pmregexp->precomp))
85e6fe83 2077 pm->op_pmflags |= PMf_WHITE;
79072805
LW
2078 op_free(expr);
2079 }
2080 else {
463ee0b2
LW
2081 if (pm->op_pmflags & PMf_KEEP)
2082 expr = newUNOP(OP_REGCMAYBE,0,expr);
2083
79072805
LW
2084 Newz(1101, rcop, 1, LOGOP);
2085 rcop->op_type = OP_REGCOMP;
2086 rcop->op_ppaddr = ppaddr[OP_REGCOMP];
2087 rcop->op_first = scalar(expr);
2088 rcop->op_flags |= OPf_KIDS;
2089 rcop->op_private = 1;
11343788 2090 rcop->op_other = o;
79072805
LW
2091
2092 /* establish postfix order */
463ee0b2
LW
2093 if (pm->op_pmflags & PMf_KEEP) {
2094 LINKLIST(expr);
2095 rcop->op_next = expr;
2096 ((UNOP*)expr)->op_first->op_next = (OP*)rcop;
2097 }
2098 else {
2099 rcop->op_next = LINKLIST(expr);
2100 expr->op_next = (OP*)rcop;
2101 }
79072805 2102
11343788 2103 prepend_elem(o->op_type, scalar((OP*)rcop), o);
79072805
LW
2104 }
2105
2106 if (repl) {
748a9306
LW
2107 OP *curop;
2108 if (pm->op_pmflags & PMf_EVAL)
2109 curop = 0;
554b3eca 2110#ifdef USE_THREADS
2faa37cc 2111 else if (repl->op_type == OP_THREADSV
554b3eca
MB
2112 && strchr("&`'123456789+",
2113 per_thread_magicals[repl->op_targ]))
2114 {
2115 curop = 0;
2116 }
2117#endif /* USE_THREADS */
748a9306
LW
2118 else if (repl->op_type == OP_CONST)
2119 curop = repl;
79072805 2120 else {
79072805
LW
2121 OP *lastop = 0;
2122 for (curop = LINKLIST(repl); curop!=repl; curop = LINKLIST(curop)) {
2123 if (opargs[curop->op_type] & OA_DANGEROUS) {
554b3eca 2124#ifdef USE_THREADS
2faa37cc 2125 if (curop->op_type == OP_THREADSV
554b3eca
MB
2126 && strchr("&`'123456789+", curop->op_private)) {
2127 break;
2128 }
2129#else
79072805
LW
2130 if (curop->op_type == OP_GV) {
2131 GV *gv = ((GVOP*)curop)->op_gv;
93a17b20 2132 if (strchr("&`'123456789+", *GvENAME(gv)))
79072805
LW
2133 break;
2134 }
554b3eca 2135#endif /* USE_THREADS */
79072805
LW
2136 else if (curop->op_type == OP_RV2CV)
2137 break;
2138 else if (curop->op_type == OP_RV2SV ||
2139 curop->op_type == OP_RV2AV ||
2140 curop->op_type == OP_RV2HV ||
2141 curop->op_type == OP_RV2GV) {
2142 if (lastop && lastop->op_type != OP_GV) /*funny deref?*/
2143 break;
2144 }
748a9306
LW
2145 else if (curop->op_type == OP_PADSV ||
2146 curop->op_type == OP_PADAV ||
2147 curop->op_type == OP_PADHV ||
554b3eca 2148 curop->op_type == OP_PADANY) {
748a9306
LW
2149 /* is okay */
2150 }
79072805
LW
2151 else
2152 break;
2153 }
2154 lastop = curop;
2155 }
748a9306
LW
2156 }
2157 if (curop == repl) {
2158 pm->op_pmflags |= PMf_CONST; /* const for long enough */
4633a7c4 2159 pm->op_pmpermflags |= PMf_CONST; /* const for long enough */
11343788 2160 prepend_elem(o->op_type, scalar(repl), o);
748a9306
LW
2161 }
2162 else {
2163 Newz(1101, rcop, 1, LOGOP);
2164 rcop->op_type = OP_SUBSTCONT;
2165 rcop->op_ppaddr = ppaddr[OP_SUBSTCONT];
2166 rcop->op_first = scalar(repl);
2167 rcop->op_flags |= OPf_KIDS;
2168 rcop->op_private = 1;
11343788 2169 rcop->op_other = o;
748a9306
LW
2170
2171 /* establish postfix order */
2172 rcop->op_next = LINKLIST(repl);
2173 repl->op_next = (OP*)rcop;
2174
2175 pm->op_pmreplroot = scalar((OP*)rcop);
2176 pm->op_pmreplstart = LINKLIST(rcop);
2177 rcop->op_next = 0;
79072805
LW
2178 }
2179 }
2180
2181 return (OP*)pm;
2182}
2183
2184OP *
8ac85365 2185newSVOP(I32 type, I32 flags, SV *sv)
79072805
LW
2186{
2187 SVOP *svop;
2188 Newz(1101, svop, 1, SVOP);
2189 svop->op_type = type;
2190 svop->op_ppaddr = ppaddr[type];
2191 svop->op_sv = sv;
2192 svop->op_next = (OP*)svop;
2193 svop->op_flags = flags;
2194 if (opargs[type] & OA_RETSCALAR)
463ee0b2 2195 scalar((OP*)svop);
79072805 2196 if (opargs[type] & OA_TARGET)
ed6116ce 2197 svop->op_targ = pad_alloc(type, SVs_PADTMP);
e50aee73 2198 return CHECKOP(type, svop);
79072805
LW
2199}
2200
2201OP *
8ac85365 2202newGVOP(I32 type, I32 flags, GV *gv)
79072805 2203{
11343788 2204 dTHR;
79072805
LW
2205 GVOP *gvop;
2206 Newz(1101, gvop, 1, GVOP);
2207 gvop->op_type = type;
2208 gvop->op_ppaddr = ppaddr[type];
8990e307 2209 gvop->op_gv = (GV*)SvREFCNT_inc(gv);
79072805
LW
2210 gvop->op_next = (OP*)gvop;
2211 gvop->op_flags = flags;
2212 if (opargs[type] & OA_RETSCALAR)
463ee0b2 2213 scalar((OP*)gvop);
79072805 2214 if (opargs[type] & OA_TARGET)
ed6116ce 2215 gvop->op_targ = pad_alloc(type, SVs_PADTMP);
e50aee73 2216 return CHECKOP(type, gvop);
79072805
LW
2217}
2218
2219OP *
8ac85365 2220newPVOP(I32 type, I32 flags, char *pv)
79072805
LW
2221{
2222 PVOP *pvop;
2223 Newz(1101, pvop, 1, PVOP);
2224 pvop->op_type = type;
2225 pvop->op_ppaddr = ppaddr[type];
2226 pvop->op_pv = pv;
2227 pvop->op_next = (OP*)pvop;
2228 pvop->op_flags = flags;
2229 if (opargs[type] & OA_RETSCALAR)
463ee0b2 2230 scalar((OP*)pvop);
79072805 2231 if (opargs[type] & OA_TARGET)
ed6116ce 2232 pvop->op_targ = pad_alloc(type, SVs_PADTMP);
e50aee73 2233 return CHECKOP(type, pvop);
79072805
LW
2234}
2235
79072805 2236void
8ac85365 2237package(OP *o)
79072805 2238{
11343788 2239 dTHR;
93a17b20 2240 SV *sv;
79072805
LW
2241
2242 save_hptr(&curstash);
2243 save_item(curstname);
11343788 2244 if (o) {
463ee0b2
LW
2245 STRLEN len;
2246 char *name;
11343788 2247 sv = cSVOPo->op_sv;
463ee0b2 2248 name = SvPV(sv, len);
b1cb66bf 2249 curstash = gv_stashpvn(name,len,TRUE);
463ee0b2 2250 sv_setpvn(curstname, name, len);
11343788 2251 op_free(o);
93a17b20
LW
2252 }
2253 else {
2254 sv_setpv(curstname,"<none>");
2255 curstash = Nullhv;
2256 }
79072805 2257 copline = NOLINE;
8990e307 2258 expect = XSTATE;
79072805
LW
2259}
2260
85e6fe83 2261void
8ac85365 2262utilize(int aver, I32 floor, OP *version, OP *id, OP *arg)
85e6fe83 2263{
a0d0e21e
LW
2264 OP *pack;
2265 OP *meth;
2266 OP *rqop;
2267 OP *imop;
b1cb66bf 2268 OP *veop;
85e6fe83 2269
a0d0e21e
LW
2270 if (id->op_type != OP_CONST)
2271 croak("Module name must be constant");
85e6fe83 2272
b1cb66bf 2273 veop = Nullop;
2274
2275 if(version != Nullop) {
2276 SV *vesv = ((SVOP*)version)->op_sv;
2277
2278 if (arg == Nullop && !SvNIOK(vesv)) {
2279 arg = version;
2280 }
2281 else {
2282 OP *pack;
2283 OP *meth;
2284
2285 if (version->op_type != OP_CONST || !SvNIOK(vesv))
2286 croak("Version number must be constant number");
2287
2288 /* Make copy of id so we don't free it twice */
2289 pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)id)->op_sv));
2290
2291 /* Fake up a method call to VERSION */
2292 meth = newSVOP(OP_CONST, 0, newSVpv("VERSION", 7));
2293 veop = convert(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL,
2294 append_elem(OP_LIST,
2295 prepend_elem(OP_LIST, pack, list(version)),
2296 newUNOP(OP_METHOD, 0, meth)));
2297 }
2298 }
aeea060c 2299
a0d0e21e 2300 /* Fake up an import/unimport */
4633a7c4
LW
2301 if (arg && arg->op_type == OP_STUB)
2302 imop = arg; /* no import on explicit () */
b1cb66bf 2303 else if(SvNIOK(((SVOP*)id)->op_sv)) {
2304 imop = Nullop; /* use 5.0; */
2305 }
4633a7c4
LW
2306 else {
2307 /* Make copy of id so we don't free it twice */
2308 pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)id)->op_sv));
4633a7c4
LW
2309 meth = newSVOP(OP_CONST, 0,
2310 aver
2311 ? newSVpv("import", 6)
2312 : newSVpv("unimport", 8)
2313 );
2314 imop = convert(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL,
a0d0e21e
LW
2315 append_elem(OP_LIST,
2316 prepend_elem(OP_LIST, pack, list(arg)),
2317 newUNOP(OP_METHOD, 0, meth)));
4633a7c4
LW
2318 }
2319
2320 /* Fake up a require */
2321 rqop = newUNOP(OP_REQUIRE, 0, id);
a0d0e21e
LW
2322
2323 /* Fake up the BEGIN {}, which does its thing immediately. */
c07a80fd 2324 newSUB(floor,
a0d0e21e 2325 newSVOP(OP_CONST, 0, newSVpv("BEGIN", 5)),
4633a7c4 2326 Nullop,
a0d0e21e 2327 append_elem(OP_LINESEQ,
b1cb66bf 2328 append_elem(OP_LINESEQ,
2329 newSTATEOP(0, Nullch, rqop),
2330 newSTATEOP(0, Nullch, veop)),
a0d0e21e 2331 newSTATEOP(0, Nullch, imop) ));
85e6fe83 2332
85e6fe83
LW
2333 copline = NOLINE;
2334 expect = XSTATE;
2335}
2336
79072805 2337OP *
8ac85365 2338newSLICEOP(I32 flags, OP *subscript, OP *listval)
79072805
LW
2339{
2340 return newBINOP(OP_LSLICE, flags,
8990e307
LW
2341 list(force_list(subscript)),
2342 list(force_list(listval)) );
79072805
LW
2343}
2344
2345static I32
8ac85365 2346list_assignment(register OP *o)
79072805 2347{
11343788 2348 if (!o)
79072805
LW
2349 return TRUE;
2350
11343788
MB
2351 if (o->op_type == OP_NULL && o->op_flags & OPf_KIDS)
2352 o = cUNOPo->op_first;
79072805 2353
11343788
MB
2354 if (o->op_type == OP_COND_EXPR) {
2355 I32 t = list_assignment(cCONDOPo->op_first->op_sibling);
2356 I32 f = list_assignment(cCONDOPo->op_first->op_sibling->op_sibling);
79072805
LW
2357
2358 if (t && f)
2359 return TRUE;
2360 if (t || f)
2361 yyerror("Assignment to both a list and a scalar");
2362 return FALSE;
2363 }
2364
11343788
MB
2365 if (o->op_type == OP_LIST || o->op_flags & OPf_PARENS ||
2366 o->op_type == OP_RV2AV || o->op_type == OP_RV2HV ||
2367 o->op_type == OP_ASLICE || o->op_type == OP_HSLICE)
79072805
LW
2368 return TRUE;
2369
11343788 2370 if (o->op_type == OP_PADAV || o->op_type == OP_PADHV)
93a17b20
LW
2371 return TRUE;
2372
11343788 2373 if (o->op_type == OP_RV2SV)
79072805
LW
2374 return FALSE;
2375
2376 return FALSE;
2377}
2378
2379OP *
8ac85365 2380newASSIGNOP(I32 flags, OP *left, I32 optype, OP *right)
79072805 2381{
11343788 2382 OP *o;
79072805 2383
a0d0e21e
LW
2384 if (optype) {
2385 if (optype == OP_ANDASSIGN || optype == OP_ORASSIGN) {
2386 return newLOGOP(optype, 0,
2387 mod(scalar(left), optype),
2388 newUNOP(OP_SASSIGN, 0, scalar(right)));
2389 }
2390 else {
2391 return newBINOP(optype, OPf_STACKED,
2392 mod(scalar(left), optype), scalar(right));
2393 }
2394 }
2395
79072805 2396 if (list_assignment(left)) {
463ee0b2 2397 modcount = 0;
748a9306 2398 eval_start = right; /* Grandfathering $[ assignment here. Bletch.*/
463ee0b2 2399 left = mod(left, OP_AASSIGN);
748a9306
LW
2400 if (eval_start)
2401 eval_start = 0;
2402 else {
a0d0e21e
LW
2403 op_free(left);
2404 op_free(right);
2405 return Nullop;
2406 }
11343788 2407 o = newBINOP(OP_AASSIGN, flags,
8990e307
LW
2408 list(force_list(right)),
2409 list(force_list(left)) );
11343788 2410 o->op_private = 0 | (flags >> 8);
a0d0e21e 2411 if (!(left->op_private & OPpLVAL_INTRO)) {
748a9306 2412 static int generation = 100;
79072805 2413 OP *curop;
11343788 2414 OP *lastop = o;
79072805 2415 generation++;
11343788 2416 for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
79072805
LW
2417 if (opargs[curop->op_type] & OA_DANGEROUS) {
2418 if (curop->op_type == OP_GV) {
2419 GV *gv = ((GVOP*)curop)->op_gv;
2420 if (gv == defgv || SvCUR(gv) == generation)
2421 break;
2422 SvCUR(gv) = generation;
2423 }
748a9306
LW
2424 else if (curop->op_type == OP_PADSV ||
2425 curop->op_type == OP_PADAV ||
2426 curop->op_type == OP_PADHV ||
2427 curop->op_type == OP_PADANY) {
2428 SV **svp = AvARRAY(comppad_name);
8e07c86e 2429 SV *sv = svp[curop->op_targ];
748a9306
LW
2430 if (SvCUR(sv) == generation)
2431 break;
2432 SvCUR(sv) = generation; /* (SvCUR not used any more) */
2433 }
79072805
LW
2434 else if (curop->op_type == OP_RV2CV)
2435 break;
2436 else if (curop->op_type == OP_RV2SV ||
2437 curop->op_type == OP_RV2AV ||
2438 curop->op_type == OP_RV2HV ||
2439 curop->op_type == OP_RV2GV) {
2440 if (lastop->op_type != OP_GV) /* funny deref? */
2441 break;
2442 }
2443 else
2444 break;
2445 }
2446 lastop = curop;
2447 }
11343788
MB
2448 if (curop != o)
2449 o->op_private = OPpASSIGN_COMMON;
79072805 2450 }
c07a80fd 2451 if (right && right->op_type == OP_SPLIT) {
2452 OP* tmpop;
2453 if ((tmpop = ((LISTOP*)right)->op_first) &&
2454 tmpop->op_type == OP_PUSHRE)
2455 {
2456 PMOP *pm = (PMOP*)tmpop;
2457 if (left->op_type == OP_RV2AV &&
2458 !(left->op_private & OPpLVAL_INTRO) &&
11343788 2459 !(o->op_private & OPpASSIGN_COMMON) )
c07a80fd 2460 {
2461 tmpop = ((UNOP*)left)->op_first;
2462 if (tmpop->op_type == OP_GV && !pm->op_pmreplroot) {
2463 pm->op_pmreplroot = (OP*)((GVOP*)tmpop)->op_gv;
2464 pm->op_pmflags |= PMf_ONCE;
11343788 2465 tmpop = cUNOPo->op_first; /* to list (nulled) */
c07a80fd 2466 tmpop = ((UNOP*)tmpop)->op_first; /* to pushmark */
2467 tmpop->op_sibling = Nullop; /* don't free split */
2468 right->op_next = tmpop->op_next; /* fix starting loc */
11343788 2469 op_free(o); /* blow off assign */
54310121 2470 right->op_flags &= ~OPf_WANT;
a5f75d66 2471 /* "I don't know and I don't care." */
c07a80fd 2472 return right;
2473 }
2474 }
2475 else {
2476 if (modcount < 10000 &&
2477 ((LISTOP*)right)->op_last->op_type == OP_CONST)
2478 {
2479 SV *sv = ((SVOP*)((LISTOP*)right)->op_last)->op_sv;
2480 if (SvIVX(sv) == 0)
2481 sv_setiv(sv, modcount+1);
2482 }
2483 }
2484 }
2485 }
11343788 2486 return o;
79072805
LW
2487 }
2488 if (!right)
2489 right = newOP(OP_UNDEF, 0);
2490 if (right->op_type == OP_READLINE) {
2491 right->op_flags |= OPf_STACKED;
463ee0b2 2492 return newBINOP(OP_NULL, flags, mod(scalar(left), OP_SASSIGN), scalar(right));
79072805 2493 }
a0d0e21e 2494 else {
748a9306 2495 eval_start = right; /* Grandfathering $[ assignment here. Bletch.*/
11343788 2496 o = newBINOP(OP_SASSIGN, flags,
463ee0b2 2497 scalar(right), mod(scalar(left), OP_SASSIGN) );
748a9306
LW
2498 if (eval_start)
2499 eval_start = 0;
2500 else {
11343788 2501 op_free(o);
a0d0e21e
LW
2502 return Nullop;
2503 }
2504 }
11343788 2505 return o;
79072805
LW
2506}
2507
2508OP *
8ac85365 2509newSTATEOP(I32 flags, char *label, OP *o)
79072805 2510{
11343788 2511 dTHR;
bbce6d69 2512 U32 seq = intro_my();
79072805
LW
2513 register COP *cop;
2514
2515 Newz(1101, cop, 1, COP);
84902520 2516 if (PERLDB_LINE && curcop->cop_line && curstash != debstash) {
8990e307
LW
2517 cop->op_type = OP_DBSTATE;
2518 cop->op_ppaddr = ppaddr[ OP_DBSTATE ];
2519 }
2520 else {
2521 cop->op_type = OP_NEXTSTATE;
2522 cop->op_ppaddr = ppaddr[ OP_NEXTSTATE ];
2523 }
79072805 2524 cop->op_flags = flags;
c07a80fd 2525 cop->op_private = 0 | (flags >> 8);
ff0cee69 2526#ifdef NATIVE_HINTS
2527 cop->op_private |= NATIVE_HINTS;
2528#endif
79072805
LW
2529 cop->op_next = (OP*)cop;
2530
463ee0b2
LW
2531 if (label) {
2532 cop->cop_label = label;
85e6fe83 2533 hints |= HINT_BLOCK_SCOPE;
463ee0b2 2534 }
bbce6d69 2535 cop->cop_seq = seq;
a0d0e21e 2536 cop->cop_arybase = curcop->cop_arybase;
79072805
LW
2537
2538 if (copline == NOLINE)
2539 cop->cop_line = curcop->cop_line;
2540 else {
2541 cop->cop_line = copline;
2542 copline = NOLINE;
2543 }
44a8e56a 2544 cop->cop_filegv = (GV*)SvREFCNT_inc(curcop->cop_filegv);
79072805
LW
2545 cop->cop_stash = curstash;
2546
84902520 2547 if (PERLDB_LINE && curstash != debstash) {
93a17b20
LW
2548 SV **svp = av_fetch(GvAV(curcop->cop_filegv),(I32)cop->cop_line, FALSE);
2549 if (svp && *svp != &sv_undef && !SvIOK(*svp)) {
a0d0e21e 2550 (void)SvIOK_on(*svp);
a5f75d66 2551 SvIVX(*svp) = 1;
93a17b20
LW
2552 SvSTASH(*svp) = (HV*)cop;
2553 }
2554 }
2555
11343788 2556 return prepend_elem(OP_LINESEQ, (OP*)cop, o);
79072805
LW
2557}
2558
bbce6d69 2559/* "Introduce" my variables to visible status. */
2560U32
8ac85365 2561intro_my(void)
bbce6d69 2562{
2563 SV **svp;
2564 SV *sv;
2565 I32 i;
2566
2567 if (! min_intro_pending)
2568 return cop_seqmax;
2569
2570 svp = AvARRAY(comppad_name);
2571 for (i = min_intro_pending; i <= max_intro_pending; i++) {
2572 if ((sv = svp[i]) && sv != &sv_undef && !SvIVX(sv)) {
2573 SvIVX(sv) = 999999999; /* Don't know scope end yet. */
2574 SvNVX(sv) = (double)cop_seqmax;
2575 }
2576 }
2577 min_intro_pending = 0;
2578 comppad_name_fill = max_intro_pending; /* Needn't search higher */
2579 return cop_seqmax++;
2580}
2581
79072805 2582OP *
8ac85365 2583newLOGOP(I32 type, I32 flags, OP *first, OP *other)
79072805 2584{
11343788 2585 dTHR;
79072805 2586 LOGOP *logop;
11343788 2587 OP *o;
79072805 2588
a0d0e21e
LW
2589 if (type == OP_XOR) /* Not short circuit, but here by precedence. */
2590 return newBINOP(type, flags, scalar(first), scalar(other));
2591
8990e307 2592 scalarboolean(first);
79072805
LW
2593 /* optimize "!a && b" to "a || b", and "!a || b" to "a && b" */
2594 if (first->op_type == OP_NOT && (first->op_flags & OPf_SPECIAL)) {
2595 if (type == OP_AND || type == OP_OR) {
2596 if (type == OP_AND)
2597 type = OP_OR;
2598 else
2599 type = OP_AND;
11343788
MB
2600 o = first;
2601 first = cUNOPo->op_first;
2602 if (o->op_next)
2603 first->op_next = o->op_next;
2604 cUNOPo->op_first = Nullop;
2605 op_free(o);
79072805
LW
2606 }
2607 }
2608 if (first->op_type == OP_CONST) {
93a17b20 2609 if (dowarn && (first->op_private & OPpCONST_BARE))
c07a80fd 2610 warn("Probable precedence problem on %s", op_desc[type]);
79072805
LW
2611 if ((type == OP_AND) == (SvTRUE(((SVOP*)first)->op_sv))) {
2612 op_free(first);
2613 return other;
2614 }
2615 else {
2616 op_free(other);
2617 return first;
2618 }
2619 }
2620 else if (first->op_type == OP_WANTARRAY) {
2621 if (type == OP_AND)
2622 list(other);
2623 else
2624 scalar(other);
2625 }
a6006777 2626 else if (dowarn && (first->op_flags & OPf_KIDS)) {
2627 OP *k1 = ((UNOP*)first)->op_first;
2628 OP *k2 = k1->op_sibling;
2629 OPCODE warnop = 0;
2630 switch (first->op_type)
2631 {
2632 case OP_NULL:
2633 if (k2 && k2->op_type == OP_READLINE
2634 && (k2->op_flags & OPf_STACKED)
2635 && (k1->op_type == OP_RV2SV || k1->op_type == OP_PADSV))
2636 warnop = k2->op_type;
2637 break;
2638
2639 case OP_SASSIGN:
68dc0745 2640 if (k1->op_type == OP_READDIR
2641 || k1->op_type == OP_GLOB
2642 || k1->op_type == OP_EACH)
a6006777 2643 warnop = k1->op_type;
2644 break;
2645 }
8ebc5c01 2646 if (warnop) {
2647 line_t oldline = curcop->cop_line;
2648 curcop->cop_line = copline;
68dc0745 2649 warn("Value of %s%s can be \"0\"; test with defined()",
2650 op_desc[warnop],
2651 ((warnop == OP_READLINE || warnop == OP_GLOB)
2652 ? " construct" : "() operator"));
2653 curcop->cop_line = oldline;
8ebc5c01 2654 }
a6006777 2655 }
79072805
LW
2656
2657 if (!other)
2658 return first;
2659
a0d0e21e
LW
2660 if (type == OP_ANDASSIGN || type == OP_ORASSIGN)
2661 other->op_private |= OPpASSIGN_BACKWARDS; /* other is an OP_SASSIGN */
2662
79072805
LW
2663 Newz(1101, logop, 1, LOGOP);
2664
2665 logop->op_type = type;
2666 logop->op_ppaddr = ppaddr[type];
2667 logop->op_first = first;
2668 logop->op_flags = flags | OPf_KIDS;
2669 logop->op_other = LINKLIST(other);
c07a80fd 2670 logop->op_private = 1 | (flags >> 8);
79072805
LW
2671
2672 /* establish postfix order */
2673 logop->op_next = LINKLIST(first);
2674 first->op_next = (OP*)logop;
2675 first->op_sibling = other;
2676
11343788
MB
2677 o = newUNOP(OP_NULL, 0, (OP*)logop);
2678 other->op_next = o;
79072805 2679
11343788 2680 return o;
79072805
LW
2681}
2682
2683OP *
8ac85365 2684newCONDOP(I32 flags, OP *first, OP *trueop, OP *falseop)
79072805 2685{
11343788 2686 dTHR;
79072805 2687 CONDOP *condop;
11343788 2688 OP *o;
79072805 2689
b1cb66bf 2690 if (!falseop)
2691 return newLOGOP(OP_AND, 0, first, trueop);
2692 if (!trueop)
2693 return newLOGOP(OP_OR, 0, first, falseop);
79072805 2694
8990e307 2695 scalarboolean(first);
79072805
LW
2696 if (first->op_type == OP_CONST) {
2697 if (SvTRUE(((SVOP*)first)->op_sv)) {
2698 op_free(first);
b1cb66bf 2699 op_free(falseop);
2700 return trueop;
79072805
LW
2701 }
2702 else {
2703 op_free(first);
b1cb66bf 2704 op_free(trueop);
2705 return falseop;
79072805
LW
2706 }
2707 }
2708 else if (first->op_type == OP_WANTARRAY) {
b1cb66bf 2709 list(trueop);
2710 scalar(falseop);
79072805
LW
2711 }
2712 Newz(1101, condop, 1, CONDOP);
2713
2714 condop->op_type = OP_COND_EXPR;
2715 condop->op_ppaddr = ppaddr[OP_COND_EXPR];
2716 condop->op_first = first;
2717 condop->op_flags = flags | OPf_KIDS;
b1cb66bf 2718 condop->op_true = LINKLIST(trueop);
2719 condop->op_false = LINKLIST(falseop);
c07a80fd 2720 condop->op_private = 1 | (flags >> 8);
79072805
LW
2721
2722 /* establish postfix order */
2723 condop->op_next = LINKLIST(first);
2724 first->op_next = (OP*)condop;
2725
b1cb66bf 2726 first->op_sibling = trueop;
2727 trueop->op_sibling = falseop;
11343788 2728 o = newUNOP(OP_NULL, 0, (OP*)condop);
79072805 2729
5dc0d613
MB
2730 trueop->op_next = o;
2731 falseop->op_next = o;
79072805 2732
11343788 2733 return o;
79072805
LW
2734}
2735
2736OP *
8ac85365 2737newRANGE(I32 flags, OP *left, OP *right)
79072805 2738{
b35b2403 2739 dTHR;
79072805
LW
2740 CONDOP *condop;
2741 OP *flip;
2742 OP *flop;
11343788 2743 OP *o;
79072805
LW
2744
2745 Newz(1101, condop, 1, CONDOP);
2746
2747 condop->op_type = OP_RANGE;
2748 condop->op_ppaddr = ppaddr[OP_RANGE];
2749 condop->op_first = left;
2750 condop->op_flags = OPf_KIDS;
2751 condop->op_true = LINKLIST(left);
2752 condop->op_false = LINKLIST(right);
c07a80fd 2753 condop->op_private = 1 | (flags >> 8);
79072805
LW
2754
2755 left->op_sibling = right;
2756
2757 condop->op_next = (OP*)condop;
2758 flip = newUNOP(OP_FLIP, flags, (OP*)condop);
2759 flop = newUNOP(OP_FLOP, 0, flip);
11343788 2760 o = newUNOP(OP_NULL, 0, flop);
79072805
LW
2761 linklist(flop);
2762
2763 left->op_next = flip;
2764 right->op_next = flop;
2765
ed6116ce 2766 condop->op_targ = pad_alloc(OP_RANGE, SVs_PADMY);
79072805 2767 sv_upgrade(PAD_SV(condop->op_targ), SVt_PVNV);
ed6116ce 2768 flip->op_targ = pad_alloc(OP_RANGE, SVs_PADMY);
79072805
LW
2769 sv_upgrade(PAD_SV(flip->op_targ), SVt_PVNV);
2770
2771 flip->op_private = left->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
2772 flop->op_private = right->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
2773
11343788 2774 flip->op_next = o;
79072805 2775 if (!flip->op_private || !flop->op_private)
11343788 2776 linklist(o); /* blow off optimizer unless constant */
79072805 2777
11343788 2778 return o;
79072805
LW
2779}
2780
2781OP *
8ac85365 2782newLOOPOP(I32 flags, I32 debuggable, OP *expr, OP *block)
79072805 2783{
11343788 2784 dTHR;
463ee0b2 2785 OP* listop;
11343788 2786 OP* o;
463ee0b2 2787 int once = block && block->op_flags & OPf_SPECIAL &&
a0d0e21e 2788 (block->op_type == OP_ENTERSUB || block->op_type == OP_NULL);
93a17b20 2789
463ee0b2
LW
2790 if (expr) {
2791 if (once && expr->op_type == OP_CONST && !SvTRUE(((SVOP*)expr)->op_sv))
2792 return block; /* do {} while 0 does once */
fb73857a 2793 if (expr->op_type == OP_READLINE || expr->op_type == OP_GLOB
2794 || (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB)) {
774d564b 2795 expr = newUNOP(OP_DEFINED, 0,
2796 newASSIGNOP(0, newSVREF(newGVOP(OP_GV, 0, defgv)), 0, expr) );
2797 }
463ee0b2 2798 }
93a17b20 2799
8990e307 2800 listop = append_elem(OP_LINESEQ, block, newOP(OP_UNSTACK, 0));
11343788 2801 o = newLOGOP(OP_AND, 0, expr, listop);
463ee0b2 2802
11343788 2803 ((LISTOP*)listop)->op_last->op_next = LINKLIST(o);
79072805 2804
11343788
MB
2805 if (once && o != listop)
2806 o->op_next = ((LOGOP*)cUNOPo->op_first)->op_other;
79072805 2807
11343788
MB
2808 if (o == listop)
2809 o = newUNOP(OP_NULL, 0, o); /* or do {} while 1 loses outer block */
748a9306 2810
11343788
MB
2811 o->op_flags |= flags;
2812 o = scope(o);
2813 o->op_flags |= OPf_SPECIAL; /* suppress POPBLOCK curpm restoration*/
2814 return o;
79072805
LW
2815}
2816
2817OP *
8ac85365 2818newWHILEOP(I32 flags, I32 debuggable, LOOP *loop, I32 whileline, OP *expr, OP *block, OP *cont)
79072805 2819{
11343788 2820 dTHR;
79072805
LW
2821 OP *redo;
2822 OP *next = 0;
2823 OP *listop;
11343788 2824 OP *o;
79072805
LW
2825 OP *condop;
2826
fb73857a 2827 if (expr && (expr->op_type == OP_READLINE || expr->op_type == OP_GLOB
2828 || (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB))) {
748a9306
LW
2829 expr = newUNOP(OP_DEFINED, 0,
2830 newASSIGNOP(0, newSVREF(newGVOP(OP_GV, 0, defgv)), 0, expr) );
2831 }
79072805
LW
2832
2833 if (!block)
2834 block = newOP(OP_NULL, 0);
2835
2836 if (cont)
2837 next = LINKLIST(cont);
fb73857a 2838 if (expr) {
79072805 2839 cont = append_elem(OP_LINESEQ, cont, newOP(OP_UNSTACK, 0));
fb73857a 2840 if ((line_t)whileline != NOLINE) {
2841 copline = whileline;
2842 cont = append_elem(OP_LINESEQ, cont,
2843 newSTATEOP(0, Nullch, Nullop));
2844 }
2845 }
79072805 2846
463ee0b2 2847 listop = append_list(OP_LINESEQ, (LISTOP*)block, (LISTOP*)cont);
79072805
LW
2848 redo = LINKLIST(listop);
2849
2850 if (expr) {
11343788
MB
2851 o = newLOGOP(OP_AND, 0, expr, scalar(listop));
2852 if (o == expr && o->op_type == OP_CONST && !SvTRUE(cSVOPo->op_sv)) {
85e6fe83 2853 op_free(expr); /* oops, it's a while (0) */
463ee0b2
LW
2854 op_free((OP*)loop);
2855 return Nullop; /* (listop already freed by newLOGOP) */
2856 }
aeea060c 2857 ((LISTOP*)listop)->op_last->op_next = condop =
11343788 2858 (o == listop ? redo : LINKLIST(o));
79072805
LW
2859 if (!next)
2860 next = condop;
2861 }
2862 else
11343788 2863 o = listop;
79072805
LW
2864
2865 if (!loop) {
2866 Newz(1101,loop,1,LOOP);
2867 loop->op_type = OP_ENTERLOOP;
2868 loop->op_ppaddr = ppaddr[OP_ENTERLOOP];
2869 loop->op_private = 0;
2870 loop->op_next = (OP*)loop;
2871 }
2872
11343788 2873 o = newBINOP(OP_LEAVELOOP, 0, (OP*)loop, o);
79072805
LW
2874
2875 loop->op_redoop = redo;
11343788 2876 loop->op_lastop = o;
79072805
LW
2877
2878 if (next)
2879 loop->op_nextop = next;
2880 else
11343788 2881 loop->op_nextop = o;
79072805 2882
11343788
MB
2883 o->op_flags |= flags;
2884 o->op_private |= (flags >> 8);
2885 return o;
79072805
LW
2886}
2887
2888OP *
a0d0e21e 2889#ifndef CAN_PROTOTYPE
79072805
LW
2890newFOROP(flags,label,forline,sv,expr,block,cont)
2891I32 flags;
2892char *label;
2893line_t forline;
2894OP* sv;
2895OP* expr;
2896OP*block;
2897OP*cont;
8990e307
LW
2898#else
2899newFOROP(I32 flags,char *label,line_t forline,OP *sv,OP *expr,OP *block,OP *cont)
a0d0e21e 2900#endif /* CAN_PROTOTYPE */
79072805
LW
2901{
2902 LOOP *loop;
fb73857a 2903 OP *wop;
85e6fe83 2904 int padoff = 0;
4633a7c4 2905 I32 iterflags = 0;
79072805 2906
79072805 2907 if (sv) {
85e6fe83 2908 if (sv->op_type == OP_RV2SV) { /* symbol table variable */
748a9306
LW
2909 sv->op_type = OP_RV2GV;
2910 sv->op_ppaddr = ppaddr[OP_RV2GV];
79072805 2911 }
85e6fe83
LW
2912 else if (sv->op_type == OP_PADSV) { /* private variable */
2913 padoff = sv->op_targ;
2914 op_free(sv);
2915 sv = Nullop;
2916 }
79072805 2917 else
c07a80fd 2918 croak("Can't use %s for loop variable", op_desc[sv->op_type]);
79072805
LW
2919 }
2920 else {
2921 sv = newGVOP(OP_GV, 0, defgv);
2922 }
5f05dabc 2923 if (expr->op_type == OP_RV2AV || expr->op_type == OP_PADAV) {
4633a7c4
LW
2924 expr = scalar(ref(expr, OP_ITER));
2925 iterflags |= OPf_STACKED;
2926 }
2927 loop = (LOOP*)list(convert(OP_ENTERITER, iterflags,
a0d0e21e
LW
2928 append_elem(OP_LIST, mod(force_list(expr), OP_GREPSTART),
2929 scalar(sv))));
85e6fe83
LW
2930 assert(!loop->op_next);
2931 Renew(loop, 1, LOOP);
2932 loop->op_targ = padoff;
fb73857a 2933 wop = newWHILEOP(flags, 1, loop, forline, newOP(OP_ITER, 0), block, cont);
2934 copline = forline;
2935 return newSTATEOP(0, label, wop);
79072805
LW
2936}
2937
8990e307 2938OP*
8ac85365 2939newLOOPEX(I32 type, OP *label)
8990e307 2940{
11343788
MB
2941 dTHR;
2942 OP *o;
8990e307 2943 if (type != OP_GOTO || label->op_type == OP_CONST) {
11343788 2944 o = newPVOP(type, 0, savepv(
a0d0e21e
LW
2945 label->op_type == OP_CONST
2946 ? SvPVx(((SVOP*)label)->op_sv, na)
2947 : "" ));
8990e307
LW
2948 op_free(label);
2949 }
2950 else {
a0d0e21e
LW
2951 if (label->op_type == OP_ENTERSUB)
2952 label = newUNOP(OP_REFGEN, 0, mod(label, OP_REFGEN));
11343788 2953 o = newUNOP(type, OPf_STACKED, label);
8990e307 2954 }
85e6fe83 2955 hints |= HINT_BLOCK_SCOPE;
11343788 2956 return o;
8990e307
LW
2957}
2958
79072805 2959void
8ac85365 2960cv_undef(CV *cv)
79072805 2961{
11343788
MB
2962 dTHR;
2963#ifdef USE_THREADS
e858de61
MB
2964 if (CvMUTEXP(cv)) {
2965 MUTEX_DESTROY(CvMUTEXP(cv));
2966 Safefree(CvMUTEXP(cv));
2967 CvMUTEXP(cv) = 0;
2968 }
11343788
MB
2969#endif /* USE_THREADS */
2970
a0d0e21e 2971 if (!CvXSUB(cv) && CvROOT(cv)) {
11343788
MB
2972#ifdef USE_THREADS
2973 if (CvDEPTH(cv) || (CvOWNER(cv) && CvOWNER(cv) != thr))
2974 croak("Can't undef active subroutine");
2975#else
a0d0e21e
LW
2976 if (CvDEPTH(cv))
2977 croak("Can't undef active subroutine");
11343788 2978#endif /* USE_THREADS */
8990e307 2979 ENTER;
a0d0e21e
LW
2980
2981 SAVESPTR(curpad);
2982 curpad = 0;
2983
a5f75d66 2984 if (!CvCLONED(cv))
748a9306 2985 op_free(CvROOT(cv));
79072805 2986 CvROOT(cv) = Nullop;
8990e307 2987 LEAVE;
79072805 2988 }
1d5db326 2989 SvPOK_off((SV*)cv); /* forget prototype */
44a8e56a 2990 CvFLAGS(cv) = 0;
8e07c86e
AD
2991 SvREFCNT_dec(CvGV(cv));
2992 CvGV(cv) = Nullgv;
2993 SvREFCNT_dec(CvOUTSIDE(cv));
2994 CvOUTSIDE(cv) = Nullcv;
2995 if (CvPADLIST(cv)) {
8ebc5c01 2996 /* may be during global destruction */
2997 if (SvREFCNT(CvPADLIST(cv))) {
2998 I32 i = AvFILL(CvPADLIST(cv));
2999 while (i >= 0) {
3000 SV** svp = av_fetch(CvPADLIST(cv), i--, FALSE);
46fc3d4c 3001 SV* sv = svp ? *svp : Nullsv;
3002 if (!sv)
3003 continue;
3004 if (sv == (SV*)comppad_name)
3005 comppad_name = Nullav;
3006 else if (sv == (SV*)comppad) {
3007 comppad = Nullav;
3008 curpad = Null(SV**);
3009 }
3010 SvREFCNT_dec(sv);
8ebc5c01 3011 }
3012 SvREFCNT_dec((SV*)CvPADLIST(cv));
8e07c86e 3013 }
8e07c86e
AD
3014 CvPADLIST(cv) = Nullav;
3015 }
79072805
LW
3016}
3017
5f05dabc 3018#ifdef DEBUG_CLOSURES
3019static void
3020cv_dump(cv)
3021CV* cv;
3022{
3023 CV *outside = CvOUTSIDE(cv);
3024 AV* padlist = CvPADLIST(cv);
4fdae800 3025 AV* pad_name;
3026 AV* pad;
3027 SV** pname;
3028 SV** ppad;
5f05dabc 3029 I32 ix;
3030
fb73857a 3031 PerlIO_printf(Perl_debug_log, "\tCV=0x%lx (%s), OUTSIDE=0x%lx (%s)\n",
ab50184a
CS
3032 cv,
3033 (CvANON(cv) ? "ANON"
3034 : (cv == main_cv) ? "MAIN"
07055b4c 3035 : CvUNIQUE(outside) ? "UNIQUE"
44a8e56a 3036 : CvGV(cv) ? GvNAME(CvGV(cv)) : "UNDEFINED"),
ab50184a
CS
3037 outside,
3038 (!outside ? "null"
3039 : CvANON(outside) ? "ANON"
3040 : (outside == main_cv) ? "MAIN"
07055b4c 3041 : CvUNIQUE(outside) ? "UNIQUE"
44a8e56a 3042 : CvGV(outside) ? GvNAME(CvGV(outside)) : "UNDEFINED"));
5f05dabc 3043
4fdae800 3044 if (!padlist)
3045 return;
3046
3047 pad_name = (AV*)*av_fetch(padlist, 0, FALSE);
3048 pad = (AV*)*av_fetch(padlist, 1, FALSE);
3049 pname = AvARRAY(pad_name);
3050 ppad = AvARRAY(pad);
3051
9607fc9c 3052 for (ix = 1; ix <= AvFILL(pad_name); ix++) {
5f05dabc 3053 if (SvPOK(pname[ix]))
fb73857a 3054 PerlIO_printf(Perl_debug_log, "\t%4d. 0x%lx (%s\"%s\" %ld-%ld)\n",
4fdae800 3055 ix, ppad[ix],
3056 SvFAKE(pname[ix]) ? "FAKE " : "",
3057 SvPVX(pname[ix]),
ab50184a
CS
3058 (long)I_32(SvNVX(pname[ix])),
3059 (long)SvIVX(pname[ix]));
5f05dabc 3060 }
3061}
3062#endif /* DEBUG_CLOSURES */
3063
3064static CV *
8ac85365 3065cv_clone2(CV *proto, CV *outside)
748a9306 3066{
11343788 3067 dTHR;
748a9306
LW
3068 AV* av;
3069 I32 ix;
3070 AV* protopadlist = CvPADLIST(proto);
3071 AV* protopad_name = (AV*)*av_fetch(protopadlist, 0, FALSE);
3072 AV* protopad = (AV*)*av_fetch(protopadlist, 1, FALSE);
5f05dabc 3073 SV** pname = AvARRAY(protopad_name);
3074 SV** ppad = AvARRAY(protopad);
9607fc9c 3075 I32 fname = AvFILL(protopad_name);
3076 I32 fpad = AvFILL(protopad);
748a9306
LW
3077 AV* comppadlist;
3078 CV* cv;
3079
07055b4c
CS
3080 assert(!CvUNIQUE(proto));
3081
748a9306
LW
3082 ENTER;
3083 SAVESPTR(curpad);
3084 SAVESPTR(comppad);
46fc3d4c 3085 SAVESPTR(comppad_name);
748a9306
LW
3086 SAVESPTR(compcv);
3087
3088 cv = compcv = (CV*)NEWSV(1104,0);
fa83b5b6 3089 sv_upgrade((SV *)cv, SvTYPE(proto));
a5f75d66 3090 CvCLONED_on(cv);
5f05dabc 3091 if (CvANON(proto))
3092 CvANON_on(cv);
748a9306 3093
11343788 3094#ifdef USE_THREADS
12ca11f6 3095 New(666, CvMUTEXP(cv), 1, perl_mutex);
11343788 3096 MUTEX_INIT(CvMUTEXP(cv));
11343788
MB
3097 CvOWNER(cv) = 0;
3098#endif /* USE_THREADS */
748a9306 3099 CvFILEGV(cv) = CvFILEGV(proto);
44a8e56a 3100 CvGV(cv) = (GV*)SvREFCNT_inc(CvGV(proto));
748a9306
LW
3101 CvSTASH(cv) = CvSTASH(proto);
3102 CvROOT(cv) = CvROOT(proto);
3103 CvSTART(cv) = CvSTART(proto);
5f05dabc 3104 if (outside)
3105 CvOUTSIDE(cv) = (CV*)SvREFCNT_inc(outside);
748a9306 3106
68dc0745 3107 if (SvPOK(proto))
3108 sv_setpvn((SV*)cv, SvPVX(proto), SvCUR(proto));
3109
46fc3d4c 3110 comppad_name = newAV();
3111 for (ix = fname; ix >= 0; ix--)
3112 av_store(comppad_name, ix, SvREFCNT_inc(pname[ix]));
748a9306
LW
3113
3114 comppad = newAV();
3115
3116 comppadlist = newAV();
3117 AvREAL_off(comppadlist);
46fc3d4c 3118 av_store(comppadlist, 0, (SV*)comppad_name);
b355b4e0 3119 av_store(comppadlist, 1, (SV*)comppad);
748a9306 3120 CvPADLIST(cv) = comppadlist;
5f05dabc 3121 av_fill(comppad, AvFILL(protopad));
748a9306
LW
3122 curpad = AvARRAY(comppad);
3123
3124 av = newAV(); /* will be @_ */
3125 av_extend(av, 0);
3126 av_store(comppad, 0, (SV*)av);
3127 AvFLAGS(av) = AVf_REIFY;
3128
9607fc9c 3129 for (ix = fpad; ix > 0; ix--) {
3130 SV* namesv = (ix <= fname) ? pname[ix] : Nullsv;
aa689395 3131 if (namesv && namesv != &sv_undef) {
3132 char *name = SvPVX(namesv); /* XXX */
3133 if (SvFLAGS(namesv) & SVf_FAKE) { /* lexical from outside? */
3134 I32 off = pad_findlex(name, ix, SvIVX(namesv),
5f05dabc 3135 CvOUTSIDE(cv), cxstack_ix);
3136 if (!off)
3137 curpad[ix] = SvREFCNT_inc(ppad[ix]);
3138 else if (off != ix)
748a9306
LW
3139 croak("panic: cv_clone: %s", name);
3140 }
3141 else { /* our own lexical */
aa689395 3142 SV* sv;
5f05dabc 3143 if (*name == '&') {
3144 /* anon code -- we'll come back for it */
3145 sv = SvREFCNT_inc(ppad[ix]);
3146 }
3147 else if (*name == '@')
3148 sv = (SV*)newAV();
748a9306 3149 else if (*name == '%')
5f05dabc 3150 sv = (SV*)newHV();
748a9306 3151 else
5f05dabc 3152 sv = NEWSV(0,0);
3153 if (!SvPADBUSY(sv))
3154 SvPADMY_on(sv);
3155 curpad[ix] = sv;
748a9306
LW
3156 }
3157 }
3158 else {
aa689395 3159 SV* sv = NEWSV(0,0);
748a9306 3160 SvPADTMP_on(sv);
5f05dabc 3161 curpad[ix] = sv;
748a9306
LW
3162 }
3163 }
3164
5f05dabc 3165 /* Now that vars are all in place, clone nested closures. */
3166
9607fc9c 3167 for (ix = fpad; ix > 0; ix--) {
3168 SV* namesv = (ix <= fname) ? pname[ix] : Nullsv;
aa689395 3169 if (namesv
3170 && namesv != &sv_undef
3171 && !(SvFLAGS(namesv) & SVf_FAKE)
3172 && *SvPVX(namesv) == '&'
5f05dabc 3173 && CvCLONE(ppad[ix]))
3174 {
3175 CV *kid = cv_clone2((CV*)ppad[ix], cv);
3176 SvREFCNT_dec(ppad[ix]);
3177 CvCLONE_on(kid);
3178 SvPADMY_on(kid);
3179 curpad[ix] = (SV*)kid;
748a9306
LW
3180 }
3181 }
3182
5f05dabc 3183#ifdef DEBUG_CLOSURES
ab50184a
CS
3184 PerlIO_printf(Perl_debug_log, "Cloned inside:\n");
3185 cv_dump(outside);
3186 PerlIO_printf(Perl_debug_log, " from:\n");
5f05dabc 3187 cv_dump(proto);
ab50184a 3188 PerlIO_printf(Perl_debug_log, " to:\n");
5f05dabc 3189 cv_dump(cv);
3190#endif
3191
748a9306
LW
3192 LEAVE;
3193 return cv;
3194}
3195
3196CV *
8ac85365 3197cv_clone(CV *proto)
5f05dabc 3198{
3199 return cv_clone2(proto, CvOUTSIDE(proto));
3200}
3201
3fe9a6f1 3202void
8ac85365 3203cv_ckproto(CV *cv, GV *gv, char *p)
3fe9a6f1 3204{
3205 if ((!p != !SvPOK(cv)) || (p && strNE(p, SvPVX(cv)))) {
46fc3d4c 3206 SV* msg = sv_newmortal();
3fe9a6f1 3207 SV* name = Nullsv;
3208
3209 if (gv)
46fc3d4c 3210 gv_efullname3(name = sv_newmortal(), gv, Nullch);
3211 sv_setpv(msg, "Prototype mismatch:");
3212 if (name)
fc36a67e 3213 sv_catpvf(msg, " sub %_", name);
3fe9a6f1 3214 if (SvPOK(cv))
46fc3d4c 3215 sv_catpvf(msg, " (%s)", SvPVX(cv));
3216 sv_catpv(msg, " vs ");
3217 if (p)
3218 sv_catpvf(msg, "(%s)", p);
3219 else
3220 sv_catpv(msg, "none");
fc36a67e 3221 warn("%_", msg);
3fe9a6f1 3222 }
3223}
3224
760ac839 3225SV *
8ac85365 3226cv_const_sv(CV *cv)
760ac839
LW
3227{
3228 OP *o;
54310121 3229 SV *sv;
aeea060c 3230
54310121 3231 if (!cv || !SvPOK(cv) || SvCUR(cv))
3232 return Nullsv;
760ac839 3233
54310121 3234 sv = Nullsv;
3235 for (o = CvSTART(cv); o; o = o->op_next) {
3236 OPCODE type = o->op_type;
3237
3238 if (type == OP_NEXTSTATE || type == OP_NULL || type == OP_PUSHMARK)
3239 continue;
3240 if (type == OP_LEAVESUB || type == OP_RETURN)
3241 break;
3242 if (sv)
3243 return Nullsv;
3244 if (type == OP_CONST)
5dc0d613 3245 sv = cSVOPo->op_sv;
54310121 3246 else if (type == OP_PADSV) {
e858de61
MB
3247 AV* padav = (AV*)(AvARRAY(CvPADLIST(cv))[1]);
3248 sv = padav ? AvARRAY(padav)[o->op_targ] : Nullsv;
5aabfad6 3249 if (!sv || (!SvREADONLY(sv) && SvREFCNT(sv) > 1))
54310121 3250 return Nullsv;
760ac839 3251 }
54310121 3252 else
3253 return Nullsv;
760ac839 3254 }
5aabfad6 3255 if (sv)
3256 SvREADONLY_on(sv);
760ac839
LW
3257 return sv;
3258}
3259
748a9306 3260CV *
8ac85365 3261newSUB(I32 floor, OP *o, OP *proto, OP *block)
79072805 3262{
11343788 3263 dTHR;
5dc0d613 3264 char *name = o ? SvPVx(cSVOPo->op_sv, na) : Nullch;
44a8e56a 3265 GV *gv = gv_fetchpv(name ? name : "__ANON__", GV_ADDMULTI, SVt_PVCV);
3fe9a6f1 3266 char *ps = proto ? SvPVx(((SVOP*)proto)->op_sv, na) : Nullch;
79072805 3267 register CV *cv;
a0d0e21e 3268 I32 ix;
79072805 3269
11343788 3270 if (o)
5dc0d613 3271 SAVEFREEOP(o);
3fe9a6f1 3272 if (proto)
3273 SAVEFREEOP(proto);
3274
68dc0745 3275 if (!name || GvCVGEN(gv))
3276 cv = Nullcv;
3277 else if (cv = GvCV(gv)) {
3fe9a6f1 3278 cv_ckproto(cv, gv, ps);
68dc0745 3279 /* already defined (or promised)? */
3280 if (CvROOT(cv) || CvXSUB(cv) || GvASSUMECV(gv)) {
3281 SV* const_sv;
aa689395 3282 if (!block) {
3283 /* just a "sub foo;" when &foo is already defined */
3284 SAVEFREESV(compcv);
3285 goto done;
3286 }
7bac28a0 3287 /* ahem, death to those who redefine active sort subs */
3288 if (curstack == sortstack && sortcop == CvSTART(cv))
3289 croak("Can't redefine active sort subroutine %s", name);
68dc0745 3290 const_sv = cv_const_sv(cv);
44a8e56a 3291 if (const_sv || dowarn) {
79072805 3292 line_t oldline = curcop->cop_line;
79072805 3293 curcop->cop_line = copline;
760ac839 3294 warn(const_sv ? "Constant subroutine %s redefined"
68dc0745 3295 : "Subroutine %s redefined", name);
79072805
LW
3296 curcop->cop_line = oldline;
3297 }
8990e307 3298 SvREFCNT_dec(cv);
68dc0745 3299 cv = Nullcv;
79072805
LW
3300 }
3301 }
a0d0e21e 3302 if (cv) { /* must reuse cv if autoloaded */
4633a7c4 3303 cv_undef(cv);
44a8e56a 3304 CvFLAGS(cv) = CvFLAGS(compcv);
748a9306 3305 CvOUTSIDE(cv) = CvOUTSIDE(compcv);
e9a444f0 3306 CvOUTSIDE(compcv) = 0;
748a9306 3307 CvPADLIST(cv) = CvPADLIST(compcv);
4aa0a1f7 3308 CvPADLIST(compcv) = 0;
4633a7c4
LW
3309 if (SvREFCNT(compcv) > 1) /* XXX Make closures transit through stub. */
3310 CvOUTSIDE(compcv) = (CV*)SvREFCNT_inc((SV*)cv);
748a9306 3311 SvREFCNT_dec(compcv);
a0d0e21e
LW
3312 }
3313 else {
748a9306 3314 cv = compcv;
44a8e56a 3315 if (name) {
3316 GvCV(gv) = cv;
3317 GvCVGEN(gv) = 0;
3318 sub_generation++;
3319 }
a0d0e21e 3320 }
44a8e56a 3321 CvGV(cv) = (GV*)SvREFCNT_inc(gv);
79072805 3322 CvFILEGV(cv) = curcop->cop_filegv;
8990e307 3323 CvSTASH(cv) = curstash;
11343788
MB
3324#ifdef USE_THREADS
3325 CvOWNER(cv) = 0;
12ca11f6 3326 New(666, CvMUTEXP(cv), 1, perl_mutex);
11343788 3327 MUTEX_INIT(CvMUTEXP(cv));
11343788 3328#endif /* USE_THREADS */
8990e307 3329
3fe9a6f1 3330 if (ps)
3331 sv_setpv((SV*)cv, ps);
4633a7c4 3332
c07a80fd 3333 if (error_count) {
3334 op_free(block);
3335 block = Nullop;
68dc0745 3336 if (name) {
3337 char *s = strrchr(name, ':');
3338 s = s ? s+1 : name;
6d4c2119
CS
3339 if (strEQ(s, "BEGIN")) {
3340 char *not_safe =
3341 "BEGIN not safe after errors--compilation aborted";
3342 if (in_eval & 4)
3343 croak(not_safe);
3344 else {
3345 /* force display of errors found but not reported */
38a03e6e
MB
3346 sv_catpv(ERRSV, not_safe);
3347 croak("%s", SvPVx(ERRSV, na));
6d4c2119
CS
3348 }
3349 }
68dc0745 3350 }
c07a80fd 3351 }
a0d0e21e 3352 if (!block) {
a0d0e21e
LW
3353 copline = NOLINE;
3354 LEAVE_SCOPE(floor);
3355 return cv;
3356 }
3357
54310121 3358 if (AvFILL(comppad_name) < AvFILL(comppad))
3359 av_store(comppad_name, AvFILL(comppad), Nullsv);
a0d0e21e 3360
54310121 3361 if (CvCLONE(cv)) {
3362 SV **namep = AvARRAY(comppad_name);
3363 for (ix = AvFILL(comppad); ix > 0; ix--) {
3364 SV *namesv;
3365
3366 if (SvIMMORTAL(curpad[ix]))
3367 continue;
3368 /*
3369 * The only things that a clonable function needs in its
3370 * pad are references to outer lexicals and anonymous subs.
3371 * The rest are created anew during cloning.
3372 */
3373 if (!((namesv = namep[ix]) != Nullsv &&
3374 namesv != &sv_undef &&
3375 (SvFAKE(namesv) ||
3376 *SvPVX(namesv) == '&')))
3377 {
3378 SvREFCNT_dec(curpad[ix]);
3379 curpad[ix] = Nullsv;
3380 }
3381 }
a0d0e21e 3382 }
54310121 3383 else {
3384 AV *av = newAV(); /* Will be @_ */
3385 av_extend(av, 0);
3386 av_store(comppad, 0, (SV*)av);
3387 AvFLAGS(av) = AVf_REIFY;
79072805 3388
54310121 3389 for (ix = AvFILL(comppad); ix > 0; ix--) {
3390 if (SvIMMORTAL(curpad[ix]))
3391 continue;
3392 if (!SvPADMY(curpad[ix]))
3393 SvPADTMP_on(curpad[ix]);
3394 }
3395 }
79072805 3396
a0d0e21e 3397 CvROOT(cv) = newUNOP(OP_LEAVESUB, 0, scalarseq(block));
79072805
LW
3398 CvSTART(cv) = LINKLIST(CvROOT(cv));
3399 CvROOT(cv)->op_next = 0;
3400 peep(CvSTART(cv));
93a17b20 3401
44a8e56a 3402 if (name) {
3403 char *s;
3404
84902520 3405 if (PERLDB_SUBLINE && curstash != debstash) {
46fc3d4c 3406 SV *sv = NEWSV(0,0);
44a8e56a 3407 SV *tmpstr = sv_newmortal();
3408 static GV *db_postponed;
3409 CV *cv;
3410 HV *hv;
3411
fc36a67e 3412 sv_setpvf(sv, "%_:%ld-%ld",
46fc3d4c 3413 GvSV(curcop->cop_filegv),
3414 (long)subline, (long)curcop->cop_line);
44a8e56a 3415 gv_efullname3(tmpstr, gv, Nullch);
3416 hv_store(GvHV(DBsub), SvPVX(tmpstr), SvCUR(tmpstr), sv, 0);
3417 if (!db_postponed) {
6bbcb22c 3418 db_postponed = gv_fetchpv("DB::postponed", GV_ADDMULTI, SVt_PVHV);
44a8e56a 3419 }
3420 hv = GvHVn(db_postponed);
9607fc9c 3421 if (HvFILL(hv) > 0 && hv_exists(hv, SvPVX(tmpstr), SvCUR(tmpstr))
3422 && (cv = GvCV(db_postponed))) {
44a8e56a 3423 dSP;
3424 PUSHMARK(sp);
3425 XPUSHs(tmpstr);
3426 PUTBACK;
3427 perl_call_sv((SV*)cv, G_DISCARD);
3428 }
3429 }
79072805 3430
44a8e56a 3431 if ((s = strrchr(name,':')))
28757baa 3432 s++;
3433 else
3434 s = name;
68dc0745 3435 if (strEQ(s, "BEGIN")) {
2ae324a7 3436 I32 oldscope = scopestack_ix;
28757baa 3437 ENTER;
3438 SAVESPTR(compiling.cop_filegv);
3439 SAVEI16(compiling.cop_line);
3440 SAVEI32(perldb);
3441 save_svref(&rs);
3442 sv_setsv(rs, nrs);
3443
3444 if (!beginav)
3445 beginav = newAV();
3446 DEBUG_x( dump_sub(gv) );
3447 av_push(beginav, (SV *)cv);
3448 GvCV(gv) = 0;
68dc0745 3449 call_list(oldscope, beginav);
a6006777 3450
28757baa 3451 curcop = &compiling;
3452 LEAVE;
3453 }
3454 else if (strEQ(s, "END") && !error_count) {
3455 if (!endav)
3456 endav = newAV();
3457 av_unshift(endav, 1);
3458 av_store(endav, 0, (SV *)cv);
3459 GvCV(gv) = 0;
3460 }
7d07dbc2
MB
3461 else if (strEQ(s, "INIT") && !error_count) {
3462 if (!initav)
3463 initav = newAV();
3464 av_push(initav, SvREFCNT_inc(cv));
ae77835f 3465 }
79072805 3466 }
a6006777 3467
aa689395 3468 done:
79072805 3469 copline = NOLINE;
8990e307 3470 LEAVE_SCOPE(floor);
a0d0e21e 3471 return cv;
79072805
LW
3472}
3473
57d3b86d 3474CV *
aeea060c 3475newXS(char *name, void (*subaddr) (CV *), char *filename)
a0d0e21e 3476{
11343788 3477 dTHR;
44a8e56a 3478 GV *gv = gv_fetchpv(name ? name : "__ANON__", GV_ADDMULTI, SVt_PVCV);
79072805 3479 register CV *cv;
44a8e56a 3480
3481 if (cv = (name ? GvCV(gv) : Nullcv)) {
3482 if (GvCVGEN(gv)) {
3483 /* just a cached method */
3484 SvREFCNT_dec(cv);
3485 cv = 0;
3486 }
3487 else if (CvROOT(cv) || CvXSUB(cv) || GvASSUMECV(gv)) {
3488 /* already defined (or promised) */
a0d0e21e
LW
3489 if (dowarn) {
3490 line_t oldline = curcop->cop_line;
a0d0e21e
LW
3491 curcop->cop_line = copline;
3492 warn("Subroutine %s redefined",name);
3493 curcop->cop_line = oldline;
3494 }
3495 SvREFCNT_dec(cv);
3496 cv = 0;
79072805 3497 }
79072805 3498 }
44a8e56a 3499
3500 if (cv) /* must reuse cv if autoloaded */
3501 cv_undef(cv);
a0d0e21e
LW
3502 else {
3503 cv = (CV*)NEWSV(1105,0);
3504 sv_upgrade((SV *)cv, SVt_PVCV);
44a8e56a 3505 if (name) {
3506 GvCV(gv) = cv;
3507 GvCVGEN(gv) = 0;
3508 sub_generation++;
3509 }
a0d0e21e 3510 }
5196be3e 3511 CvGV(cv) = (GV*)SvREFCNT_inc(gv);
11343788 3512#ifdef USE_THREADS
12ca11f6 3513 New(666, CvMUTEXP(cv), 1, perl_mutex);
11343788 3514 MUTEX_INIT(CvMUTEXP(cv));
11343788
MB
3515 CvOWNER(cv) = 0;
3516#endif /* USE_THREADS */
79072805 3517 CvFILEGV(cv) = gv_fetchfile(filename);
a0d0e21e 3518 CvXSUB(cv) = subaddr;
44a8e56a 3519
28757baa 3520 if (name) {
3521 char *s = strrchr(name,':');
3522 if (s)
3523 s++;
3524 else
3525 s = name;
3526 if (strEQ(s, "BEGIN")) {
3527 if (!beginav)
3528 beginav = newAV();
44a8e56a 3529 av_push(beginav, (SV *)cv);
3530 GvCV(gv) = 0;
28757baa 3531 }
3532 else if (strEQ(s, "END")) {
3533 if (!endav)
3534 endav = newAV();
3535 av_unshift(endav, 1);
44a8e56a 3536 av_store(endav, 0, (SV *)cv);
3537 GvCV(gv) = 0;
28757baa 3538 }
7d07dbc2
MB
3539 else if (strEQ(s, "INIT")) {
3540 if (!initav)
3541 initav = newAV();
3542 av_push(initav, (SV *)cv);
ae77835f 3543 }
28757baa 3544 }
8990e307 3545 else
a5f75d66 3546 CvANON_on(cv);
44a8e56a 3547
a0d0e21e 3548 return cv;
79072805
LW
3549}
3550
3551void
8ac85365 3552newFORM(I32 floor, OP *o, OP *block)
79072805 3553{
11343788 3554 dTHR;
79072805
LW
3555 register CV *cv;
3556 char *name;
3557 GV *gv;
a0d0e21e 3558 I32 ix;
79072805 3559
11343788
MB
3560 if (o)
3561 name = SvPVx(cSVOPo->op_sv, na);
79072805
LW
3562 else
3563 name = "STDOUT";
85e6fe83 3564 gv = gv_fetchpv(name,TRUE, SVt_PVFM);
a5f75d66 3565 GvMULTI_on(gv);
79072805
LW
3566 if (cv = GvFORM(gv)) {
3567 if (dowarn) {
3568 line_t oldline = curcop->cop_line;
3569
3570 curcop->cop_line = copline;
3571 warn("Format %s redefined",name);
3572 curcop->cop_line = oldline;
3573 }
8990e307 3574 SvREFCNT_dec(cv);
79072805 3575 }
748a9306 3576 cv = compcv;
79072805 3577 GvFORM(gv) = cv;
44a8e56a 3578 CvGV(cv) = (GV*)SvREFCNT_inc(gv);
79072805
LW
3579 CvFILEGV(cv) = curcop->cop_filegv;
3580
a0d0e21e 3581 for (ix = AvFILL(comppad); ix > 0; ix--) {
44a8e56a 3582 if (!SvPADMY(curpad[ix]) && !SvIMMORTAL(curpad[ix]))
a0d0e21e
LW
3583 SvPADTMP_on(curpad[ix]);
3584 }
3585
79072805
LW
3586 CvROOT(cv) = newUNOP(OP_LEAVEWRITE, 0, scalarseq(block));
3587 CvSTART(cv) = LINKLIST(CvROOT(cv));
3588 CvROOT(cv)->op_next = 0;
3589 peep(CvSTART(cv));
11343788 3590 op_free(o);
79072805 3591 copline = NOLINE;
8990e307 3592 LEAVE_SCOPE(floor);
79072805
LW
3593}
3594
3595OP *
8ac85365 3596newANONLIST(OP *o)
79072805 3597{
93a17b20 3598 return newUNOP(OP_REFGEN, 0,
11343788 3599 mod(list(convert(OP_ANONLIST, 0, o)), OP_REFGEN));
79072805
LW
3600}
3601
3602OP *
8ac85365 3603newANONHASH(OP *o)
79072805 3604{
93a17b20 3605 return newUNOP(OP_REFGEN, 0,
11343788 3606 mod(list(convert(OP_ANONHASH, 0, o)), OP_REFGEN));
a0d0e21e
LW
3607}
3608
3609OP *
8ac85365 3610newANONSUB(I32 floor, OP *proto, OP *block)
a0d0e21e
LW
3611{
3612 return newUNOP(OP_REFGEN, 0,
4633a7c4 3613 newSVOP(OP_ANONCODE, 0, (SV*)newSUB(floor, 0, proto, block)));
79072805
LW
3614}
3615
3616OP *
8ac85365 3617oopsAV(OP *o)
79072805 3618{
ed6116ce
LW
3619 switch (o->op_type) {
3620 case OP_PADSV:
3621 o->op_type = OP_PADAV;
3622 o->op_ppaddr = ppaddr[OP_PADAV];
3623 return ref(newUNOP(OP_RV2AV, 0, scalar(o)), OP_RV2AV);
3624
3625 case OP_RV2SV:
79072805
LW
3626 o->op_type = OP_RV2AV;
3627 o->op_ppaddr = ppaddr[OP_RV2AV];
3628 ref(o, OP_RV2AV);
ed6116ce
LW
3629 break;
3630
3631 default:
79072805 3632 warn("oops: oopsAV");
ed6116ce
LW
3633 break;
3634 }
79072805
LW
3635 return o;
3636}
3637
3638OP *
8ac85365 3639oopsHV(OP *o)
79072805 3640{
ed6116ce
LW
3641 switch (o->op_type) {
3642 case OP_PADSV:
3643 case OP_PADAV:
3644 o->op_type = OP_PADHV;
3645 o->op_ppaddr = ppaddr[OP_PADHV];
3646 return ref(newUNOP(OP_RV2HV, 0, scalar(o)), OP_RV2HV);
3647
3648 case OP_RV2SV:
3649 case OP_RV2AV:
79072805
LW
3650 o->op_type = OP_RV2HV;
3651 o->op_ppaddr = ppaddr[OP_RV2HV];
3652 ref(o, OP_RV2HV);
ed6116ce
LW
3653 break;
3654
3655 default:
79072805 3656 warn("oops: oopsHV");
ed6116ce
LW
3657 break;
3658 }
79072805
LW
3659 return o;
3660}
3661
3662OP *
8ac85365 3663newAVREF(OP *o)
79072805 3664{
ed6116ce
LW
3665 if (o->op_type == OP_PADANY) {
3666 o->op_type = OP_PADAV;
3667 o->op_ppaddr = ppaddr[OP_PADAV];
93a17b20 3668 return o;
ed6116ce 3669 }
79072805
LW
3670 return newUNOP(OP_RV2AV, 0, scalar(o));
3671}
3672
3673OP *
8ac85365 3674newGVREF(I32 type, OP *o)
79072805 3675{
a0d0e21e
LW
3676 if (type == OP_MAPSTART)
3677 return newUNOP(OP_NULL, 0, o);
748a9306 3678 return ref(newUNOP(OP_RV2GV, OPf_REF, o), type);
79072805
LW
3679}
3680
3681OP *
8ac85365 3682newHVREF(OP *o)
79072805 3683{
ed6116ce
LW
3684 if (o->op_type == OP_PADANY) {
3685 o->op_type = OP_PADHV;
3686 o->op_ppaddr = ppaddr[OP_PADHV];
93a17b20 3687 return o;
ed6116ce 3688 }
79072805
LW
3689 return newUNOP(OP_RV2HV, 0, scalar(o));
3690}
3691
3692OP *
8ac85365 3693oopsCV(OP *o)
79072805 3694{
463ee0b2 3695 croak("NOT IMPL LINE %d",__LINE__);
79072805
LW
3696 /* STUB */
3697 return o;
3698}
3699
3700OP *
8ac85365 3701newCVREF(I32 flags, OP *o)
79072805 3702{
c07a80fd 3703 return newUNOP(OP_RV2CV, flags, scalar(o));
79072805
LW
3704}
3705
3706OP *
8ac85365 3707newSVREF(OP *o)
79072805 3708{
ed6116ce
LW
3709 if (o->op_type == OP_PADANY) {
3710 o->op_type = OP_PADSV;
3711 o->op_ppaddr = ppaddr[OP_PADSV];
93a17b20 3712 return o;
ed6116ce 3713 }
2faa37cc 3714 else if (o->op_type == OP_THREADSV)
a863c7d1 3715 return o;
79072805
LW
3716 return newUNOP(OP_RV2SV, 0, scalar(o));
3717}
3718
3719/* Check routines. */
3720
3721OP *
8ac85365 3722ck_anoncode(OP *o)
5f05dabc 3723{
178c6305
CS
3724 PADOFFSET ix;
3725 SV* name;
3726
3727 name = NEWSV(1106,0);
3728 sv_upgrade(name, SVt_PVNV);
3729 sv_setpvn(name, "&", 1);
3730 SvIVX(name) = -1;
3731 SvNVX(name) = 1;
5dc0d613 3732 ix = pad_alloc(o->op_type, SVs_PADMY);
178c6305 3733 av_store(comppad_name, ix, name);
5dc0d613
MB
3734 av_store(comppad, ix, cSVOPo->op_sv);
3735 SvPADMY_on(cSVOPo->op_sv);
3736 cSVOPo->op_sv = Nullsv;
3737 cSVOPo->op_targ = ix;
3738 return o;
5f05dabc 3739}
3740
3741OP *
8ac85365 3742ck_bitop(OP *o)
55497cff 3743{
5dc0d613
MB
3744 o->op_private = hints;
3745 return o;
55497cff 3746}
3747
3748OP *
8ac85365 3749ck_concat(OP *o)
79072805 3750{
11343788
MB
3751 if (cUNOPo->op_first->op_type == OP_CONCAT)
3752 o->op_flags |= OPf_STACKED;
3753 return o;
79072805
LW
3754}
3755
3756OP *
8ac85365 3757ck_spair(OP *o)
79072805 3758{
11343788 3759 if (o->op_flags & OPf_KIDS) {
79072805 3760 OP* newop;
a0d0e21e 3761 OP* kid;
5dc0d613
MB
3762 OPCODE type = o->op_type;
3763 o = modkids(ck_fun(o), type);
11343788 3764 kid = cUNOPo->op_first;
a0d0e21e
LW
3765 newop = kUNOP->op_first->op_sibling;
3766 if (newop &&
3767 (newop->op_sibling ||
3768 !(opargs[newop->op_type] & OA_RETSCALAR) ||
3769 newop->op_type == OP_PADAV || newop->op_type == OP_PADHV ||
3770 newop->op_type == OP_RV2AV || newop->op_type == OP_RV2HV)) {
aeea060c 3771
11343788 3772 return o;
a0d0e21e
LW
3773 }
3774 op_free(kUNOP->op_first);
3775 kUNOP->op_first = newop;
3776 }
11343788
MB
3777 o->op_ppaddr = ppaddr[++o->op_type];
3778 return ck_fun(o);
a0d0e21e
LW
3779}
3780
3781OP *
8ac85365 3782ck_delete(OP *o)
a0d0e21e 3783{
11343788 3784 o = ck_fun(o);
5dc0d613 3785 o->op_private = 0;
11343788
MB
3786 if (o->op_flags & OPf_KIDS) {
3787 OP *kid = cUNOPo->op_first;
5f05dabc 3788 if (kid->op_type == OP_HSLICE)
5dc0d613 3789 o->op_private |= OPpSLICE;
5f05dabc 3790 else if (kid->op_type != OP_HELEM)
3791 croak("%s argument is not a HASH element or slice",
5dc0d613 3792 op_desc[o->op_type]);
a0d0e21e 3793 null(kid);
79072805 3794 }
11343788 3795 return o;
79072805
LW
3796}
3797
3798OP *
8ac85365 3799ck_eof(OP *o)
79072805 3800{
11343788 3801 I32 type = o->op_type;
79072805 3802
11343788
MB
3803 if (o->op_flags & OPf_KIDS) {
3804 if (cLISTOPo->op_first->op_type == OP_STUB) {
3805 op_free(o);
3806 o = newUNOP(type, OPf_SPECIAL,
d58bf5aa 3807 newGVOP(OP_GV, 0, gv_fetchpv("main::ARGV", TRUE, SVt_PVAV)));
8990e307 3808 }
11343788 3809 return ck_fun(o);
79072805 3810 }
11343788 3811 return o;
79072805
LW
3812}
3813
3814OP *
8ac85365 3815ck_eval(OP *o)
79072805 3816{
85e6fe83 3817 hints |= HINT_BLOCK_SCOPE;
11343788
MB
3818 if (o->op_flags & OPf_KIDS) {
3819 SVOP *kid = (SVOP*)cUNOPo->op_first;
79072805 3820
93a17b20 3821 if (!kid) {
11343788
MB
3822 o->op_flags &= ~OPf_KIDS;
3823 null(o);
79072805
LW
3824 }
3825 else if (kid->op_type == OP_LINESEQ) {
3826 LOGOP *enter;
3827
11343788
MB
3828 kid->op_next = o->op_next;
3829 cUNOPo->op_first = 0;
3830 op_free(o);
79072805
LW
3831
3832 Newz(1101, enter, 1, LOGOP);
3833 enter->op_type = OP_ENTERTRY;
3834 enter->op_ppaddr = ppaddr[OP_ENTERTRY];
3835 enter->op_private = 0;
3836
3837 /* establish postfix order */
3838 enter->op_next = (OP*)enter;
3839
11343788
MB
3840 o = prepend_elem(OP_LINESEQ, (OP*)enter, (OP*)kid);
3841 o->op_type = OP_LEAVETRY;
3842 o->op_ppaddr = ppaddr[OP_LEAVETRY];
3843 enter->op_other = o;
3844 return o;
79072805
LW
3845 }
3846 }
3847 else {
11343788
MB
3848 op_free(o);
3849 o = newUNOP(OP_ENTEREVAL, 0, newSVREF(newGVOP(OP_GV, 0, defgv)));
79072805 3850 }
11343788
MB
3851 o->op_targ = (PADOFFSET)hints;
3852 return o;
79072805
LW
3853}
3854
3855OP *
8ac85365 3856ck_exec(OP *o)
79072805
LW
3857{
3858 OP *kid;
11343788
MB
3859 if (o->op_flags & OPf_STACKED) {
3860 o = ck_fun(o);
3861 kid = cUNOPo->op_first->op_sibling;
8990e307
LW
3862 if (kid->op_type == OP_RV2GV)
3863 null(kid);
79072805 3864 }
463ee0b2 3865 else
11343788
MB
3866 o = listkids(o);
3867 return o;
79072805
LW
3868}
3869
3870OP *
8ac85365 3871ck_exists(OP *o)
5f05dabc 3872{
5196be3e
MB
3873 o = ck_fun(o);
3874 if (o->op_flags & OPf_KIDS) {
3875 OP *kid = cUNOPo->op_first;
5f05dabc 3876 if (kid->op_type != OP_HELEM)
5196be3e 3877 croak("%s argument is not a HASH element", op_desc[o->op_type]);
5f05dabc 3878 null(kid);
3879 }
5196be3e 3880 return o;
5f05dabc 3881}
3882
3883OP *
8ac85365 3884ck_gvconst(register OP *o)
79072805
LW
3885{
3886 o = fold_constants(o);
3887 if (o->op_type == OP_CONST)
3888 o->op_type = OP_GV;
3889 return o;
3890}
3891
3892OP *
8ac85365 3893ck_rvconst(register OP *o)
79072805 3894{
11343788
MB
3895 dTHR;
3896 SVOP *kid = (SVOP*)cUNOPo->op_first;
85e6fe83 3897
11343788 3898 o->op_private |= (hints & HINT_STRICT_REFS);
79072805 3899 if (kid->op_type == OP_CONST) {
44a8e56a 3900 char *name;
3901 int iscv;
3902 GV *gv;
3903
3904 name = SvPV(kid->op_sv, na);
3905 if ((hints & HINT_STRICT_REFS) && (kid->op_private & OPpCONST_BARE)) {
3906 char *badthing = Nullch;
5dc0d613 3907 switch (o->op_type) {
44a8e56a 3908 case OP_RV2SV:
3909 badthing = "a SCALAR";
3910 break;
3911 case OP_RV2AV:
3912 badthing = "an ARRAY";
3913 break;
3914 case OP_RV2HV:
3915 badthing = "a HASH";
3916 break;
3917 }
3918 if (badthing)
3919 croak(
3920 "Can't use bareword (\"%s\") as %s ref while \"strict refs\" in use",
3921 name, badthing);
3922 }
79072805 3923 kid->op_type = OP_GV;
5196be3e 3924 iscv = (o->op_type == OP_RV2CV) * 2;
a0d0e21e 3925 for (gv = 0; !gv; iscv++) {
748a9306
LW
3926 /*
3927 * This is a little tricky. We only want to add the symbol if we
3928 * didn't add it in the lexer. Otherwise we get duplicate strict
3929 * warnings. But if we didn't add it in the lexer, we must at
3930 * least pretend like we wanted to add it even if it existed before,
3931 * or we get possible typo warnings. OPpCONST_ENTERED says
3932 * whether the lexer already added THIS instance of this symbol.
3933 */
44a8e56a 3934 gv = gv_fetchpv(name,
748a9306 3935 iscv | !(kid->op_private & OPpCONST_ENTERED),
a0d0e21e
LW
3936 iscv
3937 ? SVt_PVCV
11343788 3938 : o->op_type == OP_RV2SV
a0d0e21e 3939 ? SVt_PV
11343788 3940 : o->op_type == OP_RV2AV
a0d0e21e 3941 ? SVt_PVAV
11343788 3942 : o->op_type == OP_RV2HV
a0d0e21e
LW
3943 ? SVt_PVHV
3944 : SVt_PVGV);
3945 }
adbc6bb1 3946 SvREFCNT_dec(kid->op_sv);
a0d0e21e 3947 kid->op_sv = SvREFCNT_inc(gv);
79072805 3948 }
11343788 3949 return o;
79072805
LW
3950}
3951
3952OP *
8ac85365 3953ck_ftst(OP *o)
79072805 3954{
11343788
MB
3955 dTHR;
3956 I32 type = o->op_type;
79072805 3957
11343788
MB
3958 if (o->op_flags & OPf_REF)
3959 return o;
79072805 3960
11343788
MB
3961 if (o->op_flags & OPf_KIDS) {
3962 SVOP *kid = (SVOP*)cUNOPo->op_first;
79072805
LW
3963
3964 if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) {
a0d0e21e 3965 OP *newop = newGVOP(type, OPf_REF,
85e6fe83 3966 gv_fetchpv(SvPVx(kid->op_sv, na), TRUE, SVt_PVIO));
11343788 3967 op_free(o);
79072805
LW
3968 return newop;
3969 }
3970 }
3971 else {
11343788 3972 op_free(o);
79072805 3973 if (type == OP_FTTTY)
fb73857a 3974 return newGVOP(type, OPf_REF, gv_fetchpv("main::STDIN", TRUE,
85e6fe83 3975 SVt_PVIO));
79072805
LW
3976 else
3977 return newUNOP(type, 0, newSVREF(newGVOP(OP_GV, 0, defgv)));
3978 }
11343788 3979 return o;
79072805
LW
3980}
3981
3982OP *
8ac85365 3983ck_fun(OP *o)
79072805 3984{
11343788 3985 dTHR;
79072805
LW
3986 register OP *kid;
3987 OP **tokid;
3988 OP *sibl;
3989 I32 numargs = 0;
11343788 3990 int type = o->op_type;
a0d0e21e 3991 register I32 oa = opargs[type] >> OASHIFT;
aeea060c 3992
11343788 3993 if (o->op_flags & OPf_STACKED) {
79072805
LW
3994 if ((oa & OA_OPTIONAL) && (oa >> 4) && !((oa >> 4) & OA_OPTIONAL))
3995 oa &= ~OA_OPTIONAL;
3996 else
11343788 3997 return no_fh_allowed(o);
79072805
LW
3998 }
3999
11343788
MB
4000 if (o->op_flags & OPf_KIDS) {
4001 tokid = &cLISTOPo->op_first;
4002 kid = cLISTOPo->op_first;
8990e307
LW
4003 if (kid->op_type == OP_PUSHMARK ||
4004 kid->op_type == OP_NULL && kid->op_targ == OP_PUSHMARK)
4005 {
79072805
LW
4006 tokid = &kid->op_sibling;
4007 kid = kid->op_sibling;
4008 }
a0d0e21e
LW
4009 if (!kid && opargs[type] & OA_DEFGV)
4010 *tokid = kid = newSVREF(newGVOP(OP_GV, 0, defgv));
79072805
LW
4011
4012 while (oa && kid) {
4013 numargs++;
4014 sibl = kid->op_sibling;
4015 switch (oa & 7) {
4016 case OA_SCALAR:
4017 scalar(kid);
4018 break;
4019 case OA_LIST:
4020 if (oa < 16) {
4021 kid = 0;
4022 continue;
4023 }
4024 else
4025 list(kid);
4026 break;
4027 case OA_AVREF:
4028 if (kid->op_type == OP_CONST &&
4029 (kid->op_private & OPpCONST_BARE)) {
463ee0b2 4030 char *name = SvPVx(((SVOP*)kid)->op_sv, na);
79072805 4031 OP *newop = newAVREF(newGVOP(OP_GV, 0,
85e6fe83 4032 gv_fetchpv(name, TRUE, SVt_PVAV) ));
463ee0b2 4033 if (dowarn)
ff0cee69 4034 warn("Array @%s missing the @ in argument %ld of %s()",
4035 name, (long)numargs, op_desc[type]);
79072805
LW
4036 op_free(kid);
4037 kid = newop;
4038 kid->op_sibling = sibl;
4039 *tokid = kid;
4040 }
8990e307 4041 else if (kid->op_type != OP_RV2AV && kid->op_type != OP_PADAV)
11343788 4042 bad_type(numargs, "array", op_desc[o->op_type], kid);
a0d0e21e 4043 mod(kid, type);
79072805
LW
4044 break;
4045 case OA_HVREF:
4046 if (kid->op_type == OP_CONST &&
4047 (kid->op_private & OPpCONST_BARE)) {
463ee0b2 4048 char *name = SvPVx(((SVOP*)kid)->op_sv, na);
79072805 4049 OP *newop = newHVREF(newGVOP(OP_GV, 0,
85e6fe83 4050 gv_fetchpv(name, TRUE, SVt_PVHV) ));
463ee0b2 4051 if (dowarn)
ff0cee69 4052 warn("Hash %%%s missing the %% in argument %ld of %s()",
4053 name, (long)numargs, op_desc[type]);
79072805
LW
4054 op_free(kid);
4055 kid = newop;
4056 kid->op_sibling = sibl;
4057 *tokid = kid;
4058 }
8990e307 4059 else if (kid->op_type != OP_RV2HV && kid->op_type != OP_PADHV)
11343788 4060 bad_type(numargs, "hash", op_desc[o->op_type], kid);
a0d0e21e 4061 mod(kid, type);
79072805
LW
4062 break;
4063 case OA_CVREF:
4064 {
a0d0e21e 4065 OP *newop = newUNOP(OP_NULL, 0, kid);
79072805
LW
4066 kid->op_sibling = 0;
4067 linklist(kid);
4068 newop->op_next = newop;
4069 kid = newop;
4070 kid->op_sibling = sibl;
4071 *tokid = kid;
4072 }
4073 break;
4074 case OA_FILEREF:
4075 if (kid->op_type != OP_GV) {
4076 if (kid->op_type == OP_CONST &&
4077 (kid->op_private & OPpCONST_BARE)) {
4078 OP *newop = newGVOP(OP_GV, 0,
85e6fe83
LW
4079 gv_fetchpv(SvPVx(((SVOP*)kid)->op_sv, na), TRUE,
4080 SVt_PVIO) );
79072805
LW
4081 op_free(kid);
4082 kid = newop;
4083 }
4084 else {
4085 kid->op_sibling = 0;
4086 kid = newUNOP(OP_RV2GV, 0, scalar(kid));
4087 }
4088 kid->op_sibling = sibl;
4089 *tokid = kid;
4090 }
4091 scalar(kid);
4092 break;
4093 case OA_SCALARREF:
a0d0e21e 4094 mod(scalar(kid), type);
79072805
LW
4095 break;
4096 }
4097 oa >>= 4;
4098 tokid = &kid->op_sibling;
4099 kid = kid->op_sibling;
4100 }
11343788 4101 o->op_private |= numargs;
79072805 4102 if (kid)
11343788
MB
4103 return too_many_arguments(o,op_desc[o->op_type]);
4104 listkids(o);
79072805 4105 }
a0d0e21e 4106 else if (opargs[type] & OA_DEFGV) {
11343788 4107 op_free(o);
a0d0e21e
LW
4108 return newUNOP(type, 0, newSVREF(newGVOP(OP_GV, 0, defgv)));
4109 }
4110
79072805
LW
4111 if (oa) {
4112 while (oa & OA_OPTIONAL)
4113 oa >>= 4;
4114 if (oa && oa != OA_LIST)
11343788 4115 return too_few_arguments(o,op_desc[o->op_type]);
79072805 4116 }
11343788 4117 return o;
79072805
LW
4118}
4119
4120OP *
8ac85365 4121ck_glob(OP *o)
79072805 4122{
fb73857a 4123 GV *gv;
4124
1f2bfc8a
MB
4125 if ((o->op_flags & OPf_KIDS) && !cLISTOPo->op_first->op_sibling)
4126 append_elem(OP_GLOB, o, newSVREF(newGVOP(OP_GV, 0, defgv)));
fb73857a 4127
4128 if (!((gv = gv_fetchpv("glob", FALSE, SVt_PVCV)) && GvIMPORTED_CV(gv)))
4129 gv = gv_fetchpv("CORE::GLOBAL::glob", FALSE, SVt_PVCV);
b1cb66bf 4130
4131 if (gv && GvIMPORTED_CV(gv)) {
46fc3d4c 4132 static int glob_index;
4133
5196be3e 4134 append_elem(OP_GLOB, o,
46fc3d4c 4135 newSVOP(OP_CONST, 0, newSViv(glob_index++)));
1f2bfc8a
MB
4136 o->op_type = OP_LIST;
4137 o->op_ppaddr = ppaddr[OP_LIST];
4138 cLISTOPo->op_first->op_type = OP_PUSHMARK;
4139 cLISTOPo->op_first->op_ppaddr = ppaddr[OP_PUSHMARK];
4140 o = newUNOP(OP_ENTERSUB, OPf_STACKED,
aeea060c 4141 append_elem(OP_LIST, o,
1f2bfc8a
MB
4142 scalar(newUNOP(OP_RV2CV, 0,
4143 newGVOP(OP_GV, 0, gv)))));
d58bf5aa
MB
4144 o = newUNOP(OP_NULL, 0, ck_subr(o));
4145 o->op_targ = OP_GLOB; /* hint at what it used to be */
4146 return o;
b1cb66bf 4147 }
4148 gv = newGVgen("main");
a0d0e21e 4149 gv_IOadd(gv);
11343788
MB
4150 append_elem(OP_GLOB, o, newGVOP(OP_GV, 0, gv));
4151 scalarkids(o);
4152 return ck_fun(o);
79072805
LW
4153}
4154
4155OP *
8ac85365 4156ck_grep(OP *o)
79072805
LW
4157{
4158 LOGOP *gwop;
4159 OP *kid;
11343788 4160 OPCODE type = o->op_type == OP_GREPSTART ? OP_GREPWHILE : OP_MAPWHILE;
79072805 4161
11343788 4162 o->op_ppaddr = ppaddr[OP_GREPSTART];
a0d0e21e 4163 Newz(1101, gwop, 1, LOGOP);
aeea060c 4164
11343788 4165 if (o->op_flags & OPf_STACKED) {
a0d0e21e 4166 OP* k;
11343788
MB
4167 o = ck_sort(o);
4168 kid = cLISTOPo->op_first->op_sibling;
4169 for (k = cLISTOPo->op_first->op_sibling->op_next; k; k = k->op_next) {
a0d0e21e
LW
4170 kid = k;
4171 }
4172 kid->op_next = (OP*)gwop;
11343788 4173 o->op_flags &= ~OPf_STACKED;
93a17b20 4174 }
11343788 4175 kid = cLISTOPo->op_first->op_sibling;
a0d0e21e
LW
4176 if (type == OP_MAPWHILE)
4177 list(kid);
4178 else
4179 scalar(kid);
11343788 4180 o = ck_fun(o);
79072805 4181 if (error_count)
11343788 4182 return o;
aeea060c 4183 kid = cLISTOPo->op_first->op_sibling;
79072805 4184 if (kid->op_type != OP_NULL)
463ee0b2 4185 croak("panic: ck_grep");
79072805
LW
4186 kid = kUNOP->op_first;
4187
a0d0e21e
LW
4188 gwop->op_type = type;
4189 gwop->op_ppaddr = ppaddr[type];
11343788 4190 gwop->op_first = listkids(o);
79072805
LW
4191 gwop->op_flags |= OPf_KIDS;
4192 gwop->op_private = 1;
4193 gwop->op_other = LINKLIST(kid);
a0d0e21e 4194 gwop->op_targ = pad_alloc(type, SVs_PADTMP);
79072805
LW
4195 kid->op_next = (OP*)gwop;
4196
11343788 4197 kid = cLISTOPo->op_first->op_sibling;
a0d0e21e 4198 if (!kid || !kid->op_sibling)
11343788 4199 return too_few_arguments(o,op_desc[o->op_type]);
a0d0e21e
LW
4200 for (kid = kid->op_sibling; kid; kid = kid->op_sibling)
4201 mod(kid, OP_GREPSTART);
4202
79072805
LW
4203 return (OP*)gwop;
4204}
4205
4206OP *
8ac85365 4207ck_index(OP *o)
79072805 4208{
11343788
MB
4209 if (o->op_flags & OPf_KIDS) {
4210 OP *kid = cLISTOPo->op_first->op_sibling; /* get past pushmark */
79072805 4211 if (kid && kid->op_type == OP_CONST)
bbce6d69 4212 fbm_compile(((SVOP*)kid)->op_sv);
79072805 4213 }
11343788 4214 return ck_fun(o);
79072805
LW
4215}
4216
4217OP *
8ac85365 4218ck_lengthconst(OP *o)
79072805
LW
4219{
4220 /* XXX length optimization goes here */
11343788 4221 return ck_fun(o);
79072805
LW
4222}
4223
4224OP *
8ac85365 4225ck_lfun(OP *o)
79072805 4226{
5dc0d613
MB
4227 OPCODE type = o->op_type;
4228 return modkids(ck_fun(o), type);
79072805
LW
4229}
4230
4231OP *
8ac85365 4232ck_rfun(OP *o)
8990e307 4233{
5dc0d613
MB
4234 OPCODE type = o->op_type;
4235 return refkids(ck_fun(o), type);
8990e307
LW
4236}
4237
4238OP *
8ac85365 4239ck_listiob(OP *o)
79072805
LW
4240{
4241 register OP *kid;
aeea060c 4242
11343788 4243 kid = cLISTOPo->op_first;
79072805 4244 if (!kid) {
11343788
MB
4245 o = force_list(o);
4246 kid = cLISTOPo->op_first;
79072805
LW
4247 }
4248 if (kid->op_type == OP_PUSHMARK)
4249 kid = kid->op_sibling;
11343788 4250 if (kid && o->op_flags & OPf_STACKED)
79072805
LW
4251 kid = kid->op_sibling;
4252 else if (kid && !kid->op_sibling) { /* print HANDLE; */
4253 if (kid->op_type == OP_CONST && kid->op_private & OPpCONST_BARE) {
11343788 4254 o->op_flags |= OPf_STACKED; /* make it a filehandle */
748a9306 4255 kid = newUNOP(OP_RV2GV, OPf_REF, scalar(kid));
11343788
MB
4256 cLISTOPo->op_first->op_sibling = kid;
4257 cLISTOPo->op_last = kid;
79072805
LW
4258 kid = kid->op_sibling;
4259 }
4260 }
4261
4262 if (!kid)
11343788 4263 append_elem(o->op_type, o, newSVREF(newGVOP(OP_GV, 0, defgv)) );
79072805 4264
5dc0d613 4265 o = listkids(o);
bbce6d69 4266
5dc0d613 4267 o->op_private = 0;
36477c24 4268#ifdef USE_LOCALE
bbce6d69 4269 if (hints & HINT_LOCALE)
5dc0d613 4270 o->op_private |= OPpLOCALE;
bbce6d69 4271#endif
4272
5dc0d613 4273 return o;
bbce6d69 4274}
4275
4276OP *
8ac85365 4277ck_fun_locale(OP *o)
bbce6d69 4278{
5dc0d613 4279 o = ck_fun(o);
bbce6d69 4280
5dc0d613 4281 o->op_private = 0;
36477c24 4282#ifdef USE_LOCALE
bbce6d69 4283 if (hints & HINT_LOCALE)
5dc0d613 4284 o->op_private |= OPpLOCALE;
bbce6d69 4285#endif
4286
5dc0d613 4287 return o;
bbce6d69 4288}
4289
4290OP *
8ac85365 4291ck_scmp(OP *o)
bbce6d69 4292{
5dc0d613 4293 o->op_private = 0;
36477c24 4294#ifdef USE_LOCALE
bbce6d69 4295 if (hints & HINT_LOCALE)
5dc0d613 4296 o->op_private |= OPpLOCALE;
bbce6d69 4297#endif
36477c24 4298
5dc0d613 4299 return o;
79072805
LW
4300}
4301
4302OP *
8ac85365 4303ck_match(OP *o)
79072805 4304{
5dc0d613 4305 o->op_private |= OPpRUNTIME;
11343788 4306 return o;
79072805
LW
4307}
4308
4309OP *
8ac85365 4310ck_null(OP *o)
79072805 4311{
11343788 4312 return o;
79072805
LW
4313}
4314
4315OP *
8ac85365 4316ck_repeat(OP *o)
79072805 4317{
11343788
MB
4318 if (cBINOPo->op_first->op_flags & OPf_PARENS) {
4319 o->op_private |= OPpREPEAT_DOLIST;
4320 cBINOPo->op_first = force_list(cBINOPo->op_first);
79072805
LW
4321 }
4322 else
11343788
MB
4323 scalar(o);
4324 return o;
79072805
LW
4325}
4326
4327OP *
8ac85365 4328ck_require(OP *o)
8990e307 4329{
11343788
MB
4330 if (o->op_flags & OPf_KIDS) { /* Shall we supply missing .pm? */
4331 SVOP *kid = (SVOP*)cUNOPo->op_first;
8990e307
LW
4332
4333 if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) {
8990e307 4334 char *s;
a0d0e21e
LW
4335 for (s = SvPVX(kid->op_sv); *s; s++) {
4336 if (*s == ':' && s[1] == ':') {
4337 *s = '/';
1aef975c 4338 Move(s+2, s+1, strlen(s+2)+1, char);
a0d0e21e
LW
4339 --SvCUR(kid->op_sv);
4340 }
8990e307 4341 }
a0d0e21e 4342 sv_catpvn(kid->op_sv, ".pm", 3);
8990e307
LW
4343 }
4344 }
11343788 4345 return ck_fun(o);
8990e307
LW
4346}
4347
4348OP *
8ac85365 4349ck_retarget(OP *o)
79072805 4350{
463ee0b2 4351 croak("NOT IMPL LINE %d",__LINE__);
79072805 4352 /* STUB */
11343788 4353 return o;
79072805
LW
4354}
4355
4356OP *
8ac85365 4357ck_select(OP *o)
79072805 4358{
c07a80fd 4359 OP* kid;
11343788
MB
4360 if (o->op_flags & OPf_KIDS) {
4361 kid = cLISTOPo->op_first->op_sibling; /* get past pushmark */
2304df62 4362 if (kid && kid->op_sibling) {
11343788
MB
4363 o->op_type = OP_SSELECT;
4364 o->op_ppaddr = ppaddr[OP_SSELECT];
4365 o = ck_fun(o);
4366 return fold_constants(o);
79072805
LW
4367 }
4368 }
11343788
MB
4369 o = ck_fun(o);
4370 kid = cLISTOPo->op_first->op_sibling; /* get past pushmark */
c07a80fd 4371 if (kid && kid->op_type == OP_RV2GV)
4372 kid->op_private &= ~HINT_STRICT_REFS;
11343788 4373 return o;
79072805
LW
4374}
4375
4376OP *
8ac85365 4377ck_shift(OP *o)
79072805 4378{
11343788 4379 I32 type = o->op_type;
79072805 4380
11343788 4381 if (!(o->op_flags & OPf_KIDS)) {
6d4ff0d2
MB
4382 OP *argop;
4383
11343788 4384 op_free(o);
6d4ff0d2
MB
4385#ifdef USE_THREADS
4386 if (subline) {
4387 argop = newOP(OP_PADAV, OPf_REF);
4388 argop->op_targ = 0; /* curpad[0] is @_ */
4389 }
4390 else {
4391 argop = newUNOP(OP_RV2AV, 0,
4392 scalar(newGVOP(OP_GV, 0,
4393 gv_fetchpv("ARGV", TRUE, SVt_PVAV))));
4394 }
4395#else
4396 argop = newUNOP(OP_RV2AV, 0,
4397 scalar(newGVOP(OP_GV, 0, subline ?
4398 defgv : gv_fetchpv("ARGV", TRUE, SVt_PVAV))));
4399#endif /* USE_THREADS */
4400 return newUNOP(type, 0, scalar(argop));
79072805 4401 }
11343788 4402 return scalar(modkids(ck_fun(o), type));
79072805
LW
4403}
4404
4405OP *
8ac85365 4406ck_sort(OP *o)
79072805 4407{
5dc0d613 4408 o->op_private = 0;
36477c24 4409#ifdef USE_LOCALE
bbce6d69 4410 if (hints & HINT_LOCALE)
5dc0d613 4411 o->op_private |= OPpLOCALE;
bbce6d69 4412#endif
4413
11343788
MB
4414 if (o->op_flags & OPf_STACKED) {
4415 OP *kid = cLISTOPo->op_first->op_sibling; /* get past pushmark */
463ee0b2
LW
4416 OP *k;
4417 kid = kUNOP->op_first; /* get past rv2gv */
79072805 4418
463ee0b2 4419 if (kid->op_type == OP_SCOPE || kid->op_type == OP_LEAVE) {
79072805 4420 linklist(kid);
463ee0b2
LW
4421 if (kid->op_type == OP_SCOPE) {
4422 k = kid->op_next;
4423 kid->op_next = 0;
79072805 4424 }
463ee0b2 4425 else if (kid->op_type == OP_LEAVE) {
11343788 4426 if (o->op_type == OP_SORT) {
748a9306
LW
4427 null(kid); /* wipe out leave */
4428 kid->op_next = kid;
463ee0b2 4429
748a9306
LW
4430 for (k = kLISTOP->op_first->op_next; k; k = k->op_next) {
4431 if (k->op_next == kid)
4432 k->op_next = 0;
4433 }
463ee0b2 4434 }
748a9306
LW
4435 else
4436 kid->op_next = 0; /* just disconnect the leave */
a0d0e21e 4437 k = kLISTOP->op_first;
463ee0b2 4438 }
a0d0e21e
LW
4439 peep(k);
4440
11343788 4441 kid = cLISTOPo->op_first->op_sibling; /* get past pushmark */
8990e307 4442 null(kid); /* wipe out rv2gv */
11343788 4443 if (o->op_type == OP_SORT)
a0d0e21e
LW
4444 kid->op_next = kid;
4445 else
4446 kid->op_next = k;
11343788 4447 o->op_flags |= OPf_SPECIAL;
79072805
LW
4448 }
4449 }
bbce6d69 4450
11343788 4451 return o;
79072805
LW
4452}
4453
4454OP *
8ac85365 4455ck_split(OP *o)
79072805
LW
4456{
4457 register OP *kid;
aeea060c 4458
11343788
MB
4459 if (o->op_flags & OPf_STACKED)
4460 return no_fh_allowed(o);
79072805 4461
11343788 4462 kid = cLISTOPo->op_first;
8990e307 4463 if (kid->op_type != OP_NULL)
463ee0b2 4464 croak("panic: ck_split");
8990e307 4465 kid = kid->op_sibling;
11343788
MB
4466 op_free(cLISTOPo->op_first);
4467 cLISTOPo->op_first = kid;
85e6fe83 4468 if (!kid) {
11343788
MB
4469 cLISTOPo->op_first = kid = newSVOP(OP_CONST, 0, newSVpv(" ", 1));
4470 cLISTOPo->op_last = kid; /* There was only one element previously */
85e6fe83 4471 }
79072805
LW
4472
4473 if (kid->op_type != OP_MATCH) {
4474 OP *sibl = kid->op_sibling;
463ee0b2 4475 kid->op_sibling = 0;
79072805 4476 kid = pmruntime( newPMOP(OP_MATCH, OPf_SPECIAL), kid, Nullop);
11343788
MB
4477 if (cLISTOPo->op_first == cLISTOPo->op_last)
4478 cLISTOPo->op_last = kid;
4479 cLISTOPo->op_first = kid;
79072805
LW
4480 kid->op_sibling = sibl;
4481 }
4482
4483 kid->op_type = OP_PUSHRE;
4484 kid->op_ppaddr = ppaddr[OP_PUSHRE];
4485 scalar(kid);
4486
4487 if (!kid->op_sibling)
11343788 4488 append_elem(OP_SPLIT, o, newSVREF(newGVOP(OP_GV, 0, defgv)) );
79072805
LW
4489
4490 kid = kid->op_sibling;
4491 scalar(kid);
4492
4493 if (!kid->op_sibling)
11343788 4494 append_elem(OP_SPLIT, o, newSVOP(OP_CONST, 0, newSViv(0)));
79072805
LW
4495
4496 kid = kid->op_sibling;
4497 scalar(kid);
4498
4499 if (kid->op_sibling)
11343788 4500 return too_many_arguments(o,op_desc[o->op_type]);
79072805 4501
11343788 4502 return o;
79072805
LW
4503}
4504
4505OP *
8ac85365 4506ck_subr(OP *o)
79072805 4507{
11343788
MB
4508 dTHR;
4509 OP *prev = ((cUNOPo->op_first->op_sibling)
4510 ? cUNOPo : ((UNOP*)cUNOPo->op_first))->op_first;
4511 OP *o2 = prev->op_sibling;
4633a7c4
LW
4512 OP *cvop;
4513 char *proto = 0;
4514 CV *cv = 0;
46fc3d4c 4515 GV *namegv = 0;
4633a7c4
LW
4516 int optional = 0;
4517 I32 arg = 0;
4518
11343788 4519 for (cvop = o2; cvop->op_sibling; cvop = cvop->op_sibling) ;
4633a7c4
LW
4520 if (cvop->op_type == OP_RV2CV) {
4521 SVOP* tmpop;
11343788 4522 o->op_private |= (cvop->op_private & OPpENTERSUB_AMPER);
4633a7c4
LW
4523 null(cvop); /* disable rv2cv */
4524 tmpop = (SVOP*)((UNOP*)cvop)->op_first;
4525 if (tmpop->op_type == OP_GV) {
8ebc5c01 4526 cv = GvCVu(tmpop->op_sv);
5dc0d613 4527 if (cv && SvPOK(cv) && !(o->op_private & OPpENTERSUB_AMPER)) {
46fc3d4c 4528 namegv = CvANON(cv) ? (GV*)tmpop->op_sv : CvGV(cv);
4529 proto = SvPV((SV*)cv, na);
4530 }
4633a7c4
LW
4531 }
4532 }
11343788 4533 o->op_private |= (hints & HINT_STRICT_REFS);
84902520 4534 if (PERLDB_SUB && curstash != debstash)
11343788
MB
4535 o->op_private |= OPpENTERSUB_DB;
4536 while (o2 != cvop) {
4633a7c4
LW
4537 if (proto) {
4538 switch (*proto) {
4539 case '\0':
5dc0d613 4540 return too_many_arguments(o, gv_ename(namegv));
4633a7c4
LW
4541 case ';':
4542 optional = 1;
4543 proto++;
4544 continue;
4545 case '$':
4546 proto++;
4547 arg++;
11343788 4548 scalar(o2);
4633a7c4
LW
4549 break;
4550 case '%':
4551 case '@':
11343788 4552 list(o2);
4633a7c4
LW
4553 arg++;
4554 break;
4555 case '&':
4556 proto++;
4557 arg++;
11343788 4558 if (o2->op_type != OP_REFGEN && o2->op_type != OP_UNDEF)
5dc0d613 4559 bad_type(arg, "block", gv_ename(namegv), o2);
4633a7c4
LW
4560 break;
4561 case '*':
4562 proto++;
4563 arg++;
11343788 4564 if (o2->op_type == OP_RV2GV)
4633a7c4
LW
4565 goto wrapref;
4566 {
11343788
MB
4567 OP* kid = o2;
4568 o2 = newUNOP(OP_RV2GV, 0, kid);
4569 o2->op_sibling = kid->op_sibling;
4633a7c4
LW
4570 kid->op_sibling = 0;
4571 prev->op_sibling = o;
4572 }
4573 goto wrapref;
4574 case '\\':
4575 proto++;
4576 arg++;
4577 switch (*proto++) {
4578 case '*':
11343788 4579 if (o2->op_type != OP_RV2GV)
5dc0d613 4580 bad_type(arg, "symbol", gv_ename(namegv), o2);
4633a7c4
LW
4581 goto wrapref;
4582 case '&':
11343788 4583 if (o2->op_type != OP_RV2CV)
5dc0d613 4584 bad_type(arg, "sub", gv_ename(namegv), o2);
4633a7c4
LW
4585 goto wrapref;
4586 case '$':
11343788 4587 if (o2->op_type != OP_RV2SV && o2->op_type != OP_PADSV)
5dc0d613 4588 bad_type(arg, "scalar", gv_ename(namegv), o2);
4633a7c4
LW
4589 goto wrapref;
4590 case '@':
11343788 4591 if (o2->op_type != OP_RV2AV && o2->op_type != OP_PADAV)
5dc0d613 4592 bad_type(arg, "array", gv_ename(namegv), o2);
4633a7c4
LW
4593 goto wrapref;
4594 case '%':
11343788 4595 if (o2->op_type != OP_RV2HV && o2->op_type != OP_PADHV)
5dc0d613 4596 bad_type(arg, "hash", gv_ename(namegv), o2);
4633a7c4
LW
4597 wrapref:
4598 {
11343788
MB
4599 OP* kid = o2;
4600 o2 = newUNOP(OP_REFGEN, 0, kid);
4601 o2->op_sibling = kid->op_sibling;
4633a7c4 4602 kid->op_sibling = 0;
e858de61 4603 prev->op_sibling = o2;
4633a7c4
LW
4604 }
4605 break;
4606 default: goto oops;
4607 }
4608 break;
b1cb66bf 4609 case ' ':
4610 proto++;
4611 continue;
4633a7c4
LW
4612 default:
4613 oops:
4614 croak("Malformed prototype for %s: %s",
46fc3d4c 4615 gv_ename(namegv), SvPV((SV*)cv, na));
4633a7c4
LW
4616 }
4617 }
4618 else
11343788
MB
4619 list(o2);
4620 mod(o2, OP_ENTERSUB);
4621 prev = o2;
4622 o2 = o2->op_sibling;
4633a7c4 4623 }
fb73857a 4624 if (proto && !optional &&
4625 (*proto && *proto != '@' && *proto != '%' && *proto != ';'))
5dc0d613 4626 return too_few_arguments(o, gv_ename(namegv));
11343788 4627 return o;
79072805
LW
4628}
4629
4630OP *
8ac85365 4631ck_svconst(OP *o)
8990e307 4632{
11343788
MB
4633 SvREADONLY_on(cSVOPo->op_sv);
4634 return o;
8990e307
LW
4635}
4636
4637OP *
8ac85365 4638ck_trunc(OP *o)
79072805 4639{
11343788
MB
4640 if (o->op_flags & OPf_KIDS) {
4641 SVOP *kid = (SVOP*)cUNOPo->op_first;
79072805 4642
a0d0e21e
LW
4643 if (kid->op_type == OP_NULL)
4644 kid = (SVOP*)kid->op_sibling;
4645 if (kid &&
4646 kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE))
11343788 4647 o->op_flags |= OPf_SPECIAL;
79072805 4648 }
11343788 4649 return ck_fun(o);
79072805
LW
4650}
4651
463ee0b2
LW
4652/* A peephole optimizer. We visit the ops in the order they're to execute. */
4653
79072805 4654void
8ac85365 4655peep(register OP *o)
79072805 4656{
11343788 4657 dTHR;
79072805 4658 register OP* oldop = 0;
a0d0e21e 4659 if (!o || o->op_seq)
79072805 4660 return;
a0d0e21e 4661 ENTER;
462e5cf6 4662 SAVEOP();
a0d0e21e
LW
4663 SAVESPTR(curcop);
4664 for (; o; o = o->op_next) {
4665 if (o->op_seq)
4666 break;
c07a80fd 4667 if (!op_seqmax)
4668 op_seqmax++;
a0d0e21e
LW
4669 op = o;
4670 switch (o->op_type) {
4671 case OP_NEXTSTATE:
4672 case OP_DBSTATE:
4673 curcop = ((COP*)o); /* for warnings */
c07a80fd 4674 o->op_seq = op_seqmax++;
a0d0e21e
LW
4675 break;
4676
4677 case OP_CONCAT:
4678 case OP_CONST:
4679 case OP_JOIN:
4680 case OP_UC:
4681 case OP_UCFIRST:
4682 case OP_LC:
4683 case OP_LCFIRST:
4684 case OP_QUOTEMETA:
3c4f770c 4685 if (o->op_next && o->op_next->op_type == OP_STRINGIFY)
a0d0e21e 4686 null(o->op_next);
c07a80fd 4687 o->op_seq = op_seqmax++;
a0d0e21e 4688 break;
8990e307 4689 case OP_STUB:
54310121 4690 if ((o->op_flags & OPf_WANT) != OPf_WANT_LIST) {
c07a80fd 4691 o->op_seq = op_seqmax++;
54310121 4692 break; /* Scalar stub must produce undef. List stub is noop */
8990e307 4693 }
748a9306 4694 goto nothin;
79072805 4695 case OP_NULL:
748a9306
LW
4696 if (o->op_targ == OP_NEXTSTATE || o->op_targ == OP_DBSTATE)
4697 curcop = ((COP*)op);
4698 goto nothin;
79072805 4699 case OP_SCALAR:
93a17b20 4700 case OP_LINESEQ:
463ee0b2 4701 case OP_SCOPE:
748a9306 4702 nothin:
a0d0e21e
LW
4703 if (oldop && o->op_next) {
4704 oldop->op_next = o->op_next;
79072805
LW
4705 continue;
4706 }
c07a80fd 4707 o->op_seq = op_seqmax++;
79072805
LW
4708 break;
4709
4710 case OP_GV:
a0d0e21e 4711 if (o->op_next->op_type == OP_RV2SV) {
5f05dabc 4712 if (!(o->op_next->op_private & OPpDEREF)) {
a0d0e21e
LW
4713 null(o->op_next);
4714 o->op_private |= o->op_next->op_private & OPpLVAL_INTRO;
4715 o->op_next = o->op_next->op_next;
4716 o->op_type = OP_GVSV;
4717 o->op_ppaddr = ppaddr[OP_GVSV];
8990e307
LW
4718 }
4719 }
a0d0e21e
LW
4720 else if (o->op_next->op_type == OP_RV2AV) {
4721 OP* pop = o->op_next->op_next;
4722 IV i;
8990e307 4723 if (pop->op_type == OP_CONST &&
e858de61 4724 (op = pop->op_next) &&
8990e307 4725 pop->op_next->op_type == OP_AELEM &&
a0d0e21e 4726 !(pop->op_next->op_private &
68dc0745 4727 (OPpLVAL_INTRO|OPpLVAL_DEFER|OPpDEREF)) &&
a0d0e21e
LW
4728 (i = SvIV(((SVOP*)pop)->op_sv) - compiling.cop_arybase)
4729 <= 255 &&
8990e307
LW
4730 i >= 0)
4731 {
748a9306 4732 SvREFCNT_dec(((SVOP*)pop)->op_sv);
a0d0e21e 4733 null(o->op_next);
8990e307
LW
4734 null(pop->op_next);
4735 null(pop);
a0d0e21e
LW
4736 o->op_flags |= pop->op_next->op_flags & OPf_MOD;
4737 o->op_next = pop->op_next->op_next;
4738 o->op_type = OP_AELEMFAST;
4739 o->op_ppaddr = ppaddr[OP_AELEMFAST];
4740 o->op_private = (U8)i;
a6006777 4741 GvAVn(((GVOP*)o)->op_gv);
8990e307 4742 }
79072805 4743 }
c07a80fd 4744 o->op_seq = op_seqmax++;
79072805
LW
4745 break;
4746
af41f3ca
MB
4747 case OP_PADAV:
4748 if (o->op_next->op_type == OP_RV2AV
4749 && (o->op_next->op_flags && OPf_REF))
4750 {
4751 null(o->op_next);
4752 o->op_next = o->op_next->op_next;
4753 }
4754 break;
aeea060c 4755
af41f3ca
MB
4756 case OP_PADHV:
4757 if (o->op_next->op_type == OP_RV2HV
4758 && (o->op_next->op_flags && OPf_REF))
4759 {
4760 null(o->op_next);
4761 o->op_next = o->op_next->op_next;
4762 }
4763 break;
4764
a0d0e21e 4765 case OP_MAPWHILE:
79072805
LW
4766 case OP_GREPWHILE:
4767 case OP_AND:
4768 case OP_OR:
c07a80fd 4769 o->op_seq = op_seqmax++;
79072805
LW
4770 peep(cLOGOP->op_other);
4771 break;
4772
4773 case OP_COND_EXPR:
c07a80fd 4774 o->op_seq = op_seqmax++;
79072805
LW
4775 peep(cCONDOP->op_true);
4776 peep(cCONDOP->op_false);
4777 break;
4778
4779 case OP_ENTERLOOP:
c07a80fd 4780 o->op_seq = op_seqmax++;
79072805
LW
4781 peep(cLOOP->op_redoop);
4782 peep(cLOOP->op_nextop);
4783 peep(cLOOP->op_lastop);
4784 break;
4785
4786 case OP_MATCH:
4787 case OP_SUBST:
c07a80fd 4788 o->op_seq = op_seqmax++;
a0d0e21e 4789 peep(cPMOP->op_pmreplstart);
79072805
LW
4790 break;
4791
a0d0e21e 4792 case OP_EXEC:
c07a80fd 4793 o->op_seq = op_seqmax++;
a0d0e21e
LW
4794 if (dowarn && o->op_next && o->op_next->op_type == OP_NEXTSTATE) {
4795 if (o->op_next->op_sibling &&
4796 o->op_next->op_sibling->op_type != OP_DIE) {
4797 line_t oldline = curcop->cop_line;
4798
4799 curcop->cop_line = ((COP*)o->op_next)->cop_line;
4800 warn("Statement unlikely to be reached");
4801 warn("(Maybe you meant system() when you said exec()?)\n");
4802 curcop->cop_line = oldline;
4803 }
4804 }
4805 break;
aeea060c 4806
c750a3ec
MB
4807 case OP_HELEM: {
4808 UNOP *rop;
4809 SV *lexname;
4810 GV **fields;
4811 SV **svp, **indsvp;
4812 I32 ind;
4813 char *key;
4814 STRLEN keylen;
aeea060c 4815
c750a3ec
MB
4816 if (o->op_private & (OPpDEREF_HV|OPpDEREF_AV|OPpLVAL_INTRO)
4817 || ((BINOP*)o)->op_last->op_type != OP_CONST)
4818 break;
4819 rop = (UNOP*)((BINOP*)o)->op_first;
4820 if (rop->op_type != OP_RV2HV || rop->op_first->op_type != OP_PADSV)
4821 break;
4822 lexname = *av_fetch(comppad_name, rop->op_first->op_targ, TRUE);
4823 if (!SvOBJECT(lexname))
4824 break;
5196be3e 4825 fields = (GV**)hv_fetch(SvSTASH(lexname), "FIELDS", 6, FALSE);
c750a3ec
MB
4826 if (!fields || !GvHV(*fields))
4827 break;
4828 svp = &((SVOP*)((BINOP*)o)->op_last)->op_sv;
4829 key = SvPV(*svp, keylen);
4830 indsvp = hv_fetch(GvHV(*fields), key, keylen, FALSE);
4831 if (!indsvp) {
4832 croak("No such field \"%s\" in variable %s of type %s",
4833 key, SvPV(lexname, na), HvNAME(SvSTASH(lexname)));
4834 }
4835 ind = SvIV(*indsvp);
4836 if (ind < 1)
4837 croak("Bad index while coercing array into hash");
4838 rop->op_type = OP_RV2AV;
4839 rop->op_ppaddr = ppaddr[OP_RV2AV];
4840 o->op_type = OP_AELEM;
4841 o->op_ppaddr = ppaddr[OP_AELEM];
4842 SvREFCNT_dec(*svp);
4843 *svp = newSViv(ind);
4844 break;
4845 }
4846
79072805 4847 default:
c07a80fd 4848 o->op_seq = op_seqmax++;
79072805
LW
4849 break;
4850 }
a0d0e21e 4851 oldop = o;
79072805 4852 }
a0d0e21e 4853 LEAVE;
79072805 4854}