Commit 7277e3c018 for perl
commit 7277e3c018c129aa1a14544938c365810aa5c58c
Author: Yves Orton <demerphq@gmail.com>
Date: Tue Oct 27 21:37:53 2026 +0100
regcomp: name POSIX class field
Use POSIX_CLASS for the class number stored in POSIX nodes. Compilation,
debugging, study, and execution now name the field directly instead of
reading or writing FLAGS, with no change to matching behavior.
diff --git a/regcomp.c b/regcomp.c
index 95b708c4bf..e677d0802b 100644
--- a/regcomp.c
+++ b/regcomp.c
@@ -2410,7 +2410,7 @@ Perl_re_op_compile(pTHX_ SV ** const patternp, int pat_count,
* See rt #122761 for more details. -- Yves */
RExC_rx->extflags |= RXf_START_ONLY;
else if (fop == PLUS
- && REGNODE_TYPE(nop) == POSIXD && FLAGS(next) == CC_SPACE_
+ && REGNODE_TYPE(nop) == POSIXD && POSIX_CLASS(next) == CC_SPACE_
&& OP(regnext(first)) == END)
RExC_rx->extflags |= RXf_WHITE;
else if ( RExC_rx->extflags & RXf_SPLIT
@@ -11778,7 +11778,7 @@ S_optimize_regclass(pTHX_
op = POSIXL + *invert * (NPOSIXL - POSIXL);
*ret = reg_node(pRExC_state, op);
- FLAGS(REGNODE_p(*ret)) = classnum;
+ POSIX_CLASS_SET(REGNODE_p(*ret), classnum);
return op;
}
}
@@ -12396,7 +12396,7 @@ S_optimize_regclass(pTHX_
? type + NPOSIXA - POSIXA
: type;
*ret = reg_node(pRExC_state, op);
- FLAGS(REGNODE_p(*ret)) = posix_class;
+ POSIX_CLASS_SET(REGNODE_p(*ret), posix_class);
SvREFCNT_dec(d_invlist);
SvREFCNT_dec(intersection);
return op;
diff --git a/regcomp.h b/regcomp.h
index 3358f293ac..841b927261 100644
--- a/regcomp.h
+++ b/regcomp.h
@@ -698,6 +698,14 @@ struct regnode_ssc {
FLAGS(p) = (val); \
} STMT_END
+#define POSIX_CLASS(p) \
+ (assert(REGNODE_TYPE(OP(p)) == POSIXD || REGNODE_TYPE(OP(p)) == \
+ NPOSIXD), PREVENT_LVALUE(FLAGS(p)))
+#define POSIX_CLASS_SET(p, val) STMT_START { \
+ assert(REGNODE_TYPE(OP(p)) == POSIXD || REGNODE_TYPE(OP(p)) == NPOSIXD); \
+ FLAGS(p) = (val); \
+} STMT_END
+
#define ANYOFM_MASK(p) \
(assert(OP(p) == ANYOFM || OP(p) == NANYOFM), PREVENT_LVALUE(FLAGS(p)))
#define ANYOFM_MASK_SET(p, val) STMT_START { \
diff --git a/regcomp_debug.c b/regcomp_debug.c
index 04db7354c3..02a16b6562 100644
--- a/regcomp_debug.c
+++ b/regcomp_debug.c
@@ -1026,7 +1026,7 @@ Perl_regprop(pTHX_ const regexp *prog, SV *sv, const regnode *o, const regmatch_
SvREFCNT_dec(cp_list);
}
else if (k == POSIXD || k == NPOSIXD) {
- U8 index = FLAGS(o) * 2;
+ U8 index = POSIX_CLASS(o) * 2;
if (index < C_ARRAY_LENGTH(anyofs)) {
if (*anyofs[index] != '[') {
sv_catpvs(sv, "[");
diff --git a/regcomp_study.c b/regcomp_study.c
index 5a2906ac80..81718268e8 100644
--- a/regcomp_study.c
+++ b/regcomp_study.c
@@ -3173,7 +3173,7 @@ Perl_study_chunk(pTHX_
/* FALLTHROUGH */
case POSIXL:
- namedclass = classnum_to_namedclass(FLAGS(scan)) + invert;
+ namedclass = classnum_to_namedclass(POSIX_CLASS(scan)) + invert;
if (flags & SCF_DO_STCLASS_AND) {
bool was_there = cBOOL(
ANYOF_POSIXL_TEST(data->start_class,
@@ -3213,7 +3213,7 @@ Perl_study_chunk(pTHX_
invert = 1;
/* FALLTHROUGH */
case POSIXA:
- my_invlist = invlist_clone(PL_Posix_ptrs[FLAGS(scan)], NULL);
+ my_invlist = invlist_clone(PL_Posix_ptrs[POSIX_CLASS(scan)], NULL);
goto join_posix_and_ascii;
case NPOSIXD:
@@ -3222,7 +3222,7 @@ Perl_study_chunk(pTHX_
/* FALLTHROUGH */
case POSIXD:
case POSIXU:
- my_invlist = invlist_clone(PL_XPosix_ptrs[FLAGS(scan)], NULL);
+ my_invlist = invlist_clone(PL_XPosix_ptrs[POSIX_CLASS(scan)], NULL);
/* NPOSIXD matches all upper Latin1 code points unless the
* target string being matched is UTF-8, which is
diff --git a/regexec.c b/regexec.c
index 811efeadbf..fece09296e 100644
--- a/regexec.c
+++ b/regexec.c
@@ -3436,7 +3436,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
case POSIXL_t8_p8:
CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
REXEC_FBC_UTF8_CLASS_SCAN(
- to_complement ^ cBOOL(isFOO_utf8_lc(FLAGS(c), (U8 *) s,
+ to_complement ^ cBOOL(isFOO_utf8_lc(POSIX_CLASS(c), (U8 *) s,
(U8 *) strend)));
break;
@@ -3449,7 +3449,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
case POSIXL_tb_p8:
CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
REXEC_FBC_NON_UTF8_CLASS_SCAN(
- to_complement ^ cBOOL(isFOO_lc(FLAGS(c), *s)));
+ to_complement ^ cBOOL(isFOO_lc(POSIX_CLASS(c), *s)));
break;
case NPOSIXA_t8_pb:
@@ -3457,7 +3457,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
/* The complement of something that matches only ASCII matches all
* non-ASCII, plus everything in ASCII that isn't in the class. */
REXEC_FBC_UTF8_CLASS_SCAN( ! isASCII_utf8_safe(s, strend)
- || ! generic_isCC_A_(*s, FLAGS(c)));
+ || ! generic_isCC_A_(*s, POSIX_CLASS(c)));
break;
case POSIXA_t8_pb:
@@ -3466,7 +3466,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
* byte invariant character. But we do anyway for performance reasons,
* as otherwise we would have to examine all the continuation
* characters */
- REXEC_FBC_UTF8_CLASS_SCAN(generic_isCC_A_(*s, FLAGS(c)));
+ REXEC_FBC_UTF8_CLASS_SCAN(generic_isCC_A_(*s, POSIX_CLASS(c)));
break;
case NPOSIXD_tb_pb:
@@ -3481,7 +3481,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
case POSIXA_tb_pb:
case POSIXA_tb_p8:
REXEC_FBC_NON_UTF8_CLASS_SCAN(
- to_complement ^ cBOOL(generic_isCC_A_(*s, FLAGS(c))));
+ to_complement ^ cBOOL(generic_isCC_A_(*s, POSIX_CLASS(c))));
break;
case NPOSIXU_tb_pb:
@@ -3493,7 +3493,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
case POSIXU_tb_p8:
REXEC_FBC_NON_UTF8_CLASS_SCAN(
to_complement ^ cBOOL(generic_isCC_(*s,
- FLAGS(c))));
+ POSIX_CLASS(c))));
break;
case NPOSIXD_t8_pb:
@@ -3507,7 +3507,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
case POSIXD_t8_p8:
case POSIXU_t8_pb:
case POSIXU_t8_p8:
- classnum = (char_class_number_) FLAGS(c);
+ classnum = (char_class_number_) POSIX_CLASS(c);
switch (classnum) {
default:
REXEC_FBC_UTF8_CLASS_SCAN(
@@ -8519,7 +8519,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
* UTF8_IS_INVARIANT works even on non-UTF-8 strings, or else
* wouldn't be invariant) */
if (UTF8_IS_INVARIANT(nextbyte) || ! utf8_target) {
- if (! (to_complement ^ cBOOL(isFOO_lc(FLAGS(scan), (U8) nextbyte)))) {
+ if (! (to_complement ^ cBOOL(isFOO_lc(POSIX_CLASS(scan), (U8) nextbyte)))) {
sayNO;
}
@@ -8536,7 +8536,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
/* Here is a UTF-8 variant code point below 256 and the target is
* UTF-8 */
- if (! (to_complement ^ cBOOL(isFOO_lc(FLAGS(scan),
+ if (! (to_complement ^ cBOOL(isFOO_lc(POSIX_CLASS(scan),
EIGHT_BIT_UTF8_TO_NATIVE(nextbyte,
*(locinput + 1))))))
{
@@ -8583,7 +8583,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
join_nposixa:
if (! (to_complement ^ cBOOL(generic_isCC_A_(nextbyte,
- FLAGS(scan)))))
+ POSIX_CLASS(scan)))))
{
sayNO;
}
@@ -8608,7 +8608,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
* wouldn't be invariant) */
if (UTF8_IS_INVARIANT(nextbyte) || ! utf8_target) {
if (! (to_complement ^ cBOOL(generic_isCC_(nextbyte,
- FLAGS(scan)))))
+ POSIX_CLASS(scan)))))
{
sayNO;
}
@@ -8618,7 +8618,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
if (! (to_complement
^ cBOOL(generic_isCC_(EIGHT_BIT_UTF8_TO_NATIVE(nextbyte,
*(locinput + 1)),
- FLAGS(scan)))))
+ POSIX_CLASS(scan)))))
{
sayNO;
}
@@ -8626,7 +8626,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
}
else { /* Handle above Latin-1 code points */
utf8_posix_above_latin1:
- classnum = (char_class_number_) FLAGS(scan);
+ classnum = (char_class_number_) POSIX_CLASS(scan);
switch (classnum) {
default:
if (! (to_complement
@@ -11578,7 +11578,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
case POSIXL_tb:
CHECK_AND_WARN_PROBLEMATIC_LOCALE_;
while ( scan < this_eol
- && to_complement ^ cBOOL(isFOO_lc(FLAGS(p), *scan)))
+ && to_complement ^ cBOOL(isFOO_lc(POSIX_CLASS(p), *scan)))
{
scan++;
}
@@ -11590,7 +11590,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
case POSIXL_t8:
while ( hardcount < max && scan < this_eol
- && to_complement ^ cBOOL(isFOO_utf8_lc(FLAGS(p),
+ && to_complement ^ cBOOL(isFOO_utf8_lc(POSIX_CLASS(p),
(U8 *) scan,
(U8 *) this_eol)))
{
@@ -11613,7 +11613,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
/* FALLTHROUGH */
case POSIXA_tb:
- while (scan < this_eol && generic_isCC_A_((U8) *scan, FLAGS(p))) {
+ while (scan < this_eol && generic_isCC_A_((U8) *scan, POSIX_CLASS(p))) {
scan++;
}
break;
@@ -11622,7 +11622,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
/* FALLTHROUGH */
case NPOSIXA_tb:
- while (scan < this_eol && ! generic_isCC_A_((U8) *scan, FLAGS(p))) {
+ while (scan < this_eol && ! generic_isCC_A_((U8) *scan, POSIX_CLASS(p))) {
scan++;
}
break;
@@ -11633,7 +11633,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
* non-ASCII, plus everything in ASCII that isn't in the class. */
while ( hardcount < max && scan < this_eol
&& ( ! isASCII_utf8_safe(scan, loceol)
- || ! generic_isCC_A_((U8) *scan, FLAGS(p))))
+ || ! generic_isCC_A_((U8) *scan, POSIX_CLASS(p))))
{
scan += UTF8SKIP(scan);
hardcount++;
@@ -11646,7 +11646,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
case POSIXU_tb:
while ( scan < this_eol
- && to_complement ^ cBOOL(generic_isCC_((U8) *scan, FLAGS(p))))
+ && to_complement ^ cBOOL(generic_isCC_((U8) *scan, POSIX_CLASS(p))))
{
scan++;
}
@@ -11659,7 +11659,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
case POSIXD_t8:
case POSIXU_t8:
- classnum = (char_class_number_) FLAGS(p);
+ classnum = (char_class_number_) POSIX_CLASS(p);
switch (classnum) {
default:
while ( hardcount < max && scan < this_eol