This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
ext/B/defsubs_h.PL: teach to allow exprs with <<
[perl5.git] / op.h
1 /*    op.h
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4  *    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
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_opt          Whether or not the op has been optimised by the
21  *                      peephole optimiser.
22  *
23  *                      See the comments in S_clear_yystack() for more
24  *                      details on the following three flags:
25  *
26  *      op_latefree     tell op_free() to clear this op (and free any kids)
27  *                      but not yet deallocate the struct. This means that
28  *                      the op may be safely op_free()d multiple times
29  *      op_latefreed    an op_latefree op has been op_free()d
30  *      op_attached     this op (sub)tree has been attached to a CV
31  *
32  *      op_spare        three spare bits!
33  *      op_flags        Flags common to all operations.  See OPf_* below.
34  *      op_private      Flags peculiar to a particular operation (BUT,
35  *                      by default, set to the number of children until
36  *                      the operation is privatized by a check routine,
37  *                      which may or may not check number of children).
38  */
39
40 #define OPCODE U16
41
42 #ifdef PERL_MAD
43 #  define MADPROP_IN_BASEOP     MADPROP*        op_madprop;
44 #else
45 #  define MADPROP_IN_BASEOP
46 #endif
47
48 typedef PERL_BITFIELD16 Optype;
49
50 #ifdef BASEOP_DEFINITION
51 #define BASEOP BASEOP_DEFINITION
52 #else
53 #define BASEOP                          \
54     OP*         op_next;                \
55     OP*         op_sibling;             \
56     OP*         (CPERLscope(*op_ppaddr))(pTHX);         \
57     MADPROP_IN_BASEOP                   \
58     PADOFFSET   op_targ;                \
59     PERL_BITFIELD16 op_type:9;          \
60     PERL_BITFIELD16 op_opt:1;           \
61     PERL_BITFIELD16 op_latefree:1;      \
62     PERL_BITFIELD16 op_latefreed:1;     \
63     PERL_BITFIELD16 op_attached:1;      \
64     PERL_BITFIELD16 op_spare:3;         \
65     U8          op_flags;               \
66     U8          op_private;
67 #endif
68
69 /* If op_type:9 is changed to :10, also change PUSHEVAL in cop.h.
70    Also, if the type of op_type is ever changed (e.g. to PERL_BITFIELD32)
71    then all the other bit-fields before/after it should change their
72    types too to let VC pack them into the same 4 byte integer.*/
73
74 #define OP_GIMME(op,dfl) \
75         (((op)->op_flags & OPf_WANT) == OPf_WANT_VOID   ? G_VOID   : \
76          ((op)->op_flags & OPf_WANT) == OPf_WANT_SCALAR ? G_SCALAR : \
77          ((op)->op_flags & OPf_WANT) == OPf_WANT_LIST   ? G_ARRAY   : \
78          dfl)
79
80 #define OP_GIMME_REVERSE(flags) ((flags) & G_WANT)
81
82 /*
83 =head1 "Gimme" Values
84
85 =for apidoc Amn|U32|GIMME_V
86 The XSUB-writer's equivalent to Perl's C<wantarray>.  Returns C<G_VOID>,
87 C<G_SCALAR> or C<G_ARRAY> for void, scalar or list context,
88 respectively. See L<perlcall> for a usage example.
89
90 =for apidoc Amn|U32|GIMME
91 A backward-compatible version of C<GIMME_V> which can only return
92 C<G_SCALAR> or C<G_ARRAY>; in a void context, it returns C<G_SCALAR>.
93 Deprecated.  Use C<GIMME_V> instead.
94
95 =cut
96 */
97
98 #define GIMME_V         OP_GIMME(PL_op, block_gimme())
99
100 /* Public flags */
101
102 #define OPf_WANT        3       /* Mask for "want" bits: */
103 #define  OPf_WANT_VOID   1      /*   Want nothing */
104 #define  OPf_WANT_SCALAR 2      /*   Want single value */
105 #define  OPf_WANT_LIST   3      /*   Want list of any length */
106 #define OPf_KIDS        4       /* There is a firstborn child. */
107 #define OPf_PARENS      8       /* This operator was parenthesized. */
108                                 /*  (Or block needs explicit scope entry.) */
109 #define OPf_REF         16      /* Certified reference. */
110                                 /*  (Return container, not containee). */
111 #define OPf_MOD         32      /* Will modify (lvalue). */
112 #define OPf_STACKED     64      /* Some arg is arriving on the stack. */
113 #define OPf_SPECIAL     128     /* Do something weird for this op: */
114                                 /*  On local LVAL, don't init local value. */
115                                 /*  On OP_SORT, subroutine is inlined. */
116                                 /*  On OP_NOT, inversion was implicit. */
117                                 /*  On OP_LEAVE, don't restore curpm. */
118                                 /*  On truncate, we truncate filehandle */
119                                 /*  On control verbs, we saw no label */
120                                 /*  On flipflop, we saw ... instead of .. */
121                                 /*  On UNOPs, saw bare parens, e.g. eof(). */
122                                 /*  On OP_ENTERSUB || OP_NULL, saw a "do". */
123                                 /*  On OP_EXISTS, treat av as av, not avhv.  */
124                                 /*  On OP_(ENTER|LEAVE)EVAL, don't clear $@ */
125                                 /*  On OP_ENTERITER, loop var is per-thread */
126                                 /*  On pushre, rx is used as part of split, e.g. split " " */
127                                 /*  On regcomp, "use re 'eval'" was in scope */
128                                 /*  On OP_READLINE, was <$filehandle> */
129                                 /*  On RV2[ACGHS]V, don't create GV--in
130                                     defined()*/
131                                 /*  On OP_DBSTATE, indicates breakpoint
132                                  *    (runtime property) */
133                                 /*  On OP_AELEMFAST, indiciates pad var */
134                                 /*  On OP_REQUIRE, was seen as CORE::require */
135                                 /*  On OP_ENTERWHEN, there's no condition */
136                                 /*  On OP_BREAK, an implicit break */
137                                 /*  On OP_SMARTMATCH, an implicit smartmatch */
138                                 /*  On OP_ANONHASH and OP_ANONLIST, create a
139                                     reference to the new anon hash or array */
140                                 /*  On OP_ENTER, store caller context */
141                                 /*  On OP_HELEM and OP_HSLICE, localization will be followed
142                                     by assignment, so do not wipe the target if it is special
143                                     (e.g. a glob or a magic SV) */
144
145 /* old names; don't use in new code, but don't break them, either */
146 #define OPf_LIST        OPf_WANT_LIST
147 #define OPf_KNOW        OPf_WANT
148
149 #define GIMME \
150           (PL_op->op_flags & OPf_WANT                                   \
151            ? ((PL_op->op_flags & OPf_WANT) == OPf_WANT_LIST             \
152               ? G_ARRAY                                                 \
153               : G_SCALAR)                                               \
154            : dowantarray())
155
156 /* NOTE: OP_NEXTSTATE and OP_DBSTATE (i.e. COPs) carry lower
157  * bits of PL_hints in op_private */
158
159 /* Private for lvalues */
160 #define OPpLVAL_INTRO   128     /* Lvalue must be localized or lvalue sub */
161
162 /* Private for OP_LEAVE, OP_LEAVESUB, OP_LEAVESUBLV and OP_LEAVEWRITE */
163 #define OPpREFCOUNTED           64      /* op_targ carries a refcount */
164
165 /* Private for OP_AASSIGN */
166 #define OPpASSIGN_COMMON        64      /* Left & right have syms in common. */
167
168 /* Private for OP_SASSIGN */
169 #define OPpASSIGN_BACKWARDS     64      /* Left & right switched. */
170 #define OPpASSIGN_CV_TO_GV      128     /* Possible optimisation for constants. */
171
172 /* Private for OP_MATCH and OP_SUBST{,CONST} */
173 #define OPpRUNTIME              64      /* Pattern coming in on the stack */
174
175 /* Private for OP_TRANS */
176 #define OPpTRANS_FROM_UTF       1
177 #define OPpTRANS_TO_UTF         2
178 #define OPpTRANS_IDENTICAL      4       /* right side is same as left */
179 #define OPpTRANS_SQUASH         8
180     /* 16 is used for OPpTARGET_MY */
181 #define OPpTRANS_COMPLEMENT     32
182 #define OPpTRANS_GROWS          64
183 #define OPpTRANS_DELETE         128
184 #define OPpTRANS_ALL    (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF|OPpTRANS_IDENTICAL|OPpTRANS_SQUASH|OPpTRANS_COMPLEMENT|OPpTRANS_GROWS|OPpTRANS_DELETE)
185
186 /* Private for OP_REPEAT */
187 #define OPpREPEAT_DOLIST        64      /* List replication. */
188
189 /* Private for OP_RV2GV, OP_RV2SV, OP_AELEM, OP_HELEM, OP_PADSV */
190 #define OPpDEREF                (32|64) /* autovivify: Want ref to something: */
191 #define OPpDEREF_AV             32      /*   Want ref to AV. */
192 #define OPpDEREF_HV             64      /*   Want ref to HV. */
193 #define OPpDEREF_SV             (32|64) /*   Want ref to SV. */
194 /* Private for OP_RV2SV, OP_RV2AV, OP_RV2AV */
195 #define OPpDEREFed              4       /* prev op was OPpDEREF */
196   /* OP_ENTERSUB only */
197 #define OPpENTERSUB_DB          16      /* Debug subroutine. */
198 #define OPpENTERSUB_HASTARG     32      /* Called from OP tree. */
199 #define OPpENTERSUB_NOMOD       64      /* Immune to mod() for :attrlist. */
200   /* OP_ENTERSUB and OP_RV2CV only */
201 #define OPpENTERSUB_AMPER       8       /* Used & form to call. */
202 #define OPpENTERSUB_NOPAREN     128     /* bare sub call (without parens) */
203 #define OPpENTERSUB_INARGS      4       /* Lval used as arg to a sub. */
204   /* OP_GV only */
205 #define OPpEARLY_CV             32      /* foo() called before sub foo was parsed */
206   /* OP_?ELEM only */
207 #define OPpLVAL_DEFER           16      /* Defer creation of array/hash elem */
208   /* OP_RV2?V, OP_GVSV, OP_ENTERITER only */
209 #define OPpOUR_INTRO            16      /* Variable was in an our() */
210   /* OP_RV2[AGH]V, OP_PAD[AH]V, OP_[AH]ELEM */
211 #define OPpMAYBE_LVSUB          8       /* We might be an lvalue to return */
212   /* OP_PADSV only */
213 #define OPpPAD_STATE            16      /* is a "state" pad */
214   /* for OP_RV2?V, lower bits carry hints (currently only HINT_STRICT_REFS) */
215
216   /* OP_RV2GV only */
217 #define OPpDONT_INIT_GV         4       /* Call gv_fetchpv with GV_NOINIT */
218 /* (Therefore will return whatever is currently in the symbol table, not
219    guaranteed to be a PVGV)  */
220
221   /* OP_RV2CV only */
222 #define OPpMAY_RETURN_CONSTANT  1       /* If a constant sub, return the constant */
223
224 /* Private for OPs with TARGLEX */
225   /* (lower bits may carry MAXARG) */
226 #define OPpTARGET_MY            16      /* Target is PADMY. */
227
228 /* Private for OP_ENTERITER and OP_ITER */
229 #define OPpITER_REVERSED        4       /* for (reverse ...) */
230 #define OPpITER_DEF             8       /* for $_ or for my $_ */
231
232 /* Private for OP_CONST */
233 #define OPpCONST_NOVER          2       /* no 6; */
234 #define OPpCONST_SHORTCIRCUIT   4       /* eg the constant 5 in (5 || foo) */
235 #define OPpCONST_STRICT         8       /* bearword subject to strict 'subs' */
236 #define OPpCONST_ENTERED        16      /* Has been entered as symbol. */
237 #define OPpCONST_ARYBASE        32      /* Was a $[ translated to constant. */
238 #define OPpCONST_BARE           64      /* Was a bare word (filehandle?). */
239 #define OPpCONST_WARNING        128     /* Was a $^W translated to constant. */
240
241 /* Private for OP_FLIP/FLOP */
242 #define OPpFLIP_LINENUM         64      /* Range arg potentially a line num. */
243
244 /* Private for OP_LIST */
245 #define OPpLIST_GUESSED         64      /* Guessed that pushmark was needed. */
246
247 /* Private for OP_DELETE */
248 #define OPpSLICE                64      /* Operating on a list of keys */
249 /* Also OPpLVAL_INTRO (128) */
250
251 /* Private for OP_EXISTS */
252 #define OPpEXISTS_SUB           64      /* Checking for &sub, not {} or [].  */
253
254 /* Private for OP_SORT */
255 #define OPpSORT_NUMERIC         1       /* Optimized away { $a <=> $b } */
256 #define OPpSORT_INTEGER         2       /* Ditto while under "use integer" */
257 #define OPpSORT_REVERSE         4       /* Reversed sort */
258 #define OPpSORT_INPLACE         8       /* sort in-place; eg @a = sort @a */
259 #define OPpSORT_DESCEND         16      /* Descending sort */
260 #define OPpSORT_QSORT           32      /* Use quicksort (not mergesort) */
261 #define OPpSORT_STABLE          64      /* Use a stable algorithm */
262
263 /* Private for OP_REVERSE */
264 #define OPpREVERSE_INPLACE      8       /* reverse in-place (@a = reverse @a) */
265
266 /* Private for OP_OPEN and OP_BACKTICK */
267 #define OPpOPEN_IN_RAW          16      /* binmode(F,":raw") on input fh */
268 #define OPpOPEN_IN_CRLF         32      /* binmode(F,":crlf") on input fh */
269 #define OPpOPEN_OUT_RAW         64      /* binmode(F,":raw") on output fh */
270 #define OPpOPEN_OUT_CRLF        128     /* binmode(F,":crlf") on output fh */
271
272 /* Private for OP_EXIT, HUSH also for OP_DIE */
273 #define OPpHUSH_VMSISH          64      /* hush DCL exit msg vmsish mode*/
274 #define OPpEXIT_VMSISH          128     /* exit(0) vs. exit(1) vmsish mode*/
275
276 /* Private for OP_FTXXX */
277 #define OPpFT_ACCESS            2       /* use filetest 'access' */
278 #define OPpFT_STACKED           4       /* stacked filetest, as in "-f -x $f" */
279
280 /* Private for OP_(MAP|GREP)(WHILE|START) */
281 #define OPpGREP_LEX             2       /* iterate over lexical $_ */
282     
283 /* Private for OP_ENTEREVAL */
284 #define OPpEVAL_HAS_HH          2       /* Does it have a copy of %^H */
285     
286 struct op {
287     BASEOP
288 };
289
290 struct unop {
291     BASEOP
292     OP *        op_first;
293 };
294
295 struct binop {
296     BASEOP
297     OP *        op_first;
298     OP *        op_last;
299 };
300
301 struct logop {
302     BASEOP
303     OP *        op_first;
304     OP *        op_other;
305 };
306
307 struct listop {
308     BASEOP
309     OP *        op_first;
310     OP *        op_last;
311 };
312
313 struct pmop {
314     BASEOP
315     OP *        op_first;
316     OP *        op_last;
317 #ifdef USE_ITHREADS
318     IV          op_pmoffset;
319 #else
320     REGEXP *    op_pmregexp;            /* compiled expression */
321 #endif
322     U32         op_pmflags;
323     union {
324         OP *    op_pmreplroot;          /* For OP_SUBST */
325 #ifdef USE_ITHREADS
326         PADOFFSET  op_pmtargetoff;      /* For OP_PUSHRE */
327 #else
328         GV *    op_pmtargetgv;
329 #endif
330     }   op_pmreplrootu;
331     union {
332         OP *    op_pmreplstart; /* Only used in OP_SUBST */
333 #ifdef USE_ITHREADS
334         char *  op_pmstashpv;   /* Only used in OP_MATCH, with PMf_ONCE set */
335 #else
336         HV *    op_pmstash;
337 #endif
338     }           op_pmstashstartu;
339 };
340
341 #ifdef USE_ITHREADS
342 #define PM_GETRE(o)     (SvTYPE(PL_regex_pad[(o)->op_pmoffset]) == SVt_REGEXP \
343                          ? (REGEXP*)(PL_regex_pad[(o)->op_pmoffset]) : NULL)
344 /* The assignment is just to enforce type safety (or at least get a warning).
345  */
346 /* With first class regexps not via a reference one needs to assign
347    &PL_sv_undef under ithreads. (This would probably work unthreaded, but NULL
348    is cheaper. I guess we could allow NULL, but the check above would get
349    more complex, and we'd have an AV with (SV*)NULL in it, which feels bad */
350 /* BEWARE - something that calls this macro passes (r) which has a side
351    effect.  */
352 #define PM_SETRE(o,r)   STMT_START {                                    \
353                             REGEXP *const _pm_setre = (r);              \
354                             assert(_pm_setre);                          \
355                             PL_regex_pad[(o)->op_pmoffset] = MUTABLE_SV(_pm_setre); \
356                         } STMT_END
357 #else
358 #define PM_GETRE(o)     ((o)->op_pmregexp)
359 #define PM_SETRE(o,r)   ((o)->op_pmregexp = (r))
360 #endif
361
362
363 #define PMf_RETAINT     0x00000040      /* taint $1 etc. if target tainted */
364
365 /* match successfully only once per reset, with related flag RXf_USED in
366  * re->extflags holding state.  This is used only for ?? matches, and only on
367  * OP_MATCH and OP_QR */
368 #define PMf_ONCE        0x00000080
369 #define PMf_UNUSED      0x00000100      /* free for use */
370 #define PMf_MAYBE_CONST 0x00000200      /* replacement contains variables */
371
372 /* PMf_ONCE has matched successfully. Not used under threading. */
373 #define PMf_USED        0x00000400
374
375 #define PMf_CONST       0x00000800      /* subst replacement is constant */
376 #define PMf_KEEP        0x00001000      /* keep 1st runtime pattern forever */
377 #define PMf_GLOBAL      0x00002000      /* pattern had a g modifier */
378 #define PMf_CONTINUE    0x00004000      /* don't reset pos() if //g fails */
379 #define PMf_EVAL        0x00008000      /* evaluating replacement as expr */
380
381 /* Return substituted string instead of modifying it. */
382 #define PMf_NONDESTRUCT 0x00010000
383
384 /* The following flags have exact equivalents in regcomp.h with the prefix RXf_
385  * which are stored in the regexp->extflags member. If you change them here,
386  * you have to change them there, and vice versa.
387  */
388 #define PMf_MULTILINE   0x00000001      /* assume multiple lines */
389 #define PMf_SINGLELINE  0x00000002      /* assume single line */
390 #define PMf_FOLD        0x00000004      /* case insensitivity */
391 #define PMf_EXTENDED    0x00000008      /* chuck embedded whitespace */
392 #define PMf_KEEPCOPY    0x00000010      /* copy the string when matching */
393 #define PMf_LOCALE      0x00000020      /* use locale for character types */
394
395 /* mask of bits that need to be transfered to re->extflags */
396 #define PMf_COMPILETIME (PMf_MULTILINE|PMf_SINGLELINE|PMf_LOCALE|PMf_FOLD|PMf_EXTENDED|PMf_KEEPCOPY)
397
398 #ifdef USE_ITHREADS
399
400 #  define PmopSTASHPV(o)                                                \
401     (((o)->op_pmflags & PMf_ONCE) ? (o)->op_pmstashstartu.op_pmstashpv : NULL)
402 #  if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
403 #    define PmopSTASHPV_set(o,pv)       ({                              \
404         assert((o)->op_pmflags & PMf_ONCE);                             \
405         ((o)->op_pmstashstartu.op_pmstashpv = savesharedpv(pv));        \
406     })
407 #  else
408 #    define PmopSTASHPV_set(o,pv)                                       \
409     ((o)->op_pmstashstartu.op_pmstashpv = savesharedpv(pv))
410 #  endif
411 #  define PmopSTASH(o)          (PmopSTASHPV(o) \
412                                  ? gv_stashpv((o)->op_pmstashstartu.op_pmstashpv,GV_ADD) : NULL)
413 #  define PmopSTASH_set(o,hv)   PmopSTASHPV_set(o, ((hv) ? HvNAME_get(hv) : NULL))
414 #  define PmopSTASH_free(o)     PerlMemShared_free(PmopSTASHPV(o))
415
416 #else
417 #  define PmopSTASH(o)                                                  \
418     (((o)->op_pmflags & PMf_ONCE) ? (o)->op_pmstashstartu.op_pmstash : NULL)
419 #  if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
420 #    define PmopSTASH_set(o,hv)         ({                              \
421         assert((o)->op_pmflags & PMf_ONCE);                             \
422         ((o)->op_pmstashstartu.op_pmstash = (hv));                      \
423     })
424 #  else
425 #    define PmopSTASH_set(o,hv) ((o)->op_pmstashstartu.op_pmstash = (hv))
426 #  endif
427 #  define PmopSTASHPV(o)        (PmopSTASH(o) ? HvNAME_get(PmopSTASH(o)) : NULL)
428    /* op_pmstashstartu.op_pmstash is not refcounted */
429 #  define PmopSTASHPV_set(o,pv) PmopSTASH_set((o), gv_stashpv(pv,GV_ADD))
430 /* Note that if this becomes non-empty, then S_forget_pmop in op.c will need
431    changing */
432 #  define PmopSTASH_free(o)    
433 #endif
434
435 struct svop {
436     BASEOP
437     SV *        op_sv;
438 };
439
440 struct padop {
441     BASEOP
442     PADOFFSET   op_padix;
443 };
444
445 struct pvop {
446     BASEOP
447     char *      op_pv;
448 };
449
450 struct loop {
451     BASEOP
452     OP *        op_first;
453     OP *        op_last;
454     OP *        op_redoop;
455     OP *        op_nextop;
456     OP *        op_lastop;
457 };
458
459 #define cUNOPx(o)       ((UNOP*)o)
460 #define cBINOPx(o)      ((BINOP*)o)
461 #define cLISTOPx(o)     ((LISTOP*)o)
462 #define cLOGOPx(o)      ((LOGOP*)o)
463 #define cPMOPx(o)       ((PMOP*)o)
464 #define cSVOPx(o)       ((SVOP*)o)
465 #define cPADOPx(o)      ((PADOP*)o)
466 #define cPVOPx(o)       ((PVOP*)o)
467 #define cCOPx(o)        ((COP*)o)
468 #define cLOOPx(o)       ((LOOP*)o)
469
470 #define cUNOP           cUNOPx(PL_op)
471 #define cBINOP          cBINOPx(PL_op)
472 #define cLISTOP         cLISTOPx(PL_op)
473 #define cLOGOP          cLOGOPx(PL_op)
474 #define cPMOP           cPMOPx(PL_op)
475 #define cSVOP           cSVOPx(PL_op)
476 #define cPADOP          cPADOPx(PL_op)
477 #define cPVOP           cPVOPx(PL_op)
478 #define cCOP            cCOPx(PL_op)
479 #define cLOOP           cLOOPx(PL_op)
480
481 #define cUNOPo          cUNOPx(o)
482 #define cBINOPo         cBINOPx(o)
483 #define cLISTOPo        cLISTOPx(o)
484 #define cLOGOPo         cLOGOPx(o)
485 #define cPMOPo          cPMOPx(o)
486 #define cSVOPo          cSVOPx(o)
487 #define cPADOPo         cPADOPx(o)
488 #define cPVOPo          cPVOPx(o)
489 #define cCOPo           cCOPx(o)
490 #define cLOOPo          cLOOPx(o)
491
492 #define kUNOP           cUNOPx(kid)
493 #define kBINOP          cBINOPx(kid)
494 #define kLISTOP         cLISTOPx(kid)
495 #define kLOGOP          cLOGOPx(kid)
496 #define kPMOP           cPMOPx(kid)
497 #define kSVOP           cSVOPx(kid)
498 #define kPADOP          cPADOPx(kid)
499 #define kPVOP           cPVOPx(kid)
500 #define kCOP            cCOPx(kid)
501 #define kLOOP           cLOOPx(kid)
502
503
504 #ifdef USE_ITHREADS
505 #  define       cGVOPx_gv(o)    ((GV*)PAD_SVl(cPADOPx(o)->op_padix))
506 #  define       IS_PADGV(v)     (v && SvTYPE(v) == SVt_PVGV && isGV_with_GP(v) \
507                                  && GvIN_PAD(v))
508 #  define       IS_PADCONST(v)  (v && SvREADONLY(v))
509 #  define       cSVOPx_sv(v)    (cSVOPx(v)->op_sv \
510                                  ? cSVOPx(v)->op_sv : PAD_SVl((v)->op_targ))
511 #  define       cSVOPx_svp(v)   (cSVOPx(v)->op_sv \
512                                  ? &cSVOPx(v)->op_sv : &PAD_SVl((v)->op_targ))
513 #else
514 #  define       cGVOPx_gv(o)    ((GV*)cSVOPx(o)->op_sv)
515 #  define       IS_PADGV(v)     FALSE
516 #  define       IS_PADCONST(v)  FALSE
517 #  define       cSVOPx_sv(v)    (cSVOPx(v)->op_sv)
518 #  define       cSVOPx_svp(v)   (&cSVOPx(v)->op_sv)
519 #endif
520
521 #define cGVOP_gv                cGVOPx_gv(PL_op)
522 #define cGVOPo_gv               cGVOPx_gv(o)
523 #define kGVOP_gv                cGVOPx_gv(kid)
524 #define cSVOP_sv                cSVOPx_sv(PL_op)
525 #define cSVOPo_sv               cSVOPx_sv(o)
526 #define kSVOP_sv                cSVOPx_sv(kid)
527
528 #ifndef PERL_CORE
529 #  define Nullop ((OP*)NULL)
530 #endif
531
532 /* Lowest byte-and-a-bit of PL_opargs */
533 #define OA_MARK 1
534 #define OA_FOLDCONST 2
535 #define OA_RETSCALAR 4
536 #define OA_TARGET 8
537 #define OA_RETINTEGER 16
538 #define OA_OTHERINT 32
539 #define OA_DANGEROUS 64
540 #define OA_DEFGV 128
541 #define OA_TARGLEX 256
542
543 /* The next 4 bits encode op class information */
544 #define OCSHIFT 9
545
546 #define OA_CLASS_MASK (15 << OCSHIFT)
547
548 #define OA_BASEOP (0 << OCSHIFT)
549 #define OA_UNOP (1 << OCSHIFT)
550 #define OA_BINOP (2 << OCSHIFT)
551 #define OA_LOGOP (3 << OCSHIFT)
552 #define OA_LISTOP (4 << OCSHIFT)
553 #define OA_PMOP (5 << OCSHIFT)
554 #define OA_SVOP (6 << OCSHIFT)
555 #define OA_PADOP (7 << OCSHIFT)
556 #define OA_PVOP_OR_SVOP (8 << OCSHIFT)
557 #define OA_LOOP (9 << OCSHIFT)
558 #define OA_COP (10 << OCSHIFT)
559 #define OA_BASEOP_OR_UNOP (11 << OCSHIFT)
560 #define OA_FILESTATOP (12 << OCSHIFT)
561 #define OA_LOOPEXOP (13 << OCSHIFT)
562
563 #define OASHIFT 13
564
565 /* Remaining nybbles of PL_opargs */
566 #define OA_SCALAR 1
567 #define OA_LIST 2
568 #define OA_AVREF 3
569 #define OA_HVREF 4
570 #define OA_CVREF 5
571 #define OA_FILEREF 6
572 #define OA_SCALARREF 7
573 #define OA_OPTIONAL 8
574
575 /* Op_REFCNT is a reference count at the head of each op tree: needed
576  * since the tree is shared between threads, and between cloned closure
577  * copies in the same thread. OP_REFCNT_LOCK/UNLOCK is used when modifying
578  * this count.
579  * The same mutex is used to protect the refcounts of the reg_trie_data
580  * and reg_ac_data structures, which are shared between duplicated
581  * regexes.
582  */
583
584 #ifdef USE_ITHREADS
585 #  define OP_REFCNT_INIT                MUTEX_INIT(&PL_op_mutex)
586 #  ifdef PERL_CORE
587 #    define OP_REFCNT_LOCK              MUTEX_LOCK(&PL_op_mutex)
588 #    define OP_REFCNT_UNLOCK            MUTEX_UNLOCK(&PL_op_mutex)
589 #  else
590 #    define OP_REFCNT_LOCK              op_refcnt_lock()
591 #    define OP_REFCNT_UNLOCK            op_refcnt_unlock()
592 #  endif
593 #  define OP_REFCNT_TERM                MUTEX_DESTROY(&PL_op_mutex)
594 #else
595 #  define OP_REFCNT_INIT                NOOP
596 #  define OP_REFCNT_LOCK                NOOP
597 #  define OP_REFCNT_UNLOCK              NOOP
598 #  define OP_REFCNT_TERM                NOOP
599 #endif
600
601 #define OpREFCNT_set(o,n)               ((o)->op_targ = (n))
602 #ifdef PERL_DEBUG_READONLY_OPS
603 #  define OpREFCNT_inc(o)               Perl_op_refcnt_inc(aTHX_ o)
604 #  define OpREFCNT_dec(o)               Perl_op_refcnt_dec(aTHX_ o)
605 #else
606 #  define OpREFCNT_inc(o)               ((o) ? (++(o)->op_targ, (o)) : NULL)
607 #  define OpREFCNT_dec(o)               (--(o)->op_targ)
608 #endif
609
610 /* flags used by Perl_load_module() */
611 #define PERL_LOADMOD_DENY               0x1     /* no Module */
612 #define PERL_LOADMOD_NOIMPORT           0x2     /* use Module () */
613 #define PERL_LOADMOD_IMPORT_OPS         0x4     /* use Module (...) */
614
615 #if defined(PERL_IN_PERLY_C) || defined(PERL_IN_OP_C)
616 #define ref(o, type) doref(o, type, TRUE)
617 #endif
618
619 /* no longer used anywhere in core */
620 #ifndef PERL_CORE
621 #define cv_ckproto(cv, gv, p) \
622    cv_ckproto_len((cv), (gv), (p), (p) ? strlen(p) : 0)
623 #endif
624
625 #ifdef PERL_CORE
626 #  define my(o) my_attrs((o), NULL)
627 #endif
628
629 #ifdef USE_REENTRANT_API
630 #include "reentr.h"
631 #endif
632
633 #if defined(PL_OP_SLAB_ALLOC)
634 #define NewOp(m,var,c,type)     \
635         (var = (type *) Perl_Slab_Alloc(aTHX_ c*sizeof(type)))
636 #define NewOpSz(m,var,size)     \
637         (var = (OP *) Perl_Slab_Alloc(aTHX_ size))
638 #define FreeOp(p) Perl_Slab_Free(aTHX_ p)
639 #else
640 #define NewOp(m, var, c, type)  \
641         (var = (MEM_WRAP_CHECK_(c,type) \
642          (type*)PerlMemShared_calloc(c, sizeof(type))))
643 #define NewOpSz(m, var, size)   \
644         (var = (OP*)PerlMemShared_calloc(1, size))
645 #define FreeOp(p) PerlMemShared_free(p)
646 #endif
647
648 struct block_hooks {
649     U32     bhk_flags;
650     void    (*bhk_start)        (pTHX_ int full);
651     void    (*bhk_pre_end)      (pTHX_ OP **seq);
652     void    (*bhk_post_end)     (pTHX_ OP **seq);
653     void    (*bhk_eval)         (pTHX_ OP *const saveop);
654 };
655
656 /*
657 =head1 Compile-time scope hooks
658
659 =for apidoc m|U32|BhkFLAGS|BHK *hk
660 Return the BHK's flags.
661
662 =for apidoc m|void *|BhkENTRY|BHK *hk|which
663 Return an entry from the BHK structure. I<which> is a preprocessor token
664 indicating which entry to return. If the appropriate flag is not set
665 this will return NULL. The type of the return value depends on which
666 entry you ask for.
667
668 =for apidoc Am|void|BhkENTRY_set|BHK *hk|which|void *ptr
669 Set an entry in the BHK structure, and set the flags to indicate it is
670 valid. I<which> is a preprocessing token indicating which entry to set.
671 The type of I<ptr> depends on the entry.
672
673 =for apidoc Am|void|BhkDISABLE|BHK *hk|which
674 Temporarily disable an entry in this BHK structure, by clearing the
675 appropriate flag. I<which> is a preprocessor token indicating which
676 entry to disable.
677
678 =for apidoc Am|void|BhkENABLE|BHK *hk|which
679 Re-enable an entry in this BHK structure, by setting the appropriate
680 flag. I<which> is a preprocessor token indicating which entry to enable.
681 This will assert (under -DDEBUGGING) if the entry doesn't contain a valid
682 pointer.
683
684 =for apidoc m|void|CALL_BLOCK_HOOKS|which|arg
685 Call all the registered block hooks for type I<which>. I<which> is a
686 preprocessing token; the type of I<arg> depends on I<which>.
687
688 =cut
689 */
690
691 #define BhkFLAGS(hk)            ((hk)->bhk_flags)
692
693 #define BHKf_start          0x01
694 #define BHKf_pre_end        0x02
695 #define BHKf_post_end       0x04
696 #define BHKf_eval           0x08
697
698 #define BhkENTRY(hk, which) \
699     ((BhkFLAGS(hk) & BHKf_ ## which) ? ((hk)->bhk_ ## which) : NULL)
700
701 #define BhkENABLE(hk, which) \
702     STMT_START { \
703         BhkFLAGS(hk) |= BHKf_ ## which; \
704         assert(BhkENTRY(hk, which)); \
705     } STMT_END
706
707 #define BhkDISABLE(hk, which) \
708     STMT_START { \
709         BhkFLAGS(hk) &= ~(BHKf_ ## which); \
710     } STMT_END
711
712 #define BhkENTRY_set(hk, which, ptr) \
713     STMT_START { \
714         (hk)->bhk_ ## which = ptr; \
715         BhkENABLE(hk, which); \
716     } STMT_END
717
718 #define CALL_BLOCK_HOOKS(which, arg) \
719     STMT_START { \
720         if (PL_blockhooks) { \
721             I32 i; \
722             for (i = av_len(PL_blockhooks); i >= 0; i--) { \
723                 SV *sv = AvARRAY(PL_blockhooks)[i]; \
724                 BHK *hk; \
725                 \
726                 assert(SvIOK(sv)); \
727                 if (SvUOK(sv)) \
728                     hk = INT2PTR(BHK *, SvUVX(sv)); \
729                 else \
730                     hk = INT2PTR(BHK *, SvIVX(sv)); \
731                 \
732                 if (BhkENTRY(hk, which)) \
733                     CALL_FPTR(BhkENTRY(hk, which))(aTHX_ arg); \
734             } \
735         } \
736     } STMT_END
737
738 #ifdef PERL_MAD
739 #  define MAD_NULL 1
740 #  define MAD_PV 2
741 #  define MAD_OP 3
742 #  define MAD_SV 4
743
744 struct madprop {
745     MADPROP* mad_next;
746     void *mad_val;
747     U32 mad_vlen;
748 /*    short mad_count; */
749     char mad_key;
750     char mad_type;
751 };
752
753 struct token {
754     I32 tk_type;
755     YYSTYPE tk_lval;
756     MADPROP* tk_mad;
757 };
758 #endif
759
760 /*
761  * Values that can be held by mad_key :
762  * ^       unfilled head spot
763  * ,       literal ,
764  * ;       literal ; (blank if implicit ; at end of block)
765  * :       literal : from ?: or attr list
766  * +       unary +
767  * ?       literal ? from ?:
768  * (       literal (
769  * )       literal )
770  * [       literal [
771  * ]       literal ]
772  * {       literal {
773  * }       literal }
774  * @       literal @ sigil
775  * $       literal $ sigil
776  * *       literal * sigil
777  * !       use is source filtered
778  * &       & or sub
779  * #       whitespace/comment following ; or }
780  * #       $# sigil
781  * 1       1st ; from for(;;)
782  * 1       retired protasis
783  * 2       2nd ; from for(;;)
784  * 2       retired apodosis
785  * 3       C-style for list
786  * a       sub or var attributes
787  * a       non-method arrow operator
788  * A       method arrow operator
789  * A       use import args
790  * b       format block
791  * B       retired stub block
792  * C       constant conditional op
793  * d       declarator
794  * D       do block
795  * e       unreached "else" (see C)
796  * e       expression producing E
797  * E       tr/E/R/, /E/
798  * f       folded constant op
799  * F       peg op for format
800  * g       op was forced to be a word
801  * i       if/unless modifier
802  * I       if/elsif/unless statement
803  * k       local declarator
804  * K       retired kid op
805  * l       last index of array ($#foo)
806  * L       label
807  * m       modifier on regex
808  * n       sub or format name
809  * o       current operator/declarator name
810  * o       else/continue
811  * O       generic optimized op
812  * p       peg to hold extra whitespace at statement level
813  * P       peg op for package declaration
814  * q       opening quote
815  * =       quoted material
816  * Q       closing quote
817  * Q       optimized qw//
818  * r       expression producing R
819  * R       tr/E/R/ s/E/R/
820  * s       sub signature
821  * S       use import stub (no import)
822  * S       retired sort block
823  * t       unreached "then" (see C)
824  * U       use import op
825  * v       private sv of for loop
826  * V       use version
827  * w       while/until modifier
828  * W       while/for statement
829  * x       optimized qw
830  * X       random thing
831  * _       whitespace/comments preceding anything else
832  * ~       =~ operator
833  */
834
835 /*
836  * Local variables:
837  * c-indentation-style: bsd
838  * c-basic-offset: 4
839  * indent-tabs-mode: t
840  * End:
841  *
842  * ex: set ts=8 sts=4 sw=4 noet:
843  */