summaryrefslogtreecommitdiff
path: root/regcomp.h
diff options
context:
space:
mode:
authorKarl Williamson <khw@cpan.org>2019-09-28 11:58:59 -0600
committerKarl Williamson <khw@cpan.org>2019-09-29 11:46:26 -0600
commit5cd61b66283b55e639490151d4e730a840ab13d5 (patch)
treedd4f8ed1815291c2af682668c32c66d504a5af7d /regcomp.h
parent3363c7035ff1df0c3ffeae0cd18bb86cc39d62e4 (diff)
downloadperl-5cd61b66283b55e639490151d4e730a840ab13d5.tar.gz
regex: Add LEXACT_ONLY8 node type
This is like LEXACT, but it is known that only strings encoded in UTF-8 will match it, so don't even have to try if that condition isn't met.
Diffstat (limited to 'regcomp.h')
-rw-r--r--regcomp.h20
1 files changed, 13 insertions, 7 deletions
diff --git a/regcomp.h b/regcomp.h
index 43cf1d345a..520e60e399 100644
--- a/regcomp.h
+++ b/regcomp.h
@@ -338,8 +338,10 @@ struct regnode_ssc {
#define FLAGS(p) ((p)->flags) /* Caution: Doesn't apply to all \
regnode types. For some, it's the \
character set of the regnode */
-#define STR_LENs(p) (__ASSERT_(OP(p) != LEXACT) ((struct regnode_string *)p)->str_len)
-#define STRINGs(p) (__ASSERT_(OP(p) != LEXACT) ((struct regnode_string *)p)->string)
+#define STR_LENs(p) (__ASSERT_(OP(p) != LEXACT && OP(p) != LEXACT_ONLY8) \
+ ((struct regnode_string *)p)->str_len)
+#define STRINGs(p) (__ASSERT_(OP(p) != LEXACT && OP(p) != LEXACT_ONLY8) \
+ ((struct regnode_string *)p)->string)
#define OPERANDs(p) STRINGs(p)
/* Long strings. Currently limited to length 18 bits, which handles a 262000
@@ -354,12 +356,16 @@ struct regnode_ssc {
* node to be an ARG2L, using the second 32 bit field for the length, and not
* using the flags nor next_off fields at all. One could have an llstring node
* and even an lllstring type. */
-#define STR_LENl(p) (__ASSERT_(OP(p) == LEXACT) (((struct regnode_lstring *)p)->str_len))
-#define STRINGl(p) (__ASSERT_(OP(p) == LEXACT) (((struct regnode_lstring *)p)->string))
+#define STR_LENl(p) (__ASSERT_(OP(p) == LEXACT || OP(p) == LEXACT_ONLY8) \
+ (((struct regnode_lstring *)p)->str_len))
+#define STRINGl(p) (__ASSERT_(OP(p) == LEXACT || OP(p) == LEXACT_ONLY8) \
+ (((struct regnode_lstring *)p)->string))
#define OPERANDl(p) STRINGl(p)
-#define STR_LEN(p) ((OP(p) == LEXACT) ? STR_LENl(p) : STR_LENs(p))
-#define STRING(p) ((OP(p) == LEXACT) ? STRINGl(p) : STRINGs(p))
+#define STR_LEN(p) ((OP(p) == LEXACT || OP(p) == LEXACT_ONLY8) \
+ ? STR_LENl(p) : STR_LENs(p))
+#define STRING(p) ((OP(p) == LEXACT || OP(p) == LEXACT_ONLY8) \
+ ? STRINGl(p) : STRINGs(p))
#define OPERAND(p) STRING(p)
/* The number of (smallest) regnode equivalents that a string of length l bytes
@@ -372,7 +378,7 @@ struct regnode_ssc {
#define setSTR_LEN(p,v) \
STMT_START{ \
- if (OP(p) == LEXACT) \
+ if (OP(p) == LEXACT || OP(p) == LEXACT_ONLY8) \
((struct regnode_lstring *)(p))->str_len = (v); \
else \
((struct regnode_string *)(p))->str_len = (v); \