diff options
author | zherczeg <zherczeg@6239d852-aaf2-0410-a92c-79f79f948069> | 2020-03-06 09:23:10 +0000 |
---|---|---|
committer | zherczeg <zherczeg@6239d852-aaf2-0410-a92c-79f79f948069> | 2020-03-06 09:23:10 +0000 |
commit | b8f39247b20001b78a969d8c505c36eeeec08d22 (patch) | |
tree | ce673e9be52432e42b4c362c46efe65f3d4c0b51 | |
parent | 8bf2ccea0db85bdf3368c2b023bb977dc98334c2 (diff) | |
download | pcre2-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.c | 54 |
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; |