Fix regression in floating mandatory string optimisation
authorYves Orton <yves.orton@booking.com>
Wed, 5 Feb 2014 17:39:30 +0000 (01:39 +0800)
committerYves Orton <yves.orton@booking.com>
Wed, 5 Feb 2014 17:39:30 +0000 (01:39 +0800)
In 304ee84bde82d4eee33b0d0ff03080b360eae72b I introduced a regression
where floating mandatory strings which were at known offsets started
being treated as though they were allowed "anywhere".

This patch fixes the bug, and adds tests to make sure it does not come
back.

See also discussion in Perl RT #121182.

https://rt.perl.org/Public/Bug/Display.html?id=121182

ext/re/t/regop.pl
ext/re/t/regop.t
regcomp.c

index 8969335..961af39 100644 (file)
@@ -7,6 +7,7 @@ my @tests=(
   'D:\\dev/perl/ver/28321_/perl.exe'=>
   '/(\\.COM|\\.EXE|\\.BAT|\\.CMD|\\.VBS|\\.VBE|\\.JS|\\.JSE|\\.WSF|\\.WSH|\\.pyo|\\.pyc|\\.pyw|\\.py)$/i',
   'q'=>'[q]',
+  "path_sep:\t8490" => '^(\\S{1,9}):\\s*(\\d+)$'
 );
 while (@tests) {
     my ($str,$pat)=splice @tests,0,2;
index a180756..6eda0ab 100644 (file)
@@ -55,7 +55,7 @@ foreach my $testout ( @tests ) {
 # that the tests for this result set are finished.
 # If you add a test make sure you update $NUM_SECTS
 # the commented output is just for legacy/debugging purposes
-BEGIN{ $NUM_SECTS= 6 }
+BEGIN{ $NUM_SECTS= 7 }
 
 __END__
 #Compiling REx "X(A|[B]Q||C|D)Y"
@@ -259,3 +259,26 @@ Offsets: [3]
 1:1[3] 3:4[0]
 %MATCHED%        
 Freeing REx: "[q]"
+---
+#Compiling REx "^(\S{1,9}):\s*(\d+)$"
+#synthetic stclass "ANYOF[\x{00}-\x{08}\x{0E}-\x{1F}\x{21}-\x{FF}][{utf8}0100-167F 1681-1FFF 200B-2027 202A-202E 2030-205E 2060-2FFF 3001-INFINITY]".
+#Final program:
+#   1: BOL (2)
+#   2: OPEN1 (4)
+#   4:   CURLY {1,9} (7)
+#   6:     NPOSIXD[\s] (0)
+#   7: CLOSE1 (9)
+#   9: EXACT <:> (11)
+#  11: STAR (13)
+#  12:   POSIXD[\s] (0)
+#  13: OPEN2 (15)
+#  15:   PLUS (17)
+#  16:     POSIXD[\d] (0)
+#  17: CLOSE2 (19)
+#  19: EOL (20)
+#  20: END (0)
+#floating ":" at 1..9 (checking floating) stclass ANYOF[\x{00}-\x{08}\x{0E}-\x{1F}\x{21}-\x{FF}][{utf8}0100-167F 1681-1FFF 200B-2027 202A-202E 2030-205E 2060-2FFF 3001-INFINITY] anchored(BOL) minlen 3
+#Freeing REx: "^(\S{1,9}):\s*(\d+)$"
+floating ":" at 1..9 (checking floating) stclass ANYOF[\x{00}-\x{08}\x{0E}-\x{1F}\x{21}-\x{FF}][{utf8}0100-167F 1681-1FFF 200B-2027 202A-202E 2030-205E 2060-2FFF 3001-INFINITY] anchored(BOL) minlen 3
+%MATCHED%
+synthetic stclass
index 1761811..0951fa5 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -4388,13 +4388,13 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
                    scan = NEXTOPER(scan);
                    goto do_curly;
                }
-               is_inf = is_inf_internal = 1;
-               scan = regnext(scan);
                if (flags & SCF_DO_SUBSTR) {
                     scan_commit(pRExC_state, data, minlenp, is_inf);
                     /* Cannot extend fixed substrings */
                    data->longest = &(data->longest_float);
                }
+                is_inf = is_inf_internal = 1;
+                scan = regnext(scan);
                goto optimize_curly_tail;
            case CURLY:
                if (stopparen>0 && (OP(scan)==CURLYN || OP(scan)==CURLYM)