Re: [PATCH regcomp.[ch], regexp.h, pp_hot.c, t/op/re_tests] lazy $& and \Z fix
Jeff Pinyan [Wed, 14 Nov 2001 16:35:29 +0000 (11:35 -0500)]
Message-ID: <Pine.GSO.4.21.0111141634020.16649-100000@crusoe.crusoe.net>

p4raw-id: //depot/perl@13048

pp_hot.c
regcomp.c
regcomp.h
regexp.h
t/op/re_tests

index f1274a6..77e070f 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -1264,9 +1264,7 @@ PP(pp_match)
            }
        }
     }
-    if ((!global && rx->nparens)
-           || SvTEMP(TARG) || PL_sawampersand)
-       r_flags |= REXEC_COPY_STR;
+    r_flags |= REXEC_COPY_STR;
     if (SvSCREAM(TARG))
        r_flags |= REXEC_SCREAM;
 
@@ -1291,7 +1289,7 @@ play_it_again:
        if (!s)
            goto nope;
        if ( (rx->reganch & ROPT_CHECK_ALL)
-            && !PL_sawampersand
+            && !((rx->reganch & ROPT_SEOL_SEEN) && PL_multiline)
             && ((rx->reganch & ROPT_NOSCAN)
                 || !((rx->reganch & RE_INTUIT_TAIL)
                      && (r_flags & REXEC_SCREAM)))
@@ -1408,19 +1406,12 @@ yup:                                    /* Confirmed by INTUIT */
        rx->sublen = strend - truebase;
        goto gotcha;
     }
-    if (PL_sawampersand) {
-       I32 off;
 
-       rx->subbeg = savepvn(t, strend - t);
-       rx->sublen = strend - t;
-       RX_MATCH_COPIED_on(rx);
-       off = rx->startp[0] = s - t;
-       rx->endp[0] = off + rx->minlen;
-    }
-    else {                     /* startp/endp are used by @- @+. */
-       rx->startp[0] = s - truebase;
-       rx->endp[0] = s - truebase + rx->minlen;
-    }
+    rx->sublen = strend - t;
+    rx->subbeg = savepvn(t, rx->sublen);
+    RX_MATCH_COPIED_on(rx);
+    rx->startp[0] = s - truebase;
+    rx->endp[0] = s - truebase + rx->minlen;
     rx->nparens = rx->lastparen = 0;   /* used by @- and @+ */
     LEAVE_SCOPE(oldsave);
     RETPUSHYES;
index 12e0395..eabaa8c 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -2016,6 +2016,8 @@ Perl_pregcomp(pTHX_ char *exp, char *xend, PMOP *pm)
        r->reganch |= ROPT_EVAL_SEEN;
     if (RExC_seen & REG_SEEN_CANY)
        r->reganch |= ROPT_CANY_SEEN;
+    if (RExC_seen & REG_SEEN_SEOL)
+       r->reganch |= ROPT_SEOL_SEEN;
     Newz(1002, r->startp, RExC_npar, I32);
     Newz(1002, r->endp, RExC_npar, I32);
     PL_regdata = r->data; /* for regprop() */
@@ -2794,6 +2796,7 @@ tryagain:
            break;
        case 'Z':
            ret = reg_node(pRExC_state, SEOL);
+           RExC_seen |= REG_SEEN_SEOL;
            *flagp |= SIMPLE;
            nextchar(pRExC_state);
            break;
index bbe3a41..7948853 100644 (file)
--- a/regcomp.h
+++ b/regcomp.h
@@ -311,6 +311,7 @@ struct regnode_charclass_class {    /* has [[:blah:]] classes */
 #define REG_SEEN_EVAL           8
 #define REG_SEEN_CANY          16
 #define REG_SEEN_SANY          REG_SEEN_CANY /* src bckwrd cmpt */
+#define REG_SEEN_SEOL          32
 
 START_EXTERN_C
 
index 6217aaa..8366fa2 100644 (file)
--- a/regexp.h
+++ b/regexp.h
@@ -58,6 +58,7 @@ typedef struct regexp {
 #define ROPT_EVAL_SEEN         0x00400
 #define ROPT_CANY_SEEN         0x00800
 #define ROPT_SANY_SEEN         ROPT_CANY_SEEN /* src bckwrd cmpt */
+#define ROPT_SEOL_SEEN         0x01000
 
 /* 0xf800 of reganch is used by PMf_COMPILETIME */
 
index 1e80f50..c7ab5ad 100644 (file)
@@ -537,7 +537,7 @@ a$  b\na\n  y       $-[0]   2
 a\Z    b\na    y       $-[0]   2
 a\z    b\na    y       $-[0]   2
 a$     b\na    y       $-[0]   2
-'a\Z'm a\nb\n  bn      -       -
+'a\Z'm a\nb\n  n       -       -
 'a\z'm a\nb\n  n       -       -
 'a$'m  a\nb\n  y       $-[0]   0
 'a\Z'm b\na\n  y       $-[0]   2
@@ -555,7 +555,7 @@ aa$ b\naa\n y       $-[0]   2
 aa\Z   b\naa   y       $-[0]   2
 aa\z   b\naa   y       $-[0]   2
 aa$    b\naa   y       $-[0]   2
-'aa\Z'm        aa\nb\n bn      -       -
+'aa\Z'm        aa\nb\n n       -       -
 'aa\z'm        aa\nb\n n       -       -
 'aa$'m aa\nb\n y       $-[0]   0
 'aa\Z'm        b\naa\n y       $-[0]   2
@@ -609,7 +609,7 @@ ab$ b\nab\n y       $-[0]   2
 ab\Z   b\nab   y       $-[0]   2
 ab\z   b\nab   y       $-[0]   2
 ab$    b\nab   y       $-[0]   2
-'ab\Z'm        ab\nb\n bn      -       -
+'ab\Z'm        ab\nb\n n       -       -
 'ab\z'm        ab\nb\n n       -       -
 'ab$'m ab\nb\n y       $-[0]   0
 'ab\Z'm        b\nab\n y       $-[0]   2
@@ -663,7 +663,7 @@ abb$        b\nabb\n        y       $-[0]   2
 abb\Z  b\nabb  y       $-[0]   2
 abb\z  b\nabb  y       $-[0]   2
 abb$   b\nabb  y       $-[0]   2
-'abb\Z'm       abb\nb\n        bn      -       -
+'abb\Z'm       abb\nb\n        n       -       -
 'abb\z'm       abb\nb\n        n       -       -
 'abb$'m        abb\nb\n        y       $-[0]   0
 'abb\Z'm       b\nabb\n        y       $-[0]   2