This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix Windows build following commit 184f90dc41
[perl5.git] / regnodes.h
index cc3da9d..8fe0f41 100644 (file)
@@ -6,8 +6,8 @@
 
 /* Regops and State definitions */
 
-#define REGNODE_MAX            93
-#define REGMATCH_STATE_MAX     133
+#define REGNODE_MAX            92
+#define REGMATCH_STATE_MAX     134
 
 #define        END                     0       /* 0000 End of program. */
 #define        SUCCEED                 1       /* 0x01 Return from a subroutine, basically. */
 #define        AHOCORASICK             74      /* 0x4a Aho Corasick stclass. flags==type */
 #define        AHOCORASICKC            75      /* 0x4b Same as AHOCORASICK, but with embedded charclass data */
 #define        GOSUB                   76      /* 0x4c recurse to paren arg1 at (signed) ofs arg2 */
-#define        GOSTART                 77      /* 0x4d recurse to start of pattern */
-#define        NGROUPP                 78      /* 0x4e Whether the group matched. */
-#define        INSUBP                  79      /* 0x4f Whether we are in a specific recurse. */
-#define        DEFINEP                 80      /* 0x50 Never execute directly. */
-#define        ENDLIKE                 81      /* 0x51 Used only for the type field of verbs */
-#define        OPFAIL                  82      /* 0x52 Same as (?!) */
-#define        ACCEPT                  83      /* 0x53 Accepts the current matched string. */
-#define        VERB                    84      /* 0x54 Used only for the type field of verbs */
-#define        PRUNE                   85      /* 0x55 Pattern fails at this startpoint if no-backtracking through this */
-#define        MARKPOINT               86      /* 0x56 Push the current location for rollback by cut. */
-#define        SKIP                    87      /* 0x57 On failure skip forward (to the mark) before retrying */
-#define        COMMIT                  88      /* 0x58 Pattern fails outright if backtracking through this */
-#define        CUTGROUP                89      /* 0x59 On failure go to the next alternation in the group */
-#define        KEEPS                   90      /* 0x5a $& begins here. */
-#define        LNBREAK                 91      /* 0x5b generic newline pattern */
-#define        OPTIMIZED               92      /* 0x5c Placeholder for dump. */
-#define        PSEUDO                  93      /* 0x5d Pseudo opcode for internal use. */
+#define        NGROUPP                 77      /* 0x4d Whether the group matched. */
+#define        INSUBP                  78      /* 0x4e Whether we are in a specific recurse. */
+#define        DEFINEP                 79      /* 0x4f Never execute directly. */
+#define        ENDLIKE                 80      /* 0x50 Used only for the type field of verbs */
+#define        OPFAIL                  81      /* 0x51 Same as (?!), but with verb arg */
+#define        ACCEPT                  82      /* 0x52 Accepts the current matched string, with verbar */
+#define        VERB                    83      /* 0x53 Used only for the type field of verbs */
+#define        PRUNE                   84      /* 0x54 Pattern fails at this startpoint if no-backtracking through this */
+#define        MARKPOINT               85      /* 0x55 Push the current location for rollback by cut. */
+#define        SKIP                    86      /* 0x56 On failure skip forward (to the mark) before retrying */
+#define        COMMIT                  87      /* 0x57 Pattern fails outright if backtracking through this */
+#define        CUTGROUP                88      /* 0x58 On failure go to the next alternation in the group */
+#define        KEEPS                   89      /* 0x59 $& begins here. */
+#define        LNBREAK                 90      /* 0x5a generic newline pattern */
+#define        OPTIMIZED               91      /* 0x5b Placeholder for dump. */
+#define        PSEUDO                  92      /* 0x5c Pseudo opcode for internal use. */
        /* ------------ States ------------- */
 #define        TRIE_next               (REGNODE_MAX + 1)       /* state for TRIE */
 #define        TRIE_next_fail          (REGNODE_MAX + 2)       /* state for TRIE */
-#define        EVAL_AB                 (REGNODE_MAX + 3)       /* state for EVAL */
-#define        EVAL_AB_fail            (REGNODE_MAX + 4)       /* state for EVAL */
-#define        CURLYX_end              (REGNODE_MAX + 5)       /* state for CURLYX */
-#define        CURLYX_end_fail         (REGNODE_MAX + 6)       /* state for CURLYX */
-#define        WHILEM_A_pre            (REGNODE_MAX + 7)       /* state for WHILEM */
-#define        WHILEM_A_pre_fail       (REGNODE_MAX + 8)       /* state for WHILEM */
-#define        WHILEM_A_min            (REGNODE_MAX + 9)       /* state for WHILEM */
-#define        WHILEM_A_min_fail       (REGNODE_MAX + 10)      /* state for WHILEM */
-#define        WHILEM_A_max            (REGNODE_MAX + 11)      /* state for WHILEM */
-#define        WHILEM_A_max_fail       (REGNODE_MAX + 12)      /* state for WHILEM */
-#define        WHILEM_B_min            (REGNODE_MAX + 13)      /* state for WHILEM */
-#define        WHILEM_B_min_fail       (REGNODE_MAX + 14)      /* state for WHILEM */
-#define        WHILEM_B_max            (REGNODE_MAX + 15)      /* state for WHILEM */
-#define        WHILEM_B_max_fail       (REGNODE_MAX + 16)      /* state for WHILEM */
-#define        BRANCH_next             (REGNODE_MAX + 17)      /* state for BRANCH */
-#define        BRANCH_next_fail        (REGNODE_MAX + 18)      /* state for BRANCH */
-#define        CURLYM_A                (REGNODE_MAX + 19)      /* state for CURLYM */
-#define        CURLYM_A_fail           (REGNODE_MAX + 20)      /* state for CURLYM */
-#define        CURLYM_B                (REGNODE_MAX + 21)      /* state for CURLYM */
-#define        CURLYM_B_fail           (REGNODE_MAX + 22)      /* state for CURLYM */
-#define        IFMATCH_A               (REGNODE_MAX + 23)      /* state for IFMATCH */
-#define        IFMATCH_A_fail          (REGNODE_MAX + 24)      /* state for IFMATCH */
-#define        CURLY_B_min_known       (REGNODE_MAX + 25)      /* state for CURLY */
-#define        CURLY_B_min_known_fail  (REGNODE_MAX + 26)      /* state for CURLY */
-#define        CURLY_B_min             (REGNODE_MAX + 27)      /* state for CURLY */
-#define        CURLY_B_min_fail        (REGNODE_MAX + 28)      /* state for CURLY */
-#define        CURLY_B_max             (REGNODE_MAX + 29)      /* state for CURLY */
-#define        CURLY_B_max_fail        (REGNODE_MAX + 30)      /* state for CURLY */
-#define        COMMIT_next             (REGNODE_MAX + 31)      /* state for COMMIT */
-#define        COMMIT_next_fail        (REGNODE_MAX + 32)      /* state for COMMIT */
-#define        MARKPOINT_next          (REGNODE_MAX + 33)      /* state for MARKPOINT */
-#define        MARKPOINT_next_fail     (REGNODE_MAX + 34)      /* state for MARKPOINT */
-#define        SKIP_next               (REGNODE_MAX + 35)      /* state for SKIP */
-#define        SKIP_next_fail          (REGNODE_MAX + 36)      /* state for SKIP */
-#define        CUTGROUP_next           (REGNODE_MAX + 37)      /* state for CUTGROUP */
-#define        CUTGROUP_next_fail      (REGNODE_MAX + 38)      /* state for CUTGROUP */
-#define        KEEPS_next              (REGNODE_MAX + 39)      /* state for KEEPS */
-#define        KEEPS_next_fail         (REGNODE_MAX + 40)      /* state for KEEPS */
+#define        EVAL_B                  (REGNODE_MAX + 3)       /* state for EVAL */
+#define        EVAL_B_fail             (REGNODE_MAX + 4)       /* state for EVAL */
+#define        EVAL_postponed_AB       (REGNODE_MAX + 5)       /* state for EVAL */
+#define        EVAL_postponed_AB_fail  (REGNODE_MAX + 6)       /* state for EVAL */
+#define        CURLYX_end              (REGNODE_MAX + 7)       /* state for CURLYX */
+#define        CURLYX_end_fail         (REGNODE_MAX + 8)       /* state for CURLYX */
+#define        WHILEM_A_pre            (REGNODE_MAX + 9)       /* state for WHILEM */
+#define        WHILEM_A_pre_fail       (REGNODE_MAX + 10)      /* state for WHILEM */
+#define        WHILEM_A_min            (REGNODE_MAX + 11)      /* state for WHILEM */
+#define        WHILEM_A_min_fail       (REGNODE_MAX + 12)      /* state for WHILEM */
+#define        WHILEM_A_max            (REGNODE_MAX + 13)      /* state for WHILEM */
+#define        WHILEM_A_max_fail       (REGNODE_MAX + 14)      /* state for WHILEM */
+#define        WHILEM_B_min            (REGNODE_MAX + 15)      /* state for WHILEM */
+#define        WHILEM_B_min_fail       (REGNODE_MAX + 16)      /* state for WHILEM */
+#define        WHILEM_B_max            (REGNODE_MAX + 17)      /* state for WHILEM */
+#define        WHILEM_B_max_fail       (REGNODE_MAX + 18)      /* state for WHILEM */
+#define        BRANCH_next             (REGNODE_MAX + 19)      /* state for BRANCH */
+#define        BRANCH_next_fail        (REGNODE_MAX + 20)      /* state for BRANCH */
+#define        CURLYM_A                (REGNODE_MAX + 21)      /* state for CURLYM */
+#define        CURLYM_A_fail           (REGNODE_MAX + 22)      /* state for CURLYM */
+#define        CURLYM_B                (REGNODE_MAX + 23)      /* state for CURLYM */
+#define        CURLYM_B_fail           (REGNODE_MAX + 24)      /* state for CURLYM */
+#define        IFMATCH_A               (REGNODE_MAX + 25)      /* state for IFMATCH */
+#define        IFMATCH_A_fail          (REGNODE_MAX + 26)      /* state for IFMATCH */
+#define        CURLY_B_min_known       (REGNODE_MAX + 27)      /* state for CURLY */
+#define        CURLY_B_min_known_fail  (REGNODE_MAX + 28)      /* state for CURLY */
+#define        CURLY_B_min             (REGNODE_MAX + 29)      /* state for CURLY */
+#define        CURLY_B_min_fail        (REGNODE_MAX + 30)      /* state for CURLY */
+#define        CURLY_B_max             (REGNODE_MAX + 31)      /* state for CURLY */
+#define        CURLY_B_max_fail        (REGNODE_MAX + 32)      /* state for CURLY */
+#define        COMMIT_next             (REGNODE_MAX + 33)      /* state for COMMIT */
+#define        COMMIT_next_fail        (REGNODE_MAX + 34)      /* state for COMMIT */
+#define        MARKPOINT_next          (REGNODE_MAX + 35)      /* state for MARKPOINT */
+#define        MARKPOINT_next_fail     (REGNODE_MAX + 36)      /* state for MARKPOINT */
+#define        SKIP_next               (REGNODE_MAX + 37)      /* state for SKIP */
+#define        SKIP_next_fail          (REGNODE_MAX + 38)      /* state for SKIP */
+#define        CUTGROUP_next           (REGNODE_MAX + 39)      /* state for CUTGROUP */
+#define        CUTGROUP_next_fail      (REGNODE_MAX + 40)      /* state for CUTGROUP */
+#define        KEEPS_next              (REGNODE_MAX + 41)      /* state for KEEPS */
+#define        KEEPS_next_fail         (REGNODE_MAX + 42)      /* state for KEEPS */
 
 /* PL_regkind[] What type of regop or state is this. */
 
@@ -230,7 +231,6 @@ EXTCONST U8 PL_regkind[] = {
        TRIE,           /* AHOCORASICK            */
        TRIE,           /* AHOCORASICKC           */
        GOSUB,          /* GOSUB                  */
-       GOSTART,        /* GOSTART                */
        NGROUPP,        /* NGROUPP                */
        INSUBP,         /* INSUBP                 */
        DEFINEP,        /* DEFINEP                */
@@ -250,8 +250,10 @@ EXTCONST U8 PL_regkind[] = {
        /* ------------ States ------------- */
        TRIE,           /* TRIE_next              */
        TRIE,           /* TRIE_next_fail         */
-       EVAL,           /* EVAL_AB                */
-       EVAL,           /* EVAL_AB_fail           */
+       EVAL,           /* EVAL_B                 */
+       EVAL,           /* EVAL_B_fail            */
+       EVAL,           /* EVAL_postponed_AB      */
+       EVAL,           /* EVAL_postponed_AB_fail */
        CURLYX,         /* CURLYX_end             */
        CURLYX,         /* CURLYX_end_fail        */
        WHILEM,         /* WHILEM_A_pre           */
@@ -291,9 +293,10 @@ EXTCONST U8 PL_regkind[] = {
 };
 #endif
 
+#ifdef REG_COMP_C
+
 /* regarglen[] - How large is the argument part of the node (in regnodes) */
 
-#ifdef REG_COMP_C
 static const U8 regarglen[] = {
        0,                                      /* END          */
        0,                                      /* SUCCEED      */
@@ -372,13 +375,12 @@ static const U8 regarglen[] = {
        EXTRA_SIZE(struct regnode_1),           /* AHOCORASICK  */
        EXTRA_SIZE(struct regnode_charclass),   /* AHOCORASICKC */
        EXTRA_SIZE(struct regnode_2L),          /* GOSUB        */
-       0,                                      /* GOSTART      */
        EXTRA_SIZE(struct regnode_1),           /* NGROUPP      */
        EXTRA_SIZE(struct regnode_1),           /* INSUBP       */
        EXTRA_SIZE(struct regnode_1),           /* DEFINEP      */
        0,                                      /* ENDLIKE      */
-       0,                                      /* OPFAIL       */
-       EXTRA_SIZE(struct regnode_1),           /* ACCEPT       */
+       EXTRA_SIZE(struct regnode_1),           /* OPFAIL       */
+       EXTRA_SIZE(struct regnode_2L),          /* ACCEPT       */
        EXTRA_SIZE(struct regnode_1),           /* VERB         */
        EXTRA_SIZE(struct regnode_1),           /* PRUNE        */
        EXTRA_SIZE(struct regnode_1),           /* MARKPOINT    */
@@ -471,7 +473,6 @@ static const char reg_off_by_arg[] = {
        0,      /* AHOCORASICK  */
        0,      /* AHOCORASICKC */
        0,      /* GOSUB        */
-       0,      /* GOSTART      */
        0,      /* NGROUPP      */
        0,      /* INSUBP       */
        0,      /* DEFINEP      */
@@ -492,6 +493,7 @@ static const char reg_off_by_arg[] = {
 
 #endif /* REG_COMP_C */
 
+
 /* reg_name[] - Opcode/state names in string form, for debugging */
 
 #ifndef DOINIT
@@ -575,64 +577,65 @@ EXTCONST char * const PL_reg_name[] = {
        "AHOCORASICK",                  /* 0x4a */
        "AHOCORASICKC",                 /* 0x4b */
        "GOSUB",                        /* 0x4c */
-       "GOSTART",                      /* 0x4d */
-       "NGROUPP",                      /* 0x4e */
-       "INSUBP",                       /* 0x4f */
-       "DEFINEP",                      /* 0x50 */
-       "ENDLIKE",                      /* 0x51 */
-       "OPFAIL",                       /* 0x52 */
-       "ACCEPT",                       /* 0x53 */
-       "VERB",                         /* 0x54 */
-       "PRUNE",                        /* 0x55 */
-       "MARKPOINT",                    /* 0x56 */
-       "SKIP",                         /* 0x57 */
-       "COMMIT",                       /* 0x58 */
-       "CUTGROUP",                     /* 0x59 */
-       "KEEPS",                        /* 0x5a */
-       "LNBREAK",                      /* 0x5b */
-       "OPTIMIZED",                    /* 0x5c */
-       "PSEUDO",                       /* 0x5d */
+       "NGROUPP",                      /* 0x4d */
+       "INSUBP",                       /* 0x4e */
+       "DEFINEP",                      /* 0x4f */
+       "ENDLIKE",                      /* 0x50 */
+       "OPFAIL",                       /* 0x51 */
+       "ACCEPT",                       /* 0x52 */
+       "VERB",                         /* 0x53 */
+       "PRUNE",                        /* 0x54 */
+       "MARKPOINT",                    /* 0x55 */
+       "SKIP",                         /* 0x56 */
+       "COMMIT",                       /* 0x57 */
+       "CUTGROUP",                     /* 0x58 */
+       "KEEPS",                        /* 0x59 */
+       "LNBREAK",                      /* 0x5a */
+       "OPTIMIZED",                    /* 0x5b */
+       "PSEUDO",                       /* 0x5c */
        /* ------------ States ------------- */
        "TRIE_next",                    /* REGNODE_MAX +0x01 */
        "TRIE_next_fail",               /* REGNODE_MAX +0x02 */
-       "EVAL_AB",                      /* REGNODE_MAX +0x03 */
-       "EVAL_AB_fail",                 /* REGNODE_MAX +0x04 */
-       "CURLYX_end",                   /* REGNODE_MAX +0x05 */
-       "CURLYX_end_fail",              /* REGNODE_MAX +0x06 */
-       "WHILEM_A_pre",                 /* REGNODE_MAX +0x07 */
-       "WHILEM_A_pre_fail",            /* REGNODE_MAX +0x08 */
-       "WHILEM_A_min",                 /* REGNODE_MAX +0x09 */
-       "WHILEM_A_min_fail",            /* REGNODE_MAX +0x0a */
-       "WHILEM_A_max",                 /* REGNODE_MAX +0x0b */
-       "WHILEM_A_max_fail",            /* REGNODE_MAX +0x0c */
-       "WHILEM_B_min",                 /* REGNODE_MAX +0x0d */
-       "WHILEM_B_min_fail",            /* REGNODE_MAX +0x0e */
-       "WHILEM_B_max",                 /* REGNODE_MAX +0x0f */
-       "WHILEM_B_max_fail",            /* REGNODE_MAX +0x10 */
-       "BRANCH_next",                  /* REGNODE_MAX +0x11 */
-       "BRANCH_next_fail",             /* REGNODE_MAX +0x12 */
-       "CURLYM_A",                     /* REGNODE_MAX +0x13 */
-       "CURLYM_A_fail",                /* REGNODE_MAX +0x14 */
-       "CURLYM_B",                     /* REGNODE_MAX +0x15 */
-       "CURLYM_B_fail",                /* REGNODE_MAX +0x16 */
-       "IFMATCH_A",                    /* REGNODE_MAX +0x17 */
-       "IFMATCH_A_fail",               /* REGNODE_MAX +0x18 */
-       "CURLY_B_min_known",            /* REGNODE_MAX +0x19 */
-       "CURLY_B_min_known_fail",       /* REGNODE_MAX +0x1a */
-       "CURLY_B_min",                  /* REGNODE_MAX +0x1b */
-       "CURLY_B_min_fail",             /* REGNODE_MAX +0x1c */
-       "CURLY_B_max",                  /* REGNODE_MAX +0x1d */
-       "CURLY_B_max_fail",             /* REGNODE_MAX +0x1e */
-       "COMMIT_next",                  /* REGNODE_MAX +0x1f */
-       "COMMIT_next_fail",             /* REGNODE_MAX +0x20 */
-       "MARKPOINT_next",               /* REGNODE_MAX +0x21 */
-       "MARKPOINT_next_fail",          /* REGNODE_MAX +0x22 */
-       "SKIP_next",                    /* REGNODE_MAX +0x23 */
-       "SKIP_next_fail",               /* REGNODE_MAX +0x24 */
-       "CUTGROUP_next",                /* REGNODE_MAX +0x25 */
-       "CUTGROUP_next_fail",           /* REGNODE_MAX +0x26 */
-       "KEEPS_next",                   /* REGNODE_MAX +0x27 */
-       "KEEPS_next_fail",              /* REGNODE_MAX +0x28 */
+       "EVAL_B",                       /* REGNODE_MAX +0x03 */
+       "EVAL_B_fail",                  /* REGNODE_MAX +0x04 */
+       "EVAL_postponed_AB",            /* REGNODE_MAX +0x05 */
+       "EVAL_postponed_AB_fail",       /* REGNODE_MAX +0x06 */
+       "CURLYX_end",                   /* REGNODE_MAX +0x07 */
+       "CURLYX_end_fail",              /* REGNODE_MAX +0x08 */
+       "WHILEM_A_pre",                 /* REGNODE_MAX +0x09 */
+       "WHILEM_A_pre_fail",            /* REGNODE_MAX +0x0a */
+       "WHILEM_A_min",                 /* REGNODE_MAX +0x0b */
+       "WHILEM_A_min_fail",            /* REGNODE_MAX +0x0c */
+       "WHILEM_A_max",                 /* REGNODE_MAX +0x0d */
+       "WHILEM_A_max_fail",            /* REGNODE_MAX +0x0e */
+       "WHILEM_B_min",                 /* REGNODE_MAX +0x0f */
+       "WHILEM_B_min_fail",            /* REGNODE_MAX +0x10 */
+       "WHILEM_B_max",                 /* REGNODE_MAX +0x11 */
+       "WHILEM_B_max_fail",            /* REGNODE_MAX +0x12 */
+       "BRANCH_next",                  /* REGNODE_MAX +0x13 */
+       "BRANCH_next_fail",             /* REGNODE_MAX +0x14 */
+       "CURLYM_A",                     /* REGNODE_MAX +0x15 */
+       "CURLYM_A_fail",                /* REGNODE_MAX +0x16 */
+       "CURLYM_B",                     /* REGNODE_MAX +0x17 */
+       "CURLYM_B_fail",                /* REGNODE_MAX +0x18 */
+       "IFMATCH_A",                    /* REGNODE_MAX +0x19 */
+       "IFMATCH_A_fail",               /* REGNODE_MAX +0x1a */
+       "CURLY_B_min_known",            /* REGNODE_MAX +0x1b */
+       "CURLY_B_min_known_fail",       /* REGNODE_MAX +0x1c */
+       "CURLY_B_min",                  /* REGNODE_MAX +0x1d */
+       "CURLY_B_min_fail",             /* REGNODE_MAX +0x1e */
+       "CURLY_B_max",                  /* REGNODE_MAX +0x1f */
+       "CURLY_B_max_fail",             /* REGNODE_MAX +0x20 */
+       "COMMIT_next",                  /* REGNODE_MAX +0x21 */
+       "COMMIT_next_fail",             /* REGNODE_MAX +0x22 */
+       "MARKPOINT_next",               /* REGNODE_MAX +0x23 */
+       "MARKPOINT_next_fail",          /* REGNODE_MAX +0x24 */
+       "SKIP_next",                    /* REGNODE_MAX +0x25 */
+       "SKIP_next_fail",               /* REGNODE_MAX +0x26 */
+       "CUTGROUP_next",                /* REGNODE_MAX +0x27 */
+       "CUTGROUP_next_fail",           /* REGNODE_MAX +0x28 */
+       "KEEPS_next",                   /* REGNODE_MAX +0x29 */
+       "KEEPS_next_fail",              /* REGNODE_MAX +0x2a */
 };
 #endif /* DOINIT */
 
@@ -700,11 +703,12 @@ EXTCONST char * const PL_reg_intflags_name[] = {
        "ANCH_MBOL",                  /* 0x00000400 - PREGf_ANCH_MBOL */
        "ANCH_SBOL",                  /* 0x00000800 - PREGf_ANCH_SBOL */
        "ANCH_GPOS",                  /* 0x00001000 - PREGf_ANCH_GPOS */
+       "RECURSE_SEEN",               /* 0x00002000 - PREGf_RECURSE_SEEN */
 };
 #endif /* DOINIT */
 
 #ifdef DEBUGGING
-#  define REG_INTFLAGS_NAME_SIZE 12
+#  define REG_INTFLAGS_NAME_SIZE 13
 #endif
 
 /* The following have no fixed length. U8 so we can do strchr() on it. */