In perl.git, the branch davem/maint-5.18-118213 has been created
<http://perl5.git.perl.org/perl.git/commitdiff/4d7b2f562978b8efa58e6a489ac3a0f146794184?hp=0000000000000000000000000000000000000000>
at 4d7b2f562978b8efa58e6a489ac3a0f146794184 (commit)
- Log -----------------------------------------------------------------
commit 4d7b2f562978b8efa58e6a489ac3a0f146794184
Author: David Mitchell <[email protected]>
Date: Tue Jul 30 20:14:37 2013 +0100
Disable new //p tests
The previous commit fixed a regression in 5.18.0:
my $pat = qr/a/;
'aaaa' =~ /$pat/gp or die;
print "MATCH=[${^MATCH}]\n";
which printed 'a' in 5.16.0, and undef in 5.18.0.
5.18.0 only broke the /g behaviour; the non-/g variant was already broken
and the previous commit didn't fix that for maint.
The new tests are testing for the non-/g variant, which still fail, so
disable these tests.
(Getting it to capture under non-/g works in 5.19.2 due to a major
reorganisation of the pp_match/pp_subst/regexec() code, which isn't
suitable for backporting to maint-5.18.)
M t/re/reg_pmod.t
commit f4194b23d4abd4f267681d848ba761ec1888a998
Author: David Mitchell <[email protected]>
Date: Tue Jul 30 16:16:35 2013 +0100
RT #118213: handle $r=qr/.../; /$r/p properly
(cherry-picked from 5b0e71e9d506. Some of the new tests are unsuitable for
5.18.x and fail with this commit; they'll be disabled in the next commit)
In the case where a qr// regex is directly used by PMOP (rather than being
interpolated with some other stuff and a new regex created, such as
/a$r/p), then the PMf_KEEPCOPY flag will be set on the PMOP, but the
corresponding RXf_PMf_KEEPCOPY flag *won't* be set on the regex.
Since most of the regex handling for copying the string and extracting out
${^PREMATCH} etc is done based on the RXf_PMf_KEEPCOPY flag in the regex,
this is a bit of a problem.
Prior to 5.18.0 this wasn't so noticeable, since various other bugs around
//p handling meant that ${$PREMATCH} etc often accidentally got set
anyway. 5.18.0 fixed these bugs, and so as a side-effect, exposed the
PMOP verses regex flag issue. In particular, this stopped working in
5.18.0:
my $pat = qr/a/;
'aaaa' =~ /$pat/gp or die;
print "MATCH=[${^MATCH}]\n";
(prints 'a' in 5.16.0, undef in 5.18.0).
The presence /g caused the engine to copy the string anyway by luck.
We can't just set the RXf_PMf_KEEPCOPY flag on the regex if we see the
PMf_KEEPCOPY flag on the PMOP, otherwise stuff like this will be wrong:
$r = qr/..../;
/$r/p; # set RXf_PMf_KEEPCOPY on $r
/$r/; # does a /p match by mistake
Since for 5.19.x onwards COW is enabled by default (and cheap copies are
always made regardless of /p), then this fix is mainly for PERL_NO_COW
builds and for backporting to 5.18.x. (Although it still applies to
strings that can't be COWed for whatever reason).
Since we can't set a flag in the rx, we fix this by:
1) when calling the regex engine (which may attempt to copy part or all of
the capture string), make sure we pass REXEC_COPY_STR, but neither of
REXEC_COPY_SKIP_PRE, REXEC_COPY_SKIP_POST when we call regexec() from
pp_match or pp_subst when the corresponding PMOP has PMf_KEEPCOPY set.
2) in Perl_reg_numbered_buff_fetch() etc, check for PMf_KEEPCOPY in
PL_curpm as well as for RXf_PMf_KEEPCOPY in the current rx before deciding
whether to process ${^PREMATCH} etc.
As well as adding new tests to t/re/reg_pmod.t, I also changed the
string to be matched against from being '12...' to '012...', to ensure that
the lengths of ${^PREMATCH}, ${^MATCH}, ${^POSTMATCH} would all be
different.
M pp_hot.c
M regcomp.c
M t/re/reg_pmod.t
-----------------------------------------------------------------------
--
Perl5 Master Repository