summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGurusamy Sarathy <gsar@cpan.org>2000-02-10 00:56:27 +0000
committerGurusamy Sarathy <gsar@cpan.org>2000-02-10 00:56:27 +0000
commit445b3f5100bf9bd5899b8cc5eed925e1cf28b5b2 (patch)
tree45125744e1f40f1dd45ced537a4ed38b83e08b2c
parent0ea24a45c99c9fd1365aeec509bea7218409d1a1 (diff)
downloadperl-445b3f5100bf9bd5899b8cc5eed925e1cf28b5b2.tar.gz
formline() could wipe out readonly-ness, freeing constants
prematurely, or affect cloning of pad constants p4raw-id: //depot/perl@5056
-rw-r--r--pp_ctl.c9
-rwxr-xr-xt/op/write.t17
2 files changed, 21 insertions, 5 deletions
diff --git a/pp_ctl.c b/pp_ctl.c
index 972c21d30c..7b4cbfea49 100644
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -302,8 +302,13 @@ PP(pp_formline)
bool item_is_utf = FALSE;
if (!SvMAGICAL(tmpForm) || !SvCOMPILED(tmpForm)) {
- SvREADONLY_off(tmpForm);
- doparseform(tmpForm);
+ if (SvREADONLY(tmpForm)) {
+ SvREADONLY_off(tmpForm);
+ doparseform(tmpForm);
+ SvREADONLY_on(tmpForm);
+ }
+ else
+ doparseform(tmpForm);
}
SvPV_force(PL_formtarget, len);
diff --git a/t/op/write.t b/t/op/write.t
index 9918b2f57f..87d50429f4 100755
--- a/t/op/write.t
+++ b/t/op/write.t
@@ -1,8 +1,6 @@
#!./perl
-# $RCSfile: write.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:38 $
-
-print "1..6\n";
+print "1..8\n";
my $CAT = ($^O eq 'MSWin32') ? 'type' : 'cat';
@@ -190,3 +188,16 @@ if (`$CAT Op_write.tmp` eq $right)
else
{ print "not ok 6\n"; }
+# test lexicals and globals
+{
+ my $this = "ok";
+ our $that = 7;
+ format LEX =
+@<<@|
+$this,$that
+.
+ open(LEX, ">&STDOUT") or die;
+ write LEX;
+ $that = 8;
+ write LEX;
+}