Commit | Line | Data |
---|---|---|
79072805 LW |
1 | /* $RCSfile: arg.h,v $$Revision: 4.1 $$Date: 92/08/07 17:18:16 $ |
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: arg.h,v $ | |
9 | */ | |
10 | ||
11 | /* | |
12 | * The fields of BASEOP are: | |
13 | * op_next Pointer to next ppcode to execute after this one. | |
14 | * (Top level pre-grafted op points to first op, | |
15 | * but this is replaced when op is grafted in, when | |
16 | * this op will point to the real next op, and the new | |
17 | * parent takes over role of remembering starting op.) | |
18 | * op_ppaddr Pointer to current ppcode's function. | |
19 | * op_type The type of the operation. | |
20 | * op_flags Flags common to all operations. See OPf_* below. | |
21 | * op_private Flags peculiar to a particular operation (BUT, | |
22 | * by default, set to the number of children until | |
23 | * the operation is privatized by a check routine, | |
24 | * which may or may not check number of children). | |
25 | */ | |
26 | ||
27 | typedef U16 PADOFFSET; | |
28 | ||
29 | #ifdef DEBUGGING | |
30 | #define OPCODE opcode | |
31 | #else | |
32 | #define OPCODE U16 | |
33 | #endif | |
34 | ||
35 | #define BASEOP \ | |
36 | OP* op_next; \ | |
37 | OP* op_sibling; \ | |
38 | OP* (*op_ppaddr)(); \ | |
39 | PADOFFSET op_targ; \ | |
40 | OPCODE op_type; \ | |
41 | U16 op_seq; \ | |
42 | char op_flags; \ | |
43 | char op_private; | |
44 | ||
45 | #define GIMME (op->op_flags & OPf_KNOW ? op->op_flags & OPf_LIST : getgimme(op)) | |
46 | ||
47 | /* Public flags */ | |
48 | #define OPf_LIST 1 /* Do operator in list context. */ | |
49 | #define OPf_KNOW 2 /* Context is known. */ | |
50 | #define OPf_KIDS 4 /* There is a firstborn child. */ | |
51 | #define OPf_PARENS 8 /* This operator was parenthesized. */ | |
463ee0b2 | 52 | /* (Or block needs explicit scope entry.) */ |
79072805 LW |
53 | #define OPf_STACKED 16 /* Some arg is arriving on the stack. */ |
54 | #define OPf_LVAL 32 /* Certified reference (lvalue). */ | |
93a17b20 | 55 | #define OPf_INTRO 64 /* Lvalue must be localized */ |
79072805 LW |
56 | #define OPf_SPECIAL 128 /* Do something weird for this op: */ |
57 | /* On local LVAL, don't init local value. */ | |
58 | /* On OP_SORT, subroutine is inlined. */ | |
59 | /* On OP_NOT, inversion was implicit. */ | |
60 | /* On file tests, we fstat filehandle */ | |
61 | /* On truncate, we truncate filehandle */ | |
62 | /* On control verbs, we saw no label */ | |
63 | /* On flipflop, we saw ... instead of .. */ | |
64 | /* On UNOPs, saw bare parens, e.g. eof(). */ | |
65 | /* On OP_ENTERSUBR || OP_NULL, saw a "do". */ | |
66 | ||
67 | /* Private for OP_ASSIGN */ | |
68 | #define OPpASSIGN_COMMON 1 /* Left & right have syms in common. */ | |
69 | ||
70 | /* Private for OP_TRANS */ | |
71 | #define OPpTRANS_SQUASH 1 | |
72 | #define OPpTRANS_DELETE 2 | |
73 | #define OPpTRANS_COMPLEMENT 4 | |
74 | ||
75 | /* Private for OP_REPEAT */ | |
76 | #define OPpREPEAT_DOLIST 1 /* List replication. */ | |
77 | ||
78 | /* Private for OP_SUBR */ | |
79 | #define OPpSUBR_DB 1 /* Debug subroutine. */ | |
80 | ||
81 | /* Private for OP_CONST */ | |
82 | #define OPpCONST_BARE 1 /* Was a bare word (filehandle?). */ | |
83 | ||
84 | /* Private for OP_FLIP/FLOP */ | |
85 | #define OPpFLIP_LINENUM 1 /* Range arg potentially a line num. */ | |
86 | ||
87 | struct op { | |
88 | BASEOP | |
89 | }; | |
90 | ||
91 | struct unop { | |
92 | BASEOP | |
93 | OP * op_first; | |
94 | }; | |
95 | ||
96 | struct binop { | |
97 | BASEOP | |
98 | OP * op_first; | |
99 | OP * op_last; | |
100 | }; | |
101 | ||
102 | struct logop { | |
103 | BASEOP | |
104 | OP * op_first; | |
105 | OP * op_other; | |
106 | }; | |
107 | ||
108 | struct condop { | |
109 | BASEOP | |
110 | OP * op_first; | |
111 | OP * op_true; | |
112 | OP * op_false; | |
113 | }; | |
114 | ||
115 | struct listop { | |
116 | BASEOP | |
117 | OP * op_first; | |
118 | OP * op_last; | |
119 | U32 op_children; | |
120 | }; | |
121 | ||
122 | struct pmop { | |
123 | BASEOP | |
124 | OP * op_first; | |
125 | OP * op_last; | |
126 | U32 op_children; | |
127 | OP * op_pmreplroot; | |
128 | OP * op_pmreplstart; | |
129 | PMOP * op_pmnext; /* list of all scanpats */ | |
130 | REGEXP * op_pmregexp; /* compiled expression */ | |
131 | SV * op_pmshort; /* for a fast bypass of execute() */ | |
132 | short op_pmflags; | |
133 | char op_pmslen; | |
134 | }; | |
135 | #define PMf_USED 1 /* pm has been used once already */ | |
136 | #define PMf_ONCE 2 /* use pattern only once per reset */ | |
137 | #define PMf_SCANFIRST 4 /* initial constant not anchored */ | |
138 | #define PMf_ALL 8 /* initial constant is whole pat */ | |
139 | #define PMf_SKIPWHITE 16 /* skip leading whitespace for split */ | |
140 | #define PMf_FOLD 32 /* case insensitivity */ | |
141 | #define PMf_CONST 64 /* subst replacement is constant */ | |
142 | #define PMf_KEEP 128 /* keep 1st runtime pattern forever */ | |
143 | #define PMf_GLOBAL 256 /* pattern had a g modifier */ | |
144 | #define PMf_RUNTIME 512 /* pattern coming in on the stack */ | |
145 | #define PMf_EVAL 1024 /* evaluating replacement as expr */ | |
146 | ||
147 | struct svop { | |
148 | BASEOP | |
149 | SV * op_sv; | |
150 | }; | |
151 | ||
152 | struct gvop { | |
153 | BASEOP | |
154 | GV * op_gv; | |
155 | }; | |
156 | ||
157 | struct pvop { | |
158 | BASEOP | |
159 | char * op_pv; | |
160 | }; | |
161 | ||
162 | struct cvop { | |
163 | BASEOP | |
164 | CV * op_cv; | |
165 | OP * op_cont; | |
166 | }; | |
167 | ||
168 | struct loop { | |
169 | BASEOP | |
170 | OP * op_first; | |
171 | OP * op_last; | |
172 | U32 op_children; | |
173 | OP * op_redoop; | |
174 | OP * op_nextop; | |
175 | OP * op_lastop; | |
176 | }; | |
177 | ||
178 | #define cUNOP ((UNOP*)op) | |
179 | #define cBINOP ((BINOP*)op) | |
180 | #define cLISTOP ((LISTOP*)op) | |
181 | #define cLOGOP ((LOGOP*)op) | |
182 | #define cCONDOP ((CONDOP*)op) | |
183 | #define cPMOP ((PMOP*)op) | |
184 | #define cSVOP ((SVOP*)op) | |
185 | #define cGVOP ((GVOP*)op) | |
186 | #define cPVOP ((PVOP*)op) | |
187 | #define cCVOP ((CVOP*)op) | |
188 | #define cCOP ((COP*)op) | |
189 | #define cLOOP ((LOOP*)op) | |
190 | ||
191 | #define kUNOP ((UNOP*)kid) | |
192 | #define kBINOP ((BINOP*)kid) | |
193 | #define kLISTOP ((LISTOP*)kid) | |
194 | #define kLOGOP ((LOGOP*)kid) | |
195 | #define kCONDOP ((CONDOP*)kid) | |
196 | #define kPMOP ((PMOP*)kid) | |
197 | #define kSVOP ((SVOP*)kid) | |
198 | #define kGVOP ((GVOP*)kid) | |
199 | #define kPVOP ((PVOP*)kid) | |
200 | #define kCVOP ((CVOP*)kid) | |
201 | #define kCOP ((COP*)kid) | |
202 | #define kLOOP ((LOOP*)kid) | |
203 | ||
204 | #define Nullop Null(OP*) | |
205 |