summaryrefslogtreecommitdiff
path: root/lib/overload.t
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2011-10-29 13:40:06 -0700
committerFather Chrysostomos <sprout@cpan.org>2011-10-29 13:40:06 -0700
commit15d9c083b08647e489d279a1059b4f14a3df187b (patch)
tree42214185a70e7b4668732bba38607e2c4dd3057b /lib/overload.t
parentd9f099ba19708667c3dbe041cdfdb2f4ef00dce3 (diff)
downloadperl-15d9c083b08647e489d279a1059b4f14a3df187b.tar.gz
Fix =~ $str_overloaded (5.10 regression)
In 5.8.x, this code: use overload '""'=>sub { warn "stringify"; --$| ? "gonzo" : chr 256 }; my $obj = bless\do{my $x}; warn "$obj"; print "match\n" if chr(256) =~ $obj; prints stringify at - line 1. gonzo at - line 3. stringify at - line 1. match which is to be expected. In 5.10+, the stringification happens one extra time, causing a failed match: stringify at - line 1. gonzo at - line 3. stringify at - line 1. stringify at - line 1. This logic in pp_regcomp is faulty: if (DO_UTF8(tmpstr)) { assert (SvUTF8(tmpstr)); } else if (SvUTF8(tmpstr)) { ... copy under ‘use bytes’... } else if (SvAMAGIC(tmpstr)) { /* make a copy to avoid extra stringifies */ tmpstr = newSVpvn_flags(t, len, SVs_TEMP | SvUTF8(tmpstr)); } The SvAMAGIC check never happens when the UTF8 flag is on.
Diffstat (limited to 'lib/overload.t')
-rw-r--r--lib/overload.t4
1 files changed, 3 insertions, 1 deletions
diff --git a/lib/overload.t b/lib/overload.t
index 89d8af7d83..1021a5f24a 100644
--- a/lib/overload.t
+++ b/lib/overload.t
@@ -48,7 +48,7 @@ package main;
$| = 1;
BEGIN { require './test.pl' }
-plan tests => 4983;
+plan tests => 5037;
use Scalar::Util qw(tainted);
@@ -1793,6 +1793,8 @@ foreach my $op (qw(<=> == != < <= > >=)) {
# note: this is testing unary qr, not binary =~
$subs{qr} = '(qr/%s/)';
push @tests, [ "abc", '"abc" =~ (%s)', '(qr)', '("")', [ 1, 2, 0 ], 0 ];
+ push @tests, [ chr 256, 'chr(256) =~ (%s)', '(qr)', '("")',
+ [ 1, 2, 0 ], 0 ];
$e = '"abc" ~~ (%s)';
$subs{'~~'} = $e;