This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
op.c: Remove assert exception for OP_REPEAT
[perl5.git] / regcomp.h
index 9b11ce5..049ac43 100644 (file)
--- a/regcomp.h
+++ b/regcomp.h
@@ -84,9 +84,7 @@
  * but allows patterns to get big without disasters.
  *
  * [The "next" pointer is always aligned on an even
- * boundary, and reads the offset directly as a short.  Also, there is no
- * special test to reverse the sign of BACK pointers since the offset is
- * stored negative.]
+ * boundary, and reads the offset directly as a short.]
  */
 
 /* This is the stuff that used to live in regexp.h that was truly
 #define PREGf_GPOS_SEEN         0x00000100
 #define PREGf_GPOS_FLOAT        0x00000200
 
-#define PREGf_ANCH_BOL          0x00000400
-#define PREGf_ANCH_MBOL         0x00000800
-#define PREGf_ANCH_SBOL         0x00001000
-#define PREGf_ANCH_GPOS         0x00002000
+#define PREGf_ANCH_MBOL         0x00000400
+#define PREGf_ANCH_SBOL         0x00000800
+#define PREGf_ANCH_GPOS         0x00001000
 
-#define PREGf_ANCH              (PREGf_ANCH_SBOL | PREGf_ANCH_GPOS | \
-                                 PREGf_ANCH_MBOL | PREGf_ANCH_BOL )
+#define PREGf_ANCH              \
+    ( PREGf_ANCH_SBOL | PREGf_ANCH_GPOS | PREGf_ANCH_MBOL )
 
 /* this is where the old regcomp.h started */
 
@@ -217,7 +214,7 @@ struct regnode_charclass {
     U8 flags;
     U8  type;
     U16 next_off;
-    U32 arg1;
+    U32 arg1;                           /* set by set_ANYOF_arg() */
     char bitmap[ANYOF_BITMAP_SIZE];    /* only compile-time */
 };
 
@@ -227,7 +224,7 @@ struct regnode_charclass_class {
     U8  type;
     U16 next_off;
     U32 arg1;
-    char bitmap[ANYOF_BITMAP_SIZE];            /* both compile-time */
+    char bitmap[ANYOF_BITMAP_SIZE];            /* both compile-time ... */
     U32 classflags;                            /* and run-time */
 };
 
@@ -245,7 +242,7 @@ struct regnode_ssc {
     U8  type;
     U16 next_off;
     U32 arg1;
-    char bitmap[ANYOF_BITMAP_SIZE];    /* both compile-time */
+    char bitmap[ANYOF_BITMAP_SIZE];    /* both compile-time ... */
     U32 classflags;                    /* and run-time */
 
     /* Auxiliary, only used during construction; NULL afterwards: list of code
@@ -310,7 +307,16 @@ struct regnode_ssc {
 
 #define NEXT_OFF(p) ((p)->next_off)
 #define NODE_ALIGN(node)
-#define NODE_ALIGN_FILL(node) ((node)->flags = 0xde) /* deadbeef */
+/* the following define was set to 0xde in 075abff3
+ * as part of some linting logic. I have set it to 0
+ * as otherwise in every place where we /might/ set flags
+ * we have to set it 0 explicitly, which duplicates
+ * assignments and IMO adds an unacceptable level of
+ * surprise to working in the regex engine. If this
+ * is changed from 0 then at the very least make sure
+ * that SBOL for /^/ sets the flags to 0 explicitly.
+ * -- Yves */
+#define NODE_ALIGN_FILL(node) ((node)->flags = 0)
 
 #define SIZE_ALIGN NODE_ALIGN
 
@@ -353,6 +359,13 @@ struct regnode_ssc {
     (ptr)->type = op;    (ptr)->next_off = 0;   (ptr)++; } STMT_END
 #define FILL_ADVANCE_NODE_ARG(ptr, op, arg) STMT_START { \
     ARG_SET(ptr, arg);  FILL_ADVANCE_NODE(ptr, op); (ptr) += 1; } STMT_END
+#define FILL_ADVANCE_NODE_2L_ARG(ptr, op, arg1, arg2)               \
+                STMT_START {                                        \
+                    ARG_SET(ptr, arg1);                             \
+                    ARG2L_SET(ptr, arg2);                           \
+                    FILL_ADVANCE_NODE(ptr, op);                     \
+                    (ptr) += 2;                                     \
+                } STMT_END
 
 #define REG_MAGIC 0234
 
@@ -505,10 +518,6 @@ struct regnode_ssc {
 
 /* Utility macros for the bitmap and classes of ANYOF */
 
-#define ANYOF_SIZE             (sizeof(struct regnode_charclass))
-#define ANYOF_POSIXL_SIZE      (sizeof(regnode_charclass_posixl))
-#define ANYOF_CLASS_SIZE       ANYOF_POSIXL_SIZE
-
 #define ANYOF_FLAGS(p)         ((p)->flags)
 
 #define ANYOF_BIT(c)           (1U << ((c) & 7))
@@ -564,9 +573,8 @@ struct regnode_ssc {
 #define ANYOF_BITMAP_CLEARALL(p)       \
        Zero (ANYOF_BITMAP(p), ANYOF_BITMAP_SIZE)
 
-#define ANYOF_SKIP             ((ANYOF_SIZE - 1)/sizeof(regnode))
-#define ANYOF_POSIXL_SKIP      ((ANYOF_POSIXL_SIZE - 1)/sizeof(regnode))
-#define ANYOF_CLASS_SKIP       ANYOF_POSIXL_SKIP
+#define ANYOF_SKIP             EXTRA_SIZE(struct regnode_charclass)
+#define ANYOF_POSIXL_SKIP      EXTRA_SIZE(regnode_charclass_posixl)
 
 /*
  * Utility definitions.
@@ -848,6 +856,7 @@ re.pm, especially to the documentation.
 #define RE_DEBUG_COMPILE_TRIE      0x000004
 #define RE_DEBUG_COMPILE_DUMP      0x000008
 #define RE_DEBUG_COMPILE_FLAGS     0x000010
+#define RE_DEBUG_COMPILE_TEST      0x000020
 
 /* Execute */
 #define RE_DEBUG_EXECUTE_MASK      0x00FF00
@@ -883,6 +892,8 @@ re.pm, especially to the documentation.
     if (re_debug_flags & RE_DEBUG_COMPILE_TRIE) x )
 #define DEBUG_FLAGS_r(x) DEBUG_r( \
     if (re_debug_flags & RE_DEBUG_COMPILE_FLAGS) x )
+#define DEBUG_TEST_r(x) DEBUG_r( \
+    if (re_debug_flags & RE_DEBUG_COMPILE_TEST) x )
 /* Execute */
 #define DEBUG_EXECUTE_r(x) DEBUG_r( \
     if (re_debug_flags & RE_DEBUG_EXECUTE_MASK) x  )