This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #115254] Fix flag check on scope exit
authorFather Chrysostomos <sprout@cpan.org>
Sat, 20 Sep 2014 13:41:29 +0000 (06:41 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 20 Sep 2014 16:25:02 +0000 (09:25 -0700)
$ ./perl -Ilib -e '{ my $x = 3; Internals::SvREADONLY $x, 1; () }'
$ ./perl -Ilib -e '{ my $x = ${qr//}; Internals::SvREADONLY $x, 1; () }'
Modification of a read-only value attempted at -e line 1.

The latter causes $x to be marked FAKE.  At the time this code was
introduced in scope.c, read-only+fake meant cow, so the !fake check
was necessary.  (That said, it has always behaved incorrectly for glob
copies that are also marked fake.)

scope.c
t/lib/universal.t

diff --git a/scope.c b/scope.c
index cf656c0..5eb9ddb 100644 (file)
--- a/scope.c
+++ b/scope.c
@@ -996,7 +996,7 @@ Perl_leave_scope(pTHX_ I32 base)
                          * readonlyness so that it can go out of scope
                          * quietly
                          */
-                        if (SvREADONLY(sv) && !SvFAKE(sv))
+                        if (SvREADONLY(sv))
                             SvREADONLY_off(sv);
 
                         if (SvOOK(sv)) { /* OOK or HvAUX */
index 55fda06..d3510c4 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
     chdir 't' if -d 't';
     @INC = '../lib';
     require './test.pl';
-    plan( tests => 15 );
+    plan( tests => 16 );
 }
 
 for my $arg ('', 'q[]', qw( 1 undef )) {
@@ -66,3 +66,6 @@ eval { ${\!0} = 7 };
 like $@, qr "^Modification of a read-only value",
     'protected values still croak on assignment after SvREADONLY(..., 0)';
 is ${\3} == 3, "1", 'attempt to modify failed';
+
+eval { { my $x = ${qr//}; Internals::SvREADONLY $x, 1; () } };
+is $@, "", 'read-only lexical regexps on scope exit [perl #115254]';