summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzherczeg <zherczeg@6239d852-aaf2-0410-a92c-79f79f948069>2020-03-06 09:23:10 +0000
committerzherczeg <zherczeg@6239d852-aaf2-0410-a92c-79f79f948069>2020-03-06 09:23:10 +0000
commitb8f39247b20001b78a969d8c505c36eeeec08d22 (patch)
treece673e9be52432e42b4c362c46efe65f3d4c0b51
parent8bf2ccea0db85bdf3368c2b023bb977dc98334c2 (diff)
downloadpcre2-b8f39247b20001b78a969d8c505c36eeeec08d22.tar.gz
Fix issues in the early fail optimization.
git-svn-id: svn://vcs.exim.org/pcre2/code/trunk@1235 6239d852-aaf2-0410-a92c-79f79f948069
-rw-r--r--src/pcre2_jit_compile.c54
1 files changed, 38 insertions, 16 deletions
diff --git a/src/pcre2_jit_compile.c b/src/pcre2_jit_compile.c
index a3efbcd..344fa84 100644
--- a/src/pcre2_jit_compile.c
+++ b/src/pcre2_jit_compile.c
@@ -1285,13 +1285,19 @@ do
case OP_ANY:
case OP_ALLANY:
case OP_ANYBYTE:
- case OP_ANYNL:
case OP_NOT_HSPACE:
case OP_HSPACE:
case OP_NOT_VSPACE:
case OP_VSPACE:
+ fast_forward_allowed = FALSE;
+ cc++;
+ continue;
+
+ case OP_ANYNL:
case OP_EXTUNI:
fast_forward_allowed = FALSE;
+ if (count == 0)
+ count = 1;
cc++;
continue;
@@ -1337,6 +1343,7 @@ do
case OP_TYPEEXACT:
case OP_TYPEPOSUPTO:
cc += IMM2_SIZE;
+ /* Fall through */
case OP_TYPEQUERY:
case OP_TYPEMINQUERY:
@@ -1399,6 +1406,7 @@ do
case OP_NOTEXACTI:
case OP_NOTPOSUPTOI:
cc += IMM2_SIZE;
+ /* Fall through */
case OP_QUERY:
case OP_MINQUERY:
@@ -1425,27 +1433,41 @@ do
case OP_NCLASS:
#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
case OP_XCLASS:
- end = cc + ((*cc == OP_XCLASS) ? GET(cc, 1) : (unsigned int)(1 + (32 / sizeof(PCRE2_UCHAR))));
+ accelerated_start = cc;
+ cc += ((*cc == OP_XCLASS) ? GET(cc, 1) : (unsigned int)(1 + (32 / sizeof(PCRE2_UCHAR))));
#else
- end = cc + (1 + (32 / sizeof(PCRE2_UCHAR)));
+ accelerated_start = cc;
+ cc += (1 + (32 / sizeof(PCRE2_UCHAR)));
#endif
- if ((*end >= OP_CRSTAR && *end <= OP_CRMINPLUS) || (*end >= OP_CRPOSSTAR && *end <= OP_CRPOSPLUS))
+ switch (*cc)
{
- accelerated_start = cc;
- cc = end + 1;
+ case OP_CRSTAR:
+ case OP_CRMINSTAR:
+ case OP_CRPLUS:
+ case OP_CRMINPLUS:
+ case OP_CRPOSSTAR:
+ case OP_CRPOSPLUS:
+ cc++;
break;
- }
-
- fast_forward_allowed = FALSE;
- if (count == 0)
- count = 1;
- cc = end;
- if (*end == OP_CRQUERY || *end == OP_CRMINQUERY || *end == OP_CRPOSQUERY)
+ case OP_CRRANGE:
+ case OP_CRMINRANGE:
+ case OP_CRPOSRANGE:
+ cc += 2 * IMM2_SIZE;
+ /* Fall through */
+ case OP_CRQUERY:
+ case OP_CRMINQUERY:
+ case OP_CRPOSQUERY:
cc++;
- else if (*end == OP_CRRANGE || *end == OP_CRMINRANGE || *end == OP_CRPOSRANGE)
- cc += 1 + 2 * IMM2_SIZE;
+ if (count == 0)
+ count = 1;
+ /* Fall through */
+ default:
+ accelerated_start = NULL;
+ fast_forward_allowed = FALSE;
+ break;
+ }
continue;
case OP_ONCE:
@@ -1505,7 +1527,7 @@ do
common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_skip;
*private_data_start += sizeof(sljit_sw);
}
- else
+ else
{
common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_fail;