[perl #113764] Make &= duping work with PerlIO::scalar
authorFather Chrysostomos <sprout@cpan.org>
Thu, 21 Jun 2012 06:33:28 +0000 (23:33 -0700)
committerRicardo Signes <rjbs@cpan.org>
Sun, 24 Jun 2012 22:28:57 +0000 (18:28 -0400)
commita3d9b85b2bd480dc8c97e633ab1cda7845c06266
treedfdc78e4eac8e46ead396c95a43e2a826a9bc4c3
parentcc921a8a9f393ad2ced442a7757e1b2cf28d715c
[perl #113764] Make &= duping work with PerlIO::scalar

In trying to fix bug #112780, I made in-memory handle duplication tem-
porarily hide the underlying scalar so it wouldn’t be set to the empty
string (commit 49b69fb3a).

I used PerlIO_sv_dup in j rather than PerlIOScalar_arg.  The for-
mer is usually what is called anyway.  There is only one branch of
PerlIOScalar_arg that doesn’t call PerlIO_sv_dup.  I don’t remember
what I was thinking back then, but I think I thought that branch
was there for paranoia.  But actually, it is used for "&=", so this
started failing:

open FILE, '>', \my $content or die "Couldn't open scalar filehandle";
open my $fh, ">&=FILE" or die "Couldn't open: $!";
print $fh "Foo-Bar\n";
close $fh;
close FILE;
print $content;

This commit fixes the bug in the smallest way possible, which means
switching from PerlIO_sv_dup to PerlIOScalar_arg in PerlIOScalar_arg,
which, in turn, entails fiddling with RVs.
ext/PerlIO-scalar/scalar.xs
ext/PerlIO-scalar/t/scalar.t