bless file handles as FileHandle if loaded else IO::Handle
Gisle Aas [Tue, 24 Jun 1997 03:46:11 +0000 (15:46 +1200)]
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

gv.c
lib/FileHandle.pm

diff --git a/gv.c b/gv.c
index 6c912a0..8b38bbe 100644 (file)
--- 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;
 }
index 0b5d9ed..1dc699c 100644 (file)
@@ -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__