unread()のバグ

:scalar

:scalarのunread()のバグについて,perlbugにレポートを送った。しかし添付ファイルを付け忘れた。
バグレポートは大分送り慣れてきたが,いつもファイルを添付するのを忘れてしまう。今回は,いつも添付し忘れるから本文にもファイル名を書いておこう,とまで思ったのにそれでも忘れた。これはひどい

:crlf

Win32のデフォルトレイヤである:crlfのunread()もバグっている*1。PerlIOCrlf_unread()が,LFだけが押し戻された場合でもCRとLFをバッファに押し戻すからのようだ。この振る舞いが正しいのかどうかは分からないが,結果的にはバッファがおかしくなることがあるので,バグだと考えられる。しかし,どうすれば「直った」といえるのかがよく分からないので,直しようがない。
この問題そのものは全てのプラットフォームで再現する。

#!perl -w
use 5.008_001;
use strict;
use Test::More 'no_plan';
use IO::Handle;
use File::Spec;
# :perlioにすると一応テストは通る
ok open(my $io, '<:crlf', File::Spec->devnull), 'open';
my $n = 5000;
for my $i(1 .. $n){
	$io->ungetc(ord "\n");
}
diag 'tell($io) = ', tell($io);
is_deeply [<$io>], [("\n") x $n], 'readline';

*1:そのせいでIO::Handle::unreadのテストがWin32で失敗する。