Commit 6e0ce50ded for perl
commit 6e0ce50dedd46ef6426e73d9e609b2c53427775d
Author: Yves Orton <demerphq@gmail.com>
Date: Tue Oct 27 21:38:07 2026 +0100
regcomp: name TRIE literal type field
Use TRIE_LITERAL_TYPE for the literal opcode stored in trie and
Aho–Corasick nodes. Compilation, debugging, and execution now identify
the field directly while preserving the existing trie encoding and
matching behavior.
diff --git a/regcomp.h b/regcomp.h
index 3d070a0d92..fac66c7fbc 100644
--- a/regcomp.h
+++ b/regcomp.h
@@ -698,6 +698,14 @@ struct regnode_ssc {
FLAGS(p) = (val); \
} STMT_END
+#define TRIE_LITERAL_TYPE(p) \
+ (assert(REGNODE_TYPE(OP(p)) == TRIE || OP(p) == AHOCORASICK), \
+ PREVENT_LVALUE(FLAGS(p)))
+#define TRIE_LITERAL_TYPE_SET(p, val) STMT_START { \
+ assert(REGNODE_TYPE(OP(p)) == TRIE || OP(p) == AHOCORASICK); \
+ FLAGS(p) = (val); \
+} STMT_END
+
#define POSIX_CLASS(p) \
(assert(REGNODE_TYPE(OP(p)) == POSIXD || REGNODE_TYPE(OP(p)) == \
NPOSIXD), PREVENT_LVALUE(FLAGS(p)))
diff --git a/regcomp_debug.c b/regcomp_debug.c
index bd85eb8952..6a6f26dafc 100644
--- a/regcomp_debug.c
+++ b/regcomp_debug.c
@@ -601,7 +601,7 @@ Perl_regprop(pTHX_ const regexp *prog, SV *sv, const regnode *o, const regmatch_
const reg_trie_data * const trie
= (reg_trie_data*)progi->data->data[!IS_TRIE_AC(op) ? n : ac->trie];
- sv_catpvf(sv, "-%s", REGNODE_NAME(FLAGS(o)));
+ sv_catpvf(sv, "-%s", REGNODE_NAME(TRIE_LITERAL_TYPE(o)));
DEBUG_TRIE_COMPILE_r({
if (trie->jump)
sv_catpvs(sv, "(JUMP)");
diff --git a/regcomp_trie.c b/regcomp_trie.c
index dd5efcc391..7670902c93 100644
--- a/regcomp_trie.c
+++ b/regcomp_trie.c
@@ -1680,7 +1680,7 @@ Perl_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch,
}
/* store the type in the flags */
- FLAGS(convert) = nodetype;
+ TRIE_LITERAL_TYPE_SET(convert, nodetype);
DEBUG_r({
optimize = convert
+ NODE_STEP_REGNODE
@@ -1957,7 +1957,7 @@ Perl_construct_ahocorasick_from_trie(pTHX_ RExC_state_t *pRExC_state, regnode *s
tregnode_AHOCORASICK *op = (tregnode_AHOCORASICK *)
PerlMemShared_calloc(1, sizeof(tregnode_AHOCORASICK));
OP(op) = AHOCORASICK;
- FLAGS(op) = FLAGS(source);
+ TRIE_LITERAL_TYPE_SET(op, TRIE_LITERAL_TYPE(source));
stclass = (regnode *)op;
}
diff --git a/regexec.c b/regexec.c
index 172a4971ae..981776ad3b 100644
--- a/regexec.c
+++ b/regexec.c
@@ -1888,15 +1888,16 @@ Perl_re_intuit_start(pTHX_
trie_latin_utf8_fold, trie_utf8_exactfa_fold, \
trie_latin_utf8_exactfa_fold, \
trie_flu8, trie_flu8_latin } \
- trie_type = ((IS_EXACT_OR_NF(FLAGS(scan)) \
- || IS_EXACT_REQ8_OR_NF_REQ8(FLAGS(scan)) \
- || FLAGS(scan) == EXACTL) \
+ trie_type = ((IS_EXACT_OR_NF(TRIE_LITERAL_TYPE(scan)) \
+ || IS_EXACT_REQ8_OR_NF_REQ8( \
+ TRIE_LITERAL_TYPE(scan)) \
+ || TRIE_LITERAL_TYPE(scan) == EXACTL) \
? trie_plain \
- : (FLAGS(scan) == EXACTFAA) \
+ : (TRIE_LITERAL_TYPE(scan) == EXACTFAA) \
? (utf8_target \
? trie_utf8_exactfa_fold \
: trie_latin_utf8_exactfa_fold) \
- : (FLAGS(scan) == EXACTFLU8 \
+ : (TRIE_LITERAL_TYPE(scan) == EXACTFLU8 \
? (utf8_target \
? trie_flu8 \
: trie_flu8_latin) \
@@ -7436,12 +7437,14 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
U32 state = trie->startstate;
- if (FLAGS(scan) == EXACTL || FLAGS(scan) == EXACTFLU8) {
+ if ( TRIE_LITERAL_TYPE(scan) == EXACTL
+ || TRIE_LITERAL_TYPE(scan) == EXACTFLU8)
+ {
CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
if (utf8_target
&& ! NEXTCHR_IS_EOS
&& UTF8_IS_ABOVE_LATIN1(nextbyte)
- && FLAGS(scan) == EXACTL)
+ && TRIE_LITERAL_TYPE(scan) == EXACTL)
{
/* We only output for EXACTL, as we let the folder
* output this message for EXACTFLU8 to avoid