diff options
author | Yves Orton <demerphq@gmail.com> | 2023-01-15 13:00:46 +0100 |
---|---|---|
committer | Yves Orton <demerphq@gmail.com> | 2023-03-13 21:26:08 +0800 |
commit | 17e3e02ad120eabda2bdb6c297a70d53294437ef (patch) | |
tree | 6fc99228c2a34c7ee5ec892de4c1f1a980e2f240 /proto.h | |
parent | 59db194299c94c6707095797c3df0e2f67ff82b2 (diff) | |
download | perl-17e3e02ad120eabda2bdb6c297a70d53294437ef.tar.gz |
regex engine - simplify regnode structures and make them consistent
This eliminates the regnode_2L data structure, and merges it with the older
regnode_2 data structure. At the same time it makes each "arg" property of the
various regnode types that have one be consistently structured as an anonymous
union like this:
union {
U32 arg1u;
I32 arg2i;
struct {
U16 arg1a;
U16 arg1b;
};
};
We then expose four macros for accessing each slot: ARG1u() ARG1i() and
ARG1a() and ARG1b(). Code then explicitly designates which they want. The old
logic used ARG() to access an U32 arg1, and ARG1() to access an I32 arg1,
which was confusing to say the least. The regnode_2L structure had a U32 arg1,
and I32 arg2, and the regnode_2 data strucutre had two I32 args. With the new
set of macros we use the regnode_2 for both, and use the appropriate macros to
show whether we want to signed or unsigned values.
This also renames the regnode_4 to regnode_3. The 3 stands for "three 32-bit
args". However as each slot can also store two U16s, a regnode_3 can hold up
to 6 U16s, or as 3 I32's, or a combination. For instance the CURLY style nodes
use regnode_3 to store 4 values, ARG1i() for min count, ARG2i() for max count
and ARG3a() and ARG3b() for parens before and inside the quantifier.
It also changes the functions reganode() to reg1node() and changes reg2Lanode()
to reg2node(). The 2L thing was just confusing.
Diffstat (limited to 'proto.h')
-rw-r--r-- | proto.h | 14 |
1 files changed, 7 insertions, 7 deletions
@@ -8382,8 +8382,13 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth); assert(pRExC_state); assert(flagp) STATIC regnode_offset -S_reg2Lanode(pTHX_ RExC_state_t *pRExC_state, const U8 op, const U32 arg1, const I32 arg2); -# define PERL_ARGS_ASSERT_REG2LANODE \ +S_reg1node(pTHX_ RExC_state_t *pRExC_state, U8 op, U32 arg); +# define PERL_ARGS_ASSERT_REG1NODE \ + assert(pRExC_state) + +STATIC regnode_offset +S_reg2node(pTHX_ RExC_state_t *pRExC_state, const U8 op, const U32 arg1, const I32 arg2); +# define PERL_ARGS_ASSERT_REG2NODE \ assert(pRExC_state) STATIC regnode_offset @@ -8407,11 +8412,6 @@ S_reg_scan_name(pTHX_ RExC_state_t *pRExC_state, U32 flags); assert(pRExC_state) STATIC regnode_offset -S_reganode(pTHX_ RExC_state_t *pRExC_state, U8 op, U32 arg); -# define PERL_ARGS_ASSERT_REGANODE \ - assert(pRExC_state) - -STATIC regnode_offset S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth); # define PERL_ARGS_ASSERT_REGATOM \ assert(pRExC_state); assert(flagp) |