source: trunk/third/perl/op.h @ 10724

Revision 10724, 7.4 KB checked in by ghudson, 27 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r10723, which included commits to RCS files with non-trunk default branches.
Line 
1/*    op.h
2 *
3 *    Copyright (c) 1991-1997, 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 */
9
10/*
11 * The fields of BASEOP are:
12 *      op_next         Pointer to next ppcode to execute after this one.
13 *                      (Top level pre-grafted op points to first op,
14 *                      but this is replaced when op is grafted in, when
15 *                      this op will point to the real next op, and the new
16 *                      parent takes over role of remembering starting op.)
17 *      op_ppaddr       Pointer to current ppcode's function.
18 *      op_type         The type of the operation.
19 *      op_flags        Flags common to all operations.  See OPf_* below.
20 *      op_private      Flags peculiar to a particular operation (BUT,
21 *                      by default, set to the number of children until
22 *                      the operation is privatized by a check routine,
23 *                      which may or may not check number of children).
24 */
25
26typedef U32 PADOFFSET;
27
28#ifdef DEBUGGING_OPS
29#define OPCODE opcode
30#else
31#define OPCODE U16
32#endif
33
34#define BASEOP                          \
35    OP*         op_next;                \
36    OP*         op_sibling;             \
37    OP*         (*op_ppaddr)();         \
38    PADOFFSET   op_targ;                \
39    OPCODE      op_type;                \
40    U16         op_seq;                 \
41    U8          op_flags;               \
42    U8          op_private;
43
44#define OP_GIMME(op,dfl) \
45        (((op)->op_flags & OPf_WANT) == OPf_WANT_VOID   ? G_VOID   : \
46         ((op)->op_flags & OPf_WANT) == OPf_WANT_SCALAR ? G_SCALAR : \
47         ((op)->op_flags & OPf_WANT) == OPf_WANT_LIST   ? G_ARRAY   : \
48         dfl)
49
50#define GIMME_V         OP_GIMME(op, block_gimme())
51
52/* Public flags */
53
54#define OPf_WANT        3       /* Mask for "want" bits: */
55#define  OPf_WANT_VOID   1      /*   Want nothing */
56#define  OPf_WANT_SCALAR 2      /*   Want single value */
57#define  OPf_WANT_LIST   3      /*   Want list of any length */
58#define OPf_KIDS        4       /* There is a firstborn child. */
59#define OPf_PARENS      8       /* This operator was parenthesized. */
60                                /*  (Or block needs explicit scope entry.) */
61#define OPf_REF         16      /* Certified reference. */
62                                /*  (Return container, not containee). */
63#define OPf_MOD         32      /* Will modify (lvalue). */
64#define OPf_STACKED     64      /* Some arg is arriving on the stack. */
65#define OPf_SPECIAL     128     /* Do something weird for this op: */
66                                /*  On local LVAL, don't init local value. */
67                                /*  On OP_SORT, subroutine is inlined. */
68                                /*  On OP_NOT, inversion was implicit. */
69                                /*  On OP_LEAVE, don't restore curpm. */
70                                /*  On truncate, we truncate filehandle */
71                                /*  On control verbs, we saw no label */
72                                /*  On flipflop, we saw ... instead of .. */
73                                /*  On UNOPs, saw bare parens, e.g. eof(). */
74                                /*  On OP_ENTERSUB || OP_NULL, saw a "do". */
75                                /*  On OP_(ENTER|LEAVE)EVAL, don't clear $@ */
76
77/* old names; don't use in new code, but don't break them, either */
78#define OPf_LIST        1
79#define OPf_KNOW        2
80#define GIMME \
81          (op->op_flags & OPf_KNOW ? op->op_flags & OPf_LIST : dowantarray())
82
83/* Private for lvalues */
84#define OPpLVAL_INTRO   128     /* Lvalue must be localized */
85
86/* Private for OP_AASSIGN */
87#define OPpASSIGN_COMMON        64      /* Left & right have syms in common. */
88
89/* Private for OP_SASSIGN */
90#define OPpASSIGN_BACKWARDS     64      /* Left & right switched. */
91
92/* Private for OP_MATCH and OP_SUBST{,CONST} */
93#define OPpRUNTIME              64      /* Pattern coming in on the stack */
94
95/* Private for OP_TRANS */
96#define OPpTRANS_SQUASH         16
97#define OPpTRANS_DELETE         32
98#define OPpTRANS_COMPLEMENT     64
99
100/* Private for OP_REPEAT */
101#define OPpREPEAT_DOLIST        64      /* List replication. */
102
103/* Private for OP_ENTERSUB, OP_RV2?V, OP_?ELEM */
104#define OPpDEREF                (32|64) /* Want ref to something: */
105#define OPpDEREF_AV             32      /*   Want ref to AV. */
106#define OPpDEREF_HV             64      /*   Want ref to HV. */
107#define OPpDEREF_SV             (32|64) /*   Want ref to SV. */
108  /* OP_ENTERSUB only */
109#define OPpENTERSUB_DB          16      /* Debug subroutine. */
110#define OPpENTERSUB_AMPER       8       /* Used & form to call. */
111  /* OP_?ELEM only */
112#define OPpLVAL_DEFER           16      /* Defer creation of array/hash elem */
113  /* for OP_RV2?V, lower bits carry hints */
114
115/* Private for OP_CONST */
116#define OPpCONST_ENTERED        16      /* Has been entered as symbol. */
117#define OPpCONST_ARYBASE        32      /* Was a $[ translated to constant. */
118#define OPpCONST_BARE           64      /* Was a bare word (filehandle?). */
119
120/* Private for OP_FLIP/FLOP */
121#define OPpFLIP_LINENUM         64      /* Range arg potentially a line num. */
122
123/* Private for OP_LIST */
124#define OPpLIST_GUESSED         64      /* Guessed that pushmark was needed. */
125
126/* Private for OP_DELETE */
127#define OPpSLICE                64      /* Operating on a list of keys */
128
129/* Private for OP_SORT, OP_PRTF, OP_SPRINTF, string cmp'n, and case changers */
130#define OPpLOCALE               64      /* Use locale */
131
132struct op {
133    BASEOP
134};
135
136struct unop {
137    BASEOP
138    OP *        op_first;
139};
140
141struct binop {
142    BASEOP
143    OP *        op_first;
144    OP *        op_last;
145};
146
147struct logop {
148    BASEOP
149    OP *        op_first;
150    OP *        op_other;
151};
152
153struct condop {
154    BASEOP
155    OP *        op_first;
156    OP *        op_true;
157    OP *        op_false;
158};
159
160struct listop {
161    BASEOP
162    OP *        op_first;
163    OP *        op_last;
164    U32         op_children;
165};
166
167struct pmop {
168    BASEOP
169    OP *        op_first;
170    OP *        op_last;
171    U32         op_children;
172    OP *        op_pmreplroot;
173    OP *        op_pmreplstart;
174    PMOP *      op_pmnext;              /* list of all scanpats */
175    REGEXP *    op_pmregexp;            /* compiled expression */
176    SV *        op_pmshort;             /* for a fast bypass of execute() */
177    U16         op_pmflags;
178    U16         op_pmpermflags;
179    char        op_pmslen;
180};
181
182#define PMf_USED        0x0001          /* pm has been used once already */
183#define PMf_ONCE        0x0002          /* use pattern only once per reset */
184#define PMf_SCANFIRST   0x0004          /* initial constant not anchored */
185#define PMf_ALL         0x0008          /* initial constant is whole pat */
186#define PMf_SKIPWHITE   0x0010          /* skip leading whitespace for split */
187#define PMf_FOLD        0x0020          /* case insensitivity */
188#define PMf_CONST       0x0040          /* subst replacement is constant */
189#define PMf_KEEP        0x0080          /* keep 1st runtime pattern forever */
190#define PMf_GLOBAL      0x0100          /* pattern had a g modifier */
191#define PMf_CONTINUE    0x0200          /* don't reset pos() if //g fails */
192#define PMf_EVAL        0x0400          /* evaluating replacement as expr */
193#define PMf_WHITE       0x0800          /* pattern is \s+ */
194#define PMf_MULTILINE   0x1000          /* assume multiple lines */
195#define PMf_SINGLELINE  0x2000          /* assume single line */
196#define PMf_LOCALE      0x4000          /* use locale for character types */
197#define PMf_EXTENDED    0x8000          /* chuck embedded whitespace */
198
199struct svop {
200    BASEOP
201    SV *        op_sv;
202};
203
204struct gvop {
205    BASEOP
206    GV *        op_gv;
207};
208
209struct pvop {
210    BASEOP
211    char *      op_pv;
212};
213
214struct loop {
215    BASEOP
216    OP *        op_first;
217    OP *        op_last;
218    U32         op_children;
219    OP *        op_redoop;
220    OP *        op_nextop;
221    OP *        op_lastop;
222};
223
224#define cUNOP ((UNOP*)op)
225#define cBINOP ((BINOP*)op)
226#define cLISTOP ((LISTOP*)op)
227#define cLOGOP ((LOGOP*)op)
228#define cCONDOP ((CONDOP*)op)
229#define cPMOP ((PMOP*)op)
230#define cSVOP ((SVOP*)op)
231#define cGVOP ((GVOP*)op)
232#define cPVOP ((PVOP*)op)
233#define cCOP ((COP*)op)
234#define cLOOP ((LOOP*)op)
235
236#define kUNOP ((UNOP*)kid)
237#define kBINOP ((BINOP*)kid)
238#define kLISTOP ((LISTOP*)kid)
239#define kLOGOP ((LOGOP*)kid)
240#define kCONDOP ((CONDOP*)kid)
241#define kPMOP ((PMOP*)kid)
242#define kSVOP ((SVOP*)kid)
243#define kGVOP ((GVOP*)kid)
244#define kPVOP ((PVOP*)kid)
245#define kCOP ((COP*)kid)
246#define kLOOP ((LOOP*)kid)
247
248#define Nullop Null(OP*)
249
250/* Lowest byte of opargs */
251#define OA_MARK 1
252#define OA_FOLDCONST 2
253#define OA_RETSCALAR 4
254#define OA_TARGET 8
255#define OA_RETINTEGER 16
256#define OA_OTHERINT 32
257#define OA_DANGEROUS 64
258#define OA_DEFGV 128
259
260#define OASHIFT 8
261
262/* Remaining nybbles of opargs */
263#define OA_SCALAR 1
264#define OA_LIST 2
265#define OA_AVREF 3
266#define OA_HVREF 4
267#define OA_CVREF 5
268#define OA_FILEREF 6
269#define OA_SCALARREF 7
270#define OA_OPTIONAL 8
271
Note: See TracBrowser for help on using the repository browser.