develooper Front page | perl.perl5.porters | Postings from January 2012

[perl #77388] Stacked file tests with -T, -t and/or -B remove too much from the stack

Thread Next
Father Chrysostomos via RT
January 11, 2012 22:33
[perl #77388] Stacked file tests with -T, -t and/or -B remove too much from the stack
Message ID:
On Mon Aug 23 11:51:51 2010, wrote:
> I had a talk with Jan Dubois about this (because he fixed a similar  
> bug with -u/-g/-k on windows) and this are his notes:
>   <jdb> It happens because pp_fttty and pp_fttext don't know about  
> stacked file tests
>   <jdb> The problem is that the stacked filetest doesn't leave the  
> filename on the stack, it leaves the result of the test only.
>   <jdb> So the next test in the sequence will pop the result with  
> STACKED_FTEST_CHECK and either return early with a FALSE value, or  
> continue checking
>   <jdb> The checking will have to rely on PL_laststatval for the next  
> test in the sequence
>   <jdb> But the stat buffer doesn't contain the information that -T needs
>   <jdb> So it always pops something from the stack, even though there  
> is nothing there in this case
>   <Bram> I see. Is it fixable? Or should I create a bug report for it?
>   <jdb> For pp_ftis is this hard to see because the actual stack logic  
> is hidden in my_stat() in doio.c (my_stat_flags in 5.12)
>   <jdb> Please create a bug report, I'm not sure how you can fix it
>   <jdb> Because the filename is gone by the time the second stacked  
> filetest is executed.  So how are you going to make the check now?

The file name is in PL_statname.  The last gv is in PL_statgv.  -T and
-B can already handle *_.  They just need to be taught to do so in
stacked mode instead of popping something off the stack.

(There does seem to be another bug, though.  The code is not setting
PL_laststype when called with a gv.  And I think a nonexistent file name
will cause the internal stat status to get out of sync, as
PL_last_stat_val and PL_statcache are not set until after the file is
opened, but PL_laststype is set before.  Ouch, there is so much wrong
with this code!)

>   <jdb> And extending my_stat() is not an option because -T is *expensive*
>   <jdb> It actually opens the file and reads the first 1024 bytes or  
> something like that.
>   <Bram> I'm not sure... the fix could be to disallow -T and -t in  
> stacked file tests but I don't know how complicated that is..

But -t is difficult.  -r -w $foo is documented as being equivalent to -r
$foo && -w _.  But -t doesn’t work with _.  We could make -t use _  when
stacked, which would be silly.  I can’t think of a case where stacked -t
is actually useful, which makes it hard to decide how it should work.

Actually, forget half of that.  -t could use PL_statgv, too.  We just
need to document that -t -r is not exactly equivalent to -r && -t _.

Should -t -r "filename" be an error, or equivalent to -r "filename" &&
-t "filename"?


Father Chrysostomos

via perlbug:  queue: perl5 status: new

Thread Next Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About