This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #108480] $cow |= number undefines $cow
authorFather Chrysostomos <sprout@cpan.org>
Wed, 18 Jan 2012 06:51:32 +0000 (22:51 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Wed, 18 Jan 2012 06:51:32 +0000 (22:51 -0800)
commit5ee80e13ad1338a061ce31e1c7ea5c074fc5a0ff
treea147ea2cd65e3149b6168e8193cbd3448acc7b23
parent485495c37ef9e4aac088b1f65dff57b9b274003c
[perl #108480] $cow |= number undefines $cow

If a read-only scalar is passed to one of | & ^ and it decides to do
a numeric operation, the numeric flags on the read-only scalar are
turned off afterwards if they were not on to begin with.

This was introduced in commit b20c4ee1f, which did so to stop $x | "0"
from coercing the rhs and making it behave differently the second
time through.

What that commit did not take into account was that the read-only
flag is set on cow scalars, and the same pp function is used for the
assignment forms.  So it was turning off the numeric flags after
$cow |= 1, leaving $cow undef.

I made this numeric flag-twiddling apply only to read-only scalars
(supposedly), because that seemed the most conservative and acceptable
change.  I am actually in favour of extending it to all scalars, to
make these operators less surprising.  For that reason, this commit
preserves the current behaviour with cows in the non-assignment case:
they don’t get coerced into numbers.  Changing them to work the same
way as non-cow writable scalars would make things more consistent, but
more consistently buggy.  I would like to make this non-coercion apply
to all scalars in 5.18.

This commit simply skips the flag-twiddling on the lhs in the assign-
ment case.
pp.c
t/op/bop.t