summaryrefslogtreecommitdiff
path: root/regnodes.h
diff options
context:
space:
mode:
authorDavid Mitchell <davem@iabyn.com>2018-08-15 18:02:53 +0100
committerDavid Mitchell <davem@iabyn.com>2018-08-26 20:57:34 +0100
commit21cbe0098921b51ccea087caa9ad5c71b2cda029 (patch)
tree9c02a0f2f2bc312bfafd7651d15e484ac0211d23 /regnodes.h
parent42f10b3ffcb09f2c3fb2fb2600565b3fe588f922 (diff)
downloadperl-21cbe0098921b51ccea087caa9ad5c71b2cda029.tar.gz
S_regmatch(): combine CURLY_B_min/_known states
There are currently two similar backtracking states for simple non-greedy pattern repeats: CURLY_B_min CURLY_B_min_known the latter is a variant of the former for when the character which must follow the repeat is known, e.g. /(...)*?X.../, which allows quick skipping to the next viable position. The code for the two cases: case CURLY_B_min_fail: case CURLY_B_min_known_fail: share a lot of similarities. This commit merges the two states into a single CURLY_B_min state, with an associated single CURLY_B_min_fail fail state. That one code block can handle both types, with a single if (ST.c1 == CHRTEST_VOID) ... test to choose between the two variant parts of the code. This makes the code smaller and more maintainable, at the cost of one extra test per backtrack.
Diffstat (limited to 'regnodes.h')
-rw-r--r--regnodes.h64
1 files changed, 29 insertions, 35 deletions
diff --git a/regnodes.h b/regnodes.h
index 69f3e38cdb..eeb5ce9f18 100644
--- a/regnodes.h
+++ b/regnodes.h
@@ -7,7 +7,7 @@
/* Regops and State definitions */
#define REGNODE_MAX 97
-#define REGMATCH_STATE_MAX 139
+#define REGMATCH_STATE_MAX 137
#define END 0 /* 0000 End of program. */
#define SUCCEED 1 /* 0x01 Return from a subroutine, basically. */
@@ -136,22 +136,20 @@
#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 */
+#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 */
/* PL_regkind[] What type of regop or state is this. */
@@ -284,8 +282,6 @@ EXTCONST U8 PL_regkind[] = {
CURLYM, /* CURLYM_B_fail */
IFMATCH, /* IFMATCH_A */
IFMATCH, /* IFMATCH_A_fail */
- CURLY, /* CURLY_B_min_known */
- CURLY, /* CURLY_B_min_known_fail */
CURLY, /* CURLY_B_min */
CURLY, /* CURLY_B_min_fail */
CURLY, /* CURLY_B_max */
@@ -645,22 +641,20 @@ EXTCONST char * const PL_reg_name[] = {
"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 */
+ "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 */
};
#endif /* DOINIT */