diff options
author | David Mitchell <davem@iabyn.com> | 2014-06-27 11:52:44 +0100 |
---|---|---|
committer | David Mitchell <davem@iabyn.com> | 2014-07-08 16:40:03 +0100 |
commit | 29e61fd971cd4373e17cf1dd6e954ddea5171299 (patch) | |
tree | 98cedf27877b50dba8ab0a7c7e781bd4a21275f3 /op.h | |
parent | c4b209751862a812e3cb3d6951c4f9411b0ca0af (diff) | |
download | perl-29e61fd971cd4373e17cf1dd6e954ddea5171299.tar.gz |
add op_lastsib and -DPERL_OP_PARENT
Add the boolean field op_lastsib to OPs. Within the core, this is set
on the last op in an op_sibling chain (so it is synonymous with op_sibling
being null). By default, its value is set but not used.
In addition, add a new build define (not yet enabled by default),
-DPERL_OP_PARENT, that forces the core to use op_lastsib to detect the
last op in a sibling chain, rather than op_sibling being NULL. This frees
up the last op_sibling pointer in the chain, which rather than being set
to NULL, is now set to point back to the parent of the sibling chain (if
any).
This commit also adds a C-level op_parent() function and B parent()
method; under default builds they just return NULL, under PERL_OP_PARENT
they return the parent of the current op.
Collectively this provides a facility not previously available from B:: nor
C, of being able to follow an op tree up as well as down.
Diffstat (limited to 'op.h')
-rw-r--r-- | op.h | 18 |
1 files changed, 13 insertions, 5 deletions
@@ -24,7 +24,8 @@ * !op_slabbed. * op_savefree on savestack via SAVEFREEOP * op_folded Result/remainder of a constant fold operation. - * op_spare Two spare bits + * op_lastsib this op is is the last sibling + * op_spare One spare bit * op_flags Flags common to all operations. See OPf_* below. * op_private Flags peculiar to a particular operation (BUT, * by default, set to the number of children until @@ -51,7 +52,8 @@ typedef PERL_BITFIELD16 Optype; PERL_BITFIELD16 op_savefree:1; \ PERL_BITFIELD16 op_static:1; \ PERL_BITFIELD16 op_folded:1; \ - PERL_BITFIELD16 op_spare:2; \ + PERL_BITFIELD16 op_lastsib; \ + PERL_BITFIELD16 op_spare:1; \ U8 op_flags; \ U8 op_private; #endif @@ -1061,9 +1063,15 @@ Sets the sibling of o to sib #define OP_TYPE_ISNT_AND_WASNT(o, type) \ ( (o) && OP_TYPE_ISNT_AND_WASNT_NN(o, type) ) -#define OP_HAS_SIBLING(o) (cBOOL((o)->op_sibling)) -#define OP_SIBLING(o) (0 + (o)->op_sibling) -#define OP_SIBLING_set(o, sib) ((o)->op_sibling = (sib)) +#ifdef PERL_OP_PARENT +# define OP_HAS_SIBLING(o) (!cBOOL((o)->op_lastsib)) +# define OP_SIBLING(o) (0 + (o)->op_lastsib ? NULL : (o)->op_sibling) +# define OP_SIBLING_set(o, sib) ((o)->op_sibling = (sib)) +#else +# define OP_HAS_SIBLING(o) (cBOOL((o)->op_sibling)) +# define OP_SIBLING(o) (0 + (o)->op_sibling) +# define OP_SIBLING_set(o, sib) ((o)->op_sibling = (sib)) +#endif #define newATTRSUB(f, o, p, a, b) Perl_newATTRSUB_x(aTHX_ f, o, p, a, b, FALSE) #define newSUB(f, o, p, b) newATTRSUB((f), (o), (p), NULL, (b)) |