Fix bug #23141 : localization of readonly magic scalars
Rafael Garcia-Suarez [Mon, 4 Aug 2003 20:26:17 +0000 (20:26 +0000)]
now produces an error "Modification of a read-only value
attempted", instead of silently failing.

p4raw-id: //depot/perl@20479

scope.c
t/op/local.t

diff --git a/scope.c b/scope.c
index f738b5b..673a312 100644 (file)
--- a/scope.c
+++ b/scope.c
@@ -214,7 +214,7 @@ S_save_scalar_at(pTHX_ SV **sptr)
            PL_tainted = oldtainted;
        }
        SvMAGIC(sv) = SvMAGIC(osv);
-       SvFLAGS(sv) |= SvMAGICAL(osv);
+       SvFLAGS(sv) |= SvMAGICAL(osv) | SvREADONLY(osv);
        /* XXX SvMAGIC() is *shared* between osv and sv.  This can
         * lead to coredumps when both SVs are destroyed without one
         * of their SvMAGIC() slots being NULLed. */
index 1bb8b8a..5a5b7ee 100755 (executable)
@@ -1,6 +1,6 @@
 #!./perl
 
-print "1..75\n";
+print "1..78\n";
 
 sub foo {
     local($a, $b) = @_;
@@ -257,3 +257,17 @@ print "not " if exists $h{'y'}; print "ok 72\n";
 print "not " if exists $h{'z'}; print "ok 73\n";
 print "not " if exists $ENV{_A_}; print "ok 74\n";
 print "not " if exists $ENV{_B_}; print "ok 75\n";
+
+# local() and readonly magic variables
+
+eval { local $1 = 1 };
+print "not " if $@ !~ /Modification of a read-only value attempted/;
+print "ok 76\n";
+
+eval { for ($1) { local $_ = 1 } };
+print "not " if $@ !~ /Modification of a read-only value attempted/;
+print "ok 77\n";
+
+eval { for ($1) { local $_ = 1 } };
+print "not " if $@;
+print "ok 78\n";