From: Gisle Aas Date: Tue, 24 Jun 1997 03:46:11 +0000 (+1200) Subject: bless file handles as FileHandle if loaded else IO::Handle X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=c9de509e331450a10058399280ce28f68f0faf39;p=p5sagit%2Fp5-mst-13.2.git bless file handles as FileHandle if loaded else IO::Handle Subject: Re: More info regarding the Can't locate error message [PATCH] lvirden@cas.org (Larry W. Virden) writes: > use FileHandle; > STDERR->open("/tmp/errorsfile","w"); This patch tries to fix the problem by auto-blessing handles as 'FileHandle' if the FileHandle package has been loaded and IO::Handle otherwise. The snag is that STDOUT, STDIN, STDERR are initialized before 'use FileHandle' executes, so they are all initially blessed as IO::Handles. We compensate by reblessing them in FileHandle.pm: This makes Larry's example as well as the following code work: use FileHandle; open(F, "/dev/null") or die; F->seek(0, 1) or die; p5p-msgid: hyb80drrz.fsf@bergen.sn.no --- diff --git a/gv.c b/gv.c index 6c912a0..8b38bbe 100644 --- a/gv.c +++ b/gv.c @@ -827,7 +827,9 @@ newIO() sv_upgrade((SV *)io,SVt_PVIO); SvREFCNT(io) = 1; SvOBJECT_on(io); - iogv = gv_fetchpv("IO::Handle::", TRUE, SVt_PVHV); + iogv = gv_fetchpv("FileHandle::", FALSE, SVt_PVHV); + if (!iogv) + iogv = gv_fetchpv("IO::Handle::", TRUE, SVt_PVHV); SvSTASH(io) = (HV*)SvREFCNT_inc(GvHV(iogv)); return io; } diff --git a/lib/FileHandle.pm b/lib/FileHandle.pm index 0b5d9ed..1dc699c 100644 --- a/lib/FileHandle.pm +++ b/lib/FileHandle.pm @@ -93,6 +93,11 @@ sub pipe { ($r, $w); } +# Rebless standard file handles +bless *STDIN{IO}, "FileHandle"; +bless *STDOUT{IO}, "FileHandle"; +bless *STDERR{IO}, "FileHandle"; + 1; __END__