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

Revision 17035, 12.9 KB checked in by zacheiss, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r17034, which included commits to RCS files with non-trunk default branches.
Line 
1/*    op.h
2 *
3 *    Copyright (c) 1991-2001, 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#define NOT_IN_PAD ((PADOFFSET) -1)
28
29#ifdef DEBUGGING_OPS
30#define OPCODE opcode
31#else
32#define OPCODE U16
33#endif
34
35#ifdef BASEOP_DEFINITION
36#define BASEOP BASEOP_DEFINITION
37#else
38#define BASEOP                          \
39    OP*         op_next;                \
40    OP*         op_sibling;             \
41    OP*         (CPERLscope(*op_ppaddr))(pTHX);         \
42    PADOFFSET   op_targ;                \
43    OPCODE      op_type;                \
44    U16         op_seq;                 \
45    U8          op_flags;               \
46    U8          op_private;
47#endif
48
49#define OP_GIMME(op,dfl) \
50        (((op)->op_flags & OPf_WANT) == OPf_WANT_VOID   ? G_VOID   : \
51         ((op)->op_flags & OPf_WANT) == OPf_WANT_SCALAR ? G_SCALAR : \
52         ((op)->op_flags & OPf_WANT) == OPf_WANT_LIST   ? G_ARRAY   : \
53         dfl)
54
55/*
56=for apidoc Amn|U32|GIMME_V
57The XSUB-writer's equivalent to Perl's C<wantarray>.  Returns C<G_VOID>,
58C<G_SCALAR> or C<G_ARRAY> for void, scalar or list context,
59respectively.
60
61=for apidoc Amn|U32|GIMME
62A backward-compatible version of C<GIMME_V> which can only return
63C<G_SCALAR> or C<G_ARRAY>; in a void context, it returns C<G_SCALAR>.
64Deprecated.  Use C<GIMME_V> instead.
65
66=cut
67*/
68
69#define GIMME_V         OP_GIMME(PL_op, block_gimme())
70
71/* Public flags */
72
73#define OPf_WANT        3       /* Mask for "want" bits: */
74#define  OPf_WANT_VOID   1      /*   Want nothing */
75#define  OPf_WANT_SCALAR 2      /*   Want single value */
76#define  OPf_WANT_LIST   3      /*   Want list of any length */
77#define OPf_KIDS        4       /* There is a firstborn child. */
78#define OPf_PARENS      8       /* This operator was parenthesized. */
79                                /*  (Or block needs explicit scope entry.) */
80#define OPf_REF         16      /* Certified reference. */
81                                /*  (Return container, not containee). */
82#define OPf_MOD         32      /* Will modify (lvalue). */
83#define OPf_STACKED     64      /* Some arg is arriving on the stack. */
84#define OPf_SPECIAL     128     /* Do something weird for this op: */
85                                /*  On local LVAL, don't init local value. */
86                                /*  On OP_SORT, subroutine is inlined. */
87                                /*  On OP_NOT, inversion was implicit. */
88                                /*  On OP_LEAVE, don't restore curpm. */
89                                /*  On truncate, we truncate filehandle */
90                                /*  On control verbs, we saw no label */
91                                /*  On flipflop, we saw ... instead of .. */
92                                /*  On UNOPs, saw bare parens, e.g. eof(). */
93                                /*  On OP_ENTERSUB || OP_NULL, saw a "do". */
94                                /*  On OP_EXISTS, treat av as av, not avhv.  */
95                                /*  On OP_(ENTER|LEAVE)EVAL, don't clear $@ */
96                                /*  On OP_ENTERITER, loop var is per-thread */
97                                /*  On pushre, re is /\s+/ imp. by split " " */
98                                /*  On regcomp, "use re 'eval'" was in scope */
99
100/* old names; don't use in new code, but don't break them, either */
101#define OPf_LIST        OPf_WANT_LIST
102#define OPf_KNOW        OPf_WANT
103
104#define GIMME \
105          (PL_op->op_flags & OPf_WANT                                   \
106           ? ((PL_op->op_flags & OPf_WANT) == OPf_WANT_LIST             \
107              ? G_ARRAY                                                 \
108              : G_SCALAR)                                               \
109           : dowantarray())
110
111/* NOTE: OP_NEXTSTATE, OP_DBSTATE, and OP_SETSTATE (i.e. COPs) carry lower
112 * bits of PL_hints in op_private */
113
114/* Private for lvalues */
115#define OPpLVAL_INTRO   128     /* Lvalue must be localized or lvalue sub */
116
117/* Private for OP_LEAVE, OP_LEAVESUB, OP_LEAVESUBLV and OP_LEAVEWRITE */
118#define OPpREFCOUNTED           64      /* op_targ carries a refcount */
119
120/* Private for OP_AASSIGN */
121#define OPpASSIGN_COMMON        64      /* Left & right have syms in common. */
122#define OPpASSIGN_HASH          32      /* Assigning to possible pseudohash. */
123
124/* Private for OP_SASSIGN */
125#define OPpASSIGN_BACKWARDS     64      /* Left & right switched. */
126
127/* Private for OP_MATCH and OP_SUBST{,CONST} */
128#define OPpRUNTIME              64      /* Pattern coming in on the stack */
129
130/* Private for OP_TRANS */
131#define OPpTRANS_FROM_UTF       1
132#define OPpTRANS_TO_UTF         2
133#define OPpTRANS_IDENTICAL      4       /* right side is same as left */
134#define OPpTRANS_SQUASH         8
135#define OPpTRANS_DELETE         16
136#define OPpTRANS_COMPLEMENT     32
137#define OPpTRANS_GROWS          64
138
139/* Private for OP_REPEAT */
140#define OPpREPEAT_DOLIST        64      /* List replication. */
141
142/* Private for OP_RV2?V, OP_?ELEM */
143#define OPpDEREF                (32|64) /* Want ref to something: */
144#define OPpDEREF_AV             32      /*   Want ref to AV. */
145#define OPpDEREF_HV             64      /*   Want ref to HV. */
146#define OPpDEREF_SV             (32|64) /*   Want ref to SV. */
147  /* OP_ENTERSUB only */
148#define OPpENTERSUB_DB          16      /* Debug subroutine. */
149#define OPpENTERSUB_HASTARG     32      /* Called from OP tree. */
150  /* OP_RV2CV only */
151#define OPpENTERSUB_AMPER       8       /* Used & form to call. */
152#define OPpENTERSUB_NOPAREN     128     /* bare sub call (without parens) */
153#define OPpENTERSUB_INARGS      4       /* Lval used as arg to a sub. */
154  /* OP_GV only */
155#define OPpEARLY_CV             32      /* foo() called before sub foo was parsed */
156  /* OP_?ELEM only */
157#define OPpLVAL_DEFER           16      /* Defer creation of array/hash elem */
158  /* OP_RV2?V, OP_GVSV only */
159#define OPpOUR_INTRO            16      /* Variable was in an our() */
160  /* OP_RV2[AH]V, OP_PAD[AH]V, OP_[AH]ELEM */
161#define OPpMAYBE_LVSUB          8       /* We might be an lvalue to return */
162  /* for OP_RV2?V, lower bits carry hints (currently only HINT_STRICT_REFS) */
163
164/* Private for OPs with TARGLEX */
165  /* (lower bits may carry MAXARG) */
166#define OPpTARGET_MY            16      /* Target is PADMY. */
167
168/* Private for OP_CONST */
169#define OPpCONST_STRICT         8       /* bearword subject to strict 'subs' */
170#define OPpCONST_ENTERED        16      /* Has been entered as symbol. */
171#define OPpCONST_ARYBASE        32      /* Was a $[ translated to constant. */
172#define OPpCONST_BARE           64      /* Was a bare word (filehandle?). */
173#define OPpCONST_WARNING        128     /* Was a $^W translated to constant. */
174
175/* Private for OP_FLIP/FLOP */
176#define OPpFLIP_LINENUM         64      /* Range arg potentially a line num. */
177
178/* Private for OP_LIST */
179#define OPpLIST_GUESSED         64      /* Guessed that pushmark was needed. */
180
181/* Private for OP_DELETE */
182#define OPpSLICE                64      /* Operating on a list of keys */
183
184/* Private for OP_EXISTS */
185#define OPpEXISTS_SUB           64      /* Checking for &sub, not {} or [].  */
186
187/* Private for OP_SORT, OP_PRTF, OP_SPRINTF, OP_FTTEXT, OP_FTBINARY, */
188/*             string comparisons, and case changers. */
189#define OPpLOCALE               64      /* Use locale */
190
191/* Private for OP_SORT */
192#define OPpSORT_NUMERIC         1       /* Optimized away { $a <=> $b } */
193#define OPpSORT_INTEGER         2       /* Ditto while under "use integer" */
194#define OPpSORT_REVERSE         4       /* Descending sort */
195/* Private for OP_THREADSV */
196#define OPpDONE_SVREF           64      /* Been through newSVREF once */
197
198/* Private for OP_OPEN and OP_BACKTICK */
199#define OPpOPEN_IN_RAW          16      /* binmode(F,":raw") on input fh */
200#define OPpOPEN_IN_CRLF         32      /* binmode(F,":crlf") on input fh */
201#define OPpOPEN_OUT_RAW         64      /* binmode(F,":raw") on output fh */
202#define OPpOPEN_OUT_CRLF        128     /* binmode(F,":crlf") on output fh */
203
204/* Private for OP_EXIT */
205#define OPpEXIT_VMSISH          128     /* exit(0) vs. exit(1) vmsish mode*/
206
207struct op {
208    BASEOP
209};
210
211struct unop {
212    BASEOP
213    OP *        op_first;
214};
215
216struct binop {
217    BASEOP
218    OP *        op_first;
219    OP *        op_last;
220};
221
222struct logop {
223    BASEOP
224    OP *        op_first;
225    OP *        op_other;
226};
227
228struct listop {
229    BASEOP
230    OP *        op_first;
231    OP *        op_last;
232};
233
234struct pmop {
235    BASEOP
236    OP *        op_first;
237    OP *        op_last;
238    OP *        op_pmreplroot;
239    OP *        op_pmreplstart;
240    PMOP *      op_pmnext;              /* list of all scanpats */
241    REGEXP *    op_pmregexp;            /* compiled expression */
242    U16         op_pmflags;
243    U16         op_pmpermflags;
244    U8          op_pmdynflags;
245};
246
247#define PMdf_USED       0x01            /* pm has been used once already */
248#define PMdf_TAINTED    0x02            /* pm compiled from tainted pattern */
249#define PMdf_UTF8       0x04            /* pm compiled from utf8 data */
250
251#define PMf_RETAINT     0x0001          /* taint $1 etc. if target tainted */
252#define PMf_ONCE        0x0002          /* use pattern only once per reset */
253#define PMf_REVERSED    0x0004          /* Should be matched right->left */
254#define PMf_MAYBE_CONST 0x0008          /* replacement contains variables */
255#define PMf_SKIPWHITE   0x0010          /* skip leading whitespace for split */
256#define PMf_WHITE       0x0020          /* pattern is \s+ */
257#define PMf_CONST       0x0040          /* subst replacement is constant */
258#define PMf_KEEP        0x0080          /* keep 1st runtime pattern forever */
259#define PMf_GLOBAL      0x0100          /* pattern had a g modifier */
260#define PMf_CONTINUE    0x0200          /* don't reset pos() if //g fails */
261#define PMf_EVAL        0x0400          /* evaluating replacement as expr */
262#define PMf_LOCALE      0x0800          /* use locale for character types */
263#define PMf_MULTILINE   0x1000          /* assume multiple lines */
264#define PMf_SINGLELINE  0x2000          /* assume single line */
265#define PMf_FOLD        0x4000          /* case insensitivity */
266#define PMf_EXTENDED    0x8000          /* chuck embedded whitespace */
267
268/* mask of bits stored in regexp->reganch */
269#define PMf_COMPILETIME (PMf_MULTILINE|PMf_SINGLELINE|PMf_LOCALE|PMf_FOLD|PMf_EXTENDED)
270
271struct svop {
272    BASEOP
273    SV *        op_sv;
274};
275
276struct padop {
277    BASEOP
278    PADOFFSET   op_padix;
279};
280
281struct pvop {
282    BASEOP
283    char *      op_pv;
284};
285
286struct loop {
287    BASEOP
288    OP *        op_first;
289    OP *        op_last;
290    OP *        op_redoop;
291    OP *        op_nextop;
292    OP *        op_lastop;
293};
294
295#define cUNOPx(o)       ((UNOP*)o)
296#define cBINOPx(o)      ((BINOP*)o)
297#define cLISTOPx(o)     ((LISTOP*)o)
298#define cLOGOPx(o)      ((LOGOP*)o)
299#define cPMOPx(o)       ((PMOP*)o)
300#define cSVOPx(o)       ((SVOP*)o)
301#define cPADOPx(o)      ((PADOP*)o)
302#define cPVOPx(o)       ((PVOP*)o)
303#define cCOPx(o)        ((COP*)o)
304#define cLOOPx(o)       ((LOOP*)o)
305
306#define cUNOP           cUNOPx(PL_op)
307#define cBINOP          cBINOPx(PL_op)
308#define cLISTOP         cLISTOPx(PL_op)
309#define cLOGOP          cLOGOPx(PL_op)
310#define cPMOP           cPMOPx(PL_op)
311#define cSVOP           cSVOPx(PL_op)
312#define cPADOP          cPADOPx(PL_op)
313#define cPVOP           cPVOPx(PL_op)
314#define cCOP            cCOPx(PL_op)
315#define cLOOP           cLOOPx(PL_op)
316
317#define cUNOPo          cUNOPx(o)
318#define cBINOPo         cBINOPx(o)
319#define cLISTOPo        cLISTOPx(o)
320#define cLOGOPo         cLOGOPx(o)
321#define cPMOPo          cPMOPx(o)
322#define cSVOPo          cSVOPx(o)
323#define cPADOPo         cPADOPx(o)
324#define cPVOPo          cPVOPx(o)
325#define cCOPo           cCOPx(o)
326#define cLOOPo          cLOOPx(o)
327
328#define kUNOP           cUNOPx(kid)
329#define kBINOP          cBINOPx(kid)
330#define kLISTOP         cLISTOPx(kid)
331#define kLOGOP          cLOGOPx(kid)
332#define kPMOP           cPMOPx(kid)
333#define kSVOP           cSVOPx(kid)
334#define kPADOP          cPADOPx(kid)
335#define kPVOP           cPVOPx(kid)
336#define kCOP            cCOPx(kid)
337#define kLOOP           cLOOPx(kid)
338
339
340#ifdef USE_ITHREADS
341#  define       cGVOPx_gv(o)    ((GV*)PL_curpad[cPADOPx(o)->op_padix])
342#  define       IS_PADGV(v)     (v && SvTYPE(v) == SVt_PVGV && GvIN_PAD(v))
343#  define       IS_PADCONST(v)  (v && SvREADONLY(v))
344#  define       cSVOPx_sv(v)    (cSVOPx(v)->op_sv \
345                                 ? cSVOPx(v)->op_sv : PL_curpad[(v)->op_targ])
346#  define       cSVOPx_svp(v)   (cSVOPx(v)->op_sv \
347                                 ? &cSVOPx(v)->op_sv : &PL_curpad[(v)->op_targ])
348#else
349#  define       cGVOPx_gv(o)    ((GV*)cSVOPx(o)->op_sv)
350#  define       IS_PADGV(v)     FALSE
351#  define       IS_PADCONST(v)  FALSE
352#  define       cSVOPx_sv(v)    (cSVOPx(v)->op_sv)
353#  define       cSVOPx_svp(v)   (&cSVOPx(v)->op_sv)
354#endif
355
356#define cGVOP_gv                cGVOPx_gv(PL_op)
357#define cGVOPo_gv               cGVOPx_gv(o)
358#define kGVOP_gv                cGVOPx_gv(kid)
359#define cSVOP_sv                cSVOPx_sv(PL_op)
360#define cSVOPo_sv               cSVOPx_sv(o)
361#define kSVOP_sv                cSVOPx_sv(kid)
362
363#define Nullop Null(OP*)
364
365/* Lowest byte of PL_opargs */
366#define OA_MARK 1
367#define OA_FOLDCONST 2
368#define OA_RETSCALAR 4
369#define OA_TARGET 8
370#define OA_RETINTEGER 16
371#define OA_OTHERINT 32
372#define OA_DANGEROUS 64
373#define OA_DEFGV 128
374#define OA_TARGLEX 256
375
376/* The next 4 bits encode op class information */
377#define OCSHIFT 9
378
379#define OA_CLASS_MASK (15 << OCSHIFT)
380
381#define OA_BASEOP (0 << OCSHIFT)
382#define OA_UNOP (1 << OCSHIFT)
383#define OA_BINOP (2 << OCSHIFT)
384#define OA_LOGOP (3 << OCSHIFT)
385#define OA_LISTOP (4 << OCSHIFT)
386#define OA_PMOP (5 << OCSHIFT)
387#define OA_SVOP (6 << OCSHIFT)
388#define OA_PADOP (7 << OCSHIFT)
389#define OA_PVOP_OR_SVOP (8 << OCSHIFT)
390#define OA_LOOP (9 << OCSHIFT)
391#define OA_COP (10 << OCSHIFT)
392#define OA_BASEOP_OR_UNOP (11 << OCSHIFT)
393#define OA_FILESTATOP (12 << OCSHIFT)
394#define OA_LOOPEXOP (13 << OCSHIFT)
395
396#define OASHIFT 13
397
398/* Remaining nybbles of PL_opargs */
399#define OA_SCALAR 1
400#define OA_LIST 2
401#define OA_AVREF 3
402#define OA_HVREF 4
403#define OA_CVREF 5
404#define OA_FILEREF 6
405#define OA_SCALARREF 7
406#define OA_OPTIONAL 8
407
408#ifdef USE_ITHREADS
409#  define OP_REFCNT_INIT                MUTEX_INIT(&PL_op_mutex)
410#  define OP_REFCNT_LOCK                MUTEX_LOCK(&PL_op_mutex)
411#  define OP_REFCNT_UNLOCK              MUTEX_UNLOCK(&PL_op_mutex)
412#  define OP_REFCNT_TERM                MUTEX_DESTROY(&PL_op_mutex)
413#else
414#  define OP_REFCNT_INIT                NOOP
415#  define OP_REFCNT_LOCK                NOOP
416#  define OP_REFCNT_UNLOCK              NOOP
417#  define OP_REFCNT_TERM                NOOP
418#endif
419
420#define OpREFCNT_set(o,n)               ((o)->op_targ = (n))
421#define OpREFCNT_inc(o)                 ((o) ? (++(o)->op_targ, (o)) : Nullop)
422#define OpREFCNT_dec(o)                 (--(o)->op_targ)
423
424/* flags used by Perl_load_module() */
425#define PERL_LOADMOD_DENY               0x1
426#define PERL_LOADMOD_NOIMPORT           0x2
427#define PERL_LOADMOD_IMPORT_OPS         0x4
Note: See TracBrowser for help on using the repository browser.