This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perl 5.0 alpha 8
[perl5.git] / op.c
CommitLineData
79072805
LW
1/* $RCSfile: cmd.h,v $$Revision: 4.1 $$Date: 92/08/07 17:19:19 $
2 *
3 * Copyright (c) 1991, Larry Wall
4 *
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
7 *
8 * $Log: cmd.h,v $
9 */
10
11#include "EXTERN.h"
12#include "perl.h"
13
79072805
LW
14/* Lowest byte of opargs */
15#define OA_MARK 1
16#define OA_FOLDCONST 2
17#define OA_RETSCALAR 4
18#define OA_TARGET 8
19#define OA_RETINTEGER 16
20#define OA_OTHERINT 32
21#define OA_DANGEROUS 64
22
23/* Remaining nybbles of opargs */
24#define OA_SCALAR 1
25#define OA_LIST 2
26#define OA_AVREF 3
27#define OA_HVREF 4
28#define OA_CVREF 5
29#define OA_FILEREF 6
30#define OA_SCALARREF 7
31#define OA_OPTIONAL 8
32
79072805
LW
33void
34cpy7bit(d,s,l)
35register char *d;
36register char *s;
37register I32 l;
38{
39 while (l--)
40 *d++ = *s++ & 127;
41 *d = '\0';
42}
43
8990e307 44static OP *
79072805
LW
45no_fh_allowed(op)
46OP *op;
47{
48 sprintf(tokenbuf,"Missing comma after first argument to %s function",
49 op_name[op->op_type]);
50 yyerror(tokenbuf);
51 return op;
52}
53
8990e307 54static OP *
79072805
LW
55too_few_arguments(op)
56OP *op;
57{
58 sprintf(tokenbuf,"Not enough arguments for %s", op_name[op->op_type]);
59 yyerror(tokenbuf);
60 return op;
61}
62
8990e307 63static OP *
79072805
LW
64too_many_arguments(op)
65OP *op;
66{
67 sprintf(tokenbuf,"Too many arguments for %s", op_name[op->op_type]);
68 yyerror(tokenbuf);
69 return op;
70}
71
8990e307
LW
72static OP *
73bad_type(n, t, op, kid)
74I32 n;
75char *t;
76OP *op;
77OP *kid;
78{
79 sprintf(tokenbuf, "Type of arg %d to %s must be %s (not %s)",
80 n, op_name[op->op_type], t, op_name[kid->op_type]);
81 yyerror(tokenbuf);
82 return op;
83}
84
79072805
LW
85/* "register" allocation */
86
87PADOFFSET
93a17b20
LW
88pad_allocmy(name)
89char *name;
90{
ed6116ce 91 PADOFFSET off = pad_alloc(OP_PADSV, SVs_PADMY);
93a17b20
LW
92 SV *sv = NEWSV(0,0);
93 sv_upgrade(sv, SVt_PVNV);
94 sv_setpv(sv, name);
8990e307 95 av_store(comppad_name, off, sv);
463ee0b2 96 SvNVX(sv) = (double)cop_seqmax;
8990e307
LW
97 SvIVX(sv) = 0; /* Not yet introduced--see newSTATEOP */
98 if (!min_intro_pending)
99 min_intro_pending = off;
100 max_intro_pending = off;
93a17b20 101 if (*name == '@')
463ee0b2 102 av_store(comppad, off, (SV*)newAV());
93a17b20 103 else if (*name == '%')
463ee0b2 104 av_store(comppad, off, (SV*)newHV());
ed6116ce 105 SvPADMY_on(curpad[off]);
93a17b20
LW
106 return off;
107}
108
109PADOFFSET
110pad_findmy(name)
111char *name;
112{
113 I32 off;
114 SV *sv;
8990e307 115 SV **svp = AvARRAY(comppad_name);
93a17b20
LW
116 register I32 i;
117 register CONTEXT *cx;
118 bool saweval;
119 AV *curlist;
120 AV *curname;
121 CV *cv;
463ee0b2 122 I32 seq = cop_seqmax;
93a17b20 123
8990e307
LW
124 /* The one we're looking for is probably just before comppad_name_fill. */
125 for (off = comppad_name_fill; off > 0; off--) {
93a17b20 126 if ((sv = svp[off]) &&
463ee0b2
LW
127 seq <= SvIVX(sv) &&
128 seq > (I32)SvNVX(sv) &&
129 strEQ(SvPVX(sv), name))
93a17b20
LW
130 {
131 return (PADOFFSET)off;
132 }
133 }
134
135 /* Nothing in current lexical context--try eval's context, if any.
136 * This is necessary to let the perldb get at lexically scoped variables.
137 * XXX This will also probably interact badly with eval tree caching.
138 */
139
140 saweval = FALSE;
141 for (i = cxstack_ix; i >= 0; i--) {
142 cx = &cxstack[i];
143 switch (cx->cx_type) {
144 default:
145 break;
146 case CXt_EVAL:
147 saweval = TRUE;
148 break;
149 case CXt_SUB:
150 if (!saweval)
151 return 0;
152 cv = cx->blk_sub.cv;
153 if (debstash && CvSTASH(cv) == debstash) /* ignore DB'* scope */
154 continue;
155 seq = cxstack[i+1].blk_oldcop->cop_seq;
156 curlist = CvPADLIST(cv);
157 curname = (AV*)*av_fetch(curlist, 0, FALSE);
158 svp = AvARRAY(curname);
159 for (off = AvFILL(curname); off > 0; off--) {
160 if ((sv = svp[off]) &&
463ee0b2
LW
161 seq <= SvIVX(sv) &&
162 seq > (I32)SvNVX(sv) &&
163 strEQ(SvPVX(sv), name))
93a17b20 164 {
ed6116ce 165 PADOFFSET newoff = pad_alloc(OP_PADSV, SVs_PADMY);
93a17b20
LW
166 AV *oldpad = (AV*)*av_fetch(curlist, CvDEPTH(cv), FALSE);
167 SV *oldsv = *av_fetch(oldpad, off, TRUE);
168 SV *sv = NEWSV(0,0);
169 sv_upgrade(sv, SVt_PVNV);
170 sv_setpv(sv, name);
8990e307 171 av_store(comppad_name, newoff, sv);
463ee0b2 172 SvNVX(sv) = (double)curcop->cop_seq;
8990e307
LW
173 SvIVX(sv) = 999999999; /* A ref, intro immediately */
174 av_store(comppad, newoff, SvREFCNT_inc(oldsv));
93a17b20
LW
175 return newoff;
176 }
177 }
178 return 0;
179 }
180 }
181
182 return 0;
183}
184
185void
186pad_leavemy(fill)
187I32 fill;
188{
189 I32 off;
8990e307 190 SV **svp = AvARRAY(comppad_name);
93a17b20 191 SV *sv;
8990e307
LW
192 if (min_intro_pending && fill < min_intro_pending) {
193 for (off = max_intro_pending; off >= min_intro_pending; off--) {
194 if (sv = svp[off])
195 warn("%s never introduced", SvPVX(sv));
196 }
197 }
198 /* "Deintroduce" my variables that are leaving with this scope. */
199 for (off = AvFILL(comppad_name); off > fill; off--) {
93a17b20 200 if (sv = svp[off])
463ee0b2 201 SvIVX(sv) = cop_seqmax;
93a17b20
LW
202 }
203}
204
205PADOFFSET
79072805
LW
206pad_alloc(optype,tmptype)
207I32 optype;
ed6116ce 208U32 tmptype;
79072805
LW
209{
210 SV *sv;
211 I32 retval;
212
213 if (AvARRAY(comppad) != curpad)
463ee0b2 214 croak("panic: pad_alloc");
ed6116ce 215 if (tmptype & SVs_PADMY) {
79072805
LW
216 do {
217 sv = *av_fetch(comppad, AvFILL(comppad) + 1, TRUE);
ed6116ce 218 } while (SvPADBUSY(sv)); /* need a fresh one */
79072805
LW
219 retval = AvFILL(comppad);
220 }
221 else {
222 do {
223 sv = *av_fetch(comppad, ++padix, TRUE);
8990e307 224 } while (SvFLAGS(sv) & (SVs_PADTMP|SVs_PADMY));
79072805
LW
225 retval = padix;
226 }
8990e307 227 SvFLAGS(sv) |= tmptype;
79072805
LW
228 curpad = AvARRAY(comppad);
229 DEBUG_X(fprintf(stderr, "Pad alloc %d for %s\n", retval, op_name[optype]));
230 return (PADOFFSET)retval;
231}
232
233SV *
8990e307 234#ifndef STANDARD_C
79072805
LW
235pad_sv(po)
236PADOFFSET po;
8990e307
LW
237#else
238pad_sv(PADOFFSET po)
239#endif /* STANDARD_C */
79072805
LW
240{
241 if (!po)
463ee0b2 242 croak("panic: pad_sv po");
79072805
LW
243 DEBUG_X(fprintf(stderr, "Pad sv %d\n", po));
244 return curpad[po]; /* eventually we'll turn this into a macro */
245}
246
247void
8990e307 248#ifndef STANDARD_C
79072805
LW
249pad_free(po)
250PADOFFSET po;
8990e307
LW
251#else
252pad_free(PADOFFSET po)
253#endif /* STANDARD_C */
79072805
LW
254{
255 if (AvARRAY(comppad) != curpad)
463ee0b2 256 croak("panic: pad_free curpad");
79072805 257 if (!po)
463ee0b2 258 croak("panic: pad_free po");
79072805
LW
259 DEBUG_X(fprintf(stderr, "Pad free %d\n", po));
260 if (curpad[po])
ed6116ce 261 SvPADTMP_off(curpad[po]);
79072805
LW
262 if (po < padix)
263 padix = po - 1;
264}
265
266void
8990e307 267#ifndef STANDARD_C
79072805
LW
268pad_swipe(po)
269PADOFFSET po;
8990e307
LW
270#else
271pad_swipe(PADOFFSET po)
272#endif /* STANDARD_C */
79072805
LW
273{
274 if (AvARRAY(comppad) != curpad)
463ee0b2 275 croak("panic: pad_swipe curpad");
79072805 276 if (!po)
463ee0b2 277 croak("panic: pad_swipe po");
79072805
LW
278 DEBUG_X(fprintf(stderr, "Pad swipe %d\n", po));
279 curpad[po] = NEWSV(0,0);
ed6116ce 280 SvPADTMP_off(curpad[po]);
79072805
LW
281 if (po < padix)
282 padix = po - 1;
283}
284
285void
286pad_reset()
287{
288 register I32 po;
289
290 if (AvARRAY(comppad) != curpad)
463ee0b2 291 croak("panic: pad_reset curpad");
79072805
LW
292 DEBUG_X(fprintf(stderr, "Pad reset\n"));
293 for (po = AvMAX(comppad); po > 0; po--) {
ed6116ce
LW
294 if (curpad[po])
295 SvPADTMP_off(curpad[po]);
79072805
LW
296 }
297 padix = 0;
298}
299
300/* Destructor */
301
302void
303op_free(op)
304OP *op;
305{
306 register OP *kid;
307
308 if (!op)
309 return;
310
311 if (op->op_flags & OPf_KIDS) {
312 for (kid = cUNOP->op_first; kid; kid = kid->op_sibling)
313 op_free(kid);
314 }
315
79072805
LW
316
317 switch (op->op_type) {
8990e307
LW
318 case OP_NULL:
319 op->op_targ = 0; /* Was holding old type, if any. */
320 break;
463ee0b2 321 case OP_GVSV:
79072805 322 case OP_GV:
8990e307
LW
323 SvREFCNT_dec((SV*)cGVOP->op_gv);
324 break;
325 case OP_NEXTSTATE:
326 case OP_DBSTATE:
327 SvREFCNT_dec(cCOP->cop_filegv);
79072805
LW
328 break;
329 case OP_CONST:
8990e307 330 SvREFCNT_dec(cSVOP->op_sv);
79072805
LW
331 break;
332 }
333
8990e307
LW
334 if (op->op_targ > 0)
335 pad_free(op->op_targ);
336
79072805
LW
337 Safefree(op);
338}
339
8990e307
LW
340static void
341null(op)
342OP* op;
343{
344 if (op->op_type != OP_NULL && op->op_targ > 0)
345 pad_free(op->op_targ);
346 op->op_targ = op->op_type;
347 op->op_type = OP_NULL;
348 op->op_ppaddr = ppaddr[OP_NULL];
349}
350
351static void
352unlist(op)
353OP* op;
354{
355 OP* kid = cLISTOP->op_first;
356 assert(kid->op_type == OP_PUSHMARK);
357 cLISTOP->op_first = kid->op_sibling;
358 null(kid);
359 null(op);
360}
361
79072805
LW
362/* Contextualizers */
363
463ee0b2 364#define LINKLIST(o) ((o)->op_next ? (o)->op_next : linklist((OP*)o))
79072805
LW
365
366OP *
367linklist(op)
368OP *op;
369{
370 register OP *kid;
371
372 if (op->op_next)
373 return op->op_next;
374
375 /* establish postfix order */
376 if (cUNOP->op_first) {
377 op->op_next = LINKLIST(cUNOP->op_first);
378 for (kid = cUNOP->op_first; kid; kid = kid->op_sibling) {
379 if (kid->op_sibling)
380 kid->op_next = LINKLIST(kid->op_sibling);
381 else
382 kid->op_next = op;
383 }
384 }
385 else
386 op->op_next = op;
387
388 return op->op_next;
389}
390
391OP *
392scalarkids(op)
393OP *op;
394{
395 OP *kid;
396 if (op && op->op_flags & OPf_KIDS) {
397 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling)
398 scalar(kid);
399 }
400 return op;
401}
402
403OP *
8990e307
LW
404scalarboolean(op)
405OP *op;
406{
407 if (dowarn &&
408 op->op_type == OP_SASSIGN && cBINOP->op_first->op_type == OP_CONST)
409 warn("Found = in conditional, should be ==");
410 return scalar(op);
411}
412
413OP *
79072805
LW
414scalar(op)
415OP *op;
416{
417 OP *kid;
418
419 if (!op || (op->op_flags & OPf_KNOW)) /* assumes no premature commitment */
420 return op;
421
422 op->op_flags &= ~OPf_LIST;
423 op->op_flags |= OPf_KNOW;
424
425 switch (op->op_type) {
426 case OP_REPEAT:
427 scalar(cBINOP->op_first);
8990e307 428 break;
79072805
LW
429 case OP_OR:
430 case OP_AND:
431 case OP_COND_EXPR:
8990e307
LW
432 for (kid = cUNOP->op_first->op_sibling; kid; kid = kid->op_sibling)
433 scalar(kid);
79072805 434 break;
79072805
LW
435 case OP_MATCH:
436 case OP_SUBST:
437 case OP_NULL:
8990e307
LW
438 default:
439 if (op->op_flags & OPf_KIDS) {
440 for (kid = cUNOP->op_first; kid; kid = kid->op_sibling)
441 scalar(kid);
442 }
79072805 443 break;
463ee0b2 444 case OP_SCOPE:
79072805
LW
445 case OP_LEAVE:
446 case OP_LEAVETRY:
447 case OP_LINESEQ:
8990e307 448 case OP_LIST:
79072805
LW
449 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling) {
450 if (kid->op_sibling)
451 scalarvoid(kid);
452 else
453 scalar(kid);
454 }
93a17b20 455 curcop = &compiling;
79072805
LW
456 break;
457 }
79072805
LW
458 return op;
459}
460
461OP *
462scalarvoid(op)
463OP *op;
464{
465 OP *kid;
8990e307
LW
466 char* useless = 0;
467 SV* sv;
79072805
LW
468
469 if (!op)
470 return op;
471 if (op->op_flags & OPf_LIST)
472 return op;
473
474 op->op_flags |= OPf_KNOW;
475
476 switch (op->op_type) {
477 default:
8990e307
LW
478 if (!(opargs[op->op_type] & OA_FOLDCONST))
479 break;
480 if (op->op_flags & OPf_STACKED)
481 break;
482 /* FALL THROUGH */
483 case OP_GVSV:
484 case OP_WANTARRAY:
485 case OP_GV:
486 case OP_PADSV:
487 case OP_PADAV:
488 case OP_PADHV:
489 case OP_PADANY:
490 case OP_AV2ARYLEN:
491 case OP_SV2LEN:
492 case OP_REF:
493 case OP_DEFINED:
494 case OP_HEX:
495 case OP_OCT:
496 case OP_LENGTH:
497 case OP_SUBSTR:
498 case OP_VEC:
499 case OP_INDEX:
500 case OP_RINDEX:
501 case OP_SPRINTF:
502 case OP_AELEM:
503 case OP_AELEMFAST:
504 case OP_ASLICE:
505 case OP_VALUES:
506 case OP_KEYS:
507 case OP_HELEM:
508 case OP_HSLICE:
509 case OP_UNPACK:
510 case OP_PACK:
8990e307
LW
511 case OP_JOIN:
512 case OP_LSLICE:
513 case OP_ANONLIST:
514 case OP_ANONHASH:
515 case OP_SORT:
516 case OP_REVERSE:
517 case OP_RANGE:
518 case OP_FLIP:
519 case OP_FLOP:
520 case OP_CALLER:
521 case OP_FILENO:
522 case OP_EOF:
523 case OP_TELL:
524 case OP_GETSOCKNAME:
525 case OP_GETPEERNAME:
526 case OP_READLINK:
527 case OP_TELLDIR:
528 case OP_GETPPID:
529 case OP_GETPGRP:
530 case OP_GETPRIORITY:
531 case OP_TIME:
532 case OP_TMS:
533 case OP_LOCALTIME:
534 case OP_GMTIME:
535 case OP_GHBYNAME:
536 case OP_GHBYADDR:
537 case OP_GHOSTENT:
538 case OP_GNBYNAME:
539 case OP_GNBYADDR:
540 case OP_GNETENT:
541 case OP_GPBYNAME:
542 case OP_GPBYNUMBER:
543 case OP_GPROTOENT:
544 case OP_GSBYNAME:
545 case OP_GSBYPORT:
546 case OP_GSERVENT:
547 case OP_GPWNAM:
548 case OP_GPWUID:
549 case OP_GGRNAM:
550 case OP_GGRGID:
551 case OP_GETLOGIN:
552 if (!(op->op_flags & OPf_INTRO))
553 useless = op_name[op->op_type];
554 break;
555
556 case OP_RV2GV:
557 case OP_RV2SV:
558 case OP_RV2AV:
559 case OP_RV2HV:
560 if (!(op->op_flags & OPf_INTRO))
561 useless = "a variable";
562 break;
79072805 563
93a17b20 564 case OP_NEXTSTATE:
8990e307 565 case OP_DBSTATE:
93a17b20
LW
566 curcop = ((COP*)op); /* for warning above */
567 break;
568
79072805 569 case OP_CONST:
8990e307
LW
570 sv = cSVOP->op_sv;
571 if (dowarn) {
572 useless = "a constant";
573 if (SvNIOK(sv) && (SvNV(sv) == 0.0 || SvNV(sv) == 1.0))
574 useless = 0;
575 else if (SvPOK(sv)) {
576 if (strnEQ(SvPVX(sv), "di", 2) ||
577 strnEQ(SvPVX(sv), "ig", 2))
578 useless = 0;
579 }
580 }
581 null(op); /* don't execute a constant */
582 SvREFCNT_dec(sv); /* don't even remember it */
79072805
LW
583 break;
584
585 case OP_POSTINC:
8990e307 586 op->op_type = OP_PREINC; /* pre-increment is faster */
79072805
LW
587 op->op_ppaddr = ppaddr[OP_PREINC];
588 break;
589
590 case OP_POSTDEC:
8990e307 591 op->op_type = OP_PREDEC; /* pre-decrement is faster */
79072805
LW
592 op->op_ppaddr = ppaddr[OP_PREDEC];
593 break;
594
595 case OP_REPEAT:
596 scalarvoid(cBINOP->op_first);
8990e307 597 useless = op_name[op->op_type];
79072805 598 break;
8990e307 599
79072805
LW
600 case OP_OR:
601 case OP_AND:
602 case OP_COND_EXPR:
603 for (kid = cUNOP->op_first->op_sibling; kid; kid = kid->op_sibling)
604 scalarvoid(kid);
605 break;
606 case OP_ENTERTRY:
607 case OP_ENTER:
608 case OP_SCALAR:
609 case OP_NULL:
610 if (!(op->op_flags & OPf_KIDS))
611 break;
463ee0b2 612 case OP_SCOPE:
79072805
LW
613 case OP_LEAVE:
614 case OP_LEAVETRY:
615 case OP_LINESEQ:
79072805 616 case OP_LIST:
79072805
LW
617 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling)
618 scalarvoid(kid);
619 break;
620 }
8990e307
LW
621 if (useless && dowarn)
622 warn("Useless use of %s in void context", useless);
79072805
LW
623 return op;
624}
625
626OP *
627listkids(op)
628OP *op;
629{
630 OP *kid;
631 if (op && op->op_flags & OPf_KIDS) {
632 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling)
633 list(kid);
634 }
635 return op;
636}
637
638OP *
639list(op)
640OP *op;
641{
642 OP *kid;
643
644 if (!op || (op->op_flags & OPf_KNOW)) /* assumes no premature commitment */
645 return op;
646
647 op->op_flags |= (OPf_KNOW | OPf_LIST);
648
649 switch (op->op_type) {
650 case OP_FLOP:
651 case OP_REPEAT:
652 list(cBINOP->op_first);
653 break;
654 case OP_OR:
655 case OP_AND:
656 case OP_COND_EXPR:
657 for (kid = cUNOP->op_first->op_sibling; kid; kid = kid->op_sibling)
658 list(kid);
659 break;
660 default:
661 case OP_MATCH:
662 case OP_SUBST:
663 case OP_NULL:
664 if (!(op->op_flags & OPf_KIDS))
665 break;
666 if (!op->op_next && cUNOP->op_first->op_type == OP_FLOP) {
667 list(cBINOP->op_first);
668 return gen_constant_list(op);
669 }
670 case OP_LIST:
671 listkids(op);
672 break;
463ee0b2 673 case OP_SCOPE:
79072805
LW
674 case OP_LEAVE:
675 case OP_LEAVETRY:
676 case OP_LINESEQ:
677 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling) {
678 if (kid->op_sibling)
679 scalarvoid(kid);
680 else
681 list(kid);
682 }
93a17b20 683 curcop = &compiling;
79072805
LW
684 break;
685 }
686 return op;
687}
688
689OP *
690scalarseq(op)
691OP *op;
692{
693 OP *kid;
694
463ee0b2
LW
695 if (op) {
696 if (op->op_type == OP_LINESEQ ||
697 op->op_type == OP_SCOPE ||
79072805 698 op->op_type == OP_LEAVE ||
463ee0b2
LW
699 op->op_type == OP_LEAVETRY)
700 {
701 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling) {
ed6116ce 702 if (kid->op_sibling) {
463ee0b2 703 scalarvoid(kid);
ed6116ce 704 }
463ee0b2
LW
705 }
706 curcop = &compiling;
79072805 707 }
463ee0b2
LW
708 op->op_flags &= ~OPf_PARENS;
709 if (needblockscope)
710 op->op_flags |= OPf_PARENS;
79072805 711 }
8990e307
LW
712 else
713 op = newOP(OP_STUB, 0);
79072805
LW
714 return op;
715}
716
717OP *
463ee0b2 718modkids(op, type)
79072805
LW
719OP *op;
720I32 type;
721{
722 OP *kid;
723 if (op && op->op_flags & OPf_KIDS) {
724 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling)
463ee0b2 725 mod(kid, type);
79072805
LW
726 }
727 return op;
728}
729
463ee0b2 730static I32 modcount;
79072805
LW
731
732OP *
463ee0b2 733mod(op, type)
79072805
LW
734OP *op;
735I32 type;
736{
737 OP *kid;
738 SV *sv;
739
740 if (!op)
741 return op;
742
743 switch (op->op_type) {
744 case OP_ENTERSUBR:
8990e307 745 if ((type == OP_UNDEF) && !(op->op_flags & OPf_STACKED)) {
93a17b20
LW
746 op->op_type = OP_RV2CV; /* entersubr => rv2cv */
747 op->op_ppaddr = ppaddr[OP_RV2CV];
8990e307 748 null(cUNOP->op_first); /* disable pushmark */
79072805
LW
749 break;
750 }
751 /* FALL THROUGH */
752 default:
8990e307 753 sprintf(tokenbuf, "Can't modify %s in %s",
79072805
LW
754 op_name[op->op_type],
755 type ? op_name[type] : "local");
756 yyerror(tokenbuf);
757 return op;
758
759 case OP_COND_EXPR:
760 for (kid = cUNOP->op_first->op_sibling; kid; kid = kid->op_sibling)
463ee0b2 761 mod(kid, type);
79072805
LW
762 break;
763
764 case OP_RV2AV:
765 case OP_RV2HV:
766 case OP_RV2GV:
93a17b20 767 ref(cUNOP->op_first, op->op_type);
79072805
LW
768 /* FALL THROUGH */
769 case OP_AASSIGN:
770 case OP_ASLICE:
771 case OP_HSLICE:
93a17b20
LW
772 case OP_NEXTSTATE:
773 case OP_DBSTATE:
463ee0b2 774 modcount = 10000;
79072805 775 break;
463ee0b2
LW
776 case OP_RV2SV:
777 if (type == OP_RV2AV || type == OP_RV2HV)
778 op->op_private = type;
8990e307 779 ref(cUNOP->op_first, op->op_type);
463ee0b2 780 /* FALL THROUGH */
93a17b20
LW
781 case OP_PADSV:
782 case OP_PADAV:
783 case OP_PADHV:
79072805
LW
784 case OP_UNDEF:
785 case OP_GV:
463ee0b2
LW
786 case OP_AV2ARYLEN:
787 case OP_SASSIGN:
8990e307
LW
788 case OP_AELEMFAST:
789 modcount++;
790 break;
791
463ee0b2 792 case OP_REFGEN:
463ee0b2
LW
793 modcount++;
794 break;
795
796 case OP_PUSHMARK:
797 break;
798
799 case OP_SUBSTR:
800 case OP_VEC:
8990e307 801 pad_free(op->op_targ);
ed6116ce 802 op->op_targ = pad_alloc(op->op_type, SVs_PADMY);
463ee0b2
LW
803 sv = PAD_SV(op->op_targ);
804 sv_upgrade(sv, SVt_PVLV);
805 sv_magic(sv, 0, op->op_type == OP_VEC ? 'v' : 'x', 0, 0);
806 curpad[op->op_targ] = sv;
807 /* FALL THROUGH */
808 case OP_NULL:
8990e307
LW
809 if (op->op_flags & OPf_KIDS)
810 mod(cBINOP->op_first, type);
463ee0b2
LW
811 break;
812 case OP_AELEM:
813 case OP_HELEM:
8990e307 814 ref(cBINOP->op_first, op->op_type);
463ee0b2
LW
815 if (type == OP_RV2AV || type == OP_RV2HV)
816 op->op_private = type;
817 break;
818
819 case OP_SCOPE:
820 case OP_LEAVE:
821 case OP_ENTER:
463ee0b2
LW
822 if (!(op->op_flags & OPf_KIDS))
823 break;
8990e307
LW
824 mod(cLISTOP->op_last, type);
825 break;
826
463ee0b2
LW
827 case OP_LIST:
828 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling)
829 mod(kid, type);
830 break;
831 }
832 op->op_flags |= OPf_LVAL;
833 if (!type) {
834 op->op_flags &= ~OPf_SPECIAL;
835 op->op_flags |= OPf_INTRO;
836 }
837 else if (type == OP_AASSIGN || type == OP_SASSIGN)
838 op->op_flags |= OPf_SPECIAL;
839 return op;
840}
841
842OP *
843refkids(op, type)
844OP *op;
845I32 type;
846{
847 OP *kid;
848 if (op && op->op_flags & OPf_KIDS) {
849 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling)
850 ref(kid, type);
851 }
852 return op;
853}
854
855OP *
856ref(op, type)
857OP *op;
858I32 type;
859{
860 OP *kid;
861 SV *sv;
862
863 if (!op)
864 return op;
865
866 switch (op->op_type) {
8990e307
LW
867 case OP_ENTERSUBR:
868 if ((type == OP_REFGEN || type == OP_DEFINED)
869 && !(op->op_flags & (OPf_STACKED|OPf_PARENS))) {
870 op->op_type = OP_RV2CV; /* entersubr => rv2cv */
871 op->op_ppaddr = ppaddr[OP_RV2CV];
872 null(cUNOP->op_first);
873 }
874 break;
875
463ee0b2
LW
876 case OP_COND_EXPR:
877 for (kid = cUNOP->op_first->op_sibling; kid; kid = kid->op_sibling)
878 ref(kid, type);
879 break;
8990e307
LW
880 case OP_RV2SV:
881 if (type == OP_RV2AV || type == OP_RV2HV)
882 op->op_private = type;
883 ref(cUNOP->op_first, op->op_type);
884 break;
885
463ee0b2
LW
886 case OP_RV2AV:
887 case OP_RV2HV:
8990e307
LW
888 op->op_flags |= OPf_LVAL;
889 /* FALL THROUGH */
463ee0b2
LW
890 case OP_RV2GV:
891 ref(cUNOP->op_first, op->op_type);
463ee0b2 892 break;
8990e307 893
463ee0b2
LW
894 case OP_PADAV:
895 case OP_PADHV:
8990e307 896 op->op_flags |= OPf_LVAL;
79072805 897 break;
8990e307
LW
898
899 case OP_SCALAR:
79072805
LW
900 case OP_NULL:
901 if (!(op->op_flags & OPf_KIDS))
463ee0b2 902 break;
8990e307 903 ref(cBINOP->op_first, type);
79072805
LW
904 break;
905 case OP_AELEM:
906 case OP_HELEM:
8990e307
LW
907 ref(cBINOP->op_first, op->op_type);
908 if (type == OP_RV2AV || type == OP_RV2HV || type == OP_REFGEN) {
93a17b20 909 op->op_private = type;
8990e307
LW
910 op->op_flags |= OPf_LVAL;
911 }
79072805
LW
912 break;
913
463ee0b2 914 case OP_SCOPE:
79072805
LW
915 case OP_LEAVE:
916 case OP_ENTER:
8990e307 917 case OP_LIST:
79072805
LW
918 if (!(op->op_flags & OPf_KIDS))
919 break;
8990e307 920 ref(cLISTOP->op_last, type);
79072805
LW
921 break;
922 }
8990e307
LW
923 return scalar(op);
924
79072805
LW
925}
926
927OP *
93a17b20
LW
928my(op)
929OP *op;
930{
931 OP *kid;
932 SV *sv;
933 I32 type;
934
935 if (!op)
936 return op;
937
938 type = op->op_type;
939 if (type == OP_LIST) {
940 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling)
941 my(kid);
942 }
943 else if (type != OP_PADSV &&
944 type != OP_PADAV &&
945 type != OP_PADHV &&
946 type != OP_PUSHMARK)
947 {
948 sprintf(tokenbuf, "Can't declare %s in my", op_name[op->op_type]);
949 yyerror(tokenbuf);
950 return op;
951 }
952 op->op_flags |= OPf_LVAL|OPf_INTRO;
953 return op;
954}
955
956OP *
79072805
LW
957sawparens(o)
958OP *o;
959{
960 if (o)
961 o->op_flags |= OPf_PARENS;
962 return o;
963}
964
965OP *
966bind_match(type, left, right)
967I32 type;
968OP *left;
969OP *right;
970{
971 OP *op;
972
973 if (right->op_type == OP_MATCH ||
974 right->op_type == OP_SUBST ||
975 right->op_type == OP_TRANS) {
976 right->op_flags |= OPf_STACKED;
977 if (right->op_type != OP_MATCH)
463ee0b2 978 left = mod(left, right->op_type);
79072805
LW
979 if (right->op_type == OP_TRANS)
980 op = newBINOP(OP_NULL, 0, scalar(left), right);
981 else
982 op = prepend_elem(right->op_type, scalar(left), right);
983 if (type == OP_NOT)
984 return newUNOP(OP_NOT, 0, scalar(op));
985 return op;
986 }
987 else
988 return bind_match(type, left,
989 pmruntime(newPMOP(OP_MATCH, 0), right, Nullop));
990}
991
992OP *
993invert(op)
994OP *op;
995{
996 if (!op)
997 return op;
998 /* XXX need to optimize away NOT NOT here? Or do we let optimizer do it? */
999 return newUNOP(OP_NOT, OPf_SPECIAL, scalar(op));
1000}
1001
1002OP *
1003scope(o)
1004OP *o;
1005{
1006 if (o) {
463ee0b2
LW
1007 if (o->op_flags & OPf_PARENS) {
1008 o = prepend_elem(OP_LINESEQ, newOP(OP_ENTER, 0), o);
1009 o->op_type = OP_LEAVE;
1010 o->op_ppaddr = ppaddr[OP_LEAVE];
1011 }
1012 else {
1013 if (o->op_type == OP_LINESEQ) {
1014 OP *kid;
1015 o->op_type = OP_SCOPE;
1016 o->op_ppaddr = ppaddr[OP_SCOPE];
1017 kid = ((LISTOP*)o)->op_first;
8990e307
LW
1018 if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE)
1019 null(kid);
463ee0b2
LW
1020 }
1021 else
1022 o = newUNOP(OP_SCOPE, 0, o);
1023 }
79072805
LW
1024 }
1025 return o;
1026}
1027
1028OP *
1029block_head(o, startp)
1030OP *o;
1031OP **startp;
1032{
1033 if (!o) {
1034 *startp = 0;
1035 return o;
1036 }
8990e307
LW
1037 o = scope(sawparens(scalarvoid(o)));
1038 curcop = &compiling;
79072805
LW
1039 *startp = LINKLIST(o);
1040 o->op_next = 0;
1041 peep(*startp);
1042 return o;
1043}
1044
1045OP *
93a17b20 1046localize(o, lex)
79072805 1047OP *o;
93a17b20 1048I32 lex;
79072805
LW
1049{
1050 if (o->op_flags & OPf_PARENS)
1051 list(o);
8990e307 1052 else {
79072805 1053 scalar(o);
8990e307
LW
1054 if (dowarn && bufptr > oldbufptr && bufptr[-1] == ',') {
1055 char *s;
1056 for (s = bufptr; *s && (isALNUM(*s) || strchr("@$%, ",*s)); s++) ;
1057 if (*s == ';' || *s == '=' && (s[1] == '@' || s[2] == '@'))
1058 warn("Parens missing around \"%s\" list", lex ? "my" : "local");
1059 }
1060 }
93a17b20
LW
1061 in_my = FALSE;
1062 if (lex)
1063 return my(o);
1064 else
463ee0b2 1065 return mod(o, OP_NULL); /* a bit kludgey */
79072805
LW
1066}
1067
1068OP *
1069jmaybe(o)
1070OP *o;
1071{
1072 if (o->op_type == OP_LIST) {
1073 o = convert(OP_JOIN, 0,
1074 prepend_elem(OP_LIST,
1075 newSVREF(newGVOP(OP_GV, 0, gv_fetchpv(";", TRUE))),
1076 o));
1077 }
1078 return o;
1079}
1080
1081OP *
1082fold_constants(o)
1083register OP *o;
1084{
1085 register OP *curop;
1086 I32 type = o->op_type;
1087 SV *sv;
1088
1089 if (opargs[type] & OA_RETSCALAR)
1090 scalar(o);
1091 if (opargs[type] & OA_TARGET)
ed6116ce 1092 o->op_targ = pad_alloc(type, SVs_PADTMP);
79072805
LW
1093
1094 if (!(opargs[type] & OA_FOLDCONST))
1095 goto nope;
1096
1097 for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
93a17b20
LW
1098 if (curop->op_type != OP_CONST &&
1099 curop->op_type != OP_LIST &&
1100 curop->op_type != OP_SCALAR &&
1101 curop->op_type != OP_PUSHMARK) {
79072805
LW
1102 goto nope;
1103 }
1104 }
1105
1106 curop = LINKLIST(o);
1107 o->op_next = 0;
1108 op = curop;
1109 run();
1110 if (o->op_targ && *stack_sp == PAD_SV(o->op_targ))
1111 pad_swipe(o->op_targ);
1112 op_free(o);
1113 if (type == OP_RV2GV)
1114 return newGVOP(OP_GV, 0, *(stack_sp--));
1115 else
1116 return newSVOP(OP_CONST, 0, *(stack_sp--));
1117
1118 nope:
1119 if (!(opargs[type] & OA_OTHERINT))
1120 return o;
1121 if (!(o->op_flags & OPf_KIDS))
1122 return o;
1123
1124 for (curop = ((UNOP*)o)->op_first; curop; curop = curop->op_sibling) {
1125 if (curop->op_type == OP_CONST) {
1126 if (SvIOK(((SVOP*)curop)->op_sv))
1127 continue;
1128 return o;
1129 }
1130 if (opargs[curop->op_type] & OA_RETINTEGER)
1131 continue;
1132 return o;
1133 }
1134
1135 o->op_ppaddr = ppaddr[++(o->op_type)];
1136 return o;
1137}
1138
1139OP *
1140gen_constant_list(o)
1141register OP *o;
1142{
1143 register OP *curop;
1144 OP *anonop;
1145 I32 tmpmark;
1146 I32 tmpsp;
1147 I32 oldtmps_floor = tmps_floor;
1148 AV *av;
1149 GV *gv;
1150
1151 tmpmark = stack_sp - stack_base;
1152 anonop = newANONLIST(o);
1153 curop = LINKLIST(anonop);
1154 anonop->op_next = 0;
1155 op = curop;
1156 run();
1157 tmpsp = stack_sp - stack_base;
1158 tmps_floor = oldtmps_floor;
1159 stack_sp = stack_base + tmpmark;
1160
1161 o->op_type = OP_RV2AV;
1162 o->op_ppaddr = ppaddr[OP_RV2AV];
1163 o->op_sibling = 0;
1164 curop = ((UNOP*)o)->op_first;
1165 ((UNOP*)o)->op_first = newSVOP(OP_CONST, 0, newSVsv(stack_sp[1]));
1166 op_free(curop);
1167 curop = ((UNOP*)anonop)->op_first;
1168 curop = ((UNOP*)curop)->op_first;
1169 curop->op_sibling = 0;
1170 op_free(anonop);
1171 o->op_next = 0;
1172 linklist(o);
1173 return list(o);
1174}
1175
1176OP *
1177convert(type, flags, op)
1178I32 type;
1179I32 flags;
1180OP* op;
1181{
1182 OP *kid;
1183 OP *last;
1184
79072805
LW
1185 if (!op || op->op_type != OP_LIST)
1186 op = newLISTOP(OP_LIST, 0, op, Nullop);
1187
8990e307
LW
1188 if (!(opargs[type] & OA_MARK))
1189 null(cLISTOP->op_first);
1190
79072805
LW
1191 op->op_type = type;
1192 op->op_ppaddr = ppaddr[type];
1193 op->op_flags |= flags;
1194
1195 op = (*check[type])(op);
1196 if (op->op_type != type)
1197 return op;
1198
1199 if (cLISTOP->op_children < 7) {
1200 /* XXX do we really need to do this if we're done appending?? */
1201 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling)
1202 last = kid;
1203 cLISTOP->op_last = last; /* in case check substituted last arg */
1204 }
1205
1206 return fold_constants(op);
1207}
1208
1209/* List constructors */
1210
1211OP *
1212append_elem(type, first, last)
1213I32 type;
1214OP* first;
1215OP* last;
1216{
1217 if (!first)
1218 return last;
8990e307
LW
1219
1220 if (!last)
79072805 1221 return first;
8990e307
LW
1222
1223 if (first->op_type == type) {
79072805
LW
1224 if (first->op_flags & OPf_KIDS)
1225 ((LISTOP*)first)->op_last->op_sibling = last;
1226 else {
1227 first->op_flags |= OPf_KIDS;
1228 ((LISTOP*)first)->op_first = last;
1229 }
1230 ((LISTOP*)first)->op_last = last;
1231 ((LISTOP*)first)->op_children++;
1232 return first;
1233 }
1234
1235 return newLISTOP(type, 0, first, last);
1236}
1237
1238OP *
1239append_list(type, first, last)
1240I32 type;
1241LISTOP* first;
1242LISTOP* last;
1243{
1244 if (!first)
1245 return (OP*)last;
8990e307
LW
1246
1247 if (!last)
79072805 1248 return (OP*)first;
8990e307
LW
1249
1250 if (first->op_type != type)
79072805 1251 return prepend_elem(type, (OP*)first, (OP*)last);
8990e307
LW
1252
1253 if (last->op_type != type)
79072805
LW
1254 return append_elem(type, (OP*)first, (OP*)last);
1255
1256 first->op_last->op_sibling = last->op_first;
1257 first->op_last = last->op_last;
1258 first->op_children += last->op_children;
1259 if (first->op_children)
1260 last->op_flags |= OPf_KIDS;
1261
1262 Safefree(last);
1263 return (OP*)first;
1264}
1265
1266OP *
1267prepend_elem(type, first, last)
1268I32 type;
1269OP* first;
1270OP* last;
1271{
1272 if (!first)
1273 return last;
8990e307
LW
1274
1275 if (!last)
79072805 1276 return first;
8990e307
LW
1277
1278 if (last->op_type == type) {
1279 if (type == OP_LIST) { /* already a PUSHMARK there */
1280 first->op_sibling = ((LISTOP*)last)->op_first->op_sibling;
1281 ((LISTOP*)last)->op_first->op_sibling = first;
1282 }
1283 else {
1284 if (!(last->op_flags & OPf_KIDS)) {
1285 ((LISTOP*)last)->op_last = first;
1286 last->op_flags |= OPf_KIDS;
1287 }
1288 first->op_sibling = ((LISTOP*)last)->op_first;
1289 ((LISTOP*)last)->op_first = first;
79072805 1290 }
79072805
LW
1291 ((LISTOP*)last)->op_children++;
1292 return last;
1293 }
1294
1295 return newLISTOP(type, 0, first, last);
1296}
1297
1298/* Constructors */
1299
1300OP *
1301newNULLLIST()
1302{
8990e307
LW
1303 return newOP(OP_STUB, 0);
1304}
1305
1306OP *
1307force_list(op)
1308OP* op;
1309{
1310 if (!op || op->op_type != OP_LIST)
1311 op = newLISTOP(OP_LIST, 0, op, Nullop);
1312 null(op);
1313 return op;
79072805
LW
1314}
1315
1316OP *
1317newLISTOP(type, flags, first, last)
1318I32 type;
1319I32 flags;
1320OP* first;
1321OP* last;
1322{
1323 LISTOP *listop;
1324
1325 Newz(1101, listop, 1, LISTOP);
1326
1327 listop->op_type = type;
1328 listop->op_ppaddr = ppaddr[type];
1329 listop->op_children = (first != 0) + (last != 0);
1330 listop->op_flags = flags;
79072805
LW
1331
1332 if (!last && first)
1333 last = first;
1334 else if (!first && last)
1335 first = last;
8990e307
LW
1336 else if (first)
1337 first->op_sibling = last;
79072805
LW
1338 listop->op_first = first;
1339 listop->op_last = last;
8990e307
LW
1340 if (type == OP_LIST) {
1341 OP* pushop;
1342 pushop = newOP(OP_PUSHMARK, 0);
1343 pushop->op_sibling = first;
1344 listop->op_first = pushop;
1345 listop->op_flags |= OPf_KIDS;
1346 if (!last)
1347 listop->op_last = pushop;
1348 }
1349 else if (listop->op_children)
1350 listop->op_flags |= OPf_KIDS;
79072805
LW
1351
1352 return (OP*)listop;
1353}
1354
1355OP *
1356newOP(type, flags)
1357I32 type;
1358I32 flags;
1359{
1360 OP *op;
1361 Newz(1101, op, 1, OP);
1362 op->op_type = type;
1363 op->op_ppaddr = ppaddr[type];
1364 op->op_flags = flags;
1365
1366 op->op_next = op;
1367 /* op->op_private = 0; */
1368 if (opargs[type] & OA_RETSCALAR)
1369 scalar(op);
1370 if (opargs[type] & OA_TARGET)
ed6116ce 1371 op->op_targ = pad_alloc(type, SVs_PADTMP);
79072805
LW
1372 return (*check[type])(op);
1373}
1374
1375OP *
1376newUNOP(type, flags, first)
1377I32 type;
1378I32 flags;
1379OP* first;
1380{
1381 UNOP *unop;
1382
93a17b20
LW
1383 if (!first)
1384 first = newOP(OP_STUB, 0);
8990e307
LW
1385 if (opargs[type] & OA_MARK)
1386 first = force_list(first);
1387 else if (first->op_type == OP_LIST)
1388 unlist(first);
93a17b20 1389
79072805
LW
1390 Newz(1101, unop, 1, UNOP);
1391 unop->op_type = type;
1392 unop->op_ppaddr = ppaddr[type];
1393 unop->op_first = first;
1394 unop->op_flags = flags | OPf_KIDS;
1395 unop->op_private = 1;
1396
1397 unop = (UNOP*)(*check[type])((OP*)unop);
1398 if (unop->op_next)
1399 return (OP*)unop;
1400
1401 return fold_constants(unop);
1402}
1403
1404OP *
1405newBINOP(type, flags, first, last)
1406I32 type;
1407I32 flags;
1408OP* first;
1409OP* last;
1410{
1411 BINOP *binop;
1412 Newz(1101, binop, 1, BINOP);
1413
1414 if (!first)
1415 first = newOP(OP_NULL, 0);
1416
1417 binop->op_type = type;
1418 binop->op_ppaddr = ppaddr[type];
1419 binop->op_first = first;
1420 binop->op_flags = flags | OPf_KIDS;
1421 if (!last) {
1422 last = first;
1423 binop->op_private = 1;
1424 }
1425 else {
1426 binop->op_private = 2;
1427 first->op_sibling = last;
1428 }
1429
1430 binop = (BINOP*)(*check[type])((OP*)binop);
1431 if (binop->op_next)
1432 return (OP*)binop;
1433
1434 binop->op_last = last = binop->op_first->op_sibling;
1435
1436 return fold_constants(binop);
1437}
1438
1439OP *
1440pmtrans(op, expr, repl)
1441OP *op;
1442OP *expr;
1443OP *repl;
1444{
1445 PMOP *pm = (PMOP*)op;
1446 SV *tstr = ((SVOP*)expr)->op_sv;
1447 SV *rstr = ((SVOP*)repl)->op_sv;
463ee0b2
LW
1448 STRLEN tlen;
1449 STRLEN rlen;
1450 register char *t = SvPV(tstr, tlen);
1451 register char *r = SvPV(rstr, rlen);
79072805
LW
1452 register I32 i;
1453 register I32 j;
1454 I32 squash;
1455 I32 delete;
1456 I32 complement;
1457 register short *tbl;
1458
1459 tbl = (short*)cPVOP->op_pv;
1460 complement = op->op_private & OPpTRANS_COMPLEMENT;
1461 delete = op->op_private & OPpTRANS_DELETE;
1462 squash = op->op_private & OPpTRANS_SQUASH;
1463
1464 if (complement) {
1465 Zero(tbl, 256, short);
1466 for (i = 0; i < tlen; i++)
1467 tbl[t[i] & 0377] = -1;
1468 for (i = 0, j = 0; i < 256; i++) {
1469 if (!tbl[i]) {
1470 if (j >= rlen) {
1471 if (delete)
1472 tbl[i] = -2;
1473 else if (rlen)
1474 tbl[i] = r[j-1] & 0377;
1475 else
1476 tbl[i] = i;
1477 }
1478 else
1479 tbl[i] = r[j++] & 0377;
1480 }
1481 }
1482 }
1483 else {
1484 if (!rlen && !delete) {
1485 r = t; rlen = tlen;
1486 }
1487 for (i = 0; i < 256; i++)
1488 tbl[i] = -1;
1489 for (i = 0, j = 0; i < tlen; i++,j++) {
1490 if (j >= rlen) {
1491 if (delete) {
1492 if (tbl[t[i] & 0377] == -1)
1493 tbl[t[i] & 0377] = -2;
1494 continue;
1495 }
1496 --j;
1497 }
1498 if (tbl[t[i] & 0377] == -1)
1499 tbl[t[i] & 0377] = r[j] & 0377;
1500 }
1501 }
1502 op_free(expr);
1503 op_free(repl);
1504
1505 return op;
1506}
1507
1508OP *
1509newPMOP(type, flags)
1510I32 type;
1511I32 flags;
1512{
1513 PMOP *pmop;
1514
1515 Newz(1101, pmop, 1, PMOP);
1516 pmop->op_type = type;
1517 pmop->op_ppaddr = ppaddr[type];
1518 pmop->op_flags = flags;
1519 pmop->op_private = 0;
1520
1521 /* link into pm list */
1522 if (type != OP_TRANS) {
1523 pmop->op_pmnext = HvPMROOT(curstash);
1524 HvPMROOT(curstash) = pmop;
1525 }
1526
1527 return (OP*)pmop;
1528}
1529
1530OP *
1531pmruntime(op, expr, repl)
1532OP *op;
1533OP *expr;
1534OP *repl;
1535{
1536 PMOP *pm;
1537 LOGOP *rcop;
1538
1539 if (op->op_type == OP_TRANS)
1540 return pmtrans(op, expr, repl);
1541
1542 pm = (PMOP*)op;
1543
1544 if (expr->op_type == OP_CONST) {
463ee0b2 1545 STRLEN plen;
79072805 1546 SV *pat = ((SVOP*)expr)->op_sv;
463ee0b2 1547 char *p = SvPV(pat, plen);
79072805 1548 if ((op->op_flags & OPf_SPECIAL) && strEQ(p, " ")) {
93a17b20 1549 sv_setpvn(pat, "\\s+", 3);
463ee0b2 1550 p = SvPV(pat, plen);
79072805
LW
1551 pm->op_pmflags |= PMf_SKIPWHITE;
1552 }
463ee0b2 1553 scan_prefix(pm, p, plen);
79072805
LW
1554 if (pm->op_pmshort && (pm->op_pmflags & PMf_SCANFIRST))
1555 fbm_compile(pm->op_pmshort, pm->op_pmflags & PMf_FOLD);
463ee0b2 1556 pm->op_pmregexp = regcomp(p, p + plen, pm->op_pmflags & PMf_FOLD);
79072805
LW
1557 hoistmust(pm);
1558 op_free(expr);
1559 }
1560 else {
463ee0b2
LW
1561 if (pm->op_pmflags & PMf_KEEP)
1562 expr = newUNOP(OP_REGCMAYBE,0,expr);
1563
79072805
LW
1564 Newz(1101, rcop, 1, LOGOP);
1565 rcop->op_type = OP_REGCOMP;
1566 rcop->op_ppaddr = ppaddr[OP_REGCOMP];
1567 rcop->op_first = scalar(expr);
1568 rcop->op_flags |= OPf_KIDS;
1569 rcop->op_private = 1;
1570 rcop->op_other = op;
1571
1572 /* establish postfix order */
463ee0b2
LW
1573 if (pm->op_pmflags & PMf_KEEP) {
1574 LINKLIST(expr);
1575 rcop->op_next = expr;
1576 ((UNOP*)expr)->op_first->op_next = (OP*)rcop;
1577 }
1578 else {
1579 rcop->op_next = LINKLIST(expr);
1580 expr->op_next = (OP*)rcop;
1581 }
79072805 1582
463ee0b2 1583 prepend_elem(op->op_type, scalar((OP*)rcop), op);
79072805
LW
1584 }
1585
1586 if (repl) {
1587 if (repl->op_type == OP_CONST) {
1588 pm->op_pmflags |= PMf_CONST;
1589 prepend_elem(op->op_type, scalar(repl), op);
1590 }
1591 else {
1592 OP *curop;
1593 OP *lastop = 0;
1594 for (curop = LINKLIST(repl); curop!=repl; curop = LINKLIST(curop)) {
1595 if (opargs[curop->op_type] & OA_DANGEROUS) {
1596 if (curop->op_type == OP_GV) {
1597 GV *gv = ((GVOP*)curop)->op_gv;
93a17b20 1598 if (strchr("&`'123456789+", *GvENAME(gv)))
79072805
LW
1599 break;
1600 }
1601 else if (curop->op_type == OP_RV2CV)
1602 break;
1603 else if (curop->op_type == OP_RV2SV ||
1604 curop->op_type == OP_RV2AV ||
1605 curop->op_type == OP_RV2HV ||
1606 curop->op_type == OP_RV2GV) {
1607 if (lastop && lastop->op_type != OP_GV) /*funny deref?*/
1608 break;
1609 }
1610 else
1611 break;
1612 }
1613 lastop = curop;
1614 }
1615 if (curop == repl) {
1616 pm->op_pmflags |= PMf_CONST; /* const for long enough */
1617 prepend_elem(op->op_type, scalar(repl), op);
1618 }
1619 else {
1620 Newz(1101, rcop, 1, LOGOP);
1621 rcop->op_type = OP_SUBSTCONT;
1622 rcop->op_ppaddr = ppaddr[OP_SUBSTCONT];
1623 rcop->op_first = scalar(repl);
1624 rcop->op_flags |= OPf_KIDS;
1625 rcop->op_private = 1;
1626 rcop->op_other = op;
1627
1628 /* establish postfix order */
1629 rcop->op_next = LINKLIST(repl);
1630 repl->op_next = (OP*)rcop;
1631
463ee0b2 1632 pm->op_pmreplroot = scalar((OP*)rcop);
79072805
LW
1633 pm->op_pmreplstart = LINKLIST(rcop);
1634 rcop->op_next = 0;
1635 }
1636 }
1637 }
1638
1639 return (OP*)pm;
1640}
1641
1642OP *
1643newSVOP(type, flags, sv)
1644I32 type;
1645I32 flags;
1646SV *sv;
1647{
1648 SVOP *svop;
1649 Newz(1101, svop, 1, SVOP);
1650 svop->op_type = type;
1651 svop->op_ppaddr = ppaddr[type];
1652 svop->op_sv = sv;
1653 svop->op_next = (OP*)svop;
1654 svop->op_flags = flags;
1655 if (opargs[type] & OA_RETSCALAR)
463ee0b2 1656 scalar((OP*)svop);
79072805 1657 if (opargs[type] & OA_TARGET)
ed6116ce 1658 svop->op_targ = pad_alloc(type, SVs_PADTMP);
79072805
LW
1659 return (*check[type])((OP*)svop);
1660}
1661
1662OP *
1663newGVOP(type, flags, gv)
1664I32 type;
1665I32 flags;
1666GV *gv;
1667{
1668 GVOP *gvop;
1669 Newz(1101, gvop, 1, GVOP);
1670 gvop->op_type = type;
1671 gvop->op_ppaddr = ppaddr[type];
8990e307 1672 gvop->op_gv = (GV*)SvREFCNT_inc(gv);
79072805
LW
1673 gvop->op_next = (OP*)gvop;
1674 gvop->op_flags = flags;
1675 if (opargs[type] & OA_RETSCALAR)
463ee0b2 1676 scalar((OP*)gvop);
79072805 1677 if (opargs[type] & OA_TARGET)
ed6116ce 1678 gvop->op_targ = pad_alloc(type, SVs_PADTMP);
79072805
LW
1679 return (*check[type])((OP*)gvop);
1680}
1681
1682OP *
1683newPVOP(type, flags, pv)
1684I32 type;
1685I32 flags;
1686char *pv;
1687{
1688 PVOP *pvop;
1689 Newz(1101, pvop, 1, PVOP);
1690 pvop->op_type = type;
1691 pvop->op_ppaddr = ppaddr[type];
1692 pvop->op_pv = pv;
1693 pvop->op_next = (OP*)pvop;
1694 pvop->op_flags = flags;
1695 if (opargs[type] & OA_RETSCALAR)
463ee0b2 1696 scalar((OP*)pvop);
79072805 1697 if (opargs[type] & OA_TARGET)
ed6116ce 1698 pvop->op_targ = pad_alloc(type, SVs_PADTMP);
79072805
LW
1699 return (*check[type])((OP*)pvop);
1700}
1701
1702OP *
1703newCVOP(type, flags, cv, cont)
1704I32 type;
1705I32 flags;
1706CV *cv;
1707OP *cont;
1708{
1709 CVOP *cvop;
1710 Newz(1101, cvop, 1, CVOP);
1711 cvop->op_type = type;
1712 cvop->op_ppaddr = ppaddr[type];
1713 cvop->op_cv = cv;
1714 cvop->op_cont = cont;
1715 cvop->op_next = (OP*)cvop;
1716 cvop->op_flags = flags;
1717 if (opargs[type] & OA_RETSCALAR)
463ee0b2 1718 scalar((OP*)cvop);
79072805 1719 if (opargs[type] & OA_TARGET)
ed6116ce 1720 cvop->op_targ = pad_alloc(type, SVs_PADTMP);
79072805
LW
1721 return (*check[type])((OP*)cvop);
1722}
1723
1724void
1725package(op)
1726OP *op;
1727{
93a17b20 1728 SV *sv;
79072805
LW
1729
1730 save_hptr(&curstash);
1731 save_item(curstname);
93a17b20 1732 if (op) {
463ee0b2
LW
1733 STRLEN len;
1734 char *name;
93a17b20 1735 sv = cSVOP->op_sv;
463ee0b2
LW
1736 curstash = fetch_stash(sv,TRUE);
1737 name = SvPV(sv, len);
1738 sv_setpvn(curstname, name, len);
93a17b20
LW
1739 op_free(op);
1740 }
1741 else {
1742 sv_setpv(curstname,"<none>");
1743 curstash = Nullhv;
1744 }
79072805 1745 copline = NOLINE;
8990e307 1746 expect = XSTATE;
79072805
LW
1747}
1748
463ee0b2
LW
1749HV*
1750fetch_stash(sv,create)
1751SV *sv;
1752I32 create;
1753{
1754 char tmpbuf[256];
1755 HV *stash;
1756 GV *tmpgv;
1757 char *name = SvPV(sv, na);
1758 sprintf(tmpbuf,"%s::",name);
1759 tmpgv = gv_fetchpv(tmpbuf,create);
1760 if (!tmpgv)
1761 return 0;
1762 if (!GvHV(tmpgv))
1763 GvHV(tmpgv) = newHV();
1764 stash = GvHV(tmpgv);
1765 if (!HvNAME(stash))
1766 HvNAME(stash) = savestr(name);
1767 return stash;
1768}
1769
79072805
LW
1770OP *
1771newSLICEOP(flags, subscript, listval)
1772I32 flags;
1773OP *subscript;
1774OP *listval;
1775{
1776 return newBINOP(OP_LSLICE, flags,
8990e307
LW
1777 list(force_list(subscript)),
1778 list(force_list(listval)) );
79072805
LW
1779}
1780
1781static I32
1782list_assignment(op)
1783register OP *op;
1784{
1785 if (!op)
1786 return TRUE;
1787
1788 if (op->op_type == OP_NULL && op->op_flags & OPf_KIDS)
1789 op = cUNOP->op_first;
1790
1791 if (op->op_type == OP_COND_EXPR) {
1792 I32 t = list_assignment(cCONDOP->op_first->op_sibling);
1793 I32 f = list_assignment(cCONDOP->op_first->op_sibling->op_sibling);
1794
1795 if (t && f)
1796 return TRUE;
1797 if (t || f)
1798 yyerror("Assignment to both a list and a scalar");
1799 return FALSE;
1800 }
1801
1802 if (op->op_type == OP_LIST || op->op_flags & OPf_PARENS ||
1803 op->op_type == OP_RV2AV || op->op_type == OP_RV2HV ||
1804 op->op_type == OP_ASLICE || op->op_type == OP_HSLICE)
1805 return TRUE;
1806
93a17b20
LW
1807 if (op->op_type == OP_PADAV || op->op_type == OP_PADHV)
1808 return TRUE;
1809
79072805
LW
1810 if (op->op_type == OP_RV2SV)
1811 return FALSE;
1812
1813 return FALSE;
1814}
1815
1816OP *
1817newASSIGNOP(flags, left, right)
1818I32 flags;
1819OP *left;
1820OP *right;
1821{
1822 OP *op;
1823
1824 if (list_assignment(left)) {
463ee0b2
LW
1825 modcount = 0;
1826 left = mod(left, OP_AASSIGN);
79072805
LW
1827 if (right && right->op_type == OP_SPLIT) {
1828 if ((op = ((LISTOP*)right)->op_first) && op->op_type == OP_PUSHRE) {
1829 PMOP *pm = (PMOP*)op;
1830 if (left->op_type == OP_RV2AV) {
1831 op = ((UNOP*)left)->op_first;
1832 if (op->op_type == OP_GV && !pm->op_pmreplroot) {
1833 pm->op_pmreplroot = (OP*)((GVOP*)op)->op_gv;
1834 pm->op_pmflags |= PMf_ONCE;
1835 op_free(left);
1836 return right;
1837 }
1838 }
1839 else {
463ee0b2 1840 if (modcount < 10000) {
79072805 1841 SV *sv = ((SVOP*)((LISTOP*)right)->op_last)->op_sv;
463ee0b2
LW
1842 if (SvIVX(sv) == 0)
1843 sv_setiv(sv, modcount+1);
79072805
LW
1844 }
1845 }
1846 }
1847 }
1848 op = newBINOP(OP_AASSIGN, flags,
8990e307
LW
1849 list(force_list(right)),
1850 list(force_list(left)) );
79072805 1851 op->op_private = 0;
93a17b20 1852 if (!(left->op_flags & OPf_INTRO)) {
79072805
LW
1853 static int generation = 0;
1854 OP *curop;
1855 OP *lastop = op;
1856 generation++;
1857 for (curop = LINKLIST(op); curop != op; curop = LINKLIST(curop)) {
1858 if (opargs[curop->op_type] & OA_DANGEROUS) {
1859 if (curop->op_type == OP_GV) {
1860 GV *gv = ((GVOP*)curop)->op_gv;
1861 if (gv == defgv || SvCUR(gv) == generation)
1862 break;
1863 SvCUR(gv) = generation;
1864 }
1865 else if (curop->op_type == OP_RV2CV)
1866 break;
1867 else if (curop->op_type == OP_RV2SV ||
1868 curop->op_type == OP_RV2AV ||
1869 curop->op_type == OP_RV2HV ||
1870 curop->op_type == OP_RV2GV) {
1871 if (lastop->op_type != OP_GV) /* funny deref? */
1872 break;
1873 }
1874 else
1875 break;
1876 }
1877 lastop = curop;
1878 }
1879 if (curop != op)
1880 op->op_private = OPpASSIGN_COMMON;
1881 }
79072805
LW
1882 return op;
1883 }
1884 if (!right)
1885 right = newOP(OP_UNDEF, 0);
1886 if (right->op_type == OP_READLINE) {
1887 right->op_flags |= OPf_STACKED;
463ee0b2 1888 return newBINOP(OP_NULL, flags, mod(scalar(left), OP_SASSIGN), scalar(right));
79072805
LW
1889 }
1890 else
1891 op = newBINOP(OP_SASSIGN, flags,
463ee0b2 1892 scalar(right), mod(scalar(left), OP_SASSIGN) );
79072805
LW
1893 return op;
1894}
1895
1896OP *
1897newSTATEOP(flags, label, op)
1898I32 flags;
1899char *label;
1900OP *op;
1901{
1902 register COP *cop;
1903
8990e307
LW
1904 /* Introduce my variables. */
1905 if (min_intro_pending) {
1906 SV **svp = AvARRAY(comppad_name);
1907 I32 i;
1908 SV *sv;
1909 for (i = min_intro_pending; i <= max_intro_pending; i++) {
1910 if (sv = svp[i])
1911 SvIVX(sv) = 999999999; /* Don't know scope end yet. */
1912 }
1913 min_intro_pending = 0;
1914 comppad_name_fill = max_intro_pending; /* Needn't search higher */
1915 }
93a17b20 1916
79072805 1917 Newz(1101, cop, 1, COP);
8990e307
LW
1918 if (perldb && curcop->cop_line && curstash != debstash) {
1919 cop->op_type = OP_DBSTATE;
1920 cop->op_ppaddr = ppaddr[ OP_DBSTATE ];
1921 }
1922 else {
1923 cop->op_type = OP_NEXTSTATE;
1924 cop->op_ppaddr = ppaddr[ OP_NEXTSTATE ];
1925 }
79072805
LW
1926 cop->op_flags = flags;
1927 cop->op_private = 0;
1928 cop->op_next = (OP*)cop;
1929
463ee0b2
LW
1930 if (label) {
1931 cop->cop_label = label;
1932 needblockscope = TRUE;
1933 }
1934 cop->cop_seq = cop_seqmax++;
79072805
LW
1935
1936 if (copline == NOLINE)
1937 cop->cop_line = curcop->cop_line;
1938 else {
1939 cop->cop_line = copline;
1940 copline = NOLINE;
1941 }
8990e307 1942 cop->cop_filegv = SvREFCNT_inc(curcop->cop_filegv);
79072805
LW
1943 cop->cop_stash = curstash;
1944
8990e307 1945 if (perldb && curstash != debstash) {
93a17b20
LW
1946 SV **svp = av_fetch(GvAV(curcop->cop_filegv),(I32)cop->cop_line, FALSE);
1947 if (svp && *svp != &sv_undef && !SvIOK(*svp)) {
463ee0b2 1948 SvIVX(*svp) = 1;
93a17b20
LW
1949 SvIOK_on(*svp);
1950 SvSTASH(*svp) = (HV*)cop;
1951 }
1952 }
1953
79072805
LW
1954 return prepend_elem(OP_LINESEQ, (OP*)cop, op);
1955}
1956
1957OP *
1958newLOGOP(type, flags, first, other)
1959I32 type;
1960I32 flags;
1961OP* first;
1962OP* other;
1963{
1964 LOGOP *logop;
1965 OP *op;
1966
8990e307 1967 scalarboolean(first);
79072805
LW
1968 /* optimize "!a && b" to "a || b", and "!a || b" to "a && b" */
1969 if (first->op_type == OP_NOT && (first->op_flags & OPf_SPECIAL)) {
1970 if (type == OP_AND || type == OP_OR) {
1971 if (type == OP_AND)
1972 type = OP_OR;
1973 else
1974 type = OP_AND;
1975 op = first;
1976 first = cUNOP->op_first;
1977 if (op->op_next)
1978 first->op_next = op->op_next;
1979 cUNOP->op_first = Nullop;
1980 op_free(op);
1981 }
1982 }
1983 if (first->op_type == OP_CONST) {
93a17b20
LW
1984 if (dowarn && (first->op_private & OPpCONST_BARE))
1985 warn("Probable precedence problem on %s", op_name[type]);
79072805
LW
1986 if ((type == OP_AND) == (SvTRUE(((SVOP*)first)->op_sv))) {
1987 op_free(first);
1988 return other;
1989 }
1990 else {
1991 op_free(other);
1992 return first;
1993 }
1994 }
1995 else if (first->op_type == OP_WANTARRAY) {
1996 if (type == OP_AND)
1997 list(other);
1998 else
1999 scalar(other);
2000 }
2001
2002 if (!other)
2003 return first;
2004
2005 Newz(1101, logop, 1, LOGOP);
2006
2007 logop->op_type = type;
2008 logop->op_ppaddr = ppaddr[type];
2009 logop->op_first = first;
2010 logop->op_flags = flags | OPf_KIDS;
2011 logop->op_other = LINKLIST(other);
2012 logop->op_private = 1;
2013
2014 /* establish postfix order */
2015 logop->op_next = LINKLIST(first);
2016 first->op_next = (OP*)logop;
2017 first->op_sibling = other;
2018
2019 op = newUNOP(OP_NULL, 0, (OP*)logop);
2020 other->op_next = op;
2021
2022 return op;
2023}
2024
2025OP *
2026newCONDOP(flags, first, true, false)
2027I32 flags;
2028OP* first;
2029OP* true;
2030OP* false;
2031{
2032 CONDOP *condop;
2033 OP *op;
2034
2035 if (!false)
2036 return newLOGOP(OP_AND, 0, first, true);
463ee0b2
LW
2037 if (!true)
2038 return newLOGOP(OP_OR, 0, first, false);
79072805 2039
8990e307 2040 scalarboolean(first);
79072805
LW
2041 if (first->op_type == OP_CONST) {
2042 if (SvTRUE(((SVOP*)first)->op_sv)) {
2043 op_free(first);
2044 op_free(false);
2045 return true;
2046 }
2047 else {
2048 op_free(first);
2049 op_free(true);
2050 return false;
2051 }
2052 }
2053 else if (first->op_type == OP_WANTARRAY) {
2054 list(true);
2055 scalar(false);
2056 }
2057 Newz(1101, condop, 1, CONDOP);
2058
2059 condop->op_type = OP_COND_EXPR;
2060 condop->op_ppaddr = ppaddr[OP_COND_EXPR];
2061 condop->op_first = first;
2062 condop->op_flags = flags | OPf_KIDS;
2063 condop->op_true = LINKLIST(true);
2064 condop->op_false = LINKLIST(false);
2065 condop->op_private = 1;
2066
2067 /* establish postfix order */
2068 condop->op_next = LINKLIST(first);
2069 first->op_next = (OP*)condop;
2070
2071 first->op_sibling = true;
2072 true->op_sibling = false;
2073 op = newUNOP(OP_NULL, 0, (OP*)condop);
2074
2075 true->op_next = op;
2076 false->op_next = op;
2077
2078 return op;
2079}
2080
2081OP *
2082newRANGE(flags, left, right)
2083I32 flags;
2084OP *left;
2085OP *right;
2086{
2087 CONDOP *condop;
2088 OP *flip;
2089 OP *flop;
2090 OP *op;
2091
2092 Newz(1101, condop, 1, CONDOP);
2093
2094 condop->op_type = OP_RANGE;
2095 condop->op_ppaddr = ppaddr[OP_RANGE];
2096 condop->op_first = left;
2097 condop->op_flags = OPf_KIDS;
2098 condop->op_true = LINKLIST(left);
2099 condop->op_false = LINKLIST(right);
2100 condop->op_private = 1;
2101
2102 left->op_sibling = right;
2103
2104 condop->op_next = (OP*)condop;
2105 flip = newUNOP(OP_FLIP, flags, (OP*)condop);
2106 flop = newUNOP(OP_FLOP, 0, flip);
2107 op = newUNOP(OP_NULL, 0, flop);
2108 linklist(flop);
2109
2110 left->op_next = flip;
2111 right->op_next = flop;
2112
ed6116ce 2113 condop->op_targ = pad_alloc(OP_RANGE, SVs_PADMY);
79072805 2114 sv_upgrade(PAD_SV(condop->op_targ), SVt_PVNV);
ed6116ce 2115 flip->op_targ = pad_alloc(OP_RANGE, SVs_PADMY);
79072805
LW
2116 sv_upgrade(PAD_SV(flip->op_targ), SVt_PVNV);
2117
2118 flip->op_private = left->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
2119 flop->op_private = right->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
2120
2121 flip->op_next = op;
2122 if (!flip->op_private || !flop->op_private)
2123 linklist(op); /* blow off optimizer unless constant */
2124
2125 return op;
2126}
2127
2128OP *
2129newLOOPOP(flags, debuggable, expr, block)
2130I32 flags;
2131I32 debuggable;
2132OP *expr;
2133OP *block;
2134{
463ee0b2 2135 OP* listop;
93a17b20 2136 OP* op;
463ee0b2
LW
2137 int once = block && block->op_flags & OPf_SPECIAL &&
2138 (block->op_type == OP_ENTERSUBR || block->op_type == OP_NULL);
93a17b20 2139
463ee0b2
LW
2140 if (expr) {
2141 if (once && expr->op_type == OP_CONST && !SvTRUE(((SVOP*)expr)->op_sv))
2142 return block; /* do {} while 0 does once */
2143 else if (expr->op_type == OP_READLINE || expr->op_type == OP_GLOB)
2144 expr = newASSIGNOP(0, newSVREF(newGVOP(OP_GV, 0, defgv)), expr);
2145 }
93a17b20 2146
8990e307 2147 listop = append_elem(OP_LINESEQ, block, newOP(OP_UNSTACK, 0));
93a17b20 2148 op = newLOGOP(OP_AND, 0, expr, listop);
463ee0b2 2149
79072805
LW
2150 ((LISTOP*)listop)->op_last->op_next = LINKLIST(op);
2151
463ee0b2 2152 if (once && op != listop)
79072805
LW
2153 op->op_next = ((LOGOP*)cUNOP->op_first)->op_other;
2154
2155 op->op_flags |= flags;
463ee0b2 2156 return scope(op);
79072805
LW
2157}
2158
2159OP *
2160newWHILEOP(flags, debuggable, loop, expr, block, cont)
2161I32 flags;
2162I32 debuggable;
2163LOOP *loop;
2164OP *expr;
2165OP *block;
2166OP *cont;
2167{
2168 OP *redo;
2169 OP *next = 0;
2170 OP *listop;
2171 OP *op;
2172 OP *condop;
2173
2174 if (expr && (expr->op_type == OP_READLINE || expr->op_type == OP_GLOB))
2175 expr = newASSIGNOP(0, newSVREF(newGVOP(OP_GV, 0, defgv)), expr);
2176
2177 if (!block)
2178 block = newOP(OP_NULL, 0);
2179
2180 if (cont)
2181 next = LINKLIST(cont);
2182 if (expr)
2183 cont = append_elem(OP_LINESEQ, cont, newOP(OP_UNSTACK, 0));
2184
463ee0b2 2185 listop = append_list(OP_LINESEQ, (LISTOP*)block, (LISTOP*)cont);
79072805
LW
2186 redo = LINKLIST(listop);
2187
2188 if (expr) {
2189 op = newLOGOP(OP_AND, 0, expr, scalar(listop));
463ee0b2
LW
2190 if (op == expr) { /* oops, it's a while (0) */
2191 op_free(expr);
2192 op_free((OP*)loop);
2193 return Nullop; /* (listop already freed by newLOGOP) */
2194 }
79072805
LW
2195 ((LISTOP*)listop)->op_last->op_next = condop =
2196 (op == listop ? redo : LINKLIST(op));
2197 if (!next)
2198 next = condop;
2199 }
2200 else
2201 op = listop;
2202
2203 if (!loop) {
2204 Newz(1101,loop,1,LOOP);
2205 loop->op_type = OP_ENTERLOOP;
2206 loop->op_ppaddr = ppaddr[OP_ENTERLOOP];
2207 loop->op_private = 0;
2208 loop->op_next = (OP*)loop;
2209 }
2210
463ee0b2 2211 op = newBINOP(OP_LEAVELOOP, 0, (OP*)loop, op);
79072805
LW
2212
2213 loop->op_redoop = redo;
2214 loop->op_lastop = op;
2215
2216 if (next)
2217 loop->op_nextop = next;
2218 else
2219 loop->op_nextop = op;
2220
2221 op->op_flags |= flags;
2222 return op;
2223}
2224
2225OP *
8990e307 2226#ifndef STANDARD_C
79072805
LW
2227newFOROP(flags,label,forline,sv,expr,block,cont)
2228I32 flags;
2229char *label;
2230line_t forline;
2231OP* sv;
2232OP* expr;
2233OP*block;
2234OP*cont;
8990e307
LW
2235#else
2236newFOROP(I32 flags,char *label,line_t forline,OP *sv,OP *expr,OP *block,OP *cont)
2237#endif /* STANDARD_C */
79072805
LW
2238{
2239 LOOP *loop;
2240
2241 copline = forline;
2242 if (sv) {
2243 if (sv->op_type == OP_RV2SV) {
2244 OP *op = sv;
2245 sv = cUNOP->op_first;
2246 sv->op_next = sv;
2247 cUNOP->op_first = Nullop;
2248 op_free(op);
2249 }
2250 else
463ee0b2 2251 croak("Can't use %s for loop variable", op_name[sv->op_type]);
79072805
LW
2252 }
2253 else {
2254 sv = newGVOP(OP_GV, 0, defgv);
2255 }
2256 loop = (LOOP*)list(convert(OP_ENTERITER, 0,
8990e307 2257 append_elem(OP_LIST, force_list(expr), scalar(sv))));
79072805 2258 return newSTATEOP(0, label, newWHILEOP(flags, 1,
93a17b20 2259 loop, newOP(OP_ITER, 0), block, cont));
79072805
LW
2260}
2261
8990e307
LW
2262OP*
2263newLOOPEX(type, label)
2264I32 type;
2265OP* label;
2266{
2267 OP *op;
2268 if (type != OP_GOTO || label->op_type == OP_CONST) {
2269 op = newPVOP(type, 0, savestr(SvPVx(((SVOP*)label)->op_sv, na)));
2270 op_free(label);
2271 }
2272 else {
2273 if (label->op_type == OP_ENTERSUBR)
2274 label = newUNOP(OP_REFGEN, 0, ref(label, OP_REFGEN));
2275 op = newUNOP(type, OPf_STACKED, label);
2276 }
2277 needblockscope = TRUE;
2278 return op;
2279}
2280
79072805 2281void
463ee0b2 2282cv_clear(cv)
79072805
LW
2283CV *cv;
2284{
2285 if (!CvUSERSUB(cv) && CvROOT(cv)) {
8990e307
LW
2286 ENTER;
2287 if (CvPADLIST(cv)) {
2288 SV** svp = av_fetch(CvPADLIST(cv), 0, FALSE);
2289 if (svp) {
2290 SAVESPTR(comppad);
2291 SAVESPTR(curpad);
2292 comppad = (AV*)*svp; /* Need same context we had compiling */
2293 curpad = AvARRAY(comppad);
2294 }
2295 }
79072805
LW
2296 op_free(CvROOT(cv));
2297 CvROOT(cv) = Nullop;
2298 if (CvDEPTH(cv))
2299 warn("Deleting active subroutine"); /* XXX */
2300 if (CvPADLIST(cv)) {
2301 I32 i = AvFILL(CvPADLIST(cv));
2302 while (i > 0) {
2303 SV** svp = av_fetch(CvPADLIST(cv), i--, FALSE);
2304 if (svp)
463ee0b2 2305 av_free((AV*)*svp);
79072805 2306 }
463ee0b2 2307 av_free((AV*)CvPADLIST(cv));
79072805 2308 }
8990e307
LW
2309 SvREFCNT_dec(CvGV(cv));
2310 LEAVE;
79072805 2311 }
79072805
LW
2312}
2313
2314void
2315newSUB(floor,op,block)
2316I32 floor;
2317OP *op;
2318OP *block;
2319{
2320 register CV *cv;
463ee0b2
LW
2321 char *name = SvPVx(cSVOP->op_sv, na);
2322 GV *gv = gv_fetchpv(name,2);
79072805 2323 AV* av;
8990e307 2324 char *s;
79072805 2325
463ee0b2
LW
2326 sub_generation++;
2327 if ((cv = GvCV(gv)) && !GvCVGEN(gv)) {
79072805
LW
2328 if (CvDEPTH(cv))
2329 CvDELETED(cv) = TRUE; /* probably an autoloader */
2330 else {
93a17b20 2331 if (dowarn && CvROOT(cv)) {
79072805
LW
2332 line_t oldline = curcop->cop_line;
2333
2334 curcop->cop_line = copline;
2335 warn("Subroutine %s redefined",name);
2336 curcop->cop_line = oldline;
2337 }
8990e307 2338 SvREFCNT_dec(cv);
79072805
LW
2339 }
2340 }
2341 Newz(101,cv,1,CV);
2342 sv_upgrade(cv, SVt_PVCV);
463ee0b2 2343 SvREFCNT(cv) = 1;
79072805 2344 GvCV(gv) = cv;
463ee0b2 2345 GvCVGEN(gv) = 0;
79072805 2346 CvFILEGV(cv) = curcop->cop_filegv;
8990e307
LW
2347 CvGV(cv) = SvREFCNT_inc(gv);
2348 CvSTASH(cv) = curstash;
2349
2350 av = newAV();
2351 av_store(av, 0, Nullsv);
2352 av_store(comppad, 0, (SV*)av);
2353 SvOK_on(av);
2354 AvREAL_off(av);
79072805
LW
2355
2356 av = newAV();
2357 AvREAL_off(av);
8990e307
LW
2358 if (AvFILL(comppad_name) < AvFILL(comppad))
2359 av_store(comppad_name, AvFILL(comppad), Nullsv);
2360 av_store(av, 0, (SV*)comppad_name);
79072805
LW
2361 av_store(av, 1, (SV*)comppad);
2362 AvFILL(av) = 1;
2363 CvPADLIST(cv) = av;
8990e307 2364 comppad_name = newAV();
79072805 2365
93a17b20
LW
2366 if (!block) {
2367 CvROOT(cv) = 0;
2368 op_free(op);
2369 copline = NOLINE;
8990e307 2370 LEAVE_SCOPE(floor);
93a17b20
LW
2371 return;
2372 }
79072805
LW
2373 CvROOT(cv) = newUNOP(OP_LEAVESUBR, 0, scalarseq(block));
2374 CvSTART(cv) = LINKLIST(CvROOT(cv));
2375 CvROOT(cv)->op_next = 0;
2376 peep(CvSTART(cv));
2377 CvDELETED(cv) = FALSE;
8990e307
LW
2378 if (s = strrchr(name,':'))
2379 s++;
2380 else
2381 s = name;
2382 if (strEQ(s, "BEGIN")) {
2383 line_t oldline = compiling.cop_line;
93a17b20 2384
8990e307
LW
2385 ENTER;
2386 SAVESPTR(compiling.cop_filegv);
2387 SAVEI32(perldb);
93a17b20
LW
2388 if (!beginav)
2389 beginav = newAV();
8990e307 2390 av_push(beginav, cv);
93a17b20
LW
2391 DEBUG_x( dump_sub(gv) );
2392 rs = nrs;
2393 rslen = nrslen;
2394 rschar = nrschar;
2395 rspara = (nrslen == 2);
8990e307 2396 GvCV(gv) = 0;
93a17b20 2397 calllist(beginav);
93a17b20
LW
2398 rs = "\n";
2399 rslen = 1;
2400 rschar = '\n';
2401 rspara = 0;
93a17b20 2402 curcop = &compiling;
8990e307
LW
2403 curcop->cop_line = oldline; /* might have recursed to yylex */
2404 LEAVE;
93a17b20 2405 }
8990e307 2406 else if (strEQ(s, "END")) {
93a17b20
LW
2407 if (!endav)
2408 endav = newAV();
2409 av_unshift(endav, 1);
8990e307 2410 av_store(endav, 0, SvREFCNT_inc(cv));
93a17b20 2411 }
8990e307 2412 if (perldb && curstash != debstash) {
79072805 2413 SV *sv;
8990e307 2414 SV *tmpstr = sv_newmortal();
79072805 2415
463ee0b2 2416 sprintf(buf,"%s:%ld",SvPVX(GvSV(curcop->cop_filegv)), subline);
79072805
LW
2417 sv = newSVpv(buf,0);
2418 sv_catpv(sv,"-");
2419 sprintf(buf,"%ld",(long)curcop->cop_line);
2420 sv_catpv(sv,buf);
2421 gv_efullname(tmpstr,gv);
463ee0b2 2422 hv_store(GvHV(DBsub), SvPVX(tmpstr), SvCUR(tmpstr), sv, 0);
79072805
LW
2423 }
2424 op_free(op);
2425 copline = NOLINE;
8990e307 2426 LEAVE_SCOPE(floor);
79072805
LW
2427}
2428
2429void
463ee0b2 2430newXSUB(name, ix, subaddr, filename)
79072805
LW
2431char *name;
2432I32 ix;
2433I32 (*subaddr)();
2434char *filename;
2435{
2436 register CV *cv;
463ee0b2 2437 GV *gv = gv_fetchpv(name,2);
8990e307 2438 char *s;
79072805 2439
463ee0b2
LW
2440 sub_generation++;
2441 if ((cv = GvCV(gv)) && !GvCVGEN(gv)) {
79072805
LW
2442 if (dowarn)
2443 warn("Subroutine %s redefined",name);
2444 if (!CvUSERSUB(cv) && CvROOT(cv)) {
2445 op_free(CvROOT(cv));
2446 CvROOT(cv) = Nullop;
2447 }
2448 Safefree(cv);
2449 }
2450 Newz(101,cv,1,CV);
2451 sv_upgrade(cv, SVt_PVCV);
463ee0b2 2452 SvREFCNT(cv) = 1;
79072805 2453 GvCV(gv) = cv;
8990e307 2454 CvGV(cv) = SvREFCNT_inc(gv);
463ee0b2 2455 GvCVGEN(gv) = 0;
79072805
LW
2456 CvFILEGV(cv) = gv_fetchfile(filename);
2457 CvUSERSUB(cv) = subaddr;
2458 CvUSERINDEX(cv) = ix;
2459 CvDELETED(cv) = FALSE;
8990e307
LW
2460 if (s = strrchr(name,':'))
2461 s++;
2462 else
2463 s = name;
2464 if (strEQ(s, "BEGIN")) {
93a17b20
LW
2465 if (!beginav)
2466 beginav = newAV();
8990e307 2467 av_push(beginav, SvREFCNT_inc(gv));
93a17b20 2468 }
8990e307 2469 else if (strEQ(s, "END")) {
93a17b20
LW
2470 if (!endav)
2471 endav = newAV();
2472 av_unshift(endav, 1);
8990e307 2473 av_store(endav, 0, SvREFCNT_inc(gv));
93a17b20 2474 }
79072805
LW
2475}
2476
2477void
2478newFORM(floor,op,block)
2479I32 floor;
2480OP *op;
2481OP *block;
2482{
2483 register CV *cv;
2484 char *name;
2485 GV *gv;
2486 AV* av;
2487
2488 if (op)
463ee0b2 2489 name = SvPVx(cSVOP->op_sv, na);
79072805
LW
2490 else
2491 name = "STDOUT";
2492 gv = gv_fetchpv(name,TRUE);
2493 if (cv = GvFORM(gv)) {
2494 if (dowarn) {
2495 line_t oldline = curcop->cop_line;
2496
2497 curcop->cop_line = copline;
2498 warn("Format %s redefined",name);
2499 curcop->cop_line = oldline;
2500 }
8990e307 2501 SvREFCNT_dec(cv);
79072805
LW
2502 }
2503 Newz(101,cv,1,CV);
2504 sv_upgrade(cv, SVt_PVFM);
463ee0b2 2505 SvREFCNT(cv) = 1;
79072805 2506 GvFORM(gv) = cv;
8990e307 2507 CvGV(cv) = SvREFCNT_inc(gv);
79072805
LW
2508 CvFILEGV(cv) = curcop->cop_filegv;
2509
2510 CvPADLIST(cv) = av = newAV();
2511 AvREAL_off(av);
2512 av_store(av, 1, (SV*)comppad);
2513 AvFILL(av) = 1;
2514
2515 CvROOT(cv) = newUNOP(OP_LEAVEWRITE, 0, scalarseq(block));
2516 CvSTART(cv) = LINKLIST(CvROOT(cv));
2517 CvROOT(cv)->op_next = 0;
2518 peep(CvSTART(cv));
2519 CvDELETED(cv) = FALSE;
2520 FmLINES(cv) = 0;
2521 op_free(op);
2522 copline = NOLINE;
8990e307 2523 LEAVE_SCOPE(floor);
79072805
LW
2524}
2525
2526OP *
2527newMETHOD(ref,name)
2528OP *ref;
2529OP *name;
2530{
2531 LOGOP* mop;
2532 Newz(1101, mop, 1, LOGOP);
2533 mop->op_type = OP_METHOD;
2534 mop->op_ppaddr = ppaddr[OP_METHOD];
2535 mop->op_first = scalar(ref);
2536 mop->op_flags |= OPf_KIDS;
2537 mop->op_private = 1;
2538 mop->op_other = LINKLIST(name);
ed6116ce 2539 mop->op_targ = pad_alloc(OP_METHOD, SVs_PADTMP);
79072805
LW
2540 mop->op_next = LINKLIST(ref);
2541 ref->op_next = (OP*)mop;
8990e307 2542 return scalar((OP*)mop);
79072805
LW
2543}
2544
2545OP *
2546newANONLIST(op)
2547OP* op;
2548{
93a17b20
LW
2549 return newUNOP(OP_REFGEN, 0,
2550 ref(list(convert(OP_ANONLIST, 0, op)), OP_REFGEN));
79072805
LW
2551}
2552
2553OP *
2554newANONHASH(op)
2555OP* op;
2556{
93a17b20
LW
2557 return newUNOP(OP_REFGEN, 0,
2558 ref(list(convert(OP_ANONHASH, 0, op)), OP_REFGEN));
79072805
LW
2559}
2560
2561OP *
2562oopsAV(o)
2563OP *o;
2564{
ed6116ce
LW
2565 switch (o->op_type) {
2566 case OP_PADSV:
2567 o->op_type = OP_PADAV;
2568 o->op_ppaddr = ppaddr[OP_PADAV];
2569 return ref(newUNOP(OP_RV2AV, 0, scalar(o)), OP_RV2AV);
2570
2571 case OP_RV2SV:
79072805
LW
2572 o->op_type = OP_RV2AV;
2573 o->op_ppaddr = ppaddr[OP_RV2AV];
2574 ref(o, OP_RV2AV);
ed6116ce
LW
2575 break;
2576
2577 default:
79072805 2578 warn("oops: oopsAV");
ed6116ce
LW
2579 break;
2580 }
79072805
LW
2581 return o;
2582}
2583
2584OP *
2585oopsHV(o)
2586OP *o;
2587{
ed6116ce
LW
2588 switch (o->op_type) {
2589 case OP_PADSV:
2590 case OP_PADAV:
2591 o->op_type = OP_PADHV;
2592 o->op_ppaddr = ppaddr[OP_PADHV];
2593 return ref(newUNOP(OP_RV2HV, 0, scalar(o)), OP_RV2HV);
2594
2595 case OP_RV2SV:
2596 case OP_RV2AV:
79072805
LW
2597 o->op_type = OP_RV2HV;
2598 o->op_ppaddr = ppaddr[OP_RV2HV];
2599 ref(o, OP_RV2HV);
ed6116ce
LW
2600 break;
2601
2602 default:
79072805 2603 warn("oops: oopsHV");
ed6116ce
LW
2604 break;
2605 }
79072805
LW
2606 return o;
2607}
2608
2609OP *
2610newAVREF(o)
2611OP *o;
2612{
ed6116ce
LW
2613 if (o->op_type == OP_PADANY) {
2614 o->op_type = OP_PADAV;
2615 o->op_ppaddr = ppaddr[OP_PADAV];
93a17b20 2616 return o;
ed6116ce 2617 }
79072805
LW
2618 return newUNOP(OP_RV2AV, 0, scalar(o));
2619}
2620
2621OP *
2622newGVREF(o)
2623OP *o;
2624{
2625 return newUNOP(OP_RV2GV, 0, scalar(o));
2626}
2627
2628OP *
2629newHVREF(o)
2630OP *o;
2631{
ed6116ce
LW
2632 if (o->op_type == OP_PADANY) {
2633 o->op_type = OP_PADHV;
2634 o->op_ppaddr = ppaddr[OP_PADHV];
93a17b20 2635 return o;
ed6116ce 2636 }
79072805
LW
2637 return newUNOP(OP_RV2HV, 0, scalar(o));
2638}
2639
2640OP *
2641oopsCV(o)
2642OP *o;
2643{
463ee0b2 2644 croak("NOT IMPL LINE %d",__LINE__);
79072805
LW
2645 /* STUB */
2646 return o;
2647}
2648
2649OP *
2650newCVREF(o)
2651OP *o;
2652{
2653 return newUNOP(OP_RV2CV, 0, scalar(o));
2654}
2655
2656OP *
2657newSVREF(o)
2658OP *o;
2659{
ed6116ce
LW
2660 if (o->op_type == OP_PADANY) {
2661 o->op_type = OP_PADSV;
2662 o->op_ppaddr = ppaddr[OP_PADSV];
93a17b20 2663 return o;
ed6116ce 2664 }
79072805
LW
2665 return newUNOP(OP_RV2SV, 0, scalar(o));
2666}
2667
2668/* Check routines. */
2669
2670OP *
79072805
LW
2671ck_concat(op)
2672OP *op;
2673{
2674 if (cUNOP->op_first->op_type == OP_CONCAT)
2675 op->op_flags |= OPf_STACKED;
2676 return op;
2677}
2678
2679OP *
2680ck_chop(op)
2681OP *op;
2682{
2683 if (op->op_flags & OPf_KIDS) {
2684 OP* newop;
463ee0b2 2685 op = modkids(ck_fun(op), op->op_type);
79072805
LW
2686 if (op->op_private != 1)
2687 return op;
2688 newop = cUNOP->op_first->op_sibling;
2689 if (!newop || newop->op_type != OP_RV2SV)
2690 return op;
2691 op_free(cUNOP->op_first);
2692 cUNOP->op_first = newop;
2693 }
2694 op->op_type = OP_SCHOP;
2695 op->op_ppaddr = ppaddr[OP_SCHOP];
2696 return op;
2697}
2698
2699OP *
2700ck_eof(op)
2701OP *op;
2702{
2703 I32 type = op->op_type;
2704
8990e307
LW
2705 if (op->op_flags & OPf_KIDS) {
2706 if (cLISTOP->op_first->op_type == OP_STUB) {
2707 op_free(op);
2708 op = newUNOP(type, OPf_SPECIAL,
2709 newGVOP(OP_GV, 0, gv_fetchpv("main'ARGV", TRUE)));
2710 }
79072805 2711 return ck_fun(op);
79072805
LW
2712 }
2713 return op;
2714}
2715
2716OP *
2717ck_eval(op)
2718OP *op;
2719{
463ee0b2 2720 needblockscope = TRUE;
79072805
LW
2721 if (op->op_flags & OPf_KIDS) {
2722 SVOP *kid = (SVOP*)cUNOP->op_first;
2723
93a17b20
LW
2724 if (!kid) {
2725 op->op_flags &= ~OPf_KIDS;
8990e307 2726 null(op);
79072805
LW
2727 }
2728 else if (kid->op_type == OP_LINESEQ) {
2729 LOGOP *enter;
2730
2731 kid->op_next = op->op_next;
2732 cUNOP->op_first = 0;
2733 op_free(op);
2734
2735 Newz(1101, enter, 1, LOGOP);
2736 enter->op_type = OP_ENTERTRY;
2737 enter->op_ppaddr = ppaddr[OP_ENTERTRY];
2738 enter->op_private = 0;
2739
2740 /* establish postfix order */
2741 enter->op_next = (OP*)enter;
2742
463ee0b2 2743 op = prepend_elem(OP_LINESEQ, (OP*)enter, (OP*)kid);
79072805
LW
2744 op->op_type = OP_LEAVETRY;
2745 op->op_ppaddr = ppaddr[OP_LEAVETRY];
2746 enter->op_other = op;
2747 return op;
2748 }
2749 }
2750 else {
2751 op_free(op);
2752 op = newUNOP(OP_ENTEREVAL, 0, newSVREF(newGVOP(OP_GV, 0, defgv)));
2753 }
2754 return op;
2755}
2756
2757OP *
2758ck_exec(op)
2759OP *op;
2760{
2761 OP *kid;
79072805 2762 if (op->op_flags & OPf_STACKED) {
463ee0b2 2763 op = ck_fun(op);
79072805 2764 kid = cUNOP->op_first->op_sibling;
8990e307
LW
2765 if (kid->op_type == OP_RV2GV)
2766 null(kid);
79072805 2767 }
463ee0b2
LW
2768 else
2769 op = listkids(op);
79072805
LW
2770 return op;
2771}
2772
2773OP *
2774ck_gvconst(o)
2775register OP *o;
2776{
2777 o = fold_constants(o);
2778 if (o->op_type == OP_CONST)
2779 o->op_type = OP_GV;
2780 return o;
2781}
2782
2783OP *
2784ck_rvconst(op)
2785register OP *op;
2786{
2787 SVOP *kid = (SVOP*)cUNOP->op_first;
2788 if (kid->op_type == OP_CONST) {
2789 kid->op_type = OP_GV;
8990e307 2790 kid->op_sv = SvREFCNT_inc(gv_fetchpv(SvPVx(kid->op_sv, na),
463ee0b2 2791 1+(op->op_type==OP_RV2CV)));
79072805
LW
2792 }
2793 return op;
2794}
2795
2796OP *
2797ck_formline(op)
2798OP *op;
2799{
2800 return ck_fun(op);
2801}
2802
2803OP *
2804ck_ftst(op)
2805OP *op;
2806{
2807 I32 type = op->op_type;
2808
2809 if (op->op_flags & OPf_SPECIAL)
2810 return op;
2811
2812 if (op->op_flags & OPf_KIDS) {
2813 SVOP *kid = (SVOP*)cUNOP->op_first;
2814
2815 if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) {
2816 OP *newop = newGVOP(type, OPf_SPECIAL,
463ee0b2 2817 gv_fetchpv(SvPVx(kid->op_sv, na), TRUE));
79072805
LW
2818 op_free(op);
2819 return newop;
2820 }
2821 }
2822 else {
2823 op_free(op);
2824 if (type == OP_FTTTY)
2825 return newGVOP(type, OPf_SPECIAL, gv_fetchpv("main'STDIN", TRUE));
2826 else
2827 return newUNOP(type, 0, newSVREF(newGVOP(OP_GV, 0, defgv)));
2828 }
2829 return op;
2830}
2831
2832OP *
2833ck_fun(op)
2834OP *op;
2835{
2836 register OP *kid;
2837 OP **tokid;
2838 OP *sibl;
2839 I32 numargs = 0;
2840 register I32 oa = opargs[op->op_type] >> 8;
2841
2842 if (op->op_flags & OPf_STACKED) {
2843 if ((oa & OA_OPTIONAL) && (oa >> 4) && !((oa >> 4) & OA_OPTIONAL))
2844 oa &= ~OA_OPTIONAL;
2845 else
2846 return no_fh_allowed(op);
2847 }
2848
2849 if (op->op_flags & OPf_KIDS) {
2850 tokid = &cLISTOP->op_first;
2851 kid = cLISTOP->op_first;
8990e307
LW
2852 if (kid->op_type == OP_PUSHMARK ||
2853 kid->op_type == OP_NULL && kid->op_targ == OP_PUSHMARK)
2854 {
79072805
LW
2855 tokid = &kid->op_sibling;
2856 kid = kid->op_sibling;
2857 }
2858
2859 while (oa && kid) {
2860 numargs++;
2861 sibl = kid->op_sibling;
2862 switch (oa & 7) {
2863 case OA_SCALAR:
2864 scalar(kid);
2865 break;
2866 case OA_LIST:
2867 if (oa < 16) {
2868 kid = 0;
2869 continue;
2870 }
2871 else
2872 list(kid);
2873 break;
2874 case OA_AVREF:
2875 if (kid->op_type == OP_CONST &&
2876 (kid->op_private & OPpCONST_BARE)) {
463ee0b2 2877 char *name = SvPVx(((SVOP*)kid)->op_sv, na);
79072805 2878 OP *newop = newAVREF(newGVOP(OP_GV, 0,
463ee0b2
LW
2879 gv_fetchpv(name, TRUE) ));
2880 if (dowarn)
2881 warn("Array @%s missing the @ in argument %d of %s()",
2882 name, numargs, op_name[op->op_type]);
79072805
LW
2883 op_free(kid);
2884 kid = newop;
2885 kid->op_sibling = sibl;
2886 *tokid = kid;
2887 }
8990e307
LW
2888 else if (kid->op_type != OP_RV2AV && kid->op_type != OP_PADAV)
2889 bad_type(numargs, "array", op, kid);
463ee0b2 2890 mod(kid, op->op_type);
79072805
LW
2891 break;
2892 case OA_HVREF:
2893 if (kid->op_type == OP_CONST &&
2894 (kid->op_private & OPpCONST_BARE)) {
463ee0b2 2895 char *name = SvPVx(((SVOP*)kid)->op_sv, na);
79072805 2896 OP *newop = newHVREF(newGVOP(OP_GV, 0,
463ee0b2
LW
2897 gv_fetchpv(name, TRUE) ));
2898 if (dowarn)
2899 warn("Hash %%%s missing the %% in argument %d of %s()",
2900 name, numargs, op_name[op->op_type]);
79072805
LW
2901 op_free(kid);
2902 kid = newop;
2903 kid->op_sibling = sibl;
2904 *tokid = kid;
2905 }
8990e307
LW
2906 else if (kid->op_type != OP_RV2HV && kid->op_type != OP_PADHV)
2907 bad_type(numargs, "hash", op, kid);
463ee0b2 2908 mod(kid, op->op_type);
79072805
LW
2909 break;
2910 case OA_CVREF:
2911 {
2912 OP *newop = newUNOP(OP_NULL, 0, scalar(kid));
2913 kid->op_sibling = 0;
2914 linklist(kid);
2915 newop->op_next = newop;
2916 kid = newop;
2917 kid->op_sibling = sibl;
2918 *tokid = kid;
2919 }
2920 break;
2921 case OA_FILEREF:
2922 if (kid->op_type != OP_GV) {
2923 if (kid->op_type == OP_CONST &&
2924 (kid->op_private & OPpCONST_BARE)) {
2925 OP *newop = newGVOP(OP_GV, 0,
463ee0b2 2926 gv_fetchpv(SvPVx(((SVOP*)kid)->op_sv, na), TRUE) );
79072805
LW
2927 op_free(kid);
2928 kid = newop;
2929 }
2930 else {
2931 kid->op_sibling = 0;
2932 kid = newUNOP(OP_RV2GV, 0, scalar(kid));
2933 }
2934 kid->op_sibling = sibl;
2935 *tokid = kid;
2936 }
2937 scalar(kid);
2938 break;
2939 case OA_SCALARREF:
463ee0b2 2940 mod(scalar(kid), op->op_type);
79072805
LW
2941 break;
2942 }
2943 oa >>= 4;
2944 tokid = &kid->op_sibling;
2945 kid = kid->op_sibling;
2946 }
2947 op->op_private = numargs;
2948 if (kid)
2949 return too_many_arguments(op);
2950 listkids(op);
2951 }
2952 if (oa) {
2953 while (oa & OA_OPTIONAL)
2954 oa >>= 4;
2955 if (oa && oa != OA_LIST)
2956 return too_few_arguments(op);
2957 }
2958 return op;
2959}
2960
2961OP *
2962ck_glob(op)
2963OP *op;
2964{
2965 GV *gv = newGVgen();
2966 GvIOn(gv);
2967 append_elem(OP_GLOB, op, newGVOP(OP_GV, 0, gv));
2968 scalarkids(op);
2969 return op;
2970}
2971
2972OP *
2973ck_grep(op)
2974OP *op;
2975{
2976 LOGOP *gwop;
2977 OP *kid;
2978
93a17b20
LW
2979 if (op->op_flags & OPf_STACKED) {
2980 op = ck_sort(op);
2981 op->op_flags &= ~OPf_STACKED;
2982 }
79072805
LW
2983 op = ck_fun(op);
2984 if (error_count)
2985 return op;
2986 kid = cLISTOP->op_first->op_sibling;
2987 if (kid->op_type != OP_NULL)
463ee0b2 2988 croak("panic: ck_grep");
79072805
LW
2989 kid = kUNOP->op_first;
2990
2991 Newz(1101, gwop, 1, LOGOP);
2992 gwop->op_type = OP_GREPWHILE;
2993 gwop->op_ppaddr = ppaddr[OP_GREPWHILE];
2994 gwop->op_first = list(op);
2995 gwop->op_flags |= OPf_KIDS;
2996 gwop->op_private = 1;
2997 gwop->op_other = LINKLIST(kid);
ed6116ce 2998 gwop->op_targ = pad_alloc(OP_GREPWHILE, SVs_PADTMP);
79072805
LW
2999 kid->op_next = (OP*)gwop;
3000
3001 return (OP*)gwop;
3002}
3003
3004OP *
3005ck_index(op)
3006OP *op;
3007{
3008 if (op->op_flags & OPf_KIDS) {
3009 OP *kid = cLISTOP->op_first->op_sibling; /* get past pushmark */
3010 if (kid && kid->op_type == OP_CONST)
3011 fbm_compile(((SVOP*)kid)->op_sv, 0);
3012 }
3013 return ck_fun(op);
3014}
3015
3016OP *
3017ck_lengthconst(op)
3018OP *op;
3019{
3020 /* XXX length optimization goes here */
3021 return op;
3022}
3023
3024OP *
3025ck_lfun(op)
3026OP *op;
3027{
463ee0b2 3028 return modkids(ck_fun(op), op->op_type);
79072805
LW
3029}
3030
3031OP *
8990e307
LW
3032ck_rfun(op)
3033OP *op;
3034{
3035 return refkids(ck_fun(op), op->op_type);
3036}
3037
3038OP *
79072805
LW
3039ck_listiob(op)
3040OP *op;
3041{
3042 register OP *kid;
3043
3044 kid = cLISTOP->op_first;
3045 if (!kid) {
8990e307 3046 op = force_list(op);
79072805
LW
3047 kid = cLISTOP->op_first;
3048 }
3049 if (kid->op_type == OP_PUSHMARK)
3050 kid = kid->op_sibling;
3051 if (kid && op->op_flags & OPf_STACKED)
3052 kid = kid->op_sibling;
3053 else if (kid && !kid->op_sibling) { /* print HANDLE; */
3054 if (kid->op_type == OP_CONST && kid->op_private & OPpCONST_BARE) {
3055 op->op_flags |= OPf_STACKED; /* make it a filehandle */
3056 kid = newUNOP(OP_RV2GV, 0, scalar(kid));
3057 cLISTOP->op_first->op_sibling = kid;
3058 cLISTOP->op_last = kid;
3059 kid = kid->op_sibling;
3060 }
3061 }
3062
3063 if (!kid)
3064 append_elem(op->op_type, op, newSVREF(newGVOP(OP_GV, 0, defgv)) );
3065
3066 return listkids(op);
3067}
3068
3069OP *
3070ck_match(op)
3071OP *op;
3072{
3073 cPMOP->op_pmflags |= PMf_RUNTIME;
3074 return op;
3075}
3076
3077OP *
3078ck_null(op)
3079OP *op;
3080{
3081 return op;
3082}
3083
3084OP *
3085ck_repeat(op)
3086OP *op;
3087{
3088 if (cBINOP->op_first->op_flags & OPf_PARENS) {
3089 op->op_private = OPpREPEAT_DOLIST;
8990e307 3090 cBINOP->op_first = force_list(cBINOP->op_first);
79072805
LW
3091 }
3092 else
3093 scalar(op);
3094 return op;
3095}
3096
3097OP *
8990e307
LW
3098ck_require(op)
3099OP *op;
3100{
3101 if (op->op_flags & OPf_KIDS) { /* Shall we fake a BEGIN {}? */
3102 SVOP *kid = (SVOP*)cUNOP->op_first;
3103
3104 if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) {
3105 char *name = SvPVX(subname);
3106 char *s;
3107 sv_catpvn(kid->op_sv, ".pm", 3);
3108 if (s = strrchr(name,':'))
3109 s++;
3110 else
3111 s = name;
3112 if (strNE(s, "BEGIN")) {
3113 op = newSTATEOP(0, Nullch, op);
3114 newSUB(start_subparse(),
3115 newSVOP(OP_CONST, 0, newSVpv("BEGIN", 5)),
3116 op);
3117 return newOP(OP_STUB,0);
3118 }
3119 }
3120 }
3121 return ck_fun(op);
3122}
3123
3124OP *
79072805
LW
3125ck_retarget(op)
3126OP *op;
3127{
463ee0b2 3128 croak("NOT IMPL LINE %d",__LINE__);
79072805
LW
3129 /* STUB */
3130 return op;
3131}
3132
3133OP *
3134ck_select(op)
3135OP *op;
3136{
3137 if (op->op_flags & OPf_KIDS) {
3138 OP *kid = cLISTOP->op_first->op_sibling; /* get past pushmark */
2304df62 3139 if (kid && kid->op_sibling) {
79072805
LW
3140 op->op_type = OP_SSELECT;
3141 op->op_ppaddr = ppaddr[OP_SSELECT];
3142 op = ck_fun(op);
3143 return fold_constants(op);
3144 }
3145 }
3146 return ck_fun(op);
3147}
3148
3149OP *
3150ck_shift(op)
3151OP *op;
3152{
3153 I32 type = op->op_type;
3154
3155 if (!(op->op_flags & OPf_KIDS)) {
3156 op_free(op);
3157 return newUNOP(type, 0,
3158 scalar(newUNOP(OP_RV2AV, 0,
3159 scalar(newGVOP(OP_GV, 0,
3160 gv_fetchpv((subline ? "_" : "ARGV"), TRUE) )))));
3161 }
463ee0b2 3162 return scalar(modkids(ck_fun(op), type));
79072805
LW
3163}
3164
3165OP *
3166ck_sort(op)
3167OP *op;
3168{
3169 if (op->op_flags & OPf_STACKED) {
3170 OP *kid = cLISTOP->op_first->op_sibling; /* get past pushmark */
463ee0b2
LW
3171 OP *k;
3172 kid = kUNOP->op_first; /* get past rv2gv */
79072805 3173
463ee0b2 3174 if (kid->op_type == OP_SCOPE || kid->op_type == OP_LEAVE) {
79072805 3175 linklist(kid);
463ee0b2
LW
3176 if (kid->op_type == OP_SCOPE) {
3177 k = kid->op_next;
3178 kid->op_next = 0;
3179 peep(k);
79072805 3180 }
463ee0b2 3181 else if (kid->op_type == OP_LEAVE) {
8990e307 3182 null(kid); /* wipe out leave */
463ee0b2
LW
3183 kid->op_next = kid;
3184
3185 for (k = kLISTOP->op_first->op_next; k; k = k->op_next) {
3186 if (k->op_next == kid)
3187 k->op_next = 0;
3188 }
3189 peep(kLISTOP->op_first);
3190 }
3191 kid = cLISTOP->op_first->op_sibling; /* get past pushmark */
8990e307 3192 null(kid); /* wipe out rv2gv */
79072805 3193 kid->op_next = kid;
79072805
LW
3194 op->op_flags |= OPf_SPECIAL;
3195 }
3196 }
3197 return op;
3198}
3199
3200OP *
3201ck_split(op)
3202OP *op;
3203{
3204 register OP *kid;
ed6116ce 3205 PMOP* pm;
79072805
LW
3206
3207 if (op->op_flags & OPf_STACKED)
3208 return no_fh_allowed(op);
3209
79072805 3210 kid = cLISTOP->op_first;
8990e307 3211 if (kid->op_type != OP_NULL)
463ee0b2 3212 croak("panic: ck_split");
8990e307
LW
3213 kid = kid->op_sibling;
3214 op_free(cLISTOP->op_first);
3215 cLISTOP->op_first = kid;
3216 if (!kid)
3217 cLISTOP->op_first = kid = newSVOP(OP_CONST, 0, newSVpv(" ", 1));
79072805
LW
3218
3219 if (kid->op_type != OP_MATCH) {
3220 OP *sibl = kid->op_sibling;
463ee0b2 3221 kid->op_sibling = 0;
79072805
LW
3222 kid = pmruntime( newPMOP(OP_MATCH, OPf_SPECIAL), kid, Nullop);
3223 if (cLISTOP->op_first == cLISTOP->op_last)
3224 cLISTOP->op_last = kid;
3225 cLISTOP->op_first = kid;
3226 kid->op_sibling = sibl;
3227 }
ed6116ce
LW
3228 pm = (PMOP*)kid;
3229 if (pm->op_pmshort && !(pm->op_pmflags & PMf_ALL)) {
8990e307 3230 SvREFCNT_dec(pm->op_pmshort); /* can't use substring to optimize */
ed6116ce
LW
3231 pm->op_pmshort = 0;
3232 }
79072805
LW
3233
3234 kid->op_type = OP_PUSHRE;
3235 kid->op_ppaddr = ppaddr[OP_PUSHRE];
3236 scalar(kid);
3237
3238 if (!kid->op_sibling)
3239 append_elem(OP_SPLIT, op, newSVREF(newGVOP(OP_GV, 0, defgv)) );
3240
3241 kid = kid->op_sibling;
3242 scalar(kid);
3243
3244 if (!kid->op_sibling)
3245 append_elem(OP_SPLIT, op, newSVOP(OP_CONST, 0, newSViv(0)));
3246
3247 kid = kid->op_sibling;
3248 scalar(kid);
3249
3250 if (kid->op_sibling)
3251 return too_many_arguments(op);
3252
3253 return op;
3254}
3255
3256OP *
3257ck_subr(op)
3258OP *op;
3259{
93a17b20
LW
3260 OP *o = ((cUNOP->op_first->op_sibling)
3261 ? cUNOP : ((UNOP*)cUNOP->op_first))->op_first->op_sibling;
3262
8990e307
LW
3263 if (o->op_type == OP_RV2CV)
3264 null(o); /* disable rv2cv */
79072805 3265 op->op_private = 0;
8990e307 3266 if (perldb && curstash != debstash)
93a17b20 3267 op->op_private |= OPpSUBR_DB;
79072805
LW
3268 return op;
3269}
3270
3271OP *
8990e307
LW
3272ck_svconst(op)
3273OP *op;
3274{
3275 SvREADONLY_on(cSVOP->op_sv);
3276 return op;
3277}
3278
3279OP *
79072805
LW
3280ck_trunc(op)
3281OP *op;
3282{
3283 if (op->op_flags & OPf_KIDS) {
3284 SVOP *kid = (SVOP*)cUNOP->op_first;
3285
3286 if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE))
3287 op->op_flags |= OPf_SPECIAL;
3288 }
3289 return ck_fun(op);
3290}
3291
463ee0b2
LW
3292/* A peephole optimizer. We visit the ops in the order they're to execute. */
3293
79072805
LW
3294void
3295peep(op)
3296register OP* op;
3297{
3298 register OP* oldop = 0;
3299 if (!op || op->op_seq)
3300 return;
3301 for (; op; op = op->op_next) {
3302 if (op->op_seq)
3303 return;
3304 switch (op->op_type) {
8990e307
LW
3305 case OP_STUB:
3306 if ((op->op_flags & (OPf_KNOW|OPf_LIST)) != (OPf_KNOW|OPf_LIST)) {
3307 op->op_seq = ++op_seqmax;
3308 break; /* Scalar stub must produce undef. List stub is noop */
3309 }
3310 /* FALL THROUGH */
79072805
LW
3311 case OP_NULL:
3312 case OP_SCALAR:
93a17b20 3313 case OP_LINESEQ:
463ee0b2 3314 case OP_SCOPE:
79072805
LW
3315 if (oldop) {
3316 oldop->op_next = op->op_next;
3317 continue;
3318 }
463ee0b2 3319 op->op_seq = ++op_seqmax;
79072805
LW
3320 break;
3321
3322 case OP_GV:
8990e307
LW
3323 if (op->op_next->op_type == OP_RV2SV) {
3324 if (op->op_next->op_private < OP_RV2GV) {
3325 null(op->op_next);
3326 op->op_flags |= op->op_next->op_flags & OPf_INTRO;
3327 op->op_next = op->op_next->op_next;
3328 op->op_type = OP_GVSV;
3329 op->op_ppaddr = ppaddr[OP_GVSV];
3330 }
3331 }
3332 else if (op->op_next->op_type == OP_RV2AV) {
3333 OP* pop = op->op_next->op_next;
3334 I32 i;
3335 if (pop->op_type == OP_CONST &&
3336 pop->op_next->op_type == OP_AELEM &&
3337 pop->op_next->op_private < OP_RV2GV &&
3338 !(pop->op_next->op_flags & OPf_INTRO) &&
3339 (i = SvIV(((SVOP*)pop)->op_sv)) <= 255 &&
3340 i >= 0)
3341 {
3342 null(op->op_next);
3343 null(pop->op_next);
3344 null(pop);
3345 op->op_flags &= ~OPf_LVAL;
3346 op->op_flags |= pop->op_next->op_flags & OPf_LVAL;
3347 op->op_next = pop->op_next->op_next;
3348 op->op_type = OP_AELEMFAST;
3349 op->op_ppaddr = ppaddr[OP_AELEMFAST];
3350 op->op_private = i;
3351 GvAVn((GV*)cSVOP->op_sv);
3352 }
79072805 3353 }
463ee0b2 3354 op->op_seq = ++op_seqmax;
79072805
LW
3355 break;
3356
3357 case OP_GREPWHILE:
3358 case OP_AND:
3359 case OP_OR:
463ee0b2 3360 op->op_seq = ++op_seqmax;
79072805
LW
3361 peep(cLOGOP->op_other);
3362 break;
3363
3364 case OP_COND_EXPR:
463ee0b2 3365 op->op_seq = ++op_seqmax;
79072805
LW
3366 peep(cCONDOP->op_true);
3367 peep(cCONDOP->op_false);
3368 break;
3369
3370 case OP_ENTERLOOP:
463ee0b2 3371 op->op_seq = ++op_seqmax;
79072805
LW
3372 peep(cLOOP->op_redoop);
3373 peep(cLOOP->op_nextop);
3374 peep(cLOOP->op_lastop);
3375 break;
3376
3377 case OP_MATCH:
3378 case OP_SUBST:
463ee0b2 3379 op->op_seq = ++op_seqmax;
79072805
LW
3380 peep(cPMOP->op_pmreplroot);
3381 break;
3382
3383 default:
463ee0b2 3384 op->op_seq = ++op_seqmax;
79072805
LW
3385 break;
3386 }
3387 oldop = op;
3388 }
3389}