Bug#547231: closed by Salvatore Bonaccorso <salvatore.bonaccorso at gmail.com> ([rt.cpan.org #59832] clobbers binmode layers on filehandles)

Andrew Pimlott andrew at pimlott.net
Wed Aug 18 20:35:56 UTC 2010


Salvatore, thanks for following up on this report.  I have some
questions below.

Excerpts from owner's message of Wed Aug 18 04:30:08 -0700 2010:
> This is an automatic notification regarding your Bug report
...
> Hi Andrew
> 
> I'm forwarding you the reply from upstream according to your report.
> 
> From: Hiroo_HAYASHI via RT <bug-Term-ReadLine-Gnu at rt.cpan.org>
> 
> > If I call
> > 
> >     Term::ReadLine->new('test', \*IN, \*OUT);
> > 
> > any encoding layers I have set on OUT seem to be removed.  I tracked
> 
> Term::Gnu::ReadLine "is an implementation of Term::ReadLine using the
> GNU Readline/History Library." as described in the document.
> The GNU Readline Library may call low level APIs directly.  So this is
> not a bug.

I realize that Readline has to do some low-level things.  But I don't
understand why it has to clobber the encoding layers on the filehandle.
Is it possible to preserve them?  Do you not agree that the test program
I sent is terribly confusing?  If Term::ReadLine::Gnu changes the
behavior of the filehandles like this, it should at least be documented.

> BTW if the reporter wants to handle multibyte (ex. UTF-8) characters,
> the GNU Readline Library support them and, as the result,
> Term::Gnu::ReadLine also support them. Refer the documents for the GNU
> Readline Library for details.

I couldn't find the documentation you are refering to, or how I'm
supposed to handle multibyte characters with Term::ReadLine::GNU in
Perl.  I notice that if I set the encoding layer back to UTF-8, it seems
to work.  In this test program, the first and third print statements
output the expected character, and only the second is broken:

    use Term::ReadLine;
    binmode(STDOUT, ':encoding(UTF-8)');
    print STDOUT ">", chr(0xf3), "<\n";
    $Term::ReadLine::Gnu::Attribs{outstream} = \*STDOUT;
    print STDOUT ">", chr(0xf3), "<\n";
    binmode(STDOUT, ':encoding(UTF-8)');
    print STDOUT ">", chr(0xf3), "<\n";

Will I have problems if I do it this way?  If this works, I don't see
why Term::ReadLine::GNU had to remove the encoding layer in the first
place.

> > it
> > down to the line in the perl source that sets $Attribs{outstream}.  I
> > looked briefly at the .xs source for _rl_store_iostream, but I can't
> > see
> > what's causing this.  I hope someone who knows perl internals can
> > figure
> > it out.
> 
> Here is a comment in Gnu.pm;
> ---------------------------------------
> # Each variable in the GNU Readline Library is tied to an entry of
> # this hash (%Attribs).  By accessing the hash entry, you can read
> # and/or write the variable in the GNU Readline Library.  See the
> # package definition of Term::ReadLine::Gnu::Var and following code
> # for more details.

I understand that part.  I traced the setting of $Attribs{outstream}
through the tie into _rl_store_iostream in Gnu.xs.  The code there looks
like

            rl_outstream = PerlIO_findFILE(stream);

Somehow this breaks my encoding layers, but I don't understand why.

Andrew





More information about the pkg-perl-maintainers mailing list