[Pcre-svn] [974] code/trunk: Improve JIT code generation for…

Startseite
Nachricht löschen
Autor: Subversion repository
Datum:  
To: pcre-svn
Betreff: [Pcre-svn] [974] code/trunk: Improve JIT code generation for greedy plus quantifier
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)
   {