Revision: 974
http://vcs.pcre.org/viewvc?view=rev&revision=974
Author: zherczeg
Date: 2012-06-02 06:56:58 +0100 (Sat, 02 Jun 2012)
Log Message:
-----------
Improve JIT code generation for greedy plus quantifier
Modified Paths:
--------------
code/trunk/ChangeLog
code/trunk/pcre_jit_compile.c
Modified: code/trunk/ChangeLog
===================================================================
--- code/trunk/ChangeLog 2012-06-01 18:38:40 UTC (rev 973)
+++ code/trunk/ChangeLog 2012-06-02 05:56:58 UTC (rev 974)
@@ -124,7 +124,9 @@
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
-----------------------------
Modified: code/trunk/pcre_jit_compile.c
===================================================================
--- code/trunk/pcre_jit_compile.c 2012-06-01 18:38:40 UTC (rev 973)
+++ code/trunk/pcre_jit_compile.c 2012-06-02 05:56:58 UTC (rev 974)
@@ -5020,7 +5020,12 @@
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 (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 @@
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)
{