In perl.git, the branch smoke-me/ilmari/remove-dollar-hat-encoding has been updated
<http://perl5.git.perl.org/perl.git/commitdiff/de47be304fa4e5210092a12b38fe8738c85850ad?hp=daf9b8fd72a6f44088404e203ef960f2d7f6c500> discards daf9b8fd72a6f44088404e203ef960f2d7f6c500 (commit) - Log ----------------------------------------------------------------- commit de47be304fa4e5210092a12b38fe8738c85850ad Author: Dagfinn Ilmari Mannsåker <[email protected]> Date: Thu Jun 1 18:16:56 2017 +0100 Make setting ${^ENCODING} to a defined value fatal ----------------------------------------------------------------------- Summary of changes: AUTHORS | 1 + MANIFEST | 1 + Porting/Maintainers.pl | 2 +- Porting/bench.pl | 2 +- Porting/cmpVERSION.pl | 7 + Porting/deparse-skips.txt | 239 ++++++----- README.synology | 14 +- cpan/ExtUtils-Install/lib/ExtUtils/Install.pm | 192 +++++---- cpan/ExtUtils-Install/lib/ExtUtils/Installed.pm | 2 +- cpan/ExtUtils-Install/lib/ExtUtils/Packlist.pm | 2 +- cpan/ExtUtils-Install/t/Install.t | 14 +- cpan/ExtUtils-Install/t/InstallWithMM.t | 2 +- cpan/ExtUtils-Install/t/Installed.t | 3 + .../t/lib/MakeMaker/Test/Setup/BFD.pm | 12 + dist/Module-CoreList/t/maintainer.t | 3 + doop.c | 8 +- gv.c | 2 + hints/freebsd.sh | 9 + lib/B/Deparse.pm | 247 +++++++++++- lib/B/Deparse.t | 55 ++- lib/B/Op_private.pm | 6 +- mg.c | 23 +- op.c | 6 + opcode.h | 437 +++++++++++---------- perl.h | 7 +- pod/perldata.pod | 6 +- pod/perldelta.pod | 14 + pod/perldiag.pod | 34 +- pod/perlrun.pod | 1 - pp.c | 44 ++- pp.h | 6 +- pp_ctl.c | 36 +- pp_sys.c | 8 +- regen/op_private | 2 +- regexec.c | 3 + sv.c | 52 +-- t/TEST | 20 +- t/base/rs.t | 32 +- t/lib/croak/pp_sys | 59 +++ t/lib/croak/toke | 17 + t/lib/warnings/9uninit | 12 +- t/lib/warnings/mg | 20 - t/lib/warnings/pp_sys | 59 --- t/lib/warnings/toke | 18 - t/op/chdir.t | 23 +- t/op/closure.t | 2 +- t/op/eval.t | 34 +- t/op/heredoc.t | 12 +- t/op/lex.t | 5 +- t/op/ref.t | 63 ++- t/op/stat.t | 29 +- t/perf/benchmarks | 34 ++ t/perf/optree.t | 3 +- t/porting/cmp_version.t | 7 + t/uni/heavy.t | 38 ++ toke.c | 2 +- 56 files changed, 1273 insertions(+), 718 deletions(-) create mode 100644 t/uni/heavy.t diff --git a/AUTHORS b/AUTHORS index 40c6393e00..7ef3c5c5d2 100644 --- a/AUTHORS +++ b/AUTHORS @@ -402,6 +402,7 @@ Erich Rickheit Eryq <[email protected]> Etienne Grossman <[email protected]> Eugene Alterman <[email protected]> +Eugen Konkov <[email protected]> Evan Miller <[email protected]> Evan Zacks <[email protected]> Fabien Tassin <[email protected]> diff --git a/MANIFEST b/MANIFEST index e474e51f9a..8c4950e1b4 100644 --- a/MANIFEST +++ b/MANIFEST @@ -5880,6 +5880,7 @@ t/uni/fold.t See if Unicode folding works t/uni/goto.t See if Unicode goto &sub works t/uni/greek.t See if Unicode in greek works t/uni/gv.t See if Unicode GVs work. +t/uni/heavy.t See if utf8_heavy.pl uses perl that depends on it t/uni/labels.t See if Unicode labels work t/uni/latin2.t See if Unicode in latin2 works t/uni/lex_utf8.t See if Unicode in lexer works diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl index 26ada3539f..b7d4b3b8fe 100755 --- a/Porting/Maintainers.pl +++ b/Porting/Maintainers.pl @@ -446,7 +446,7 @@ use File::Glob qw(:case); }, 'ExtUtils::Install' => { - 'DISTRIBUTION' => 'BINGOS/ExtUtils-Install-2.04.tar.gz', + 'DISTRIBUTION' => 'BINGOS/ExtUtils-Install-2.14.tar.gz', 'FILES' => q[cpan/ExtUtils-Install], 'EXCLUDED' => [ qw( t/lib/Test/Builder.pm diff --git a/Porting/bench.pl b/Porting/bench.pl index 840d7231d0..224e862e66 100755 --- a/Porting/bench.pl +++ b/Porting/bench.pl @@ -431,7 +431,7 @@ my %OPTS = ( . "'$OPTS{sort}'\n"; } my ($field, $perl) = @s; - die "Error: --sort: unknown field '$field\n" + die "Error: --sort: unknown field '$field'\n" unless $VALID_FIELDS{$field}; # the 'perl' value will be validated later, after we have processed # the perls diff --git a/Porting/cmpVERSION.pl b/Porting/cmpVERSION.pl index 01f77c8e82..dd21b655fe 100755 --- a/Porting/cmpVERSION.pl +++ b/Porting/cmpVERSION.pl @@ -81,6 +81,7 @@ if ($exclude_upstream) { # usually because they pull in their version from some other file. my %skip; @skip{ + 'cpan/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm', # just a test module 'cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/BFD.pm', # just a test module 'cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/XS.pm', # just a test module 'cpan/IO-Compress/lib/File/GlobMapper.pm', # upstream needs to supply $VERSION @@ -169,6 +170,7 @@ unless (%module_diffs) { } printf "1..%d\n" => scalar keys %module_diffs if $tap; +print "#\n# Comparing against $tag_to_compare ....\n#\n" if $tap; my $count; my $diff_cmd = "git --no-pager diff $tag_to_compare "; @@ -194,9 +196,14 @@ foreach my $pm_file (sort keys %module_diffs) { print "ok $count - $pm_file\n" if $tap; } else { if ($tap) { + print "#\n# " . '-' x 75 . "\n" + . "# Version number ($pm_version) unchanged since" + . " $tag_to_compare, but contents have changed:\n#\n"; foreach (sort @{$module_diffs{$pm_file}}) { print "# $_" for `$diff_cmd $q$_$q`; } + print "# " . '-' x 75 . "\n"; + if (exists $skip_versions{$pm_file} and grep $pm_version eq $_, @{$skip_versions{$pm_file}}) { print "ok $count - SKIP $pm_file version $pm_version\n"; diff --git a/Porting/deparse-skips.txt b/Porting/deparse-skips.txt index efac18fb0b..130fcaaff2 100644 --- a/Porting/deparse-skips.txt +++ b/Porting/deparse-skips.txt @@ -31,31 +31,79 @@ __DEPARSE_FAILURES__ -../cpan/Scalar-List-Utils/t/proto.t -../cpan/Term-ANSIColor/t/taint/basic.t -../cpan/autodie/t/internal.t -../cpan/AutoLoader/t/01AutoLoader.t -../cpan/CGI/t/utf8.t -../cpan/ExtUtils-MakeMaker/t/xs.t -../cpan/File-Path/t/taint.t -../cpan/Module-Build/t/manifypods_with_utf8.t -../cpan/Socket/t/sockaddr.t -../cpan/Term-ANSIColor/t/taint.t -../cpan/Test-Simple/t/Builder/carp.t -../cpan/Test-Simple/t/fail-more.t -../cpan/Test-Simple/t/is_deeply_fail.t -../cpan/Test-Simple/t/plan.t -../cpan/Test-Simple/t/plan_bad.t -../cpan/Test-Simple/t/subtest/line_numbers.t -../cpan/Test-Simple/t/subtest/predicate.t -../cpan/autodie/t/00-load.t +base/lex.t # checks regexp stringification +comp/final_line_num.t # tests syntax error after BEGIN block +comp/fold.t # mutability of folded constants +comp/parser.t # crazy #line directives ==> shell syntax errors +mro/basic_01_c3_utf8.t +mro/basic_01_dfs_utf8.t +mro/complex_c3_utf8.t +mro/isarev.t +mro/isarev_utf8.t +op/attrhand.t # Custom attrs ignored; also AH provides none +op/caller.t +op/each.t # utf8ness of deparsed strings +op/goto.t +op/gv.t # glob copy constants +op/hexfp.t +op/index.t +op/join.t # mutability of folded constants +op/length.t # utf8ness of deparsed strings +op/lexsub.t +op/local.t +op/lvref.t +op/not.t +op/overload_integer.t +op/override.t +op/pack.t +op/postfixderef.t +op/range.t +op/readline.t +op/srand.t +op/sub_lval.t +op/sub.t +op/switch.t +op/symbolcache.t +op/taint.t +op/vec.t +op/warn.t +op/write.t +porting/globvar.t +re/overload.t # [perl #123385] %^H output +re/pat_advanced.t # [perl #123417] +re/pat_rt_report.t # malformed utf8 constant; also /\c@/ -> /\c\@/ +re/pat.t # [perl #90590] +re/regexp_unicode_prop.t +re/regex_sets.t +re/reg_fold.t # [perl #123385] %^H output +re/rxcode.t # checks regexp stringification +re/subst.t +run/switchd-78586.t # -I on #! line is not deparsed +run/switchI.t # -I on #! line is not deparsed +uni/attrs.t +uni/bless.t +uni/gv.t +uni/labels.t +uni/lex_utf8.t +uni/method.t +uni/package.t +uni/parser.t +uni/readline.t +uni/select.t +uni/stash.t +uni/tie.t +uni/universal.t +uni/variables.t +../cpan/Archive-Tar/t/03_file.t # constant sub ref: FOO->() ../cpan/autodie/t/autodie.t +../cpan/autodie/t/basic_exceptions.t +../cpan/autodie/t/binmode.t ../cpan/autodie/t/blog_hints.t ../cpan/autodie/t/caller.t ../cpan/autodie/t/chmod.t ../cpan/autodie/t/chown.t -../cpan/autodie/t/context.t ../cpan/autodie/t/context_lexical.t +../cpan/autodie/t/context.t ../cpan/autodie/t/crickey.t ../cpan/autodie/t/dbmopen.t ../cpan/autodie/t/eval_error.t @@ -63,80 +111,86 @@ __DEPARSE_FAILURES__ ../cpan/autodie/t/exceptions.t ../cpan/autodie/t/exec.t ../cpan/autodie/t/filehandles.t -../cpan/autodie/t/hints.t +../cpan/autodie/t/fileno.t ../cpan/autodie/t/hints_insist.t ../cpan/autodie/t/hints_pod_examples.t ../cpan/autodie/t/hints_provider_does.t ../cpan/autodie/t/hints_provider_easy_does_it.t ../cpan/autodie/t/hints_provider_isa.t +../cpan/autodie/t/hints.t +../cpan/autodie/t/internal.t ../cpan/autodie/t/kill.t ../cpan/autodie/t/lethal.t +../cpan/autodie/t/mkdir.t ../cpan/autodie/t/open.t +../cpan/autodie/t/read.t ../cpan/autodie/t/recv.t ../cpan/autodie/t/repeat.t ../cpan/autodie/t/scope_leak.t ../cpan/autodie/t/sysopen.t +../cpan/autodie/t/truncate.t +../cpan/autodie/t/unlink.t ../cpan/autodie/t/user-context.t ../cpan/autodie/t/usersub.t ../cpan/autodie/t/utf8_open.t ../cpan/autodie/t/utime.t ../cpan/autodie/t/version_tag.t -../cpan/podlators/t/basic.t +../cpan/AutoLoader/t/01AutoLoader.t +../cpan/bignum/t/big_e_pi.t +../cpan/bignum/t/bigexp.t +../cpan/bignum/t/bigint.t +../cpan/bignum/t/bignum.t +../cpan/bignum/t/bigrat.t +../cpan/bignum/t/bii_e_pi.t +../cpan/bignum/t/biinfnan.t +../cpan/bignum/t/bir_e_pi.t +../cpan/bignum/t/bninfnan.t +../cpan/bignum/t/brinfnan.t +../cpan/bignum/t/in_effect.t +../cpan/bignum/t/option_a.t +../cpan/bignum/t/option_l.t +../cpan/bignum/t/option_p.t +../cpan/bignum/t/overrides.t +../cpan/bignum/t/ratopt_a.t +../cpan/bignum/t/scope_f.t +../cpan/bignum/t/scope_i.t +../cpan/bignum/t/scope_r.t +../cpan/Math-BigInt/t/constant.t +../cpan/Math-BigInt/t/const_mbf.t +../cpan/Module-Metadata/t/metadata.t +../cpan/Scalar-List-Utils/t/subname.t +../cpan/Scalar-List-Utils/t/uniq.t +../cpan/Socket/t/sockaddr.t +../cpan/Term-Cap/test.pl +../cpan/Test-Simple/t/Legacy/Builder/carp.t +../cpan/Test-Simple/t/Legacy/fail-more.t +../cpan/Test-Simple/t/Legacy/is_deeply_fail.t +../cpan/Test-Simple/t/Legacy/plan_bad.t +../cpan/Test-Simple/t/Legacy/plan.t +../cpan/Test-Simple/t/Legacy/subtest/line_numbers.t +../cpan/Test-Simple/t/Legacy/subtest/predicate.t +../cpan/Test-Simple/t/regression/684-nested_todo_diag.t +../cpan/Test-Simple/t/Test2/behavior/run_subtest_inherit.t ../dist/Attribute-Handlers/t/constants.t ../dist/Attribute-Handlers/t/data_convert.t ../dist/Attribute-Handlers/t/linerep.t ../dist/Attribute-Handlers/t/multi.t ../dist/Carp/t/Carp.t +../dist/constant/t/constant.t ../dist/Data-Dumper/t/dumper.t +../dist/Data-Dumper/t/trailing_comma.t ../dist/Exporter/t/Exporter.t ../dist/Filter-Simple/t/data.t -../dist/IO/t/io_file_export.t -../dist/IO/t/io_multihomed.t ../dist/IO/t/io_sel.t -../dist/IO/t/io_udp.t -../dist/Locale-Maketext/t/01_about_verbose.t -../dist/Locale-Maketext/t/10_make.t -../dist/Locale-Maketext/t/20_get.t -../dist/Locale-Maketext/t/40_super.t -../dist/Locale-Maketext/t/50_super.t -../dist/Locale-Maketext/t/60_super.t -../dist/Locale-Maketext/t/70_fail_auto.t -../dist/Locale-Maketext/t/91_backslash.t -../dist/Math-BigInt/t/const_mbf.t -../dist/Math-BigInt/t/constant.t ../dist/PathTools/t/cwd.t ../dist/Storable/t/blessed.t ../dist/Storable/t/croak.t -../dist/Thread-Queue/t/08_nothreads.t -../dist/bignum/t/big_e_pi.t -../dist/bignum/t/bigexp.t -../dist/bignum/t/bigint.t -../dist/bignum/t/bignum.t -../dist/bignum/t/bigrat.t -../dist/bignum/t/bii_e_pi.t -../dist/bignum/t/bir_e_pi.t -../dist/bignum/t/in_effect.t -../dist/bignum/t/option_a.t -../dist/bignum/t/option_l.t -../dist/bignum/t/option_p.t -../dist/bignum/t/overrides.t -../dist/bignum/t/ratopt_a.t -../dist/bignum/t/scope_f.t -../dist/bignum/t/scope_i.t -../dist/bignum/t/scope_r.t -../dist/constant/t/constant.t -../dist/threads/t/err.t -../dist/threads/t/exit.t -../dist/threads/t/kill2.t -../dist/threads/t/libc.t -../dist/threads/t/thread.t +../dist/threads/t/blocks.t ../ext/B/t/b.t ../ext/B/t/optree_constants.t ../ext/B/t/optree_samples.t ../ext/B/t/xref.t ../ext/Devel-Peek/t/Peek.t -../ext/File-Glob/t/taint.t -../ext/Hash-Util/t/Util.t ../ext/IPC-Open3/t/IPC-Open2.t ../ext/IPC-Open3/t/IPC-Open3.t ../ext/XS-APItest/t/autoload.t @@ -145,70 +199,13 @@ __DEPARSE_FAILURES__ ../ext/XS-APItest/t/cleanup.t ../ext/XS-APItest/t/fetch_pad_names.t ../ext/XS-APItest/t/svpeek.t -../lib/DB.t -../lib/English.t -../lib/File/Basename.t +../ext/XS-APItest/t/synthetic_scope.t +../lib/Benchmark.t ../lib/charnames.t +../lib/dumpvar.t +../lib/English.t ../lib/overload.t -base/lex.t # checks regexp stringification -comp/final_line_num.t # tests syntax error after BEGIN block -comp/fold.t # mutability of folded constants -comp/parser.t # crazy #line directives ==> shell syntax errors -mro/isarev.t -mro/isarev_utf8.t -op/attrhand.t # Custom attrs ignored; also AH provides none -op/attrs.t # [perl #70205] my attrs -op/caller.t -op/each.t # utf8ness of deparsed strings -op/getpid.t # [perl #70205] my attrs -op/goto.t -op/gv.t # glob copy constants -op/index.t -op/join.t # mutability of folded constants -op/length.t # utf8ness of deparsed strings -op/lexsub.t -op/local.t -op/not.t -op/overload_integer.t -op/override.t -op/pack.t -op/postfixderef.t -op/range.t -op/readline.t -op/srand.t -op/sub.t -op/sub_lval.t -op/switch.t -op/symbolcache.t -op/taint.t -op/vec.t -op/warn.t -op/write.t -porting/globvar.t -re/overload.t # [perl #123385] %^H output -re/pat.t # [perl #90590] -re/pat_advanced.t # [perl #123417] -re/pat_rt_report.t # malformed utf8 constant; also /\c@/ -> /\c\@/ -re/reg_fold.t # [perl #123385] %^H output -re/regex_sets.t -re/regexp_unicode_prop.t -re/rxcode.t # checks regexp stringification -re/subst.t -run/switchI.t # -I on #! line is not deparsed -run/switchd-78586.t # -I on #! line is not deparsed -uni/attrs.t -uni/bless.t -uni/gv.t -uni/labels.t -uni/lex_utf8.t -uni/method.t -uni/package.t -uni/parser.t -uni/readline.t -uni/select.t -uni/stash.t -uni/tie.t -uni/universal.t + __DEPARSE_SKIPS__ diff --git a/README.synology b/README.synology index 6a02027164..b1b9d8811c 100644 --- a/README.synology +++ b/README.synology @@ -23,11 +23,11 @@ L<Synology FAQ|http://forum.synology.com/wiki/index.php/What_kind_of_CPU_does_my Since it is based on Linux, the NAS can run many popular Linux software packages, including Perl. In fact, Synology provides a ready-to-install package for Perl, depending on the version of DSM -the installed perl ranges from 5.8.6 on DSM-4.3 to 5.18.4 on DSM-6.0.1. +the installed perl ranges from 5.8.6 on DSM-4.3 to 5.24.0 on DSM-6.1. There is an active user community that provides many software packages for the Synology DSM systems; at the time of writing this document -they provide Perl version 5.18.4. +they provide Perl version 5.24.1. This document describes various features of Synology DSM operating system that will affect how Perl 5 (hereafter just Perl) is @@ -138,11 +138,13 @@ for DSM 6: entware/opkg. For instructions on how to use that, please read L<Install Entware-ng on Synology NAS|https://github.com/Entware-ng/Entware-ng/wiki/Install-on-Synology-NAS> That sadly does not (yet) work on QorIQ. At the moment of writing, the -supported architectures are armv5, armv7, mipsel, x86_32 and x86_64. +supported architectures are armv5, armv7, mipsel, wl500g, x86_32, and x86_64. +Check L<here|http://pkg.entware.net/binaries/> for supported platforms. -Entware-ng comes with a precompiled 5.22.1 (June 2016) that allowes +Entware-ng comes with a precompiled 5.24.1 (June 2017) that allowes building shared XS code. Note that this installation does B<not> use -a site_perl folder. +a site_perl folder. The available C<cpan> works. If all required +development packages are installed too, also for XS. =head2 Compiling Perl 5 @@ -265,7 +267,7 @@ the programs are run. =head1 REVISION -June 2016, for Synology DSM 5.1.5022 and DSM 6.0.1-7393. +June 2017, for Synology DSM 5.1.5022 and DSM 6.1-15101-4. =head1 AUTHOR diff --git a/cpan/ExtUtils-Install/lib/ExtUtils/Install.pm b/cpan/ExtUtils-Install/lib/ExtUtils/Install.pm index 1e8ac4cd12..047c007145 100644 --- a/cpan/ExtUtils-Install/lib/ExtUtils/Install.pm +++ b/cpan/ExtUtils-Install/lib/ExtUtils/Install.pm @@ -1,24 +1,18 @@ package ExtUtils::Install; use strict; -use vars qw(@ISA @EXPORT $VERSION $MUST_REBOOT %Config); - -use AutoSplit; -use Carp (); use Config qw(%Config); use Cwd qw(cwd); -use Exporter; -use ExtUtils::Packlist; +use Exporter (); use File::Basename qw(dirname); -use File::Compare qw(compare); use File::Copy; -use File::Find qw(find); use File::Path; use File::Spec; +our @ISA = ('Exporter'); +our @EXPORT = ('install','uninstall','pm_to_blib', 'install_default'); -@ISA = ('Exporter'); -@EXPORT = ('install','uninstall','pm_to_blib', 'install_default'); +our $MUST_REBOOT; =pod @@ -38,11 +32,11 @@ ExtUtils::Install - install files from here to there =head1 VERSION -2.04 +2.14 =cut -$VERSION = '2.04'; # <-- do not forget to update the POD section just above this line! +our $VERSION = '2.14'; # <-- do not forget to update the POD section just above this line! $VERSION = eval $VERSION; =pod @@ -95,18 +89,12 @@ Dies with a special message. =cut -my $Is_VMS = $^O eq 'VMS'; -my $Is_MacPerl = $^O eq 'MacOS'; -my $Is_Win32 = $^O eq 'MSWin32'; -my $Is_cygwin = $^O eq 'cygwin'; -my $CanMoveAtBoot = ($Is_Win32 || $Is_cygwin); - -# *note* CanMoveAtBoot is only incidentally the same condition as below -# this needs not hold true in the future. -my $Has_Win32API_File = ($Is_Win32 || $Is_cygwin) - ? (eval {require Win32API::File; 1} || 0) - : 0; - +BEGIN { + *Is_VMS = $^O eq 'VMS' ? sub(){1} : sub(){0}; + *Is_Win32 = $^O eq 'MSWin32' ? sub(){1} : sub(){0}; + *Is_cygwin = $^O eq 'cygwin' ? sub(){1} : sub(){0}; + *CanMoveAtBoot = ($^O eq 'MSWin32' || $^O eq 'cygwin') ? sub(){1} : sub(){0}; +} my $Inc_uninstall_warn_handler; @@ -114,9 +102,12 @@ my $Inc_uninstall_warn_handler; my $INSTALL_ROOT = $ENV{PERL_INSTALL_ROOT}; my $INSTALL_QUIET = $ENV{PERL_INSTALL_QUIET}; +$INSTALL_QUIET = 1 + if (!exists $ENV{PERL_INSTALL_QUIET} and + defined $ENV{MAKEFLAGS} and + $ENV{MAKEFLAGS} =~ /\b(s|silent|quiet)\b/); my $Curdir = File::Spec->curdir; -my $Updir = File::Spec->updir; sub _estr(@) { return join "\n",'!' x 72,@_,'!' x 72,''; @@ -132,9 +123,24 @@ sub _warnonce(@) { sub _choke(@) { my $first=shift; my $msg=_estr "ERROR: $first",@_; + require Carp; Carp::croak($msg); } +sub _croak { + require Carp; + Carp::croak(@_); +} +sub _confess { + require Carp; + Carp::confess(@_); +} + +sub _compare { + require File::Compare; + File::Compare::compare(@_); +} + sub _chmod($$;$) { my ( $mode, $item, $verbose )=@_; @@ -173,47 +179,53 @@ If $moan is true then returns 0 on error and warns instead of dies. =cut +{ + my $Has_Win32API_File; + sub _move_file_at_boot { #XXX OS-SPECIFIC + my ( $file, $target, $moan )= @_; + _confess("Panic: Can't _move_file_at_boot on this platform!") + unless CanMoveAtBoot; + + my $descr= ref $target + ? "'$file' for deletion" + : "'$file' for installation as '$target'"; + + # *note* CanMoveAtBoot is only incidentally the same condition as below + # this needs not hold true in the future. + $Has_Win32API_File = (Is_Win32 || Is_cygwin) + ? (eval {require Win32API::File; 1} || 0) + : 0 unless defined $Has_Win32API_File; + if ( ! $Has_Win32API_File ) { + + my @msg=( + "Cannot schedule $descr at reboot.", + "Try installing Win32API::File to allow operations on locked files", + "to be scheduled during reboot. Or try to perform the operation by", + "hand yourself. (You may need to close other perl processes first)" + ); + if ( $moan ) { _warnonce(@msg) } else { _choke(@msg) } + return 0; + } + my $opts= Win32API::File::MOVEFILE_DELAY_UNTIL_REBOOT(); + $opts= $opts | Win32API::File::MOVEFILE_REPLACE_EXISTING() + unless ref $target; + _chmod( 0666, $file ); + _chmod( 0666, $target ) unless ref $target; -sub _move_file_at_boot { #XXX OS-SPECIFIC - my ( $file, $target, $moan )= @_; - Carp::confess("Panic: Can't _move_file_at_boot on this platform!") - unless $CanMoveAtBoot; - - my $descr= ref $target - ? "'$file' for deletion" - : "'$file' for installation as '$target'"; - - if ( ! $Has_Win32API_File ) { - - my @msg=( - "Cannot schedule $descr at reboot.", - "Try installing Win32API::File to allow operations on locked files", - "to be scheduled during reboot. Or try to perform the operation by", - "hand yourself. (You may need to close other perl processes first)" - ); - if ( $moan ) { _warnonce(@msg) } else { _choke(@msg) } + if (Win32API::File::MoveFileEx( $file, $target, $opts )) { + $MUST_REBOOT ||= ref $target ? 0 : 1; + return 1; + } else { + my @msg=( + "MoveFileEx $descr at reboot failed: $^E", + "You may try to perform the operation by hand yourself. ", + "(You may need to close other perl processes first).", + ); + if ( $moan ) { _warnonce(@msg) } else { _choke(@msg) } + } return 0; } - my $opts= Win32API::File::MOVEFILE_DELAY_UNTIL_REBOOT(); - $opts= $opts | Win32API::File::MOVEFILE_REPLACE_EXISTING() - unless ref $target; - - _chmod( 0666, $file ); - _chmod( 0666, $target ) unless ref $target; - - if (Win32API::File::MoveFileEx( $file, $target, $opts )) { - $MUST_REBOOT ||= ref $target ? 0 : 1; - return 1; - } else { - my @msg=( - "MoveFileEx $descr at reboot failed: $^E", - "You may try to perform the operation by hand yourself. ", - "(You may need to close other perl processes first).", - ); - if ( $moan ) { _warnonce(@msg) } else { _choke(@msg) } - } - return 0; } @@ -270,7 +282,7 @@ sub _unlink_or_rename { #XXX OS-SPECIFIC my $error="$!"; _choke("Cannot unlink '$file': $!") - unless $CanMoveAtBoot && $tryhard; + unless CanMoveAtBoot && $tryhard; my $tmp= "AAA"; ++$tmp while -e "$file.$tmp"; @@ -379,8 +391,8 @@ Abstract a -w check that tries to use POSIX::access() if possible. sub _have_write_access { my $dir=shift; unless (defined $has_posix) { - $has_posix= (!$Is_cygwin && !$Is_Win32 - && eval 'local $^W; require POSIX; 1') || 0; + $has_posix = (!Is_cygwin && !Is_Win32 + && eval { local $^W; require POSIX; 1} ) || 0; } if ($has_posix) { return POSIX::access($dir, POSIX::W_OK()); @@ -425,7 +437,7 @@ sub _can_write_dir { my $path=''; my @make; while (@dirs) { - if ($Is_VMS) { + if (Is_VMS) { $dir = File::Spec->catdir($vol,@dirs); } else { @@ -519,7 +531,7 @@ sub _copy { } if (!$dry_run) { File::Copy::copy($from,$to) - or Carp::croak( _estr "ERROR: Cannot copy '$from' to '$to': $!" ); + or _croak( _estr "ERROR: Cannot copy '$from' to '$to': $!" ); } } @@ -673,7 +685,7 @@ sub install { #XXX OS-SPECIFIC if (@_==1 and eval { 1+@$from_to }) { my %opts = @$from_to; $from_to = $opts{from_to} - or Carp::confess("from_to is a mandatory parameter"); + or _confess("from_to is a mandatory parameter"); $verbose = $opts{verbose}; $dry_run = $opts{dry_run}; $uninstall_shadows = $opts{uninstall_shadows}; @@ -694,6 +706,7 @@ sub install { #XXX OS-SPECIFIC my(%from_to) = %$from_to; my(%pack, $dir, %warned); + require ExtUtils::Packlist; my($packlist) = ExtUtils::Packlist->new(); local(*DIR); @@ -706,6 +719,13 @@ sub install { #XXX OS-SPECIFIC my $cwd = cwd(); my @found_files; my %check_dirs; + require File::Find; + + my $blib_lib = File::Spec->catdir('blib', 'lib'); + my $blib_arch = File::Spec->catdir('blib', 'arch'); + + # File::Find seems to always be Unixy except on MacPerl :( + my $current_directory = $^O eq 'MacOS' ? $Curdir : '.'; MOD_INSTALL: foreach my $source (sort keys %from_to) { #copy the tree to the target directory without altering @@ -720,8 +740,6 @@ sub install { #XXX OS-SPECIFIC my $targetroot = install_rooted_dir($from_to{$source}); - my $blib_lib = File::Spec->catdir('blib', 'lib'); - my $blib_arch = File::Spec->catdir('blib', 'arch'); if ($source eq $blib_lib and exists $from_to{$blib_arch} and directory_not_empty($blib_arch) @@ -734,9 +752,7 @@ sub install { #XXX OS-SPECIFIC _chdir($source); # 5.5.3's File::Find missing no_chdir option # XXX OS-SPECIFIC - # File::Find seems to always be Unixy except on MacPerl :( - my $current_directory= $Is_MacPerl ? $Curdir : '.'; - find(sub { + File::Find::find(sub { my ($mode,$size,$atime,$mtime) = (stat)[2,7,8,9]; return if !-f _; @@ -765,7 +781,7 @@ sub install { #XXX OS-SPECIFIC $diff++; } else { # we might not need to copy this file - $diff = compare($sourcefile, $targetfile); + $diff = _compare($sourcefile, $targetfile); } $check_dirs{$targetdir}++ unless -w $targetfile; @@ -806,7 +822,7 @@ sub install { #XXX OS-SPECIFIC #XXX OS-SPECIFIC print "utime($atime,$mtime,$targetfile)\n" if $verbose>1; - utime($atime,$mtime + $Is_VMS,$targetfile) unless $dry_run>1; + utime($atime,$mtime + Is_VMS,$targetfile) unless $dry_run>1; $mode = 0444 | ( $mode & 0111 ? 0111 : 0 ); @@ -936,7 +952,8 @@ Returns 0 if there is not. sub directory_not_empty ($) { my($dir) = @_; my $files = 0; - find(sub { + require File::Find; + File::Find::find(sub { return if $_ eq ".exists"; if (-f) { $File::Find::prune++; @@ -970,7 +987,7 @@ Consider its use discouraged. =cut sub install_default { - @_ < 2 or Carp::croak("install_default should be called with 0 or 1 argument"); + @_ < 2 or _croak("install_default should be called with 0 or 1 argument"); my $FULLEXT = @_ ? shift : $ARGV[0]; defined $FULLEXT or die "Do not know to where to write install log"; my $INST_LIB = File::Spec->catdir($Curdir,"blib","lib"); @@ -1026,6 +1043,7 @@ sub uninstall { unless -f $fil; # my $my_req = $self->catfile(qw(auto ExtUtils Install forceunlink.al)); # require $my_req; # Hairy, but for the first + require ExtUtils::Packlist; my ($packlist) = ExtUtils::Packlist->new($fil); foreach (sort(keys(%$packlist))) { chomp; @@ -1076,7 +1094,7 @@ sub inc_uninstall { #warn join "\n","---",@dirs,"---"; my $seen_ours; foreach $dir ( @dirs ) { - my $canonpath = $Is_VMS ? $dir : File::Spec->canonpath($dir); + my $canonpath = Is_VMS ? $dir : File::Spec->canonpath($dir); next if $canonpath eq $Curdir; next if $seen_dir{$canonpath}++; my $targetfile = File::Spec->catfile($canonpath,$libdir,$file); @@ -1088,7 +1106,7 @@ sub inc_uninstall { my $diff = 0; if ( -f $targetfile && -s _ == -s $filepath) { # We have a good chance, we can skip this one - $diff = compare($filepath,$targetfile); + $diff = _compare($filepath,$targetfile); } else { $diff++; } @@ -1158,11 +1176,12 @@ sub run_filter { =item B<pm_to_blib> + pm_to_blib(\%from_to); pm_to_blib(\%from_to, $autosplit_dir); pm_to_blib(\%from_to, $autosplit_dir, $filter_cmd); Copies each key of %from_to to its corresponding value efficiently. -Filenames with the extension .pm are autosplit into the $autosplit_dir. +If an $autosplit_dir is provided, all .pm files will be autosplit into it. Any destination directories are created. $filter_cmd is an optional shell command to run each .pm file through @@ -1180,7 +1199,7 @@ environment variable will silence this output. sub pm_to_blib { my($fromto,$autodir,$pm_filter) = @_; - _mkpath($autodir,0,0755); + _mkpath($autodir,0,0755) if defined $autodir; while(my($from, $to) = each %$fromto) { if( -f $to && -s $from == -s $to && -M $to < -M $from ) { print "Skip $to (unchanged)\n" unless $INSTALL_QUIET; @@ -1195,7 +1214,7 @@ sub pm_to_blib { my $need_filtering = defined $pm_filter && length $pm_filter && $from =~ /\.pm$/; - if (!$need_filtering && 0 == compare($from,$to)) { + if (!$need_filtering && 0 == _compare($from,$to)) { print "Skip $to (unchanged)\n" unless $INSTALL_QUIET; next; } @@ -1213,10 +1232,10 @@ sub pm_to_blib { print "cp $from $to\n" unless $INSTALL_QUIET; } my($mode,$atime,$mtime) = (stat $from)[2,8,9]; - utime($atime,$mtime+$Is_VMS,$to); + utime($atime,$mtime+Is_VMS,$to); _chmod(0444 | ( $mode & 0111 ? 0111 : 0 ),$to); next unless $from =~ /\.pm$/; - _autosplit($to,$autodir); + _autosplit($to,$autodir) if defined $autodir; } } @@ -1234,7 +1253,8 @@ locking (ie. Windows). So we wrap it and close the filehandle. =cut sub _autosplit { #XXX OS-SPECIFIC - my $retval = autosplit(@_); + require AutoSplit; + my $retval = AutoSplit::autosplit(@_); close *AutoSplit::IN if defined *AutoSplit::IN{IO}; return $retval; @@ -1265,7 +1285,7 @@ sub DESTROY { $plural = $i>1 ? "all those files" : "this file"; my $inst = (_invokant() eq 'ExtUtils::MakeMaker') ? ( $Config::Config{make} || 'make' ).' install' - . ( $Is_VMS ? '/MACRO="UNINST"=1' : ' UNINST=1' ) + . ( ExtUtils::Install::Is_VMS ? '/MACRO="UNINST"=1' : ' UNINST=1' ) : './Build install uninst=1'; print "## Running '$inst' will unlink $plural for you.\n"; } diff --git a/cpan/ExtUtils-Install/lib/ExtUtils/Installed.pm b/cpan/ExtUtils-Install/lib/ExtUtils/Installed.pm index 061c32916f..8327a95a3d 100644 --- a/cpan/ExtUtils-Install/lib/ExtUtils/Installed.pm +++ b/cpan/ExtUtils-Install/lib/ExtUtils/Installed.pm @@ -17,7 +17,7 @@ my $DOSISH = ($^O =~ /^(MSWin\d\d|os2|dos|mint)$/); require VMS::Filespec if $Is_VMS; use vars qw($VERSION); -$VERSION = '2.04'; +$VERSION = '2.14'; $VERSION = eval $VERSION; sub _is_prefix { diff --git a/cpan/ExtUtils-Install/lib/ExtUtils/Packlist.pm b/cpan/ExtUtils-Install/lib/ExtUtils/Packlist.pm index c1ab00216b..f94e3d05cc 100644 --- a/cpan/ExtUtils-Install/lib/ExtUtils/Packlist.pm +++ b/cpan/ExtUtils-Install/lib/ExtUtils/Packlist.pm @@ -5,7 +5,7 @@ use strict; use Carp qw(); use Config; use vars qw($VERSION $Relocations); -$VERSION = '2.04'; +$VERSION = '2.14'; $VERSION = eval $VERSION; # Used for generating filehandle globs. IO::File might not be available! diff --git a/cpan/ExtUtils-Install/t/Install.t b/cpan/ExtUtils-Install/t/Install.t index 440d23082d..0900b58cb8 100644 --- a/cpan/ExtUtils-Install/t/Install.t +++ b/cpan/ExtUtils-Install/t/Install.t @@ -12,7 +12,7 @@ use File::Path; use File::Spec; use File::Temp qw[tempdir]; -use Test::More tests => 60; +use Test::More tests => 62; use MakeMaker::Test::Setup::BFD; @@ -269,3 +269,15 @@ SKIP: { ok(compare("$bigdir/Dummy.pm", "$bigdir/DummyOrig.pm"), "orig file should be different"); } + +pm_to_blib( { 'lib/Dummy/Split.pm' => 'blib/lib/Dummy/Split.pm' }, + 'blib/lib/auto' + ); + +ok( -r 'blib/lib/auto/Dummy/Split/split.al', + 'pm_to_blib does autosplit on appropriate files', +); +eval { + pm_to_blib( { 'lib/Dummy/Split.pm' => 'blib/lib/Dummy/Split.pm' } ); +}; +is $@, '', 'pm_to_blib with no autodir works'; diff --git a/cpan/ExtUtils-Install/t/InstallWithMM.t b/cpan/ExtUtils-Install/t/InstallWithMM.t index 58ffd3eceb..d656d43833 100644 --- a/cpan/ExtUtils-Install/t/InstallWithMM.t +++ b/cpan/ExtUtils-Install/t/InstallWithMM.t @@ -56,7 +56,7 @@ delete @ENV{qw(PREFIX LIB MAKEFLAGS)}; ok( chdir('Big-Dummy'), "chdir'd to Big-Dummy" ) || diag("chdir failed: $!"); - my @mpl_out = run(qq{$perl Makefile.PL "PREFIX=../dummy-install"}); + my @mpl_out = run(qq{"$perl" Makefile.PL "PREFIX=../dummy-install"}); END { rmtree '../dummy-install'; } cmp_ok( $?, '==', 0, 'Makefile.PL exited with zero' ) || diff --git a/cpan/ExtUtils-Install/t/Installed.t b/cpan/ExtUtils-Install/t/Installed.t index 5c5c4d3d09..d6a099e9c7 100644 --- a/cpan/ExtUtils-Install/t/Installed.t +++ b/cpan/ExtUtils-Install/t/Installed.t @@ -109,6 +109,9 @@ my $fake_mod_dir = File::Spec->catdir(cwd(), 'auto', 'FakeMod'); # should find $fake_mod_dir via '.' in @INC + local @INC = @INC; + push @INC, '.' if not $INC[-1] eq '.'; + my $realei = ExtUtils::Installed->new(); isa_ok( $realei, 'ExtUtils::Installed' ); isa_ok( $realei->{Perl}{packlist}, 'ExtUtils::Packlist' ); diff --git a/cpan/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm b/cpan/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm index 868d0b9019..37ca9a3c01 100644 --- a/cpan/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm +++ b/cpan/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm @@ -88,6 +88,18 @@ print "Big::Liar's vars\n"; foreach my $key (qw(INST_LIB INST_ARCHLIB)) { print "$key = $mm->{$key}\n"; } +END + + 'Big-Dummy/lib/Dummy/Split.pm' => <<'END', +package Dummy::Split; +$VERSION = 0.02; +use AutoLoader 'AUTOLOAD'; + +__END__ + +sub split { print "split\n"; } + +1; END ); diff --git a/dist/Module-CoreList/t/maintainer.t b/dist/Module-CoreList/t/maintainer.t index 7a3d6584e4..b096269d27 100644 --- a/dist/Module-CoreList/t/maintainer.t +++ b/dist/Module-CoreList/t/maintainer.t @@ -24,5 +24,8 @@ is( scalar keys %vers, 1, 'All Module-CoreList modules should have the same $VER # Check that there is a release entry for the current perl version my $released = $Module::CoreList::released{ $] }; +# duplicate fetch to avoid 'used only once: possible typo' warning +$released = $Module::CoreList::released{ $] }; + ok( defined $released, "There is a released entry for $]" ); like( $released, qr!^\d{4}\-\d{2}\-\d{2}$!, 'It should be a date in YYYY-MM-DD format' ); diff --git a/doop.c b/doop.c index 0a546cce8f..1b71402485 100644 --- a/doop.c +++ b/doop.c @@ -1335,12 +1335,8 @@ Perl_do_kv(pTHX) XPUSHs(sv); } if (dovalues) { - SV *tmpstr = hv_iterval(keys,entry); - DEBUG_H(Perl_sv_setpvf(aTHX_ tmpstr, "%lu%%%d=%lu", - (unsigned long)HeHASH(entry), - (int)HvMAX(keys)+1, - (unsigned long)(HeHASH(entry) & HvMAX(keys)))); - XPUSHs(tmpstr); + SV *const sv = hv_iterval(keys,entry); + XPUSHs(sv); } } RETURN; diff --git a/gv.c b/gv.c index 81fa5de631..ea41e78725 100644 --- a/gv.c +++ b/gv.c @@ -1339,6 +1339,7 @@ S_require_tie_mod(pTHX_ GV *gv, const char varname, const char * name, GV **gvp; dSP; + PUSHSTACKi(PERLSI_MAGIC); ENTER; #define HV_FETCH_TIE_FUNC (GV **)hv_fetchs(stash, "_tie_it", 0) @@ -1368,6 +1369,7 @@ S_require_tie_mod(pTHX_ GV *gv, const char varname, const char * name, PUTBACK; call_sv((SV *)*gvp, G_VOID|G_DISCARD); LEAVE; + POPSTACK; } } diff --git a/hints/freebsd.sh b/hints/freebsd.sh index e5ecea8db9..fc6d73f87b 100644 --- a/hints/freebsd.sh +++ b/hints/freebsd.sh @@ -320,3 +320,12 @@ d_printf_format_null='undef' # As of 10.3-RELEASE FreeBSD. See [perl #128867] d_uselocale='undef' + +# https://rt.perl.org/Ticket/Display.html?id=131337 +case "$cc" in +*g++*) + usedl='define' + dlsrc='dl_dlopen.xs' + ;; +esac + diff --git a/lib/B/Deparse.pm b/lib/B/Deparse.pm index 6c35a7275e..b22683ac49 100644 --- a/lib/B/Deparse.pm +++ b/lib/B/Deparse.pm @@ -12,7 +12,8 @@ use Carp; use B qw(class main_root main_start main_cv svref_2object opnumber perlstring OPf_WANT OPf_WANT_VOID OPf_WANT_SCALAR OPf_WANT_LIST OPf_KIDS OPf_REF OPf_STACKED OPf_SPECIAL OPf_MOD OPf_PARENS - OPpLVAL_INTRO OPpOUR_INTRO OPpENTERSUB_AMPER OPpSLICE OPpCONST_BARE + OPpLVAL_INTRO OPpOUR_INTRO OPpENTERSUB_AMPER OPpSLICE OPpKVSLICE + OPpCONST_BARE OPpTRANS_SQUASH OPpTRANS_DELETE OPpTRANS_COMPLEMENT OPpTARGET_MY OPpEXISTS_SUB OPpSORT_NUMERIC OPpSORT_INTEGER OPpREPEAT_DOLIST OPpSORT_REVERSE OPpMULTIDEREF_EXISTS OPpMULTIDEREF_DELETE @@ -362,7 +363,8 @@ BEGIN { BEGIN { for (qw[ const stringify rv2sv list glob pushmark null aelem - nextstate dbstate rv2av rv2hv helem custom ]) { + kvaslice kvhslice + nextstate dbstate rv2av rv2hv helem custom ]) { eval "sub OP_\U$_ () { " . opnumber($_) . "}" }} @@ -402,13 +404,27 @@ sub _pessimise_walk { # pessimisations end here - if (class($op) eq 'PMOP' - && ref($op->pmreplroot) - && ${$op->pmreplroot} - && $op->pmreplroot->isa( 'B::OP' )) - { - $self-> _pessimise_walk($op->pmreplroot); - } + if (class($op) eq 'PMOP') { + if (ref($op->pmreplroot) + && ${$op->pmreplroot} + && $op->pmreplroot->isa( 'B::OP' )) + { + $self-> _pessimise_walk($op->pmreplroot); + } + + # pessimise any /(?{...})/ code blocks + my ($re, $cv); + my $code_list = $op->code_list; + if ($$code_list) { + $self->_pessimise_walk($code_list); + } + elsif (${$re = $op->pmregexp} && ${$cv = $re->qr_anoncv}) { + $code_list = $cv->ROOT # leavesub + ->first # qr + ->code_list; # list + $self->_pessimise_walk($code_list); + } + } if ($op->flags & OPf_KIDS) { $self-> _pessimise_walk($op->first); @@ -424,6 +440,8 @@ sub _pessimise_walk { sub _pessimise_walk_exe { my ($self, $startop, $visited) = @_; + no warnings 'recursion'; + return unless $$startop; return if $visited->{$$startop}; my ($op, $prevop); @@ -558,7 +576,17 @@ sub next_todo { # makes use of a lexical var that's not in scope. # So strip it out. return $pragmata - if $use_dec =~ /^use \S+ \(@\{\$args\[0\];\}\);/; + if $use_dec =~ + m/ + \A + use \s \S+ \s \(\@\{ + ( + \s*\#line\ \d+\ \".*"\s* + )? + \$args\[0\];\}\); + \n + \Z + /x; $use_dec =~ s/^(use|no)\b/$self->keyword($1)/e; } @@ -612,6 +640,9 @@ sub begin_is_use { my $req_op = $lineseq->first->sibling; return if $req_op->name ne "require"; + # maybe it's C<require expr> rather than C<require 'foo'> + return if ($req_op->first->name ne 'const'); + my $module; if ($req_op->first->private & OPpCONST_BARE) { # Actually it should always be a bareword @@ -2648,7 +2679,7 @@ sub pp_delete { my($op, $cx) = @_; my $arg; my $name = $self->keyword("delete"); - if ($op->private & OPpSLICE) { + if ($op->private & (OPpSLICE|OPpKVSLICE)) { if ($op->flags & OPf_SPECIAL) { # Deleting from an array, not a hash return $self->maybe_parens_func($name, @@ -3516,9 +3547,167 @@ BEGIN { delete @uses_intro{qw( lvref lvrefslice lvavref entersub )}; } + +# Look for a my attribute declaration in a list or ex-list. Returns undef +# if not found, 'my($x, @a) :Foo(bar)' etc otherwise. +# +# There are three basic tree structs that are expected: +# +# my $x :foo; +# <1> ex-list vK/LVINTRO ->c +# <0> ex-pushmark v ->3 +# <1> entersub[t2] vKRS*/TARG ->b +# .... +# <0> padsv[$x:64,65] vM/LVINTRO ->c +# +# my @a :foo; +# my %h :foo; +# +# <1> ex-list vK ->c +# <0> ex-pushmark v ->3 +# <0> padav[@a:64,65] vM/LVINTRO ->4 +# <1> entersub[t2] vKRS*/TARG ->c +# .... +# +# my ($x,@a,%h) :foo; +# +# <;> nextstate(main 64 -e:1) v:{ ->3 +# <@> list vKP ->w +# <0> pushmark vM/LVINTRO ->4 +# <0> padsv[$x:64,65] vM/LVINTRO ->5 +# <0> padav[@a:64,65] vM/LVINTRO ->6 +# <0> padhv[%h:64,65] vM/LVINTRO ->7 +# <1> entersub[t4] vKRS*/TARG ->f +# .... +# <1> entersub[t5] vKRS*/TARG ->n +# .... +# <1> entersub[t6] vKRS*/TARG ->v +# .... +# where the entersub in all cases looks like +# <1> entersub[t2] vKRS*/TARG ->c +# <0> pushmark s ->5 +# <$> const[PV "attributes"] sM ->6 +# <$> const[PV "main"] sM ->7 +# <1> srefgen sKM/1 ->9 +# <1> ex-list lKRM ->8 +# <0> padsv[@a:64,65] sRM ->8 +# <$> const[PV "foo"] sM ->a +# <.> method_named[PV "import"] ->b + +sub maybe_my_attr { + my ($self, $op, $cx) = @_; + + my $kid = $op->first->sibling; # skip pushmark + return if class($kid) eq 'NULL'; + + my $lop; + my $type; + + # Extract out all the pad ops and entersub ops into + # @padops and @entersubops. Return if anything else seen. + # Also determine what class (if any) all the pad vars belong to + my $class; + my (@padops, @entersubops); + for ($lop = $kid; !null($lop); $lop = $lop->sibling) { + my $lopname = $lop->name; + my $loppriv = $lop->private; + if ($lopname =~ /^pad[sah]v$/) { + return unless $loppriv & OPpLVAL_INTRO; + return if $loppriv & OPpPAD_STATE; + + my $padname = $self->padname_sv($lop->targ); + my $thisclass = ($padname->FLAGS & SVpad_TYPED) + ? $padname->SvSTASH->NAME : 'main'; + + # all pad vars must be in the same class + $class //= $thisclass; + return unless $thisclass eq $class; + + push @padops, $lop; + } + elsif ($lopname eq 'entersub') { + push @entersubops, $lop; + } + else { + return; + } + } + + return unless @padops && @padops == @entersubops; + + # there should be a balance: each padop has a corresponding + # 'attributes'->import() method call, in the same order. + + my @varnames; + my $attr_text; + + for my $i (0..$#padops) { + my $padop = $padops[$i]; + my $esop = $entersubops[$i]; + + push @varnames, $self->padname($padop->targ); + + return unless ($esop->flags & OPf_KIDS); + + my $kid = $esop->first; + return unless $kid->type == OP_PUSHMARK; + + $kid = $kid->sibling; + return unless $$kid && $kid->type == OP_CONST; + return unless $self->const_sv($kid)->PV eq 'attributes'; + + $kid = $kid->sibling; + return unless $$kid && $kid->type == OP_CONST; # __PACKAGE__ + + $kid = $kid->sibling; + return unless $$kid + && $kid->name eq "srefgen" + && ($kid->flags & OPf_KIDS) + && ($kid->first->flags & OPf_KIDS) + && $kid->first->first->name =~ /^pad[sah]v$/ + && $kid->first->first->targ == $padop->targ; + + $kid = $kid->sibling; + my @attr; + while ($$kid) { + last if ($kid->type != OP_CONST); + push @attr, $self->const_sv($kid)->PV; + $kid = $kid->sibling; + } + return unless @attr; + my $thisattr = ":" . join(' ', @attr); + $attr_text //= $thisattr; + # all import calls must have the same list of attributes + return unless $attr_text eq $thisattr; + + return unless $kid->name eq 'method_named'; + return unless $self->meth_sv($kid)->PV eq 'import'; + + $kid = $kid->sibling; + return if $$kid; + } + + my $res = 'my'; + $res .= " $class " if $class ne 'main'; + $res .= + (@varnames > 1) + ? "(" . join(', ', @varnames) . ')' + : " $varnames[0]"; + + return "$res $attr_text"; +} + + sub pp_list { my $self = shift; my($op, $cx) = @_; + + { + # might be my ($s,@a,%h) :Foo(bar); + my $my_attr = maybe_my_attr($self, $op, $cx); + return $my_attr if defined $my_attr; + } + my($expr, @exprs); my $kid = $op->first->sibling; # skip pushmark return '' if class($kid) eq 'NULL'; @@ -3812,6 +4001,13 @@ sub _op_is_or_was { sub pp_null { my($self, $op, $cx) = @_; + + # might be 'my $s :Foo(bar);' + if ($op->targ == OP_LIST) { + my $my_attr = maybe_my_attr($self, $op, $cx); + return $my_attr if defined $my_attr; + } + if (class($op) eq "OP") { # old value is lost return $self->{'ex_const'} if $op->targ == OP_CONST; @@ -4319,8 +4515,9 @@ sub slice { } else { $list = $self->elem_or_slice_single_index($kid); } - my $lead = '@'; - $lead = '%' if $op->name =~ /^kv/i; + my $lead = ( _op_is_or_was($op, OP_KVHSLICE) + || _op_is_or_was($op, OP_KVASLICE)) + ? '%' : '@'; return $lead . $array . $left . $list . $right; } @@ -4807,11 +5004,33 @@ sub unback { # Remove backslashes which precede literal control characters, # to avoid creating ambiguity when we escape the latter. +# +# Don't remove a backslash from escaped whitespace: where the T represents +# a literal tab character, /T/x is not equivalent to /\T/x + sub re_unback { my($str) = @_; # the insane complexity here is due to the behaviour of "\c\" - $str =~ s/(^|[^\\]|\\c\\)(?<!\\c)\\(\\\\)*(?=[[:^print:]])/$1$2/g; + $str =~ s/ + # these two lines ensure that the backslash we're about to + # remove isn't preceeded by something which makes it part + # of a \c + + (^ | [^\\] | \\c\\) # $1 + (?<!\\c) + + # the backslash to remove + \\ + + # keep pairs of backslashes + (\\\\)* # $2 + + # only remove if the thing following is a control char + (?=[[:^print:]]) + # and not whitespace + (?=\S) + /$1$2/xg; return $str; } diff --git a/lib/B/Deparse.t b/lib/B/Deparse.t index 7eeb4f813b..57c523c6cb 100644 --- a/lib/B/Deparse.t +++ b/lib/B/Deparse.t @@ -63,7 +63,7 @@ while (<DATA>) { new B::Deparse split /,/, $meta{options} : $deparse; - my $coderef = eval "$meta{context};\n" . <<'EOC' . "sub {$input\n}"; + my $code = "$meta{context};\n" . <<'EOC' . "sub {$input\n}"; # Tell B::Deparse about our ambient pragmas my ($hint_bits, $warning_bits, $hinthash); BEGIN { @@ -75,10 +75,14 @@ $deparse->ambient_pragmas ( '%^H' => $hinthash, ); EOC + my $coderef = eval $code; local $::TODO = $meta{todo}; if ($@) { - is($@, "", "compilation of $desc"); + is($@, "", "compilation of $desc") + or diag "=============================================\n" + . "CODE:\n--------\n$code\n--------\n" + . "=============================================\n"; } else { my $deparsed = $deparse->coderef2text( $coderef ); @@ -2610,3 +2614,50 @@ sub ($a, $=) { $a; } ; +#### +# padrange op within pattern code blocks +/(?{ my($x, $y) = (); })/; +my $a; +/$a(?{ my($x, $y) = (); })/; +my $r1 = qr/(?{ my($x, $y) = (); })/; +my $r2 = qr/$a(?{ my($x, $y) = (); })/; +#### +# don't remove pattern whitespace escapes +/a\ b/; +/a\ b/x; +/a\ b/; +/a\ b/x; +#### +# my attributes +my $s1 :foo(f1, f2) bar(b1, b2); +my @a1 :foo(f1, f2) bar(b1, b2); +my %h1 :foo(f1, f2) bar(b1, b2); +my($s2, @a2, %h2) :foo(f1, f2) bar(b1, b2); +#### +# my class attributes +package Foo::Bar; +my Foo::Bar $s1 :foo(f1, f2) bar(b1, b2); +my Foo::Bar @a1 :foo(f1, f2) bar(b1, b2); +my Foo::Bar %h1 :foo(f1, f2) bar(b1, b2); +my Foo::Bar ($s2, @a2, %h2) :foo(f1, f2) bar(b1, b2); +package main; +my Foo::Bar $s3 :foo(f1, f2) bar(b1, b2); +my Foo::Bar @a3 :foo(f1, f2) bar(b1, b2); +my Foo::Bar %h3 :foo(f1, f2) bar(b1, b2); +my Foo::Bar ($s4, @a4, %h4) :foo(f1, f2) bar(b1, b2); +#### +# avoid false positives in my $x :attribute +'attributes'->import('main', \my $x1, 'foo(bar)'), my $y1; +'attributes'->import('Fooo', \my $x2, 'foo(bar)'), my $y2; +#### +# hash slices and hash key/value slices +my(@a, %h); +our(@oa, %oh); +@a = @h{'foo', 'bar'}; +@a = %h{'foo', 'bar'}; +@a = delete @h{'foo', 'bar'}; +@a = delete %h{'foo', 'bar'}; +@oa = @oh{'foo', 'bar'}; +@oa = %oh{'foo', 'bar'}; +@oa = delete @oh{'foo', 'bar'}; +@oa = delete %oh{'foo', 'bar'}; diff --git a/lib/B/Op_private.pm b/lib/B/Op_private.pm index bb51b327f0..09931571f1 100644 --- a/lib/B/Op_private.pm +++ b/lib/B/Op_private.pm @@ -137,7 +137,7 @@ $bits{$_}{7} = 'OPpLVAL_INTRO' for qw(aelem aslice cond_expr delete enteriter en $bits{$_}{2} = 'OPpLVREF_ELEM' for qw(lvref refassign); $bits{$_}{3} = 'OPpLVREF_ITER' for qw(lvref refassign); $bits{$_}{3} = 'OPpMAYBE_LVSUB' for qw(aassign aelem akeys aslice av2arylen avhvswitch helem hslice keys kvaslice kvhslice multideref padav padhv pos rv2av rv2gv rv2hv substr vec); -$bits{$_}{4} = 'OPpMAYBE_TRUEBOOL' for qw(padhv rv2hv); +$bits{$_}{4} = 'OPpMAYBE_TRUEBOOL' for qw(padhv ref rv2hv); $bits{$_}{7} = 'OPpOFFBYONE' for qw(caller runcv wantarray); $bits{$_}{5} = 'OPpOPEN_IN_CRLF' for qw(backtick open); $bits{$_}{4} = 'OPpOPEN_IN_RAW' for qw(backtick open); @@ -156,7 +156,7 @@ $bits{$_}{6} = 'OPpTRANS_GROWS' for qw(trans transr); $bits{$_}{2} = 'OPpTRANS_IDENTICAL' for qw(trans transr); $bits{$_}{3} = 'OPpTRANS_SQUASH' for qw(trans transr); $bits{$_}{1} = 'OPpTRANS_TO_UTF' for qw(trans transr); -$bits{$_}{5} = 'OPpTRUEBOOL' for qw(padhv rv2hv); +$bits{$_}{5} = 'OPpTRUEBOOL' for qw(padhv ref rv2hv); my @bf = ( { @@ -807,7 +807,7 @@ our %ops_using = ( OPpLVAL_INTRO => [qw(aelem aslice cond_expr delete enteriter entersub gvsv helem hslice list lvavref lvref lvrefslice multideref padav padhv padrange padsv pushmark refassign rv2av rv2 ... [23 chars truncated] OPpLVREF_ELEM => [qw(lvref refassign)], OPpMAYBE_LVSUB => [qw(aassign aelem akeys aslice av2arylen avhvswitch helem hslice keys kvaslice kvhslice multideref padav padhv pos rv2av rv2gv rv2hv substr vec)], - OPpMAYBE_TRUEBOOL => [qw(padhv rv2hv)], + OPpMAYBE_TRUEBOOL => [qw(padhv ref rv2hv)], OPpMULTIDEREF_DELETE => [qw(multideref)], OPpOFFBYONE => [qw(caller runcv wantarray)], OPpOPEN_IN_CRLF => [qw(backtick open)], diff --git a/mg.c b/mg.c index e50b755eca..3a2210d20f 100644 --- a/mg.c +++ b/mg.c @@ -638,7 +638,7 @@ Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg) if (PL_curpm) { REGEXP * const rx = PM_GETRE(PL_curpm); if (rx) { - UV uv= (UV)mg->mg_obj; + UV uv = (UV)mg->mg_obj; if (uv == '+') { /* @+ */ /* return the number possible */ return RX_NPARENS(rx); @@ -674,7 +674,7 @@ Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg) if (PL_curpm) { REGEXP * const rx = PM_GETRE(PL_curpm); if (rx) { - const UV uv= (UV)mg->mg_obj; + const UV uv = (UV)mg->mg_obj; /* @{^CAPTURE} does not contain $&, so we need to increment by 1 */ const I32 paren = mg->mg_len + (uv == '\003' ? 1 : 0); @@ -2910,10 +2910,9 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) break; case '/': { - SV *tmpsv= sv; if (SvROK(sv)) { - SV *referent= SvRV(sv); - const char *reftype= sv_reftype(referent, 0); + SV *referent = SvRV(sv); + const char *reftype = sv_reftype(referent, 0); /* XXX: dodgy type check: This leaves me feeling dirty, but * the alternative is to copy pretty much the entire * sv_reftype() into this routine, or to do a full string @@ -2922,23 +2921,21 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) * without reviewing the corresponding comment in * sv_reftype(). - Yves */ if (reftype[0] == 'S' || reftype[0] == 'L') { - IV val= SvIV(referent); + IV val = SvIV(referent); if (val <= 0) { - tmpsv= &PL_sv_undef; - Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED), - "Setting $/ to a reference to %s as a form of slurp is deprecated, treating as undef. This will be fatal in Perl 5.28", - SvIV(SvRV(sv)) < 0 ? "a negative integer" : "zero" - ); + sv_setsv(sv, PL_rs); + Perl_croak(aTHX_ "Setting $/ to a reference to %s is forbidden", + val < 0 ? "a negative integer" : "zero"); } } else { sv_setsv(sv, PL_rs); - /* diag_listed_as: Setting $/ to %s reference is forbidden */ + /* diag_listed_as: Setting $/ to %s reference is forbidden */ Perl_croak(aTHX_ "Setting $/ to a%s %s reference is forbidden", *reftype == 'A' ? "n" : "", reftype); } } SvREFCNT_dec(PL_rs); - PL_rs = newSVsv(tmpsv); + PL_rs = newSVsv(sv); } break; case '\\': diff --git a/op.c b/op.c index 0b687e28bc..23e1640d9a 100644 --- a/op.c +++ b/op.c @@ -14784,6 +14784,12 @@ Perl_rpeep(pTHX_ OP *o) break; } + case OP_REF: + /* see if ref() is used in boolean context */ + if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR) + S_check_for_bool_cxt(aTHX_ o, OPpTRUEBOOL, OPpMAYBE_TRUEBOOL); + break; + case OP_CUSTOM: { Perl_cpeep_t cpeep = XopENTRYCUSTOM(o, xop_peep); diff --git a/opcode.h b/opcode.h index 8fd5e79fc2..f3ba953016 100644 --- a/opcode.h +++ b/opcode.h @@ -2465,10 +2465,10 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { 0, /* prototype */ 0, /* refgen */ 0, /* srefgen */ - 0, /* ref */ - 47, /* bless */ - 48, /* backtick */ - 47, /* glob */ + 47, /* ref */ + 50, /* bless */ + 51, /* backtick */ + 50, /* glob */ 0, /* readline */ -1, /* rcatline */ 0, /* regcmaybe */ @@ -2478,14 +2478,14 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { -1, /* qr */ -1, /* subst */ 0, /* substcont */ - 53, /* trans */ - 53, /* transr */ - 60, /* sassign */ - 63, /* aassign */ + 56, /* trans */ + 56, /* transr */ + 63, /* sassign */ + 66, /* aassign */ 0, /* chop */ 0, /* schop */ - 68, /* chomp */ - 68, /* schomp */ + 71, /* chomp */ + 71, /* schomp */ 0, /* defined */ 0, /* undef */ 0, /* study */ @@ -2498,22 +2498,22 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { 0, /* i_postinc */ 0, /* postdec */ 0, /* i_postdec */ - 70, /* pow */ - 70, /* multiply */ - 70, /* i_multiply */ - 70, /* divide */ - 70, /* i_divide */ - 70, /* modulo */ - 70, /* i_modulo */ - 72, /* repeat */ - 70, /* add */ - 70, /* i_add */ - 70, /* subtract */ - 70, /* i_subtract */ - 70, /* concat */ - 74, /* stringify */ - 70, /* left_shift */ - 70, /* right_shift */ + 73, /* pow */ + 73, /* multiply */ + 73, /* i_multiply */ + 73, /* divide */ + 73, /* i_divide */ + 73, /* modulo */ + 73, /* i_modulo */ + 75, /* repeat */ + 73, /* add */ + 73, /* i_add */ + 73, /* subtract */ + 73, /* i_subtract */ + 73, /* concat */ + 77, /* stringify */ + 73, /* left_shift */ + 73, /* right_shift */ 12, /* lt */ 12, /* i_lt */ 12, /* gt */ @@ -2538,9 +2538,9 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { 12, /* bit_and */ 12, /* bit_xor */ 12, /* bit_or */ - 70, /* nbit_and */ - 70, /* nbit_xor */ - 70, /* nbit_or */ + 73, /* nbit_and */ + 73, /* nbit_xor */ + 73, /* nbit_or */ 12, /* sbit_and */ 12, /* sbit_xor */ 12, /* sbit_or */ @@ -2548,114 +2548,114 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { 0, /* i_negate */ 0, /* not */ 0, /* complement */ - 68, /* ncomplement */ - 68, /* scomplement */ + 71, /* ncomplement */ + 71, /* scomplement */ 12, /* smartmatch */ - 74, /* atan2 */ - 68, /* sin */ - 68, /* cos */ - 74, /* rand */ - 74, /* srand */ - 68, /* exp */ - 68, /* log */ - 68, /* sqrt */ - 68, /* int */ - 68, /* hex */ - 68, /* oct */ - 68, /* abs */ - 68, /* length */ - 76, /* substr */ - 79, /* vec */ - 74, /* index */ - 74, /* rindex */ - 47, /* sprintf */ - 47, /* formline */ - 68, /* ord */ - 68, /* chr */ - 74, /* crypt */ + 77, /* atan2 */ + 71, /* sin */ + 71, /* cos */ + 77, /* rand */ + 77, /* srand */ + 71, /* exp */ + 71, /* log */ + 71, /* sqrt */ + 71, /* int */ + 71, /* hex */ + 71, /* oct */ + 71, /* abs */ + 71, /* length */ + 79, /* substr */ + 82, /* vec */ + 77, /* index */ + 77, /* rindex */ + 50, /* sprintf */ + 50, /* formline */ + 71, /* ord */ + 71, /* chr */ + 77, /* crypt */ 0, /* ucfirst */ 0, /* lcfirst */ 0, /* uc */ 0, /* lc */ 0, /* quotemeta */ - 81, /* rv2av */ - 87, /* aelemfast */ - 87, /* aelemfast_lex */ - 88, /* aelem */ - 93, /* aslice */ - 96, /* kvaslice */ + 84, /* rv2av */ + 90, /* aelemfast */ + 90, /* aelemfast_lex */ + 91, /* aelem */ + 96, /* aslice */ + 99, /* kvaslice */ 0, /* aeach */ 0, /* avalues */ 38, /* akeys */ 0, /* each */ 0, /* values */ 38, /* keys */ - 97, /* delete */ - 101, /* exists */ - 103, /* rv2hv */ - 88, /* helem */ - 93, /* hslice */ - 96, /* kvhslice */ - 111, /* multideref */ - 47, /* unpack */ - 47, /* pack */ - 118, /* split */ - 47, /* join */ - 123, /* list */ + 100, /* delete */ + 104, /* exists */ + 106, /* rv2hv */ + 91, /* helem */ + 96, /* hslice */ + 99, /* kvhslice */ + 114, /* multideref */ + 50, /* unpack */ + 50, /* pack */ + 121, /* split */ + 50, /* join */ + 126, /* list */ 12, /* lslice */ - 47, /* anonlist */ - 47, /* anonhash */ - 47, /* splice */ - 74, /* push */ + 50, /* anonlist */ + 50, /* anonhash */ + 50, /* splice */ + 77, /* push */ 0, /* pop */ 0, /* shift */ - 74, /* unshift */ - 125, /* sort */ - 132, /* reverse */ + 77, /* unshift */ + 128, /* sort */ + 135, /* reverse */ 0, /* grepstart */ 0, /* grepwhile */ 0, /* mapstart */ 0, /* mapwhile */ 0, /* range */ - 134, /* flip */ - 134, /* flop */ + 137, /* flip */ + 137, /* flop */ 0, /* and */ 0, /* or */ 12, /* xor */ 0, /* dor */ - 136, /* cond_expr */ + 139, /* cond_expr */ 0, /* andassign */ 0, /* orassign */ 0, /* dorassign */ 0, /* method */ - 138, /* entersub */ - 145, /* leavesub */ - 145, /* leavesublv */ + 141, /* entersub */ + 148, /* leavesub */ + 148, /* leavesublv */ 0, /* argcheck */ - 147, /* argelem */ + 150, /* argelem */ 0, /* argdefelem */ - 149, /* caller */ - 47, /* warn */ - 47, /* die */ - 47, /* reset */ + 152, /* caller */ + 50, /* warn */ + 50, /* die */ + 50, /* reset */ -1, /* lineseq */ - 151, /* nextstate */ - 151, /* dbstate */ + 154, /* nextstate */ + 154, /* dbstate */ -1, /* unstack */ -1, /* enter */ - 152, /* leave */ + 155, /* leave */ -1, /* scope */ - 154, /* enteriter */ - 158, /* iter */ + 157, /* enteriter */ + 161, /* iter */ -1, /* enterloop */ - 159, /* leaveloop */ + 162, /* leaveloop */ -1, /* return */ - 161, /* last */ - 161, /* next */ - 161, /* redo */ - 161, /* dump */ - 161, /* goto */ - 47, /* exit */ + 164, /* last */ + 164, /* next */ + 164, /* redo */ + 164, /* dump */ + 164, /* goto */ + 50, /* exit */ 0, /* method_named */ 0, /* method_super */ 0, /* method_redir */ @@ -2666,143 +2666,143 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { 0, /* leavewhen */ -1, /* break */ -1, /* continue */ - 163, /* open */ - 47, /* close */ - 47, /* pipe_op */ - 47, /* fileno */ - 47, /* umask */ - 47, /* binmode */ - 47, /* tie */ + 166, /* open */ + 50, /* close */ + 50, /* pipe_op */ + 50, /* fileno */ + 50, /* umask */ + 50, /* binmode */ + 50, /* tie */ 0, /* untie */ 0, /* tied */ - 47, /* dbmopen */ + 50, /* dbmopen */ 0, /* dbmclose */ - 47, /* sselect */ - 47, /* select */ - 47, /* getc */ - 47, /* read */ - 47, /* enterwrite */ - 145, /* leavewrite */ + 50, /* sselect */ + 50, /* select */ + 50, /* getc */ + 50, /* read */ + 50, /* enterwrite */ + 148, /* leavewrite */ -1, /* prtf */ -1, /* print */ -1, /* say */ - 47, /* sysopen */ - 47, /* sysseek */ - 47, /* sysread */ - 47, /* syswrite */ - 47, /* eof */ - 47, /* tell */ - 47, /* seek */ - 47, /* truncate */ - 47, /* fcntl */ - 47, /* ioctl */ - 74, /* flock */ - 47, /* send */ - 47, /* recv */ - 47, /* socket */ - 47, /* sockpair */ - 47, /* bind */ - 47, /* connect */ - 47, /* listen */ - 47, /* accept */ - 47, /* shutdown */ - 47, /* gsockopt */ - 47, /* ssockopt */ + 50, /* sysopen */ + 50, /* sysseek */ + 50, /* sysread */ + 50, /* syswrite */ + 50, /* eof */ + 50, /* tell */ + 50, /* seek */ + 50, /* truncate */ + 50, /* fcntl */ + 50, /* ioctl */ + 77, /* flock */ + 50, /* send */ + 50, /* recv */ + 50, /* socket */ + 50, /* sockpair */ + 50, /* bind */ + 50, /* connect */ + 50, /* listen */ + 50, /* accept */ + 50, /* shutdown */ + 50, /* gsockopt */ + 50, /* ssockopt */ 0, /* getsockname */ 0, /* getpeername */ 0, /* lstat */ 0, /* stat */ - 168, /* ftrread */ - 168, /* ftrwrite */ - 168, /* ftrexec */ - 168, /* fteread */ - 168, /* ftewrite */ - 168, /* fteexec */ - 173, /* ftis */ - 173, /* ftsize */ - 173, /* ftmtime */ - 173, /* ftatime */ - 173, /* ftctime */ - 173, /* ftrowned */ - 173, /* fteowned */ - 173, /* ftzero */ - 173, /* ftsock */ - 173, /* ftchr */ - 173, /* ftblk */ - 173, /* ftfile */ - 173, /* ftdir */ - 173, /* ftpipe */ - 173, /* ftsuid */ - 173, /* ftsgid */ - 173, /* ftsvtx */ - 173, /* ftlink */ - 173, /* fttty */ - 173, /* fttext */ - 173, /* ftbinary */ - 74, /* chdir */ - 74, /* chown */ - 68, /* chroot */ - 74, /* unlink */ - 74, /* chmod */ - 74, /* utime */ - 74, /* rename */ - 74, /* link */ - 74, /* symlink */ + 171, /* ftrread */ + 171, /* ftrwrite */ + 171, /* ftrexec */ + 171, /* fteread */ + 171, /* ftewrite */ + 171, /* fteexec */ + 176, /* ftis */ + 176, /* ftsize */ + 176, /* ftmtime */ + 176, /* ftatime */ + 176, /* ftctime */ + 176, /* ftrowned */ + 176, /* fteowned */ + 176, /* ftzero */ + 176, /* ftsock */ + 176, /* ftchr */ + 176, /* ftblk */ + 176, /* ftfile */ + 176, /* ftdir */ + 176, /* ftpipe */ + 176, /* ftsuid */ + 176, /* ftsgid */ + 176, /* ftsvtx */ + 176, /* ftlink */ + 176, /* fttty */ + 176, /* fttext */ + 176, /* ftbinary */ + 77, /* chdir */ + 77, /* chown */ + 71, /* chroot */ + 77, /* unlink */ + 77, /* chmod */ + 77, /* utime */ + 77, /* rename */ + 77, /* link */ + 77, /* symlink */ 0, /* readlink */ - 74, /* mkdir */ - 68, /* rmdir */ - 47, /* open_dir */ + 77, /* mkdir */ + 71, /* rmdir */ + 50, /* open_dir */ 0, /* readdir */ **** PATCH TRUNCATED AT 2000 LINES -- 1465 NOT SHOWN **** -- Perl5 Master Repository
