pp_match(): skip passing gpos arg to regexec()
authorDavid Mitchell <davem@iabyn.com>
Thu, 20 Jun 2013 13:54:44 +0000 (14:54 +0100)
committerDavid Mitchell <davem@iabyn.com>
Sun, 28 Jul 2013 09:33:36 +0000 (10:33 +0100)
In one specific case, pp_match() passes the value of pos() to regexec()
via the otherwise unused 'data' arg.

It turns out that pp_match() only passes this value when it exists and is
>= 0, while regexec() only uses it when there's no pos magic or pos() < 0.

So its never used as far as I can tell.

So, strip it for now.

pp_hot.c
regexec.c

index e0a543c..9a1beab 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -1334,7 +1334,6 @@ PP(pp_match)
     const I32 oldsave = PL_savestack_ix;
     I32 update_minmatch = 1;
     I32 had_zerolen = 0;
-    U32 gpos = 0;
 
     if (PL_op->op_flags & OPf_STACKED)
        TARG = POPs;
@@ -1398,9 +1397,8 @@ PP(pp_match)
                else if (RX_EXTFLAGS(rx) & RXf_ANCH_GPOS) {
                    r_flags |= REXEC_IGNOREPOS;
                    RX_OFFS(rx)[0].end = RX_OFFS(rx)[0].start = mg->mg_len;
-               } else if (RX_EXTFLAGS(rx) & RXf_GPOS_FLOAT) 
-                   gpos = mg->mg_len;
-               else 
+               }
+               else if (!(RX_EXTFLAGS(rx) & RXf_GPOS_FLOAT))
                    RX_OFFS(rx)[0].end = RX_OFFS(rx)[0].start = mg->mg_len;
                minmatch = (mg->mg_flags & MGf_MINMATCH) ? RX_GOFS(rx) + 1 : 0;
                update_minmatch = 0;
@@ -1434,7 +1432,7 @@ PP(pp_match)
     }
 
     if (!CALLREGEXEC(rx, (char*)s, (char *)strend, (char*)truebase,
-                    minmatch, TARG, NUM2PTR(void*, gpos), r_flags))
+                    minmatch, TARG, NULL, r_flags))
        goto nope;
 
     PL_curpm = pm;
index 776f8f0..0b81bab 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -2203,8 +2203,7 @@ Perl_regexec_flags(pTHX_ REGEXP * const rx, char *stringarg, char *strend,
 /* sv:        SV being matched: only used for utf8 flag, pos() etc; string
  *            itself is accessed via the pointers above */
 /* data:      May be used for some additional optimizations.
-              Currently its only used, with a U32 cast, for transmitting
-              the ganch offset when doing a /g match. This will change */
+              Currently unused. */
 /* nosave:    For optimizations. */
 
 {
@@ -2394,12 +2393,7 @@ Perl_regexec_flags(pTHX_ REGEXP * const rx, char *stringarg, char *strend,
                    goto phooey;
            }
        }
-       else if (data) {
-           reginfo->ganch = strbeg + PTR2UV(data);
-            DEBUG_GPOS_r(PerlIO_printf(Perl_debug_log,
-                "GPOS DATA: reginfo->ganch= strbeg + %"UVxf"\n",PTR2UV(data)));
-
-       } else {                                /* pos() not defined */
+       else {                          /* pos() not defined */
            reginfo->ganch = strbeg;
             DEBUG_GPOS_r(PerlIO_printf(Perl_debug_log,
                 "GPOS: reginfo->ganch = strbeg\n"));