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