This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
ext/mro: use memEQs() for constant string checks
[perl5.git] / regexp.h
index ff44df2..7351afd 100644 (file)
--- a/regexp.h
+++ b/regexp.h
@@ -102,6 +102,7 @@ struct reg_code_block {
        const struct regexp_engine* engine;                             \
        REGEXP *mother_re; /* what re is this a lightweight copy of? */ \
        HV *paren_names;   /* Optional hash of paren names */           \
+        /*--------------------------------------------------------*/    \
        /* Information about the match that the perl core uses to */    \
        /* manage things */                                             \
        U32 extflags;   /* Flags used both externally and internally */ \
@@ -116,12 +117,15 @@ struct reg_code_block {
        U32 intflags;   /* Engine Specific Internal flags */            \
        void *pprivate; /* Data private to the regex engine which */    \
                        /* created this object. */                      \
+        /*--------------------------------------------------------*/    \
        /* Data about the last/current match. These are modified */     \
        /* during matching */                                           \
        U32 lastparen;                  /* last open paren matched */   \
        U32 lastcloseparen;             /* last close paren matched */  \
        /* Array of offsets for (@-) and (@+) */                        \
        regexp_paren_pair *offs;                                        \
+        char **recurse_locinput; /* used to detect infinite recursion, XXX: move to internal */ \
+        /*--------------------------------------------------------*/    \
        /* saved or original string so \digit works forever. */         \
        char *subbeg;                                                   \
        SV_SAVED_COPY   /* If non-NULL, SV which is COW from original */\
@@ -130,11 +134,13 @@ struct reg_code_block {
        SSize_t subcoffset; /* suboffset equiv, but in chars (for @-/@+) */ \
        /* Information about the match that isn't often used */         \
         SSize_t maxlen;        /* mininum possible number of chars in string to match */\
+        /*--------------------------------------------------------*/    \
        /* offset from wrapped to the start of precomp */               \
        PERL_BITFIELD32 pre_prefix:4;                                   \
         /* original flags used to compile the pattern, may differ */    \
         /* from extflags in various ways */                             \
         PERL_BITFIELD32 compflags:9;                                    \
+        /*--------------------------------------------------------*/    \
        CV *qr_anoncv   /* the anon sub wrapped round qr/(?{..})/ */
 
 typedef struct regexp {
@@ -281,13 +287,6 @@ and check for NULL.
     case XTENDED_PAT_MOD:   *(pmfl) |= RXf_PMf_EXTENDED; (x_count)++; break;\
     case NOCAPTURE_PAT_MOD: *(pmfl) |= RXf_PMf_NOCAPTURE; break;
 
-#define STD_PMMOD_FLAGS_PARSE_X_WARN(x_count)                                   \
-    if (UNLIKELY((x_count) > 1)) {                                              \
-        Perl_ck_warner_d(aTHX_ packWARN2(WARN_DEPRECATED, WARN_REGEXP),         \
-                    "Having more than one /%c regexp modifier is deprecated",   \
-                    XTENDED_PAT_MOD);                                           \
-    }
-
 /* Note, includes charset ones, assumes 0 is the default for them */
 #define STD_PMMOD_FLAGS_CLEAR(pmfl)                        \
     *(pmfl) &= ~(RXf_PMf_FOLD|RXf_PMf_MULTILINE|RXf_PMf_SINGLELINE|RXf_PMf_EXTENDED|RXf_PMf_CHARSET|RXf_PMf_NOCAPTURE)
@@ -352,9 +351,8 @@ and check for NULL.
  */
 
 /*
-  Set in Perl_pmruntime if op_flags & OPf_SPECIAL, i.e. split. Will
-  be used by regex engines to check whether they should set
-  RXf_SKIPWHITE
+  Set in Perl_pmruntime for a split. Will be used by regex engines to
+  check whether they should set RXf_SKIPWHITE
 */
 #define RXf_SPLIT   RXf_PMf_SPLIT
 
@@ -657,7 +655,7 @@ typedef struct {
 /* structures for holding and saving the state maintained by regmatch() */
 
 #ifndef MAX_RECURSE_EVAL_NOCHANGE_DEPTH
-#define MAX_RECURSE_EVAL_NOCHANGE_DEPTH 1000
+#define MAX_RECURSE_EVAL_NOCHANGE_DEPTH 10
 #endif
 
 typedef I32 CHECKPOINT;
@@ -742,13 +740,14 @@ typedef struct regmatch_state {
        struct {
            /* this first element must match u.yes */
            struct regmatch_state *prev_yes_state;
-           struct regmatch_state *prev_eval;
            struct regmatch_state *prev_curlyx;
+            struct regmatch_state *prev_eval;
            REGEXP      *prev_rex;
            CHECKPOINT  cp;     /* remember current savestack indexes */
            CHECKPOINT  lastcp;
             U32         close_paren; /* which close bracket is our end (+1) */
            regnode     *B;     /* the node following us  */
+            char        *prev_recurse_locinput;
        } eval;
 
        struct {
@@ -833,12 +832,7 @@ typedef struct regmatch_state {
     } u;
 } regmatch_state;
 
-#define EVAL_CLOSE_PAREN_IS(cur_eval,expr) \
-(\
-    ( ( cur_eval )                                         ) && \
-    ( ( cur_eval )->u.eval.close_paren                     ) && \
-    ( ( ( cur_eval )->u.eval.close_paren - 1 ) == ( expr ) ) \
-)
+
 
 /* how many regmatch_state structs to allocate as a single slab.
  * We do it in 4K blocks for efficiency. The "3" is 2 for the next/prev