Change 33944 by [EMAIL PROTECTED] on 2008/05/28 18:24:46 Integrate: [ 33488] Subject: [PATCH] Correct misleading example in perlsyn.pod (given/when/default) From: Paul Fenwick <[EMAIL PROTECTED]> Date: Wed, 12 Mar 2008 13:19:15 +1100 Message-ID: <[EMAIL PROTECTED]> [ 33537] Subject: Re: [patch] refine make regen to be more selective From: Jim Cromie <[EMAIL PROTECTED]> Message-ID: <[EMAIL PROTECTED]> Date: Tue, 11 Mar 2008 18:16:14 -0600 [ 33538] Rename safer_rename() to rename_if_different(), to accurately describe what it does. Use File::Compare rather than Digest::MD5, as the files are small enough to simply read in. (File::Compare dates from 5.004) Remove safer_rename_always(), which isn't used. DRY by replacing the cargo-culted "open or die" with a new function safer_open(), which uses Gensym (5.002) to create an anonymous file handle, and opens and binmodes the file, or dies. This necessitates replacing bareword file handles with lexicals in all the callers. Correct the names of files in close or die constructions. [ 33539] Drag autodoc.pl and overload.pl into the age of safer_open(). Thanks to the wisdom of london.pm, stuff the filename into the SCALAR slot of the typeglob created in safer_open(), so that ... Add safer_close(), that will die (with the filename) if the close fails. [ 33544] Subject: [PATCH] Double warning with perl -we '\&$x' From: "Vincent Pit" <[EMAIL PROTECTED]> Date: Thu, 20 Mar 2008 12:06:47 +0100 (CET) Message-ID: <[EMAIL PROTECTED]>
Affected files ... ... //depot/maint-5.10/perl/autodoc.pl#2 integrate ... //depot/maint-5.10/perl/embed.pl#2 integrate ... //depot/maint-5.10/perl/keywords.pl#2 integrate ... //depot/maint-5.10/perl/opcode.pl#4 integrate ... //depot/maint-5.10/perl/overload.pl#2 integrate ... //depot/maint-5.10/perl/pod/perlsyn.pod#3 integrate ... //depot/maint-5.10/perl/reentr.pl#2 integrate ... //depot/maint-5.10/perl/regcomp.pl#3 integrate ... //depot/maint-5.10/perl/regen.pl#3 integrate ... //depot/maint-5.10/perl/regen_lib.pl#2 integrate ... //depot/maint-5.10/perl/sv.c#16 integrate ... //depot/maint-5.10/perl/t/lib/warnings/9uninit#5 integrate ... //depot/maint-5.10/perl/warnings.pl#2 integrate Differences ... ==== //depot/maint-5.10/perl/autodoc.pl#2 (text) ==== Index: perl/autodoc.pl --- perl/autodoc.pl#1~32694~ 2007-12-22 01:23:09.000000000 -0800 +++ perl/autodoc.pl 2008-05-28 11:24:46.000000000 -0700 @@ -33,7 +33,7 @@ } else { safer_unlink $filename; - open F, ">$filename" or die "Can't open $filename: $!"; + $F = safer_open($filename); binmode F; $F = \*F; } @@ -183,9 +183,7 @@ } safer_unlink "pod/perlapi.pod"; -open (DOC, ">pod/perlapi.pod") or - die "Can't create pod/perlapi.pod: $!\n"; -binmode DOC; +my $doc = safer_open("pod/perlapi.pod"); walk_table { # load documented functions into appropriate hash if (@_ > 1) { @@ -211,7 +209,7 @@ } } return ""; -} \*DOC; +} $doc; for (sort keys %docfuncs) { # Have you used a full for apidoc or just a func name? @@ -219,9 +217,9 @@ warn "Unable to place $_!\n"; } -readonly_header(\*DOC); +readonly_header($doc); -print DOC <<'_EOB_'; +print $doc <<'_EOB_'; =head1 NAME perlapi - autogenerated documentation for the perl public API @@ -248,15 +246,15 @@ # case insensitive sort, with fallback for determinacy for $key (sort { uc($a) cmp uc($b) || $a cmp $b } keys %apidocs) { my $section = $apidocs{$key}; - print DOC "\n=head1 $key\n\n=over 8\n\n"; + print $doc "\n=head1 $key\n\n=over 8\n\n"; # Again, fallback for determinacy for my $key (sort { uc($a) cmp uc($b) || $a cmp $b } keys %$section) { - docout(\*DOC, $key, $section->{$key}); + docout($doc, $key, $section->{$key}); } - print DOC "\n=back\n"; + print $doc "\n=back\n"; } -print DOC <<'_EOE_'; +print $doc <<'_EOE_'; =head1 AUTHORS @@ -278,16 +276,14 @@ _EOE_ -readonly_footer(\*DOC); +readonly_footer($doc); -close(DOC) or die "Error closing pod/perlapi.pod: $!"; +safer_close($doc); safer_unlink "pod/perlintern.pod"; -open(GUTS, ">pod/perlintern.pod") or - die "Unable to create pod/perlintern.pod: $!\n"; -binmode GUTS; -readonly_header(\*GUTS); -print GUTS <<'END'; +my $guts = safer_open("pod/perlintern.pod"); +readonly_header($guts); +print $guts <<'END'; =head1 NAME perlintern - autogenerated documentation of purely B<internal> @@ -305,14 +301,14 @@ for $key (sort { uc($a) cmp uc($b); } keys %gutsdocs) { my $section = $gutsdocs{$key}; - print GUTS "\n=head1 $key\n\n=over 8\n\n"; + print $guts "\n=head1 $key\n\n=over 8\n\n"; for my $key (sort { uc($a) cmp uc($b); } keys %$section) { - docout(\*GUTS, $key, $section->{$key}); + docout($guts, $key, $section->{$key}); } - print GUTS "\n=back\n"; + print $guts "\n=back\n"; } -print GUTS <<'END'; +print $guts <<'END'; =head1 AUTHORS @@ -325,6 +321,6 @@ perlguts(1), perlapi(1) END -readonly_footer(\*GUTS); +readonly_footer($guts); -close GUTS or die "Error closing pod/perlintern.pod: $!"; +safer_close($guts); ==== //depot/maint-5.10/perl/embed.pl#2 (xtext) ==== Index: perl/embed.pl --- perl/embed.pl#1~32694~ 2007-12-22 01:23:09.000000000 -0800 +++ perl/embed.pl 2008-05-28 11:24:46.000000000 -0700 @@ -79,15 +79,12 @@ defined $leader or $leader = do_not_edit ($filename); my $trailer = shift; my $F; - local *F; if (ref $filename) { # filehandle $F = $filename; } else { - safer_unlink $filename if $filename ne '/dev/null'; - open F, ">$filename" or die "Can't open $filename: $!"; - binmode F; - $F = \*F; + # safer_unlink $filename if $filename ne '/dev/null'; + $F = safer_open("$filename-new"); } print $F $leader if $leader; seek IN, 0, 0; # so we may restart @@ -111,7 +108,8 @@ } print $F $trailer if $trailer; unless (ref $filename) { - close $F or die "Error closing $filename: $!"; + safer_close($F); + rename_if_different("$filename-new", $filename); } } @@ -376,11 +374,9 @@ return hide("PL_$pre$sym", "PL_$sym"); } -safer_unlink 'embed.h'; -open(EM, '> embed.h') or die "Can't create embed.h: $!\n"; -binmode EM; +my $em = safer_open('embed.h-new'); -print EM do_not_edit ("embed.h"), <<'END'; +print $em do_not_edit ("embed.h"), <<'END'; /* (Doing namespace management portably in C is really gross.) */ @@ -444,18 +440,18 @@ # Remember the new state. $ifdef_state = $new_ifdef_state; $ret; -} \*EM, ""; +} $em, ""; if ($ifdef_state) { - print EM "#endif\n"; + print $em "#endif\n"; } for $sym (sort keys %ppsym) { $sym =~ s/^Perl_//; - print EM hide($sym, "Perl_$sym"); + print $em hide($sym, "Perl_$sym"); } -print EM <<'END'; +print $em <<'END'; #else /* PERL_IMPLICIT_CONTEXT */ @@ -522,26 +518,26 @@ # Remember the new state. $ifdef_state = $new_ifdef_state; $ret; -} \*EM, ""; +} $em, ""; if ($ifdef_state) { - print EM "#endif\n"; + print $em "#endif\n"; } for $sym (sort keys %ppsym) { $sym =~ s/^Perl_//; if ($sym =~ /^ck_/) { - print EM hide("$sym(a)", "Perl_$sym(aTHX_ a)"); + print $em hide("$sym(a)", "Perl_$sym(aTHX_ a)"); } elsif ($sym =~ /^pp_/) { - print EM hide("$sym()", "Perl_$sym(aTHX)"); + print $em hide("$sym()", "Perl_$sym(aTHX)"); } else { warn "Illegal symbol '$sym' in pp.sym"; } } -print EM <<'END'; +print $em <<'END'; #endif /* PERL_IMPLICIT_CONTEXT */ @@ -549,7 +545,7 @@ END -print EM <<'END'; +print $em <<'END'; /* Compatibility stubs. Compile extensions with -DPERL_NOCOMPAT to disable them. @@ -629,14 +625,12 @@ /* ex: set ro: */ END -close(EM) or die "Error closing EM: $!"; +safer_close($em); +rename_if_different('embed.h-new', 'embed.h'); -safer_unlink 'embedvar.h'; -open(EM, '> embedvar.h') - or die "Can't create embedvar.h: $!\n"; -binmode EM; +$em = safer_open('embedvar.h-new'); -print EM do_not_edit ("embedvar.h"), <<'END'; +print $em do_not_edit ("embedvar.h"), <<'END'; /* (Doing namespace management portably in C is really gross.) */ @@ -665,10 +659,10 @@ END for $sym (sort keys %intrp) { - print EM multon($sym,'I','vTHX->'); + print $em multon($sym,'I','vTHX->'); } -print EM <<'END'; +print $em <<'END'; #else /* !MULTIPLICITY */ @@ -677,14 +671,14 @@ END for $sym (sort keys %intrp) { - print EM multoff($sym,'I'); + print $em multoff($sym,'I'); } -print EM <<'END'; +print $em <<'END'; END -print EM <<'END'; +print $em <<'END'; #endif /* MULTIPLICITY */ @@ -693,21 +687,21 @@ END for $sym (sort keys %globvar) { - print EM multon($sym, 'G','my_vars->'); - print EM multon("G$sym",'', 'my_vars->'); + print $em multon($sym, 'G','my_vars->'); + print $em multon("G$sym",'', 'my_vars->'); } -print EM <<'END'; +print $em <<'END'; #else /* !PERL_GLOBAL_STRUCT */ END for $sym (sort keys %globvar) { - print EM multoff($sym,'G'); + print $em multoff($sym,'G'); } -print EM <<'END'; +print $em <<'END'; #endif /* PERL_GLOBAL_STRUCT */ @@ -716,26 +710,23 @@ END for $sym (sort @extvars) { - print EM hide($sym,"PL_$sym"); + print $em hide($sym,"PL_$sym"); } -print EM <<'END'; +print $em <<'END'; #endif /* PERL_POLLUTE */ /* ex: set ro: */ END -close(EM) or die "Error closing EM: $!"; +safer_close($em); +rename_if_different('embedvar.h-new', 'embedvar.h'); -safer_unlink 'perlapi.h'; -safer_unlink 'perlapi.c'; -open(CAPI, '> perlapi.c') or die "Can't create perlapi.c: $!\n"; -binmode CAPI; -open(CAPIH, '> perlapi.h') or die "Can't create perlapi.h: $!\n"; -binmode CAPIH; +my $capi = safer_open('perlapi.c-new'); +my $capih = safer_open('perlapi.h-new'); -print CAPIH do_not_edit ("perlapi.h"), <<'EOT'; +print $capih do_not_edit ("perlapi.h"), <<'EOT'; /* declare accessor functions for Perl variables */ #ifndef __perlapi_h__ @@ -840,14 +831,14 @@ EOT foreach $sym (sort keys %intrp) { - print CAPIH bincompat_var('I',$sym); + print $capih bincompat_var('I',$sym); } foreach $sym (sort keys %globvar) { - print CAPIH bincompat_var('G',$sym); + print $capih bincompat_var('G',$sym); } -print CAPIH <<'EOT'; +print $capih <<'EOT'; #endif /* !PERL_CORE */ #endif /* MULTIPLICITY */ @@ -856,9 +847,10 @@ /* ex: set ro: */ EOT -close CAPIH or die "Error closing CAPIH: $!"; +safer_close($capih); +rename_if_different('perlapi.h-new', 'perlapi.h'); -print CAPI do_not_edit ("perlapi.c"), <<'EOT'; +print $capi do_not_edit ("perlapi.c"), <<'EOT'; #include "EXTERN.h" #include "perl.h" @@ -937,7 +929,8 @@ /* ex: set ro: */ EOT -close(CAPI) or die "Error closing CAPI: $!"; +safer_close($capi); +rename_if_different('perlapi.c-new', 'perlapi.c'); # functions that take va_list* for implementing vararg functions # NOTE: makedef.pl must be updated if you add symbols to %vfuncs ==== //depot/maint-5.10/perl/keywords.pl#2 (xtext) ==== Index: perl/keywords.pl --- perl/keywords.pl#1~32694~ 2007-12-22 01:23:09.000000000 -0800 +++ perl/keywords.pl 2008-05-28 11:24:46.000000000 -0700 @@ -2,10 +2,9 @@ use strict; require 'regen_lib.pl'; -safer_unlink ("keywords.h"); -open(KW, ">keywords.h") || die "Can't create keywords.h: $!\n"; -binmode KW; -select KW; + +my $kw = safer_open("keywords.h-new"); +select $kw; print <<EOM; /* -*- buffer-read-only: t -*- @@ -35,9 +34,11 @@ print &tab(5, "#define KEY_$keyword"), $keynum++, "\n"; } -print KW "\n/* ex: set ro: */\n"; +print $kw "\n/* ex: set ro: */\n"; + +safer_close($kw); -close KW or die "Error closing keywords.h: $!"; +rename_if_different("keywords.h-new", "keywords.h"); ########################################################################### sub tab { ==== //depot/maint-5.10/perl/opcode.pl#4 (xtext) ==== Index: perl/opcode.pl --- perl/opcode.pl#3~33942~ 2008-05-27 18:21:26.000000000 -0700 +++ perl/opcode.pl 2008-05-28 11:24:46.000000000 -0700 @@ -8,11 +8,9 @@ my $opcode_new = 'opcode.h-new'; my $opname_new = 'opnames.h-new'; -open(OC, ">$opcode_new") || die "Can't create $opcode_new: $!\n"; -binmode OC; -open(ON, ">$opname_new") || die "Can't create $opname_new: $!\n"; -binmode ON; -select OC; +my $oc = safer_open($opcode_new); +my $on = safer_open($opname_new); +select $oc; # Read data. @@ -126,7 +124,7 @@ END -print ON <<"END"; +print $on <<"END"; /* -*- buffer-read-only: t -*- * * opnames.h @@ -148,13 +146,13 @@ my $i = 0; for (@ops) { - print ON "\t", &tab(3,"OP_\U$_,"), "/* ", $i++, " */\n"; + print $on "\t", &tab(3,"OP_\U$_,"), "/* ", $i++, " */\n"; } -print ON "\t", &tab(3,"OP_max"), "\n"; -print ON "} opcode;\n"; -print ON "\n#define MAXO ", scalar @ops, "\n"; -print ON "#define OP_phoney_INPUT_ONLY -1\n"; -print ON "#define OP_phoney_OUTPUT_ONLY -2\n\n"; +print $on "\t", &tab(3,"OP_max"), "\n"; +print $on "} opcode;\n"; +print $on "\n#define MAXO ", scalar @ops, "\n"; +print $on "#define OP_phoney_INPUT_ONLY -1\n"; +print $on "#define OP_phoney_OUTPUT_ONLY -2\n\n"; # Emit op names and descriptions. @@ -388,40 +386,35 @@ END if (keys %OP_IS_SOCKET) { - print ON "\n#define OP_IS_SOCKET(op) \\\n\t("; - print ON join(" || \\\n\t ", + print $on "\n#define OP_IS_SOCKET(op) \\\n\t("; + print $on join(" || \\\n\t ", map { "(op) == OP_" . uc() } sort keys %OP_IS_SOCKET); - print ON ")\n\n"; + print $on ")\n\n"; } if (keys %OP_IS_FILETEST) { - print ON "\n#define OP_IS_FILETEST(op) \\\n\t("; - print ON join(" || \\\n\t ", + print $on "\n#define OP_IS_FILETEST(op) \\\n\t("; + print $on join(" || \\\n\t ", map { "(op) == OP_" . uc() } sort keys %OP_IS_FILETEST); - print ON ")\n\n"; + print $on ")\n\n"; } -print OC "/* ex: set ro: */\n"; -print ON "/* ex: set ro: */\n"; +print $oc "/* ex: set ro: */\n"; +print $on "/* ex: set ro: */\n"; -close OC or die "Error closing opcode.h: $!"; -close ON or die "Error closing opnames.h: $!"; +safer_close($oc); +safer_close($on); -foreach ('opcode.h', 'opnames.h') { - safer_rename_silent $_, "$_-old"; -} -safer_rename $opcode_new, 'opcode.h'; -safer_rename $opname_new, 'opnames.h'; +rename_if_different $opcode_new, 'opcode.h'; +rename_if_different $opname_new, 'opnames.h'; my $pp_proto_new = 'pp_proto.h-new'; my $pp_sym_new = 'pp.sym-new'; -open PP, ">$pp_proto_new" or die "Error creating $pp_proto_new: $!"; -binmode PP; -open PPSYM, ">$pp_sym_new" or die "Error creating $pp_sym_new: $!"; -binmode PPSYM; +my $pp = safer_open($pp_proto_new); +my $ppsym = safer_open($pp_sym_new); -print PP <<"END"; +print $pp <<"END"; /* -*- buffer-read-only: t -*- !!!!!!! DO NOT EDIT THIS FILE !!!!!!! This file is built by opcode.pl from its data. Any changes made here @@ -430,7 +423,7 @@ END -print PPSYM <<"END"; +print $ppsym <<"END"; # -*- buffer-read-only: t -*- # # !!!!!!! DO NOT EDIT THIS FILE !!!!!!! @@ -442,30 +435,27 @@ for (sort keys %ckname) { - print PP "PERL_CKDEF(Perl_$_)\n"; - print PPSYM "Perl_$_\n"; + print $pp "PERL_CKDEF(Perl_$_)\n"; + print $ppsym "Perl_$_\n"; #OP *\t", &tab(3,$_),"(OP* o);\n"; } -print PP "\n\n"; +print $pp "\n\n"; for (@ops) { next if /^i_(pre|post)(inc|dec)$/; next if /^custom$/; - print PP "PERL_PPDEF(Perl_pp_$_)\n"; - print PPSYM "Perl_pp_$_\n"; + print $pp "PERL_PPDEF(Perl_pp_$_)\n"; + print $ppsym "Perl_pp_$_\n"; } -print PP "\n/* ex: set ro: */\n"; -print PPSYM "\n# ex: set ro:\n"; +print $pp "\n/* ex: set ro: */\n"; +print $ppsym "\n# ex: set ro:\n"; -close PP or die "Error closing pp_proto.h: $!"; -close PPSYM or die "Error closing pp.sym: $!"; +safer_close($pp); +safer_close($ppsym); -foreach ('pp_proto.h', 'pp.sym') { - safer_rename_silent $_, "$_-old"; -} -safer_rename $pp_proto_new, 'pp_proto.h'; -safer_rename $pp_sym_new, 'pp.sym'; +rename_if_different $pp_proto_new, 'pp_proto.h'; +rename_if_different $pp_sym_new, 'pp.sym'; END { foreach ('opcode.h', 'opnames.h', 'pp_proto.h', 'pp.sym') { ==== //depot/maint-5.10/perl/overload.pl#2 (text) ==== Index: perl/overload.pl --- perl/overload.pl#1~32694~ 2007-12-22 01:23:09.000000000 -0800 +++ perl/overload.pl 2008-05-28 11:24:46.000000000 -0700 @@ -22,10 +22,8 @@ } safer_unlink ('overload.h', 'overload.c'); -die "overload.h: $!" unless open(C, ">overload.c"); -binmode C; -die "overload.h: $!" unless open(H, ">overload.h"); -binmode H; +my $c = safer_open("overload.c"); +my $h = safer_open("overload.h"); sub print_header { my $file = shift; @@ -46,10 +44,10 @@ EOF } -select C; +select $c; print_header('overload.c'); -select H; +select $h; print_header('overload.h'); print <<'EOF'; @@ -67,7 +65,7 @@ EOF -print C <<'EOF'; +print $c <<'EOF'; #define AMG_id2name(id) (PL_AMG_names[id]+1) #define AMG_id2namelen(id) (PL_AMG_namelens[id]-1) @@ -77,10 +75,10 @@ my $last = pop @names; -print C " $_,\n" foreach map { length $_ } @names; +print $c " $_,\n" foreach map { length $_ } @names; my $lastlen = length $last; -print C <<"EOT"; +print $c <<"EOT"; $lastlen }; @@ -92,15 +90,15 @@ overload.pm. */ EOT -print C " \"$_\",\n" foreach map { s/(["\\"])/\\$1/g; $_ } @names; +print $c " \"$_\",\n" foreach map { s/(["\\"])/\\$1/g; $_ } @names; -print C <<"EOT"; +print $c <<"EOT"; "$last" }; EOT -close H or die $!; -close C or die $!; +safer_close($h); +safer_close($c); __DATA__ # Fallback should be the first ==== //depot/maint-5.10/perl/pod/perlsyn.pod#3 (text) ==== Index: perl/pod/perlsyn.pod --- perl/pod/perlsyn.pod#2~33123~ 2008-01-30 03:45:08.000000000 -0800 +++ perl/pod/perlsyn.pod 2008-05-28 11:24:46.000000000 -0700 @@ -634,7 +634,7 @@ given($foo) { when (/x/) { say '$foo contains an x'; continue } when (/y/) { say '$foo contains a y' } - default { say '$foo contains neither an x nor a y' } + default { say '$foo does not contain a y' } } =head3 Switching in a loop ==== //depot/maint-5.10/perl/reentr.pl#2 (text) ==== Index: perl/reentr.pl --- perl/reentr.pl#1~32694~ 2007-12-22 01:23:09.000000000 -0800 +++ perl/reentr.pl 2008-05-28 11:24:46.000000000 -0700 @@ -13,7 +13,7 @@ use strict; use Getopt::Std; my %opts; -getopts('U', \%opts); +getopts('Uv', \%opts); my %map = ( V => "void", @@ -40,10 +40,9 @@ # Example #3: S_CBI means type func_r(const char*, char*, int) -safer_unlink 'reentr.h'; -die "reentr.h: $!" unless open(H, ">reentr.h"); -binmode H; -select H; +# safer_unlink 'reentr.h'; +my $h = safer_open("reentr.h-new"); +select $h; print <<EOF; /* -*- buffer-read-only: t -*- * @@ -332,7 +331,7 @@ # Prepare to continue writing the reentr.h. -select H; +select $h; { # Write out all the known prototype signatures. @@ -788,14 +787,14 @@ /* ex: set ro: */ EOF -close(H); +safer_close($h); +rename_if_different('reentr.h-new', 'reentr.h'); # Prepare to write the reentr.c. -safer_unlink 'reentr.c'; -die "reentr.c: $!" unless open(C, ">reentr.c"); -binmode C; -select C; +# safer_unlink 'reentr.c'; +my $c = safer_open("reentr.c-new"); +select $c; print <<EOF; /* -*- buffer-read-only: t -*- * @@ -1085,6 +1084,9 @@ /* ex: set ro: */ EOF +safer_close($c); +rename_if_different('reentr.c-new', 'reentr.c'); + __DATA__ asctime S |time |const struct tm|B_SB|B_SBI|I_SB|I_SBI crypt CC |crypt |struct crypt_data|B_CCS|B_CCD|D=CRYPTD* ==== //depot/maint-5.10/perl/regcomp.pl#3 (text) ==== Index: perl/regcomp.pl --- perl/regcomp.pl#2~33136~ 2008-01-30 11:55:32.000000000 -0800 +++ perl/regcomp.pl 2008-05-28 11:24:46.000000000 -0700 @@ -68,11 +68,9 @@ unlink $tmp_h if -f $tmp_h; -open OUT, ">$tmp_h"; -#*OUT=\*STDOUT; -binmode OUT; +my $out = safer_open($tmp_h); -printf OUT <<EOP, +printf $out <<EOP, /* -*- buffer-read-only: t -*- !!!!!!! DO NOT EDIT THIS FILE !!!!!!! This file is built by regcomp.pl from regcomp.sym. @@ -92,16 +90,16 @@ for ($ind=1; $ind <= $lastregop ; $ind++) { my $oind = $ind - 1; - printf OUT "#define\t%*s\t%d\t/* %#04x %s */\n", + printf $out "#define\t%*s\t%d\t/* %#04x %s */\n", -$width, $name[$ind], $ind-1, $ind-1, $rest[$ind]; } -print OUT "\t/* ------------ States ------------- */\n"; +print $out "\t/* ------------ States ------------- */\n"; for ( ; $ind <= $tot ; $ind++) { - printf OUT "#define\t%*s\t(REGNODE_MAX + %d)\t/* %s */\n", + printf $out "#define\t%*s\t(REGNODE_MAX + %d)\t/* %s */\n", -$width, $name[$ind], $ind - $lastregop, $rest[$ind]; } -print OUT <<EOP; +print $out <<EOP; /* PL_regkind[] What type of regop or state is this. */ @@ -113,13 +111,13 @@ $ind = 0; while (++$ind <= $tot) { - printf OUT "\t%*s\t/* %*s */\n", + printf $out "\t%*s\t/* %*s */\n", -1-$twidth, "$type[$ind],", -$width, $name[$ind]; - print OUT "\t/* ------------ States ------------- */\n" + print $out "\t/* ------------ States ------------- */\n" if $ind == $lastregop and $lastregop != $tot; } -print OUT <<EOP; +print $out <<EOP; }; #endif @@ -134,11 +132,11 @@ my $size = 0; $size = "EXTRA_SIZE(struct regnode_$args[$ind])" if $args[$ind]; - printf OUT "\t%*s\t/* %*s */\n", + printf $out "\t%*s\t/* %*s */\n", -37, "$size,",-$rwidth,$name[$ind]; } -print OUT <<EOP; +print $out <<EOP; }; /* reg_off_by_arg[] - Which argument holds the offset to the next node */ @@ -150,11 +148,11 @@ while (++$ind <= $lastregop) { my $size = $longj[$ind] || 0; - printf OUT "\t%d,\t/* %*s */\n", + printf $out "\t%d,\t/* %*s */\n", $size, -$rwidth, $name[$ind] } -print OUT <<EOP; +print $out <<EOP; }; #endif /* REG_COMP_C */ @@ -173,17 +171,17 @@ while (++$ind <= $tot) { my $size = $longj[$ind] || 0; - printf OUT "\t%*s\t/* $sym%#04x */\n", + printf $out "\t%*s\t/* $sym%#04x */\n", -3-$width,qq("$name[$ind]",), $ind - $ofs; if ($ind == $lastregop and $lastregop != $tot) { - print OUT "\t/* ------------ States ------------- */\n"; + print $out "\t/* ------------ States ------------- */\n"; $ofs = $lastregop; $sym = 'REGNODE_MAX +'; } } -print OUT <<EOP; +print $out <<EOP; }; #endif /* DOINIT */ @@ -211,20 +209,20 @@ } } my %vrxf=reverse %rxfv; -printf OUT "\t/* Bits in extflags defined: %032b */\n",$val; +printf $out "\t/* Bits in extflags defined: %032b */\n",$val; for (0..31) { my $n=$vrxf{2**$_}||"UNUSED_BIT_$_"; $n=~s/^RXf_(PMf_)?//; - printf OUT qq(\t%-20s/* 0x%08x */\n), + printf $out qq(\t%-20s/* 0x%08x */\n), qq("$n",),2**$_; } -print OUT <<EOP; +print $out <<EOP; }; #endif /* DOINIT */ /* ex: set ro: */ EOP -close OUT or die "close $tmp_h: $!"; +safer_close($out); -safer_rename $tmp_h, 'regnodes.h'; +rename_if_different $tmp_h, 'regnodes.h'; ==== //depot/maint-5.10/perl/regen.pl#3 (text) ==== Index: perl/regen.pl --- perl/regen.pl#2~33731~ 2008-04-22 12:31:58.000000000 -0700 +++ perl/regen.pl 2008-05-28 11:24:46.000000000 -0700 @@ -13,8 +13,8 @@ require 'regen_lib.pl'; # keep warnings.pl in sync with the CPAN distribution by not requiring core -# changes -safer_unlink ("warnings.h", "lib/warnings.pm"); +# changes. Um, what ? +# safer_unlink ("warnings.h", "lib/warnings.pm"); my %gen = ( 'autodoc.pl' => [qw[pod/perlapi.pod pod/perlintern.pod]], ==== //depot/maint-5.10/perl/regen_lib.pl#2 (text) ==== Index: perl/regen_lib.pl --- perl/regen_lib.pl#1~32694~ 2007-12-22 01:23:09.000000000 -0800 +++ perl/regen_lib.pl 2008-05-28 11:24:46.000000000 -0700 @@ -2,6 +2,8 @@ use strict; use vars qw($Is_W32 $Is_OS2 $Is_Cygwin $Is_NetWare $Needs_Write); use Config; # Remember, this is running using an existing perl +use File::Compare; +use Symbol; # Common functions needed by the regen scripts @@ -38,8 +40,31 @@ rename $from, $to; } -sub safer_rename { +sub rename_if_different { my ($from, $to) = @_; + + if (compare($from, $to) == 0) { + warn "no changes between '$from' & '$to'\n"; + safer_unlink($from); + return; + } + warn "changed '$from' to '$to'\n"; safer_rename_silent($from, $to) or die "renaming $from to $to: $!"; } + +# Saf*er*, but not totally safe. And assumes always open for output. +sub safer_open { + my $name = shift; + my $fh = gensym; + open $fh, ">$name" or die "Can't create $name: $!"; + *{$fh}->{SCALAR} = $name; + binmode $fh; + $fh; +} + +sub safer_close { + my $fh = shift; + close $fh or die 'Error closing ' . *{$fh}->{SCALAR} . ": $!"; +} + 1; ==== //depot/maint-5.10/perl/sv.c#16 (text) ==== Index: perl/sv.c --- perl/sv.c#15~33942~ 2008-05-27 18:21:26.000000000 -0700 +++ perl/sv.c 2008-05-28 11:24:46.000000000 -0700 @@ -7635,7 +7635,7 @@ LEAVE; if (!GvCVu(gv)) Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"", - SVfARG(sv)); + SVfARG(SvOK(sv) ? sv : &PL_sv_no)); } return GvCVu(gv); } ==== //depot/maint-5.10/perl/t/lib/warnings/9uninit#5 (text) ==== Index: perl/t/lib/warnings/9uninit --- perl/t/lib/warnings/9uninit#4~33942~ 2008-05-27 18:21:26.000000000 -0700 +++ perl/t/lib/warnings/9uninit 2008-05-28 11:24:46.000000000 -0700 @@ -1064,8 +1064,6 @@ reset $g1; EXPECT Use of uninitialized value $m1 in subroutine dereference at - line 5. -Use of uninitialized value $m1 in subroutine dereference at - line 5. -Use of uninitialized value $g1 in subroutine dereference at - line 6. Use of uninitialized value $g1 in subroutine dereference at - line 6. Use of uninitialized value $m1 in splice at - line 9. Use of uninitialized value $g1 in splice at - line 9. ==== //depot/maint-5.10/perl/warnings.pl#2 (text) ==== Index: perl/warnings.pl --- perl/warnings.pl#1~32694~ 2007-12-22 01:23:09.000000000 -0800 +++ perl/warnings.pl 2008-05-28 11:24:46.000000000 -0700 @@ -3,7 +3,8 @@ $VERSION = '1.02_02'; BEGIN { - push @INC, './lib'; + require 'regen_lib.pl'; + push @INC, './lib'; } use strict ; @@ -248,14 +249,10 @@ exit ; } -unlink "warnings.h"; -unlink "lib/warnings.pm"; -open(WARN, ">warnings.h") || die "Can't create warnings.h: $!\n"; -binmode WARN; -open(PM, ">lib/warnings.pm") || die "Can't create lib/warnings.pm: $!\n"; -binmode PM; +my $warn = safer_open("warnings.h-new"); +my $pm = safer_open("lib/warnings.pm-new"); -print WARN <<'EOM' ; +print $warn <<'EOM' ; /* -*- buffer-read-only: t -*- !!!!!!! DO NOT EDIT THIS FILE !!!!!!! This file is built by warnings.pl @@ -307,19 +304,19 @@ my $last_ver = 0; foreach $k (sort { $a <=> $b } keys %ValueToName) { my ($name, $version) = @{ $ValueToName{$k} }; - print WARN "\n/* Warnings Categories added in Perl $version */\n\n" + print $warn "\n/* Warnings Categories added in Perl $version */\n\n" if $last_ver != $version ; - print WARN tab(5, "#define WARN_$name"), "$k\n" ; + print $warn tab(5, "#define WARN_$name"), "$k\n" ; $last_ver = $version ; } -print WARN "\n" ; +print $warn "\n" ; -print WARN tab(5, '#define WARNsize'), "$warn_size\n" ; +print $warn tab(5, '#define WARNsize'), "$warn_size\n" ; #print WARN tab(5, '#define WARN_ALLstring'), '"', ('\377' x $warn_size) , "\"\n" ; -print WARN tab(5, '#define WARN_ALLstring'), '"', ('\125' x $warn_size) , "\"\n" ; -print WARN tab(5, '#define WARN_NONEstring'), '"', ('\0' x $warn_size) , "\"\n" ; +print $warn tab(5, '#define WARN_ALLstring'), '"', ('\125' x $warn_size) , "\"\n" ; +print $warn tab(5, '#define WARN_NONEstring'), '"', ('\0' x $warn_size) , "\"\n" ; -print WARN <<'EOM'; +print $warn <<'EOM'; #define isLEXWARN_on (PL_curcop->cop_warnings != pWARN_STD) #define isLEXWARN_off (PL_curcop->cop_warnings == pWARN_STD) @@ -364,68 +361,70 @@ /* ex: set ro: */ EOM -close WARN ; +safer_close $warn; +rename_if_different("warnings.h-new", "warnings.h"); while (<DATA>) { last if /^KEYWORDS$/ ; - print PM $_ ; + print $pm $_ ; } #$list{'all'} = [ $offset .. 8 * ($warn_size/2) - 1 ] ; $last_ver = 0; -print PM "our %Offsets = (\n" ; +print $pm "our %Offsets = (\n" ; foreach my $k (sort { $a <=> $b } keys %ValueToName) { my ($name, $version) = @{ $ValueToName{$k} }; $name = lc $name; $k *= 2 ; if ( $last_ver != $version ) { - print PM "\n"; - print PM tab(4, " # Warnings Categories added in Perl $version"); - print PM "\n\n"; + print $pm "\n"; + print $pm tab(4, " # Warnings Categories added in Perl $version"); + print $pm "\n\n"; } - print PM tab(4, " '$name'"), "=> $k,\n" ; + print $pm tab(4, " '$name'"), "=> $k,\n" ; $last_ver = $version; } -print PM " );\n\n" ; +print $pm " );\n\n" ; -print PM "our %Bits = (\n" ; +print $pm "our %Bits = (\n" ; foreach $k (sort keys %list) { my $v = $list{$k} ; my @list = sort { $a <=> $b } @$v ; - print PM tab(4, " '$k'"), '=> "', + print $pm tab(4, " '$k'"), '=> "', # mkHex($warn_size, @list), mkHex($warn_size, map $_ * 2 , @list), '", # [', mkRange(@list), "]\n" ; } -print PM " );\n\n" ; +print $pm " );\n\n" ; -print PM "our %DeadBits = (\n" ; +print $pm "our %DeadBits = (\n" ; foreach $k (sort keys %list) { my $v = $list{$k} ; my @list = sort { $a <=> $b } @$v ; - print PM tab(4, " '$k'"), '=> "', + print $pm tab(4, " '$k'"), '=> "', # mkHex($warn_size, @list), mkHex($warn_size, map $_ * 2 + 1 , @list), '", # [', mkRange(@list), "]\n" ; } -print PM " );\n\n" ; -print PM '$NONE = "', ('\0' x $warn_size) , "\";\n" ; -print PM '$LAST_BIT = ' . "$index ;\n" ; -print PM '$BYTES = ' . "$warn_size ;\n" ; +print $pm " );\n\n" ; +print $pm '$NONE = "', ('\0' x $warn_size) , "\";\n" ; +print $pm '$LAST_BIT = ' . "$index ;\n" ; +print $pm '$BYTES = ' . "$warn_size ;\n" ; while (<DATA>) { - print PM $_ ; + print $pm $_ ; } -print PM "# ex: set ro:\n"; -close PM ; +print $pm "# ex: set ro:\n"; +safer_close $pm; +rename_if_different("lib/warnings.pm-new", "lib/warnings.pm"); __END__ # -*- buffer-read-only: t -*- End of Patch.