fix bug #57042 - preserve $^R across TRIE matches
authorYves Orton <demerphq@gmail.com>
Sat, 27 Dec 2008 19:19:31 +0000 (20:19 +0100)
committerDavid Mitchell <davem@iabyn.com>
Thu, 26 Feb 2009 02:48:55 +0000 (02:48 +0000)
(cherry picked from commit 6962fb1a1ff5ac2ee529f793d9ff033a7525ff4d)

regexec.c
t/op/pat.t

index 0f54ff5..1277a8b 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -2986,7 +2986,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, regnode *prog)
                    if ( got_wordnum ) {
                        if ( ! ST.accepted ) {
                            ENTER;
-                           /* SAVETMPS; */ /* XXX is this necessary? dmq */
+                           SAVETMPS; /* XXX is this necessary? dmq */
                            bufflen = TRIE_INITAL_ACCEPT_BUFFLEN;
                            sv_accept_buff=newSV(bufflen *
                                            sizeof(reg_trie_accepted) - 1);
@@ -3205,6 +3205,9 @@ S_regmatch(pTHX_ regmatch_info *reginfo, regnode *prog)
            }
            /* NOTREACHED */
         case TRIE_next:
+           /* we dont want to throw this away, see bug 57042*/
+           if (oreplsv != GvSV(PL_replgv))
+               sv_setsv(oreplsv, GvSV(PL_replgv));
             FREETMPS;
            LEAVE;
            sayYES;
index 040c671..aa275bd 100755 (executable)
@@ -13,7 +13,7 @@ sub run_tests;
 
 $| = 1;
 
-my $EXPECTED_TESTS = 3864;  # Update this when adding/deleting tests.
+my $EXPECTED_TESTS = 3865;  # Update this when adding/deleting tests.
 
 BEGIN {
     chdir 't' if -d 't';
@@ -2935,7 +2935,7 @@ sub run_tests {
 
         SKIP: {
             our @stack = ();
-            my @expect = qw (
+            my @expect = qw(
                 stuff1
                 stuff2
                 <stuff1>and<stuff2>
@@ -4083,7 +4083,23 @@ sub run_tests {
         utf8::upgrade $s;
         ok "aaa" =~ /$s/;
     }
-
+    {
+        local $BugId = '57042';
+       local $Message = "Check if tree logic breaks \$^R";
+       my $cond_re = qr/\s*
+           \s* (?:
+                  \( \s* A  (?{1})
+                | \( \s* B  (?{2})
+              )
+          /x;
+       my @res;
+       for my $line ("(A)","(B)") {
+          if ($line =~ m/$cond_re/) {
+              push @res, $^R ? "#$^R" : "UNDEF";
+          }
+       }
+       iseq "@res","#1 #2";
+    }
     #
     # This should be the last test.
     #