summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzherczeg <zherczeg@2f5784b3-3f2a-0410-8824-cb99058d5e15>2012-06-02 05:56:58 +0000
committerzherczeg <zherczeg@2f5784b3-3f2a-0410-8824-cb99058d5e15>2012-06-02 05:56:58 +0000
commitabad0e1a2cdb4bfd1dd6671ddf09a7f01f337bef (patch)
tree5293e679ab0d85010e35efb1866a98c93b0c796f
parent9419ba7dd0084a5f885c3016ac94b89dd37f5da0 (diff)
downloadpcre-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--ChangeLog2
-rw-r--r--pcre_jit_compile.c13
2 files changed, 11 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index fca8fc0..3f3a311 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)
{