On Mon Aug 23 11:51:51 2010, p5p@perl.wizbit.be 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 easily. > <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 https://rt.perl.org:443/rt3/Ticket/Display.html?id=77388Thread Next