Blob Blame History Raw
--- perl-5.8.8/t/op/local.t.U27914	2006-01-03 10:11:35.000000000 -0500
+++ perl-5.8.8/t/op/local.t	2006-06-01 19:49:54.000000000 -0400
@@ -4,7 +4,7 @@
     chdir 't' if -d 't';
     require './test.pl';
 }
-plan tests => 81;
+plan tests => 85;
 
 my $list_assignment_supported = 1;
 
@@ -313,3 +313,19 @@
     { local @x{c,d,e}; }
     ok(! exists $x{c});
 }
+
+# local() and readonly magic variables
+
+eval { local $1 = 1 };
+like($@, qr/Modification of a read-only value attempted/);
+
+eval { for ($1) { local $_ = 1 } };
+like($@, qr/Modification of a read-only value attempted/);
+
+# make sure $1 is still read-only
+eval { for ($1) { local $_ = 1 } };
+is($@, "");
+
+# The s/// adds 'g' magic to $_, but it should remain non-readonly
+eval { for("a") { for $x (1,2) { local $_="b"; s/(.*)/+$1/ } } };
+is($@, "");
--- perl-5.8.8/scope.c.U27914	2005-09-30 09:56:51.000000000 -0400
+++ perl-5.8.8/scope.c	2006-06-01 19:49:54.000000000 -0400
@@ -205,9 +205,9 @@
     register SV * const sv = *sptr = NEWSV(0,0);
 
     if (SvTYPE(osv) >= SVt_PVMG && SvMAGIC(osv) && SvTYPE(osv) != SVt_PVGV) {
+	MAGIC *mg;
 	sv_upgrade(sv, SvTYPE(osv));
 	if (SvGMAGICAL(osv)) {
-	    MAGIC* mg;
 	    const bool oldtainted = PL_tainted;
 	    mg_get(osv);		/* note, can croak! */
 	    if (PL_tainting && PL_tainted &&
@@ -220,6 +220,16 @@
 	    PL_tainted = oldtainted;
 	}
 	SvMAGIC_set(sv, SvMAGIC(osv));
+	/* if it's a special scalar or if it has no 'set' magic,
+	 * propagate the SvREADONLY flag. --rgs 20030922 */
+	for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
+	    if (mg->mg_type == '\0'
+		    || !(mg->mg_virtual && mg->mg_virtual->svt_set))
+	    {
+		SvFLAGS(sv) |= SvREADONLY(osv);
+		break;
+	    }
+	}
 	SvFLAGS(sv) |= SvMAGICAL(osv);
 	/* XXX SvMAGIC() is *shared* between osv and sv.  This can
 	 * lead to coredumps when both SVs are destroyed without one