From eb4c377af757baa899bb66137d53187fcea634db Mon Sep 17 00:00:00 2001 From: Father Chrysostomos Date: Fri, 13 Jan 2012 23:38:57 -0800 Subject: [PATCH] Make -T _ and -B _ always set PL_laststatval -T _ and -B _ always do another stat() on the previous file handle or filename, unless it is a handle that has been closed. Normally, the internal stat buffer, status, etc., are reset even for _. This happens even on a failed fstat(). -T HANDLE and -B HANDLE currently *do* reset the stat status (PL_laststatval) if there is no IO thingy, so having -T _ and -B _ not do that makes things needlessly inconsistent. --- pp_sys.c | 2 +- t/op/filetest.t | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/pp_sys.c b/pp_sys.c index 9d5c09c..1a84e10 100644 --- a/pp_sys.c +++ b/pp_sys.c @@ -3329,10 +3329,10 @@ PP(pp_fttext) } else { PL_statgv = gv; - PL_laststatval = -1; sv_setpvs(PL_statname, ""); io = GvIO(PL_statgv); } + PL_laststatval = -1; if (io && IoIFP(io)) { if (! PerlIO_has_base(IoIFP(io))) DIE(aTHX_ "-T and -B not implemented on filehandles"); diff --git a/t/op/filetest.t b/t/op/filetest.t index cf7a02d..65d9147 100644 --- a/t/op/filetest.t +++ b/t/op/filetest.t @@ -10,7 +10,7 @@ BEGIN { } use Config; -plan(tests => 42 + 27*14); +plan(tests => 43 + 27*14); ok( -d 'op' ); ok( -f 'TEST' ); @@ -253,7 +253,7 @@ for my $op (split //, "rwxoRWXOezsfdlpSbctugkTMBAC") { my $Perl = which_perl(); SKIP: { - skip "no -T on filehandles", 5 unless eval { -T STDERR; 1 }; + skip "no -T on filehandles", 6 unless eval { -T STDERR; 1 }; # Test that -T HANDLE sets the last stat type -l "perl.c"; # last stat type is now lstat @@ -287,6 +287,12 @@ SKIP: { # and after -r $ioref -r *$fh{IO}; ok -T _, '-T _ works after -r $ioref'; + + # -T _ on closed filehandle should still reset stat info + stat $fh; + close $fh; + -T _; + ok !stat _, '-T _ on closed filehandle resets stat info'; } is runperl(prog => '-T _', switches => ['-w'], stderr => 1), "", -- 2.7.4