This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #77684] Restore the 5.10/12 behaviour of open $fh, ">", \$glob_copy
authorFather Chrysostomos <sprout@cpan.org>
Mon, 13 Sep 2010 07:57:15 +0000 (09:57 +0200)
committerRafael Garcia-Suarez <rgs@consttype.org>
Mon, 13 Sep 2010 07:57:58 +0000 (09:57 +0200)
This restores the perl 5.10/12 behaviour, making open treat \$foo as a
scalar reference if it is a glob copy (SvFAKE).

It also fixes an existing assertion failure that the test now trig-
gers. PerlIOScalar_pushed was not downgrading the sv before set-
ting SvCUR.

ext/PerlIO-scalar/scalar.xs
perlio.c
t/io/open.t

index f2481f4..b93b9e9 100644 (file)
@@ -47,9 +47,15 @@ PerlIOScalar_pushed(pTHX_ PerlIO * f, const char *mode, SV * arg,
     SvUPGRADE(s->var, SVt_PV);
     code = PerlIOBase_pushed(aTHX_ f, mode, Nullsv, tab);
     if (!SvOK(s->var) || (PerlIOBase(f)->flags) & PERLIO_F_TRUNCATE)
+    {
+       sv_force_normal(s->var);
        SvCUR_set(s->var, 0);
+    }
     if ((PerlIOBase(f)->flags) & PERLIO_F_APPEND)
+    {
+       sv_force_normal(s->var);
        s->posn = SvCUR(s->var);
+    }
     else
        s->posn = 0;
     SvSETMAGIC(s->var);
@@ -166,6 +172,7 @@ PerlIOScalar_write(pTHX_ PerlIO * f, const void *vbuf, Size_t count)
        SV *sv = s->var;
        char *dst;
        SvGETMAGIC(sv);
+       sv_force_normal(sv);
        if ((PerlIOBase(f)->flags) & PERLIO_F_APPEND) {
            dst = SvGROW(sv, SvCUR(sv) + count);
            offset = SvCUR(sv);
index c83b2bb..79b7efa 100644 (file)
--- a/perlio.c
+++ b/perlio.c
@@ -1449,7 +1449,7 @@ PerlIO_layer_from_ref(pTHX_ SV *sv)
     /*
      * For any scalar type load the handler which is bundled with perl
      */
-    if (SvTYPE(sv) < SVt_PVAV && !isGV_with_GP(sv)) {
+    if (SvTYPE(sv) < SVt_PVAV && (!isGV_with_GP(sv) || SvFAKE(sv))) {
        PerlIO_funcs *f = PerlIO_find_layer(aTHX_ STR_WITH_LEN("scalar"), 1);
        /* This isn't supposed to happen, since PerlIO::scalar is core,
         * but could happen anyway in smaller installs or with PAR */
index 01bfaca..5bbcb0b 100644 (file)
@@ -10,7 +10,7 @@ $|  = 1;
 use warnings;
 use Config;
 
-plan tests => 110;
+plan tests => 111;
 
 my $Perl = which_perl();
 
@@ -337,3 +337,13 @@ fresh_perl_is(
     ',
     'ok', { stderr => 1 },
     '[perl #77492]: open $fh, ">", \*glob causes SEGV');
+
+# [perl #77684] Opening a reference to a glob copy.
+{
+    my $var = *STDOUT;
+    open my $fh, ">", \$var;
+    print $fh "hello";
+    is $var, "hello", '[perl #77684]: open $fh, ">", \$glob_copy'
+        # when this fails, it leaves an extra file:
+        or unlink \*STDOUT;
+}