1 /* $RCSfile: cmd.h,v $$Revision: 4.1 $$Date: 92/08/07 17:19:19 $
3 * Copyright (c) 1991, Larry Wall
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.
14 /* Lowest byte of opargs */
16 #define OA_FOLDCONST 2
17 #define OA_RETSCALAR 4
19 #define OA_RETINTEGER 16
20 #define OA_OTHERINT 32
21 #define OA_DANGEROUS 64
23 /* Remaining nybbles of opargs */
30 #define OA_SCALARREF 7
48 sprintf(tokenbuf,"Missing comma after first argument to %s function",
49 op_name[op->op_type]);
58 sprintf(tokenbuf,"Not enough arguments for %s", op_name[op->op_type]);
64 too_many_arguments(op)
67 sprintf(tokenbuf,"Too many arguments for %s", op_name[op->op_type]);
72 /* "register" allocation */
78 PADOFFSET off = pad_alloc(OP_PADSV, 'M');
80 sv_upgrade(sv, SVt_PVNV);
82 av_store(comppadname, off, sv);
83 SvNVX(sv) = (double)cop_seqmax;
86 av_store(comppad, off, (SV*)newAV());
87 else if (*name == '%')
88 av_store(comppad, off, (SV*)newHV());
98 SV **svp = AvARRAY(comppadname);
100 register CONTEXT *cx;
105 I32 seq = cop_seqmax;
107 for (off = comppadnamefill; off > 0; off--) {
108 if ((sv = svp[off]) &&
110 seq > (I32)SvNVX(sv) &&
111 strEQ(SvPVX(sv), name))
113 return (PADOFFSET)off;
117 /* Nothing in current lexical context--try eval's context, if any.
118 * This is necessary to let the perldb get at lexically scoped variables.
119 * XXX This will also probably interact badly with eval tree caching.
123 for (i = cxstack_ix; i >= 0; i--) {
125 switch (cx->cx_type) {
135 if (debstash && CvSTASH(cv) == debstash) /* ignore DB'* scope */
137 seq = cxstack[i+1].blk_oldcop->cop_seq;
138 curlist = CvPADLIST(cv);
139 curname = (AV*)*av_fetch(curlist, 0, FALSE);
140 svp = AvARRAY(curname);
141 for (off = AvFILL(curname); off > 0; off--) {
142 if ((sv = svp[off]) &&
144 seq > (I32)SvNVX(sv) &&
145 strEQ(SvPVX(sv), name))
147 PADOFFSET newoff = pad_alloc(OP_PADSV, 'M');
148 AV *oldpad = (AV*)*av_fetch(curlist, CvDEPTH(cv), FALSE);
149 SV *oldsv = *av_fetch(oldpad, off, TRUE);
151 sv_upgrade(sv, SVt_PVNV);
153 av_store(comppadname, newoff, sv);
154 SvNVX(sv) = (double)curcop->cop_seq;
155 SvIVX(sv) = 99999999;
156 av_store(comppad, newoff, sv_ref(oldsv));
172 SV **svp = AvARRAY(comppadname);
174 for (off = AvFILL(comppadname); off > fill; off--) {
176 SvIVX(sv) = cop_seqmax;
181 pad_alloc(optype,tmptype)
188 if (AvARRAY(comppad) != curpad)
189 croak("panic: pad_alloc");
190 if (tmptype == 'M') {
192 sv = *av_fetch(comppad, AvFILL(comppad) + 1, TRUE);
193 } while (SvSTORAGE(sv)); /* need a fresh one */
194 retval = AvFILL(comppad);
198 sv = *av_fetch(comppad, ++padix, TRUE);
199 } while (SvSTORAGE(sv) == 'T' || SvSTORAGE(sv) == 'M');
202 SvSTORAGE(sv) = tmptype;
203 curpad = AvARRAY(comppad);
204 DEBUG_X(fprintf(stderr, "Pad alloc %d for %s\n", retval, op_name[optype]));
205 return (PADOFFSET)retval;
213 croak("panic: pad_sv po");
214 DEBUG_X(fprintf(stderr, "Pad sv %d\n", po));
215 return curpad[po]; /* eventually we'll turn this into a macro */
222 if (AvARRAY(comppad) != curpad)
223 croak("panic: pad_free curpad");
225 croak("panic: pad_free po");
226 DEBUG_X(fprintf(stderr, "Pad free %d\n", po));
228 SvSTORAGE(curpad[po]) = 'F';
237 if (AvARRAY(comppad) != curpad)
238 croak("panic: pad_swipe curpad");
240 croak("panic: pad_swipe po");
241 DEBUG_X(fprintf(stderr, "Pad swipe %d\n", po));
242 curpad[po] = NEWSV(0,0);
243 SvSTORAGE(curpad[po]) = 'F';
253 if (AvARRAY(comppad) != curpad)
254 croak("panic: pad_reset curpad");
255 DEBUG_X(fprintf(stderr, "Pad reset\n"));
256 for (po = AvMAX(comppad); po > 0; po--) {
257 if (curpad[po] && SvSTORAGE(curpad[po]) == 'T')
258 SvSTORAGE(curpad[po]) = 'F';
274 if (op->op_flags & OPf_KIDS) {
275 for (kid = cUNOP->op_first; kid; kid = kid->op_sibling)
280 pad_free(op->op_targ);
282 switch (op->op_type) {
285 sv_free((SV*)cGVOP->op_gv);
288 sv_free(cSVOP->op_sv);
295 /* Contextualizers */
297 #define LINKLIST(o) ((o)->op_next ? (o)->op_next : linklist((OP*)o))
308 /* establish postfix order */
309 if (cUNOP->op_first) {
310 op->op_next = LINKLIST(cUNOP->op_first);
311 for (kid = cUNOP->op_first; kid; kid = kid->op_sibling) {
313 kid->op_next = LINKLIST(kid->op_sibling);
329 if (op && op->op_flags & OPf_KIDS) {
330 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling)
342 if (!op || (op->op_flags & OPf_KNOW)) /* assumes no premature commitment */
345 op->op_flags &= ~OPf_LIST;
346 op->op_flags |= OPf_KNOW;
348 switch (op->op_type) {
350 scalar(cBINOP->op_first);
360 if (!(op->op_flags & OPf_KIDS))
367 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling) {
376 op = prepend_elem(OP_LIST, newOP(OP_PUSHMARK, 0), op);
379 for (kid = cUNOP->op_first->op_sibling; kid; kid = kid->op_sibling)
392 if (op->op_flags & OPf_LIST)
395 op->op_flags |= OPf_KNOW;
397 switch (op->op_type) {
399 if (dowarn && (opargs[op->op_type] & OA_FOLDCONST) &&
400 !(op->op_flags & OPf_STACKED))
401 warn("Useless use of %s", op_name[op->op_type]);
405 curcop = ((COP*)op); /* for warning above */
409 op->op_type = OP_NULL; /* don't execute a constant */
410 sv_free(cSVOP->op_sv); /* don't even remember it */
414 op->op_type = OP_PREINC;
415 op->op_ppaddr = ppaddr[OP_PREINC];
419 op->op_type = OP_PREDEC;
420 op->op_ppaddr = ppaddr[OP_PREDEC];
424 scalarvoid(cBINOP->op_first);
429 for (kid = cUNOP->op_first->op_sibling; kid; kid = kid->op_sibling)
436 if (!(op->op_flags & OPf_KIDS))
442 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling)
446 op = prepend_elem(OP_LIST, newOP(OP_PUSHMARK, 0), op);
447 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling)
459 if (op && op->op_flags & OPf_KIDS) {
460 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling)
472 if (!op || (op->op_flags & OPf_KNOW)) /* assumes no premature commitment */
475 op->op_flags |= (OPf_KNOW | OPf_LIST);
477 switch (op->op_type) {
480 list(cBINOP->op_first);
485 for (kid = cUNOP->op_first->op_sibling; kid; kid = kid->op_sibling)
492 if (!(op->op_flags & OPf_KIDS))
494 if (!op->op_next && cUNOP->op_first->op_type == OP_FLOP) {
495 list(cBINOP->op_first);
496 return gen_constant_list(op);
505 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling) {
524 if (op->op_type == OP_LINESEQ ||
525 op->op_type == OP_SCOPE ||
526 op->op_type == OP_LEAVE ||
527 op->op_type == OP_LEAVETRY)
529 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling) {
535 op->op_flags &= ~OPf_PARENS;
537 op->op_flags |= OPf_PARENS;
548 if (op && op->op_flags & OPf_KIDS) {
549 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling)
568 switch (op->op_type) {
570 if ((type == OP_DEFINED || type == OP_UNDEF || type == OP_REFGEN) &&
571 !(op->op_flags & OPf_STACKED)) {
572 op->op_type = OP_RV2CV; /* entersubr => rv2cv */
573 op->op_ppaddr = ppaddr[OP_RV2CV];
574 cUNOP->op_first->op_type = OP_NULL; /* disable pushmark */
575 cUNOP->op_first->op_ppaddr = ppaddr[OP_NULL];
580 if (type == OP_DEFINED)
581 return scalar(op); /* ordinary expression, not lvalue */
582 sprintf(tokenbuf, "Can't %s %s in %s",
583 type == OP_REFGEN ? "refer to" : "modify",
584 op_name[op->op_type],
585 type ? op_name[type] : "local");
590 for (kid = cUNOP->op_first->op_sibling; kid; kid = kid->op_sibling)
597 ref(cUNOP->op_first, op->op_type);
607 if (type == OP_RV2AV || type == OP_RV2HV)
608 op->op_private = type;
628 op->op_targ = pad_alloc(op->op_type,'M');
629 sv = PAD_SV(op->op_targ);
630 sv_upgrade(sv, SVt_PVLV);
631 sv_magic(sv, 0, op->op_type == OP_VEC ? 'v' : 'x', 0, 0);
632 curpad[op->op_targ] = sv;
635 if (!(op->op_flags & OPf_KIDS))
637 mod(cBINOP->op_first, type ? type : op->op_type);
641 mod(cBINOP->op_first, type ? type : op->op_type);
642 if (type == OP_RV2AV || type == OP_RV2HV)
643 op->op_private = type;
649 if (type != OP_RV2HV && type != OP_RV2AV)
651 if (!(op->op_flags & OPf_KIDS))
655 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling)
659 op->op_flags |= OPf_LVAL;
661 op->op_flags &= ~OPf_SPECIAL;
662 op->op_flags |= OPf_INTRO;
664 else if (type == OP_AASSIGN || type == OP_SASSIGN)
665 op->op_flags |= OPf_SPECIAL;
675 if (op && op->op_flags & OPf_KIDS) {
676 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling)
693 switch (op->op_type) {
695 sprintf(tokenbuf, "Can't use %s as reference in %s",
696 op_name[op->op_type],
697 type ? op_name[type] : "local");
702 for (kid = cUNOP->op_first->op_sibling; kid; kid = kid->op_sibling)
709 ref(cUNOP->op_first, op->op_type);
719 if (type == OP_RV2AV || type == OP_RV2HV)
720 op->op_private = type;
739 op->op_targ = pad_alloc(op->op_type,'M');
740 sv = PAD_SV(op->op_targ);
741 sv_upgrade(sv, SVt_PVLV);
742 sv_magic(sv, 0, op->op_type == OP_VEC ? 'v' : 'x', 0, 0);
743 curpad[op->op_targ] = sv;
746 if (!(op->op_flags & OPf_KIDS))
748 ref(cBINOP->op_first, type ? type : op->op_type);
752 ref(cBINOP->op_first, type ? type : op->op_type);
753 if (type == OP_RV2AV || type == OP_RV2HV)
754 op->op_private = type;
760 if (type != OP_RV2HV && type != OP_RV2AV)
762 if (!(op->op_flags & OPf_KIDS))
766 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling)
770 op->op_flags |= OPf_LVAL;
772 op->op_flags &= ~OPf_SPECIAL;
773 op->op_flags |= OPf_INTRO;
775 else if (type == OP_AASSIGN || type == OP_SASSIGN)
776 op->op_flags |= OPf_SPECIAL;
792 if (type == OP_LIST) {
793 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling)
796 else if (type != OP_PADSV &&
801 sprintf(tokenbuf, "Can't declare %s in my", op_name[op->op_type]);
805 op->op_flags |= OPf_LVAL|OPf_INTRO;
814 o->op_flags |= OPf_PARENS;
819 bind_match(type, left, right)
826 if (right->op_type == OP_MATCH ||
827 right->op_type == OP_SUBST ||
828 right->op_type == OP_TRANS) {
829 right->op_flags |= OPf_STACKED;
830 if (right->op_type != OP_MATCH)
831 left = mod(left, right->op_type);
832 if (right->op_type == OP_TRANS)
833 op = newBINOP(OP_NULL, 0, scalar(left), right);
835 op = prepend_elem(right->op_type, scalar(left), right);
837 return newUNOP(OP_NOT, 0, scalar(op));
841 return bind_match(type, left,
842 pmruntime(newPMOP(OP_MATCH, 0), right, Nullop));
851 /* XXX need to optimize away NOT NOT here? Or do we let optimizer do it? */
852 return newUNOP(OP_NOT, OPf_SPECIAL, scalar(op));
860 if (o->op_flags & OPf_PARENS) {
861 o = prepend_elem(OP_LINESEQ, newOP(OP_ENTER, 0), o);
862 o->op_type = OP_LEAVE;
863 o->op_ppaddr = ppaddr[OP_LEAVE];
866 if (o->op_type == OP_LINESEQ) {
868 o->op_type = OP_SCOPE;
869 o->op_ppaddr = ppaddr[OP_SCOPE];
870 kid = ((LISTOP*)o)->op_first;
871 if (kid->op_type == OP_NEXTSTATE) {
872 kid->op_type = OP_NULL;
873 kid->op_ppaddr = ppaddr[OP_NULL];
877 o = newUNOP(OP_SCOPE, 0, o);
884 block_head(o, startp)
892 o = scope(scalarseq(o));
893 *startp = LINKLIST(o);
904 if (o->op_flags & OPf_PARENS)
912 return mod(o, OP_NULL); /* a bit kludgey */
919 if (o->op_type == OP_LIST) {
920 o = convert(OP_JOIN, 0,
921 prepend_elem(OP_LIST,
922 newSVREF(newGVOP(OP_GV, 0, gv_fetchpv(";", TRUE))),
933 I32 type = o->op_type;
936 if (opargs[type] & OA_RETSCALAR)
938 if (opargs[type] & OA_TARGET)
939 o->op_targ = pad_alloc(type,'T');
941 if (!(opargs[type] & OA_FOLDCONST))
944 for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
945 if (curop->op_type != OP_CONST &&
946 curop->op_type != OP_LIST &&
947 curop->op_type != OP_SCALAR &&
948 curop->op_type != OP_PUSHMARK) {
957 if (o->op_targ && *stack_sp == PAD_SV(o->op_targ))
958 pad_swipe(o->op_targ);
960 if (type == OP_RV2GV)
961 return newGVOP(OP_GV, 0, *(stack_sp--));
963 return newSVOP(OP_CONST, 0, *(stack_sp--));
966 if (!(opargs[type] & OA_OTHERINT))
968 if (!(o->op_flags & OPf_KIDS))
971 for (curop = ((UNOP*)o)->op_first; curop; curop = curop->op_sibling) {
972 if (curop->op_type == OP_CONST) {
973 if (SvIOK(((SVOP*)curop)->op_sv))
977 if (opargs[curop->op_type] & OA_RETINTEGER)
982 o->op_ppaddr = ppaddr[++(o->op_type)];
994 I32 oldtmps_floor = tmps_floor;
998 tmpmark = stack_sp - stack_base;
999 anonop = newANONLIST(o);
1000 curop = LINKLIST(anonop);
1001 anonop->op_next = 0;
1004 tmpsp = stack_sp - stack_base;
1005 tmps_floor = oldtmps_floor;
1006 stack_sp = stack_base + tmpmark;
1008 o->op_type = OP_RV2AV;
1009 o->op_ppaddr = ppaddr[OP_RV2AV];
1011 curop = ((UNOP*)o)->op_first;
1012 ((UNOP*)o)->op_first = newSVOP(OP_CONST, 0, newSVsv(stack_sp[1]));
1014 curop = ((UNOP*)anonop)->op_first;
1015 curop = ((UNOP*)curop)->op_first;
1016 curop->op_sibling = 0;
1024 convert(type, flags, op)
1032 if (opargs[type] & OA_MARK)
1033 op = prepend_elem(OP_LIST, newOP(OP_PUSHMARK, 0), op);
1035 if (!op || op->op_type != OP_LIST)
1036 op = newLISTOP(OP_LIST, 0, op, Nullop);
1039 op->op_ppaddr = ppaddr[type];
1040 op->op_flags |= flags;
1042 op = (*check[type])(op);
1043 if (op->op_type != type)
1046 if (cLISTOP->op_children < 7) {
1047 /* XXX do we really need to do this if we're done appending?? */
1048 for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling)
1050 cLISTOP->op_last = last; /* in case check substituted last arg */
1053 return fold_constants(op);
1056 /* List constructors */
1059 append_elem(type, first, last)
1068 else if (first->op_type == type) {
1069 if (first->op_flags & OPf_KIDS)
1070 ((LISTOP*)first)->op_last->op_sibling = last;
1072 first->op_flags |= OPf_KIDS;
1073 ((LISTOP*)first)->op_first = last;
1075 ((LISTOP*)first)->op_last = last;
1076 ((LISTOP*)first)->op_children++;
1080 return newLISTOP(type, 0, first, last);
1084 append_list(type, first, last)
1093 else if (first->op_type != type)
1094 return prepend_elem(type, (OP*)first, (OP*)last);
1095 else if (last->op_type != type)
1096 return append_elem(type, (OP*)first, (OP*)last);
1098 first->op_last->op_sibling = last->op_first;
1099 first->op_last = last->op_last;
1100 first->op_children += last->op_children;
1101 if (first->op_children)
1102 last->op_flags |= OPf_KIDS;
1109 prepend_elem(type, first, last)
1118 else if (last->op_type == type) {
1119 if (!(last->op_flags & OPf_KIDS)) {
1120 ((LISTOP*)last)->op_last = first;
1121 last->op_flags |= OPf_KIDS;
1123 first->op_sibling = ((LISTOP*)last)->op_first;
1124 ((LISTOP*)last)->op_first = first;
1125 ((LISTOP*)last)->op_children++;
1129 return newLISTOP(type, 0, first, last);
1141 newLISTOP(type, flags, first, last)
1149 Newz(1101, listop, 1, LISTOP);
1151 listop->op_type = type;
1152 listop->op_ppaddr = ppaddr[type];
1153 listop->op_children = (first != 0) + (last != 0);
1154 listop->op_flags = flags;
1155 if (listop->op_children)
1156 listop->op_flags |= OPf_KIDS;
1160 else if (!first && last)
1162 listop->op_first = first;
1163 listop->op_last = last;
1164 if (first && first != last)
1165 first->op_sibling = last;
1176 Newz(1101, op, 1, OP);
1178 op->op_ppaddr = ppaddr[type];
1179 op->op_flags = flags;
1182 /* op->op_private = 0; */
1183 if (opargs[type] & OA_RETSCALAR)
1185 if (opargs[type] & OA_TARGET)
1186 op->op_targ = pad_alloc(type,'T');
1187 return (*check[type])(op);
1191 newUNOP(type, flags, first)
1198 if (opargs[type] & OA_MARK) {
1199 if (first->op_type == OP_LIST)
1200 prepend_elem(OP_LIST, newOP(OP_PUSHMARK, 0), first);
1202 return newBINOP(type, flags, newOP(OP_PUSHMARK, 0), first);
1206 first = newOP(OP_STUB, 0);
1208 Newz(1101, unop, 1, UNOP);
1209 unop->op_type = type;
1210 unop->op_ppaddr = ppaddr[type];
1211 unop->op_first = first;
1212 unop->op_flags = flags | OPf_KIDS;
1213 unop->op_private = 1;
1215 unop = (UNOP*)(*check[type])((OP*)unop);
1219 return fold_constants(unop);
1223 newBINOP(type, flags, first, last)
1230 Newz(1101, binop, 1, BINOP);
1233 first = newOP(OP_NULL, 0);
1235 binop->op_type = type;
1236 binop->op_ppaddr = ppaddr[type];
1237 binop->op_first = first;
1238 binop->op_flags = flags | OPf_KIDS;
1241 binop->op_private = 1;
1244 binop->op_private = 2;
1245 first->op_sibling = last;
1248 binop = (BINOP*)(*check[type])((OP*)binop);
1252 binop->op_last = last = binop->op_first->op_sibling;
1254 return fold_constants(binop);
1258 pmtrans(op, expr, repl)
1263 PMOP *pm = (PMOP*)op;
1264 SV *tstr = ((SVOP*)expr)->op_sv;
1265 SV *rstr = ((SVOP*)repl)->op_sv;
1268 register char *t = SvPV(tstr, tlen);
1269 register char *r = SvPV(rstr, rlen);
1275 register short *tbl;
1277 tbl = (short*)cPVOP->op_pv;
1278 complement = op->op_private & OPpTRANS_COMPLEMENT;
1279 delete = op->op_private & OPpTRANS_DELETE;
1280 squash = op->op_private & OPpTRANS_SQUASH;
1283 Zero(tbl, 256, short);
1284 for (i = 0; i < tlen; i++)
1285 tbl[t[i] & 0377] = -1;
1286 for (i = 0, j = 0; i < 256; i++) {
1292 tbl[i] = r[j-1] & 0377;
1297 tbl[i] = r[j++] & 0377;
1302 if (!rlen && !delete) {
1305 for (i = 0; i < 256; i++)
1307 for (i = 0, j = 0; i < tlen; i++,j++) {
1310 if (tbl[t[i] & 0377] == -1)
1311 tbl[t[i] & 0377] = -2;
1316 if (tbl[t[i] & 0377] == -1)
1317 tbl[t[i] & 0377] = r[j] & 0377;
1327 newPMOP(type, flags)
1333 Newz(1101, pmop, 1, PMOP);
1334 pmop->op_type = type;
1335 pmop->op_ppaddr = ppaddr[type];
1336 pmop->op_flags = flags;
1337 pmop->op_private = 0;
1339 /* link into pm list */
1340 if (type != OP_TRANS) {
1341 pmop->op_pmnext = HvPMROOT(curstash);
1342 HvPMROOT(curstash) = pmop;
1349 pmruntime(op, expr, repl)
1357 if (op->op_type == OP_TRANS)
1358 return pmtrans(op, expr, repl);
1362 if (expr->op_type == OP_CONST) {
1364 SV *pat = ((SVOP*)expr)->op_sv;
1365 char *p = SvPV(pat, plen);
1366 if ((op->op_flags & OPf_SPECIAL) && strEQ(p, " ")) {
1367 sv_setpvn(pat, "\\s+", 3);
1368 p = SvPV(pat, plen);
1369 pm->op_pmflags |= PMf_SKIPWHITE;
1371 scan_prefix(pm, p, plen);
1372 if (pm->op_pmshort && (pm->op_pmflags & PMf_SCANFIRST))
1373 fbm_compile(pm->op_pmshort, pm->op_pmflags & PMf_FOLD);
1374 pm->op_pmregexp = regcomp(p, p + plen, pm->op_pmflags & PMf_FOLD);
1379 if (pm->op_pmflags & PMf_KEEP)
1380 expr = newUNOP(OP_REGCMAYBE,0,expr);
1382 Newz(1101, rcop, 1, LOGOP);
1383 rcop->op_type = OP_REGCOMP;
1384 rcop->op_ppaddr = ppaddr[OP_REGCOMP];
1385 rcop->op_first = scalar(expr);
1386 rcop->op_flags |= OPf_KIDS;
1387 rcop->op_private = 1;
1388 rcop->op_other = op;
1390 /* establish postfix order */
1391 if (pm->op_pmflags & PMf_KEEP) {
1393 rcop->op_next = expr;
1394 ((UNOP*)expr)->op_first->op_next = (OP*)rcop;
1397 rcop->op_next = LINKLIST(expr);
1398 expr->op_next = (OP*)rcop;
1401 prepend_elem(op->op_type, scalar((OP*)rcop), op);
1405 if (repl->op_type == OP_CONST) {
1406 pm->op_pmflags |= PMf_CONST;
1407 prepend_elem(op->op_type, scalar(repl), op);
1412 for (curop = LINKLIST(repl); curop!=repl; curop = LINKLIST(curop)) {
1413 if (opargs[curop->op_type] & OA_DANGEROUS) {
1414 if (curop->op_type == OP_GV) {
1415 GV *gv = ((GVOP*)curop)->op_gv;
1416 if (strchr("&`'123456789+", *GvENAME(gv)))
1419 else if (curop->op_type == OP_RV2CV)
1421 else if (curop->op_type == OP_RV2SV ||
1422 curop->op_type == OP_RV2AV ||
1423 curop->op_type == OP_RV2HV ||
1424 curop->op_type == OP_RV2GV) {
1425 if (lastop && lastop->op_type != OP_GV) /*funny deref?*/
1433 if (curop == repl) {
1434 pm->op_pmflags |= PMf_CONST; /* const for long enough */
1435 prepend_elem(op->op_type, scalar(repl), op);
1438 Newz(1101, rcop, 1, LOGOP);
1439 rcop->op_type = OP_SUBSTCONT;
1440 rcop->op_ppaddr = ppaddr[OP_SUBSTCONT];
1441 rcop->op_first = scalar(repl);
1442 rcop->op_flags |= OPf_KIDS;
1443 rcop->op_private = 1;
1444 rcop->op_other = op;
1446 /* establish postfix order */
1447 rcop->op_next = LINKLIST(repl);
1448 repl->op_next = (OP*)rcop;
1450 pm->op_pmreplroot = scalar((OP*)rcop);
1451 pm->op_pmreplstart = LINKLIST(rcop);
1461 newSVOP(type, flags, sv)
1467 Newz(1101, svop, 1, SVOP);
1468 svop->op_type = type;
1469 svop->op_ppaddr = ppaddr[type];
1471 svop->op_next = (OP*)svop;
1472 svop->op_flags = flags;
1473 if (opargs[type] & OA_RETSCALAR)
1475 if (opargs[type] & OA_TARGET)
1476 svop->op_targ = pad_alloc(type,'T');
1477 return (*check[type])((OP*)svop);
1481 newGVOP(type, flags, gv)
1487 Newz(1101, gvop, 1, GVOP);
1488 gvop->op_type = type;
1489 gvop->op_ppaddr = ppaddr[type];
1490 gvop->op_gv = (GV*)sv_ref(gv);
1491 gvop->op_next = (OP*)gvop;
1492 gvop->op_flags = flags;
1493 if (opargs[type] & OA_RETSCALAR)
1495 if (opargs[type] & OA_TARGET)
1496 gvop->op_targ = pad_alloc(type,'T');
1497 return (*check[type])((OP*)gvop);
1501 newPVOP(type, flags, pv)
1507 Newz(1101, pvop, 1, PVOP);
1508 pvop->op_type = type;
1509 pvop->op_ppaddr = ppaddr[type];
1511 pvop->op_next = (OP*)pvop;
1512 pvop->op_flags = flags;
1513 if (opargs[type] & OA_RETSCALAR)
1515 if (opargs[type] & OA_TARGET)
1516 pvop->op_targ = pad_alloc(type,'T');
1517 return (*check[type])((OP*)pvop);
1521 newCVOP(type, flags, cv, cont)
1528 Newz(1101, cvop, 1, CVOP);
1529 cvop->op_type = type;
1530 cvop->op_ppaddr = ppaddr[type];
1532 cvop->op_cont = cont;
1533 cvop->op_next = (OP*)cvop;
1534 cvop->op_flags = flags;
1535 if (opargs[type] & OA_RETSCALAR)
1537 if (opargs[type] & OA_TARGET)
1538 cvop->op_targ = pad_alloc(type,'T');
1539 return (*check[type])((OP*)cvop);
1548 save_hptr(&curstash);
1549 save_item(curstname);
1554 curstash = fetch_stash(sv,TRUE);
1555 name = SvPV(sv, len);
1556 sv_setpvn(curstname, name, len);
1560 sv_setpv(curstname,"<none>");
1568 fetch_stash(sv,create)
1575 char *name = SvPV(sv, na);
1576 sprintf(tmpbuf,"%s::",name);
1577 tmpgv = gv_fetchpv(tmpbuf,create);
1581 GvHV(tmpgv) = newHV();
1582 stash = GvHV(tmpgv);
1584 HvNAME(stash) = savestr(name);
1589 newSLICEOP(flags, subscript, listval)
1594 return newBINOP(OP_LSLICE, flags,
1595 list(prepend_elem(OP_LIST, newOP(OP_PUSHMARK, 0), subscript)),
1596 list(prepend_elem(OP_LIST, newOP(OP_PUSHMARK, 0), listval)) );
1606 if (op->op_type == OP_NULL && op->op_flags & OPf_KIDS)
1607 op = cUNOP->op_first;
1609 if (op->op_type == OP_COND_EXPR) {
1610 I32 t = list_assignment(cCONDOP->op_first->op_sibling);
1611 I32 f = list_assignment(cCONDOP->op_first->op_sibling->op_sibling);
1616 yyerror("Assignment to both a list and a scalar");
1620 if (op->op_type == OP_LIST || op->op_flags & OPf_PARENS ||
1621 op->op_type == OP_RV2AV || op->op_type == OP_RV2HV ||
1622 op->op_type == OP_ASLICE || op->op_type == OP_HSLICE)
1625 if (op->op_type == OP_PADAV || op->op_type == OP_PADHV)
1628 if (op->op_type == OP_RV2SV)
1635 newASSIGNOP(flags, left, right)
1642 if (list_assignment(left)) {
1644 left = mod(left, OP_AASSIGN);
1645 if (right && right->op_type == OP_SPLIT) {
1646 if ((op = ((LISTOP*)right)->op_first) && op->op_type == OP_PUSHRE) {
1647 PMOP *pm = (PMOP*)op;
1648 if (left->op_type == OP_RV2AV) {
1649 op = ((UNOP*)left)->op_first;
1650 if (op->op_type == OP_GV && !pm->op_pmreplroot) {
1651 pm->op_pmreplroot = (OP*)((GVOP*)op)->op_gv;
1652 pm->op_pmflags |= PMf_ONCE;
1658 if (modcount < 10000) {
1659 SV *sv = ((SVOP*)((LISTOP*)right)->op_last)->op_sv;
1661 sv_setiv(sv, modcount+1);
1666 op = newBINOP(OP_AASSIGN, flags,
1667 list(prepend_elem(OP_LIST, newOP(OP_PUSHMARK, 0), right)),
1668 list(prepend_elem(OP_LIST, newOP(OP_PUSHMARK, 0), left)) );
1670 if (!(left->op_flags & OPf_INTRO)) {
1671 static int generation = 0;
1675 for (curop = LINKLIST(op); curop != op; curop = LINKLIST(curop)) {
1676 if (opargs[curop->op_type] & OA_DANGEROUS) {
1677 if (curop->op_type == OP_GV) {
1678 GV *gv = ((GVOP*)curop)->op_gv;
1679 if (gv == defgv || SvCUR(gv) == generation)
1681 SvCUR(gv) = generation;
1683 else if (curop->op_type == OP_RV2CV)
1685 else if (curop->op_type == OP_RV2SV ||
1686 curop->op_type == OP_RV2AV ||
1687 curop->op_type == OP_RV2HV ||
1688 curop->op_type == OP_RV2GV) {
1689 if (lastop->op_type != OP_GV) /* funny deref? */
1698 op->op_private = OPpASSIGN_COMMON;
1700 op->op_targ = pad_alloc(OP_AASSIGN, 'T'); /* for scalar context */
1704 right = newOP(OP_UNDEF, 0);
1705 if (right->op_type == OP_READLINE) {
1706 right->op_flags |= OPf_STACKED;
1707 return newBINOP(OP_NULL, flags, mod(scalar(left), OP_SASSIGN), scalar(right));
1710 op = newBINOP(OP_SASSIGN, flags,
1711 scalar(right), mod(scalar(left), OP_SASSIGN) );
1716 newSTATEOP(flags, label, op)
1723 comppadnamefill = AvFILL(comppadname); /* introduce my variables */
1725 Newz(1101, cop, 1, COP);
1726 cop->op_type = OP_NEXTSTATE;
1727 cop->op_ppaddr = ppaddr[ perldb ? OP_DBSTATE : OP_NEXTSTATE ];
1728 cop->op_flags = flags;
1729 cop->op_private = 0;
1730 cop->op_next = (OP*)cop;
1733 cop->cop_label = label;
1734 needblockscope = TRUE;
1736 cop->cop_seq = cop_seqmax++;
1738 if (copline == NOLINE)
1739 cop->cop_line = curcop->cop_line;
1741 cop->cop_line = copline;
1744 cop->cop_filegv = curcop->cop_filegv;
1745 cop->cop_stash = curstash;
1748 SV **svp = av_fetch(GvAV(curcop->cop_filegv),(I32)cop->cop_line, FALSE);
1749 if (svp && *svp != &sv_undef && !SvIOK(*svp)) {
1752 SvSTASH(*svp) = (HV*)cop;
1756 return prepend_elem(OP_LINESEQ, (OP*)cop, op);
1760 newLOGOP(type, flags, first, other)
1770 /* optimize "!a && b" to "a || b", and "!a || b" to "a && b" */
1771 if (first->op_type == OP_NOT && (first->op_flags & OPf_SPECIAL)) {
1772 if (type == OP_AND || type == OP_OR) {
1778 first = cUNOP->op_first;
1780 first->op_next = op->op_next;
1781 cUNOP->op_first = Nullop;
1785 if (first->op_type == OP_CONST) {
1786 if (dowarn && (first->op_private & OPpCONST_BARE))
1787 warn("Probable precedence problem on %s", op_name[type]);
1788 if ((type == OP_AND) == (SvTRUE(((SVOP*)first)->op_sv))) {
1797 else if (first->op_type == OP_WANTARRAY) {
1807 Newz(1101, logop, 1, LOGOP);
1809 logop->op_type = type;
1810 logop->op_ppaddr = ppaddr[type];
1811 logop->op_first = first;
1812 logop->op_flags = flags | OPf_KIDS;
1813 logop->op_other = LINKLIST(other);
1814 logop->op_private = 1;
1816 /* establish postfix order */
1817 logop->op_next = LINKLIST(first);
1818 first->op_next = (OP*)logop;
1819 first->op_sibling = other;
1821 op = newUNOP(OP_NULL, 0, (OP*)logop);
1822 other->op_next = op;
1828 newCONDOP(flags, first, true, false)
1838 return newLOGOP(OP_AND, 0, first, true);
1840 return newLOGOP(OP_OR, 0, first, false);
1843 if (first->op_type == OP_CONST) {
1844 if (SvTRUE(((SVOP*)first)->op_sv)) {
1855 else if (first->op_type == OP_WANTARRAY) {
1859 Newz(1101, condop, 1, CONDOP);
1861 condop->op_type = OP_COND_EXPR;
1862 condop->op_ppaddr = ppaddr[OP_COND_EXPR];
1863 condop->op_first = first;
1864 condop->op_flags = flags | OPf_KIDS;
1865 condop->op_true = LINKLIST(true);
1866 condop->op_false = LINKLIST(false);
1867 condop->op_private = 1;
1869 /* establish postfix order */
1870 condop->op_next = LINKLIST(first);
1871 first->op_next = (OP*)condop;
1873 first->op_sibling = true;
1874 true->op_sibling = false;
1875 op = newUNOP(OP_NULL, 0, (OP*)condop);
1878 false->op_next = op;
1884 newRANGE(flags, left, right)
1894 Newz(1101, condop, 1, CONDOP);
1896 condop->op_type = OP_RANGE;
1897 condop->op_ppaddr = ppaddr[OP_RANGE];
1898 condop->op_first = left;
1899 condop->op_flags = OPf_KIDS;
1900 condop->op_true = LINKLIST(left);
1901 condop->op_false = LINKLIST(right);
1902 condop->op_private = 1;
1904 left->op_sibling = right;
1906 condop->op_next = (OP*)condop;
1907 flip = newUNOP(OP_FLIP, flags, (OP*)condop);
1908 flop = newUNOP(OP_FLOP, 0, flip);
1909 op = newUNOP(OP_NULL, 0, flop);
1912 left->op_next = flip;
1913 right->op_next = flop;
1915 condop->op_targ = pad_alloc(OP_RANGE, 'M');
1916 sv_upgrade(PAD_SV(condop->op_targ), SVt_PVNV);
1917 flip->op_targ = pad_alloc(OP_RANGE, 'M');
1918 sv_upgrade(PAD_SV(flip->op_targ), SVt_PVNV);
1920 flip->op_private = left->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
1921 flop->op_private = right->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
1924 if (!flip->op_private || !flop->op_private)
1925 linklist(op); /* blow off optimizer unless constant */
1931 newLOOPOP(flags, debuggable, expr, block)
1939 int once = block && block->op_flags & OPf_SPECIAL &&
1940 (block->op_type == OP_ENTERSUBR || block->op_type == OP_NULL);
1943 if (once && expr->op_type == OP_CONST && !SvTRUE(((SVOP*)expr)->op_sv))
1944 return block; /* do {} while 0 does once */
1945 else if (expr->op_type == OP_READLINE || expr->op_type == OP_GLOB)
1946 expr = newASSIGNOP(0, newSVREF(newGVOP(OP_GV, 0, defgv)), expr);
1949 listop = append_elem(OP_LINESEQ, block, newOP(OP_UNSTACK, 0));
1950 op = newLOGOP(OP_AND, 0, expr, listop);
1952 ((LISTOP*)listop)->op_last->op_next = LINKLIST(op);
1954 if (once && op != listop)
1955 op->op_next = ((LOGOP*)cUNOP->op_first)->op_other;
1957 op->op_flags |= flags;
1962 newWHILEOP(flags, debuggable, loop, expr, block, cont)
1976 if (expr && (expr->op_type == OP_READLINE || expr->op_type == OP_GLOB))
1977 expr = newASSIGNOP(0, newSVREF(newGVOP(OP_GV, 0, defgv)), expr);
1980 block = newOP(OP_NULL, 0);
1983 next = LINKLIST(cont);
1985 cont = append_elem(OP_LINESEQ, cont, newOP(OP_UNSTACK, 0));
1987 listop = append_list(OP_LINESEQ, (LISTOP*)block, (LISTOP*)cont);
1988 redo = LINKLIST(listop);
1991 op = newLOGOP(OP_AND, 0, expr, scalar(listop));
1992 if (op == expr) { /* oops, it's a while (0) */
1995 return Nullop; /* (listop already freed by newLOGOP) */
1997 ((LISTOP*)listop)->op_last->op_next = condop =
1998 (op == listop ? redo : LINKLIST(op));
2006 Newz(1101,loop,1,LOOP);
2007 loop->op_type = OP_ENTERLOOP;
2008 loop->op_ppaddr = ppaddr[OP_ENTERLOOP];
2009 loop->op_private = 0;
2010 loop->op_next = (OP*)loop;
2013 op = newBINOP(OP_LEAVELOOP, 0, (OP*)loop, op);
2015 loop->op_redoop = redo;
2016 loop->op_lastop = op;
2019 loop->op_nextop = next;
2021 loop->op_nextop = op;
2023 op->op_flags |= flags;
2028 newFOROP(flags,label,forline,sv,expr,block,cont)
2041 if (sv->op_type == OP_RV2SV) {
2043 sv = cUNOP->op_first;
2045 cUNOP->op_first = Nullop;
2049 croak("Can't use %s for loop variable", op_name[sv->op_type]);
2052 sv = newGVOP(OP_GV, 0, defgv);
2054 loop = (LOOP*)list(convert(OP_ENTERITER, 0,
2055 append_elem(OP_LIST,
2056 prepend_elem(OP_LIST, newOP(OP_PUSHMARK, 0), expr),
2058 return newSTATEOP(0, label, newWHILEOP(flags, 1,
2059 loop, newOP(OP_ITER, 0), block, cont));
2066 if (!CvUSERSUB(cv) && CvROOT(cv)) {
2067 op_free(CvROOT(cv));
2068 CvROOT(cv) = Nullop;
2070 warn("Deleting active subroutine"); /* XXX */
2071 if (CvPADLIST(cv)) {
2072 I32 i = AvFILL(CvPADLIST(cv));
2074 SV** svp = av_fetch(CvPADLIST(cv), i--, FALSE);
2078 av_free((AV*)CvPADLIST(cv));
2084 newSUB(floor,op,block)
2090 char *name = SvPVx(cSVOP->op_sv, na);
2091 GV *gv = gv_fetchpv(name,2);
2095 if ((cv = GvCV(gv)) && !GvCVGEN(gv)) {
2097 CvDELETED(cv) = TRUE; /* probably an autoloader */
2099 if (dowarn && CvROOT(cv)) {
2100 line_t oldline = curcop->cop_line;
2102 curcop->cop_line = copline;
2103 warn("Subroutine %s redefined",name);
2104 curcop->cop_line = oldline;
2110 sv_upgrade(cv, SVt_PVCV);
2114 CvFILEGV(cv) = curcop->cop_filegv;
2118 if (AvFILL(comppadname) < AvFILL(comppad))
2119 av_store(comppadname, AvFILL(comppad), Nullsv);
2120 av_store(av, 0, (SV*)comppadname);
2121 av_store(av, 1, (SV*)comppad);
2124 comppadname = newAV();
2133 CvROOT(cv) = newUNOP(OP_LEAVESUBR, 0, scalarseq(block));
2134 CvSTART(cv) = LINKLIST(CvROOT(cv));
2135 CvROOT(cv)->op_next = 0;
2136 CvSTASH(cv) = curstash;
2138 CvDELETED(cv) = FALSE;
2139 if (strEQ(name, "BEGIN")) {
2140 line_t oldline = curcop->cop_line;
2141 GV* oldfile = curcop->cop_filegv;
2145 av_push(beginav, sv_ref(gv));
2146 DEBUG_x( dump_sub(gv) );
2150 rspara = (nrslen == 2);
2158 curcop = &compiling;
2159 curcop->cop_line = oldline; /* might have compiled something */
2160 curcop->cop_filegv = oldfile; /* recursively, clobbering these */
2162 else if (strEQ(name, "END")) {
2165 av_unshift(endav, 1);
2166 av_store(endav, 0, sv_ref(gv));
2170 SV *tmpstr = sv_mortalcopy(&sv_undef);
2172 sprintf(buf,"%s:%ld",SvPVX(GvSV(curcop->cop_filegv)), subline);
2173 sv = newSVpv(buf,0);
2175 sprintf(buf,"%ld",(long)curcop->cop_line);
2177 gv_efullname(tmpstr,gv);
2178 hv_store(GvHV(DBsub), SvPVX(tmpstr), SvCUR(tmpstr), sv, 0);
2186 newXSUB(name, ix, subaddr, filename)
2193 GV *gv = gv_fetchpv(name,2);
2196 if ((cv = GvCV(gv)) && !GvCVGEN(gv)) {
2198 warn("Subroutine %s redefined",name);
2199 if (!CvUSERSUB(cv) && CvROOT(cv)) {
2200 op_free(CvROOT(cv));
2201 CvROOT(cv) = Nullop;
2206 sv_upgrade(cv, SVt_PVCV);
2210 CvFILEGV(cv) = gv_fetchfile(filename);
2211 CvUSERSUB(cv) = subaddr;
2212 CvUSERINDEX(cv) = ix;
2213 CvDELETED(cv) = FALSE;
2214 if (strEQ(name, "BEGIN")) {
2217 av_push(beginav, sv_ref(gv));
2219 else if (strEQ(name, "END")) {
2222 av_unshift(endav, 1);
2223 av_store(endav, 0, sv_ref(gv));
2228 newFORM(floor,op,block)
2239 name = SvPVx(cSVOP->op_sv, na);
2242 gv = gv_fetchpv(name,TRUE);
2243 if (cv = GvFORM(gv)) {
2245 line_t oldline = curcop->cop_line;
2247 curcop->cop_line = copline;
2248 warn("Format %s redefined",name);
2249 curcop->cop_line = oldline;
2254 sv_upgrade(cv, SVt_PVFM);
2257 CvFILEGV(cv) = curcop->cop_filegv;
2259 CvPADLIST(cv) = av = newAV();
2261 av_store(av, 1, (SV*)comppad);
2264 CvROOT(cv) = newUNOP(OP_LEAVEWRITE, 0, scalarseq(block));
2265 CvSTART(cv) = LINKLIST(CvROOT(cv));
2266 CvROOT(cv)->op_next = 0;
2268 CvDELETED(cv) = FALSE;
2281 Newz(1101, mop, 1, LOGOP);
2282 mop->op_type = OP_METHOD;
2283 mop->op_ppaddr = ppaddr[OP_METHOD];
2284 mop->op_first = scalar(ref);
2285 mop->op_flags |= OPf_KIDS;
2286 mop->op_private = 1;
2287 mop->op_other = LINKLIST(name);
2288 mop->op_targ = pad_alloc(OP_METHOD,'T');
2289 mop->op_next = LINKLIST(ref);
2290 ref->op_next = (OP*)mop;
2298 return newUNOP(OP_REFGEN, 0,
2299 ref(list(convert(OP_ANONLIST, 0, op)), OP_REFGEN));
2306 return newUNOP(OP_REFGEN, 0,
2307 ref(list(convert(OP_ANONHASH, 0, op)), OP_REFGEN));
2314 if (o->op_type == OP_PADAV)
2316 if (o->op_type == OP_RV2SV) {
2317 o->op_type = OP_RV2AV;
2318 o->op_ppaddr = ppaddr[OP_RV2AV];
2322 warn("oops: oopsAV");
2330 if (o->op_type == OP_PADHV)
2332 if (o->op_type == OP_RV2SV || o->op_type == OP_RV2AV) {
2333 o->op_type = OP_RV2HV;
2334 o->op_ppaddr = ppaddr[OP_RV2HV];
2338 warn("oops: oopsHV");
2346 if (o->op_type == OP_PADAV)
2348 return newUNOP(OP_RV2AV, 0, scalar(o));
2355 return newUNOP(OP_RV2GV, 0, scalar(o));
2362 if (o->op_type == OP_PADHV)
2364 return newUNOP(OP_RV2HV, 0, scalar(o));
2371 croak("NOT IMPL LINE %d",__LINE__);
2380 return newUNOP(OP_RV2CV, 0, scalar(o));
2387 if (o->op_type == OP_PADSV)
2389 return newUNOP(OP_RV2SV, 0, scalar(o));
2392 /* Check routines. */
2398 /* XXX need to optimize constant subscript here. */
2406 if (cUNOP->op_first->op_type == OP_CONCAT)
2407 op->op_flags |= OPf_STACKED;
2415 if (op->op_flags & OPf_KIDS) {
2417 op = modkids(ck_fun(op), op->op_type);
2418 if (op->op_private != 1)
2420 newop = cUNOP->op_first->op_sibling;
2421 if (!newop || newop->op_type != OP_RV2SV)
2423 op_free(cUNOP->op_first);
2424 cUNOP->op_first = newop;
2426 op->op_type = OP_SCHOP;
2427 op->op_ppaddr = ppaddr[OP_SCHOP];
2435 I32 type = op->op_type;
2437 if (op->op_flags & OPf_KIDS)
2440 if (op->op_flags & OPf_SPECIAL) {
2442 op = newUNOP(type, 0, newGVOP(OP_GV, 0, gv_fetchpv("main'ARGV", TRUE)));
2451 needblockscope = TRUE;
2452 if (op->op_flags & OPf_KIDS) {
2453 SVOP *kid = (SVOP*)cUNOP->op_first;
2456 op->op_flags &= ~OPf_KIDS;
2457 op->op_type = OP_NULL;
2458 op->op_ppaddr = ppaddr[OP_NULL];
2460 else if (kid->op_type == OP_LINESEQ) {
2463 kid->op_next = op->op_next;
2464 cUNOP->op_first = 0;
2467 Newz(1101, enter, 1, LOGOP);
2468 enter->op_type = OP_ENTERTRY;
2469 enter->op_ppaddr = ppaddr[OP_ENTERTRY];
2470 enter->op_private = 0;
2472 /* establish postfix order */
2473 enter->op_next = (OP*)enter;
2475 op = prepend_elem(OP_LINESEQ, (OP*)enter, (OP*)kid);
2476 op->op_type = OP_LEAVETRY;
2477 op->op_ppaddr = ppaddr[OP_LEAVETRY];
2478 enter->op_other = op;
2484 op = newUNOP(OP_ENTEREVAL, 0, newSVREF(newGVOP(OP_GV, 0, defgv)));
2494 if (op->op_flags & OPf_STACKED) {
2496 kid = cUNOP->op_first->op_sibling;
2497 if (kid->op_type == OP_RV2GV) {
2498 kid->op_type = OP_NULL;
2499 kid->op_ppaddr = ppaddr[OP_NULL];
2511 o = fold_constants(o);
2512 if (o->op_type == OP_CONST)
2521 SVOP *kid = (SVOP*)cUNOP->op_first;
2522 if (kid->op_type == OP_CONST) {
2523 kid->op_type = OP_GV;
2524 kid->op_sv = sv_ref((SV*)gv_fetchpv(SvPVx(kid->op_sv, na),
2525 1+(op->op_type==OP_RV2CV)));
2541 I32 type = op->op_type;
2543 if (op->op_flags & OPf_SPECIAL)
2546 if (op->op_flags & OPf_KIDS) {
2547 SVOP *kid = (SVOP*)cUNOP->op_first;
2549 if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) {
2550 OP *newop = newGVOP(type, OPf_SPECIAL,
2551 gv_fetchpv(SvPVx(kid->op_sv, na), TRUE));
2558 if (type == OP_FTTTY)
2559 return newGVOP(type, OPf_SPECIAL, gv_fetchpv("main'STDIN", TRUE));
2561 return newUNOP(type, 0, newSVREF(newGVOP(OP_GV, 0, defgv)));
2574 register I32 oa = opargs[op->op_type] >> 8;
2576 if (op->op_flags & OPf_STACKED) {
2577 if ((oa & OA_OPTIONAL) && (oa >> 4) && !((oa >> 4) & OA_OPTIONAL))
2580 return no_fh_allowed(op);
2583 if (op->op_flags & OPf_KIDS) {
2584 tokid = &cLISTOP->op_first;
2585 kid = cLISTOP->op_first;
2586 if (kid->op_type == OP_PUSHMARK) {
2587 tokid = &kid->op_sibling;
2588 kid = kid->op_sibling;
2593 sibl = kid->op_sibling;
2607 if (kid->op_type == OP_CONST &&
2608 (kid->op_private & OPpCONST_BARE)) {
2609 char *name = SvPVx(((SVOP*)kid)->op_sv, na);
2610 OP *newop = newAVREF(newGVOP(OP_GV, 0,
2611 gv_fetchpv(name, TRUE) ));
2613 warn("Array @%s missing the @ in argument %d of %s()",
2614 name, numargs, op_name[op->op_type]);
2617 kid->op_sibling = sibl;
2620 mod(kid, op->op_type);
2623 if (kid->op_type == OP_CONST &&
2624 (kid->op_private & OPpCONST_BARE)) {
2625 char *name = SvPVx(((SVOP*)kid)->op_sv, na);
2626 OP *newop = newHVREF(newGVOP(OP_GV, 0,
2627 gv_fetchpv(name, TRUE) ));
2629 warn("Hash %%%s missing the %% in argument %d of %s()",
2630 name, numargs, op_name[op->op_type]);
2633 kid->op_sibling = sibl;
2636 mod(kid, op->op_type);
2640 OP *newop = newUNOP(OP_NULL, 0, scalar(kid));
2641 kid->op_sibling = 0;
2643 newop->op_next = newop;
2645 kid->op_sibling = sibl;
2650 if (kid->op_type != OP_GV) {
2651 if (kid->op_type == OP_CONST &&
2652 (kid->op_private & OPpCONST_BARE)) {
2653 OP *newop = newGVOP(OP_GV, 0,
2654 gv_fetchpv(SvPVx(((SVOP*)kid)->op_sv, na), TRUE) );
2659 kid->op_sibling = 0;
2660 kid = newUNOP(OP_RV2GV, 0, scalar(kid));
2662 kid->op_sibling = sibl;
2668 mod(scalar(kid), op->op_type);
2672 tokid = &kid->op_sibling;
2673 kid = kid->op_sibling;
2675 op->op_private = numargs;
2677 return too_many_arguments(op);
2681 while (oa & OA_OPTIONAL)
2683 if (oa && oa != OA_LIST)
2684 return too_few_arguments(op);
2693 GV *gv = newGVgen();
2695 append_elem(OP_GLOB, op, newGVOP(OP_GV, 0, gv));
2707 if (op->op_flags & OPf_STACKED) {
2709 op->op_flags &= ~OPf_STACKED;
2714 kid = cLISTOP->op_first->op_sibling;
2715 if (kid->op_type != OP_NULL)
2716 croak("panic: ck_grep");
2717 kid = kUNOP->op_first;
2719 Newz(1101, gwop, 1, LOGOP);
2720 gwop->op_type = OP_GREPWHILE;
2721 gwop->op_ppaddr = ppaddr[OP_GREPWHILE];
2722 gwop->op_first = list(op);
2723 gwop->op_flags |= OPf_KIDS;
2724 gwop->op_private = 1;
2725 gwop->op_other = LINKLIST(kid);
2726 gwop->op_targ = pad_alloc(OP_GREPWHILE,'T');
2727 kid->op_next = (OP*)gwop;
2736 if (op->op_flags & OPf_KIDS) {
2737 OP *kid = cLISTOP->op_first->op_sibling; /* get past pushmark */
2738 if (kid && kid->op_type == OP_CONST)
2739 fbm_compile(((SVOP*)kid)->op_sv, 0);
2748 /* XXX length optimization goes here */
2756 return modkids(ck_fun(op), op->op_type);
2765 kid = cLISTOP->op_first;
2767 prepend_elem(op->op_type, newOP(OP_PUSHMARK, 0), op);
2768 kid = cLISTOP->op_first;
2770 if (kid->op_type == OP_PUSHMARK)
2771 kid = kid->op_sibling;
2772 if (kid && op->op_flags & OPf_STACKED)
2773 kid = kid->op_sibling;
2774 else if (kid && !kid->op_sibling) { /* print HANDLE; */
2775 if (kid->op_type == OP_CONST && kid->op_private & OPpCONST_BARE) {
2776 op->op_flags |= OPf_STACKED; /* make it a filehandle */
2777 kid = newUNOP(OP_RV2GV, 0, scalar(kid));
2778 cLISTOP->op_first->op_sibling = kid;
2779 cLISTOP->op_last = kid;
2780 kid = kid->op_sibling;
2785 append_elem(op->op_type, op, newSVREF(newGVOP(OP_GV, 0, defgv)) );
2787 return listkids(op);
2794 cPMOP->op_pmflags |= PMf_RUNTIME;
2809 if (cBINOP->op_first->op_flags & OPf_PARENS) {
2810 op->op_private = OPpREPEAT_DOLIST;
2812 prepend_elem(OP_NULL, newOP(OP_PUSHMARK, 0), cBINOP->op_first);
2823 croak("NOT IMPL LINE %d",__LINE__);
2832 if (op->op_flags & OPf_KIDS) {
2833 OP *kid = cLISTOP->op_first->op_sibling; /* get past pushmark */
2835 op->op_type = OP_SSELECT;
2836 op->op_ppaddr = ppaddr[OP_SSELECT];
2838 return fold_constants(op);
2848 I32 type = op->op_type;
2850 if (!(op->op_flags & OPf_KIDS)) {
2852 return newUNOP(type, 0,
2853 scalar(newUNOP(OP_RV2AV, 0,
2854 scalar(newGVOP(OP_GV, 0,
2855 gv_fetchpv((subline ? "_" : "ARGV"), TRUE) )))));
2857 return scalar(modkids(ck_fun(op), type));
2864 if (op->op_flags & OPf_STACKED) {
2865 OP *kid = cLISTOP->op_first->op_sibling; /* get past pushmark */
2867 kid = kUNOP->op_first; /* get past rv2gv */
2869 if (kid->op_type == OP_SCOPE || kid->op_type == OP_LEAVE) {
2871 if (kid->op_type == OP_SCOPE) {
2876 else if (kid->op_type == OP_LEAVE) {
2877 kid->op_type = OP_NULL; /* wipe out leave */
2878 kid->op_ppaddr = ppaddr[OP_NULL];
2881 for (k = kLISTOP->op_first->op_next; k; k = k->op_next) {
2882 if (k->op_next == kid)
2885 peep(kLISTOP->op_first);
2887 kid = cLISTOP->op_first->op_sibling; /* get past pushmark */
2888 kid->op_type = OP_NULL; /* wipe out rv2gv */
2889 kid->op_ppaddr = ppaddr[OP_NULL];
2891 op->op_flags |= OPf_SPECIAL;
2903 if (op->op_flags & OPf_STACKED)
2904 return no_fh_allowed(op);
2906 if (!(op->op_flags & OPf_KIDS))
2907 op = prepend_elem(OP_SPLIT,
2909 newPMOP(OP_MATCH, OPf_SPECIAL),
2910 newSVOP(OP_CONST, 0, newSVpv(" ", 1)),
2914 kid = cLISTOP->op_first;
2915 if (kid->op_type == OP_PUSHMARK)
2916 croak("panic: ck_split");
2918 if (kid->op_type != OP_MATCH) {
2919 OP *sibl = kid->op_sibling;
2920 kid->op_sibling = 0;
2921 kid = pmruntime( newPMOP(OP_MATCH, OPf_SPECIAL), kid, Nullop);
2922 if (cLISTOP->op_first == cLISTOP->op_last)
2923 cLISTOP->op_last = kid;
2924 cLISTOP->op_first = kid;
2925 kid->op_sibling = sibl;
2928 kid->op_type = OP_PUSHRE;
2929 kid->op_ppaddr = ppaddr[OP_PUSHRE];
2932 if (!kid->op_sibling)
2933 append_elem(OP_SPLIT, op, newSVREF(newGVOP(OP_GV, 0, defgv)) );
2935 kid = kid->op_sibling;
2938 if (!kid->op_sibling)
2939 append_elem(OP_SPLIT, op, newSVOP(OP_CONST, 0, newSViv(0)));
2941 kid = kid->op_sibling;
2944 if (kid->op_sibling)
2945 return too_many_arguments(op);
2954 OP *o = ((cUNOP->op_first->op_sibling)
2955 ? cUNOP : ((UNOP*)cUNOP->op_first))->op_first->op_sibling;
2957 if (o->op_type == OP_RV2CV) {
2958 o->op_type = OP_NULL; /* disable rv2cv */
2959 o->op_ppaddr = ppaddr[OP_NULL];
2963 op->op_private |= OPpSUBR_DB;
2971 if (op->op_flags & OPf_KIDS) {
2972 SVOP *kid = (SVOP*)cUNOP->op_first;
2974 if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE))
2975 op->op_flags |= OPf_SPECIAL;
2980 /* A peephole optimizer. We visit the ops in the order they're to execute. */
2986 register OP* oldop = 0;
2987 if (!op || op->op_seq)
2989 for (; op; op = op->op_next) {
2992 switch (op->op_type) {
2998 oldop->op_next = op->op_next;
3001 op->op_seq = ++op_seqmax;
3005 if (op->op_next->op_type == OP_RV2SV &&
3006 op->op_next->op_private < OP_RV2GV)
3008 op->op_next->op_type = OP_NULL;
3009 op->op_next->op_ppaddr = ppaddr[OP_NULL];
3010 op->op_flags |= op->op_next->op_flags & OPf_INTRO;
3011 op->op_next = op->op_next->op_next;
3012 op->op_type = OP_GVSV;
3013 op->op_ppaddr = ppaddr[OP_GVSV];
3015 op->op_seq = ++op_seqmax;
3021 op->op_seq = ++op_seqmax;
3022 peep(cLOGOP->op_other);
3026 op->op_seq = ++op_seqmax;
3027 peep(cCONDOP->op_true);
3028 peep(cCONDOP->op_false);
3032 op->op_seq = ++op_seqmax;
3033 peep(cLOOP->op_redoop);
3034 peep(cLOOP->op_nextop);
3035 peep(cLOOP->op_lastop);
3040 op->op_seq = ++op_seqmax;
3041 peep(cPMOP->op_pmreplroot);
3045 op->op_seq = ++op_seqmax;