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