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

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