diff options
author | zherczeg <zherczeg@2f5784b3-3f2a-0410-8824-cb99058d5e15> | 2012-06-02 05:56:58 +0000 |
---|---|---|
committer | zherczeg <zherczeg@2f5784b3-3f2a-0410-8824-cb99058d5e15> | 2012-06-02 05:56:58 +0000 |
commit | abad0e1a2cdb4bfd1dd6671ddf09a7f01f337bef (patch) | |
tree | 5293e679ab0d85010e35efb1866a98c93b0c796f | |
parent | 9419ba7dd0084a5f885c3016ac94b89dd37f5da0 (diff) | |
download | pcre-abad0e1a2cdb4bfd1dd6671ddf09a7f01f337bef.tar.gz |
Improve JIT code generation for greedy plus quantifier
git-svn-id: svn://vcs.exim.org/pcre/code/trunk@974 2f5784b3-3f2a-0410-8824-cb99058d5e15
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | pcre_jit_compile.c | 13 |
2 files changed, 11 insertions, 4 deletions
@@ -124,6 +124,8 @@ Version 8.31 SUPPORT_LIBBZ2. This caused a build problem when bzip2 but not gzip (zlib) was enabled. +35. Improve JIT code generation for greedy plus quantifier. + Version 8.30 04-February-2012 ----------------------------- diff --git a/pcre_jit_compile.c b/pcre_jit_compile.c index 7191ac3..5efd776 100644 --- a/pcre_jit_compile.c +++ b/pcre_jit_compile.c @@ -5020,7 +5020,12 @@ if (ket == OP_KETRMAX) BACKTRACK_AS(bracket_backtrack)->alttrypath = LABEL(); /* Checking zero-length iteration. */ if (opcode != OP_ONCE) + { CMPTO(SLJIT_C_NOT_EQUAL, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, STR_PTR, 0, rmaxlabel); + /* Drop STR_PTR for greedy plus quantifier. */ + if (bra != OP_BRAZERO) + free_stack(common, 1); + } else /* TMP2 must contain the starting STR_PTR. */ CMPTO(SLJIT_C_NOT_EQUAL, TMP2, 0, STR_PTR, 0, rmaxlabel); @@ -6154,9 +6159,7 @@ if (SLJIT_UNLIKELY(opcode == OP_ONCE_NC)) if (ket == OP_KETRMAX) { - if (bra != OP_BRAZERO) - free_stack(common, 1); - else + if (bra == OP_BRAZERO) { OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); free_stack(common, 1); @@ -6450,14 +6453,16 @@ else if (opcode == OP_ONCE) if (ket == OP_KETRMAX) { OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + if (bra != OP_BRAZERO) + free_stack(common, 1); CMPTO(SLJIT_C_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(bracket_backtrack)->recursivetrypath); if (bra == OP_BRAZERO) { OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); JUMPTO(SLJIT_JUMP, CURRENT_AS(bracket_backtrack)->zerotrypath); JUMPHERE(brazero); + free_stack(common, 1); } - free_stack(common, 1); } else if (ket == OP_KETRMIN) { |