[Pcre-svn] [730] code/trunk: Fix non-passing of mark values …

Top Page
Delete this message
Author: Subversion repository
Date:  
To: pcre-svn
Subject: [Pcre-svn] [730] code/trunk: Fix non-passing of mark values out of recursions.
Revision: 730
          http://www.exim.org/viewvc/pcre2?view=rev&revision=730
Author:   ph10
Date:     2017-04-04 12:37:21 +0100 (Tue, 04 Apr 2017)
Log Message:
-----------
Fix non-passing of mark values out of recursions.


Modified Paths:
--------------
    code/trunk/ChangeLog
    code/trunk/src/pcre2_match.c
    code/trunk/testdata/testinput2
    code/trunk/testdata/testoutput2


Modified: code/trunk/ChangeLog
===================================================================
--- code/trunk/ChangeLog    2017-04-03 18:02:07 UTC (rev 729)
+++ code/trunk/ChangeLog    2017-04-04 11:37:21 UTC (rev 730)
@@ -34,6 +34,8 @@
   (d) Captures in negative assertions that were used as conditions were not
       happening if the assertion matched via (*ACCEPT).   


+  (e) Mark values were not being passed out of recursions. 
+      
 2. Now that pcre2_match() no longer uses recursive function calls (see above),
 the "match limit recursion" value seems misnamed. It still exists, and limits 
 the depth of tree that is searched. To avoid future confusion, it has been 


Modified: code/trunk/src/pcre2_match.c
===================================================================
--- code/trunk/src/pcre2_match.c    2017-04-03 18:02:07 UTC (rev 729)
+++ code/trunk/src/pcre2_match.c    2017-04-04 11:37:21 UTC (rev 730)
@@ -725,7 +725,8 @@
     where we know the starting frame is at the top of the chained frames, in
     this case we have to search back for the relevant frame in case other types
     of group that use chained frames have intervened. Multiple OP_CLOSEs always
-    come innermost first, which matches the chain order. */
+    come innermost first, which matches the chain order. We can ignore this in
+    a recursion, because captures are not passed out of recursions. */


     case OP_CLOSE:
     if (Fcurrent_recurse == RECURSE_UNSET)
@@ -746,15 +747,14 @@
       Fovector[offset+1] = Feptr - mb->start_subject;
       if (offset >= Foffset_top) Foffset_top = offset + 2;
       }
-
     Fecode += PRIV(OP_lengths)[*Fecode];
     break;



     /* ===================================================================== */
-    /* End of the pattern, either real or forced. In an assertion ACCEPT,
-    update the last used pointer and remember the current frame so that the
-    captures can be fished out of it. */
+    /* Real or forced end of the pattern, assertion, or recursion. In an
+    assertion ACCEPT, update the last used pointer and remember the current
+    frame so that the captures can be fished out of it. */


     case OP_ASSERT_ACCEPT:
     if (Feptr > mb->last_used_ptr) mb->last_used_ptr = Feptr;
@@ -761,8 +761,7 @@
     assert_accept_frame = F;
     RRETURN(MATCH_ACCEPT);


-    /* The real end, or top-level (*ACCEPT). If recursing, we have to find the
-    most recent recursion. */
+    /* If recursing, we have to find the most recent recursion. */


     case OP_ACCEPT:
     case OP_END:
@@ -782,10 +781,11 @@
         }


       /* N is now the frame of the recursion; the previous frame is at the
-      OP_RECURSE position. Go back there, copying the current subject position,
-      and move on past the OP_RECURSE. */
+      OP_RECURSE position. Go back there, copying the current subject position
+      and mark, and move on past the OP_RECURSE. */


       P->eptr = Feptr;
+      P->mark = Fmark;
       F = P;
       Fecode += 1 + LINK_SIZE;
       continue;
@@ -5078,10 +5078,7 @@
         }
       }


-    /* Now run the recursion. If it successfully completes, it re-instates the
-    previous values of the captures and continues, just like a non-capturing
-    bracket. We must leave Fecode unchanged so that the ending code can find
-    out where to continue. */
+    /* Now run the recursion, branch by branch. */


     Lstart_branch = bracode;
     Lframe_type = GF_RECURSE | number;


Modified: code/trunk/testdata/testinput2
===================================================================
--- code/trunk/testdata/testinput2    2017-04-03 18:02:07 UTC (rev 729)
+++ code/trunk/testdata/testinput2    2017-04-04 11:37:21 UTC (rev 730)
@@ -5005,5 +5005,10 @@
 /^ (?(DEFINE) (..(*ACCEPT)|...) ) (?1)$/x
 \= Expect no match
     abc
+    
+# Perl gives no match for this one


+/(a(*MARK:m)(*ACCEPT)){0}(?1)/mark
+    abc
+
 # End of testinput2 


Modified: code/trunk/testdata/testoutput2
===================================================================
--- code/trunk/testdata/testoutput2    2017-04-03 18:02:07 UTC (rev 729)
+++ code/trunk/testdata/testoutput2    2017-04-04 11:37:21 UTC (rev 730)
@@ -15529,7 +15529,14 @@
 \= Expect no match
     abc
 No match
+    
+# Perl gives no match for this one


+/(a(*MARK:m)(*ACCEPT)){0}(?1)/mark
+    abc
+ 0: a
+MK: m
+
 # End of testinput2 
 Error -63: PCRE2_ERROR_BADDATA (unknown error number)
 Error -62: bad serialized data