PerlIO_unread()

PerlIO_unread()という,stdioのungetc()を拡張したようなPerlIO APIがある。
PerlIO APIのテストの為に,これをPerlから呼び出すモジュールを書いて,ついでにCPANにアップロードした。
しかし,これはちょっと思慮の足りない行為だったかもしれない。Perlインタプリタは,内部的にはPerlIO_unread()のラッパーであるPerlIO_ungetc()を呼び出しているが,今のところPerlIO_unread()のような汎用性は求められていない。むしろ,PerlIO_unread()の用途が分からない。一体何のために使うというのか。将来的にはむしろPerlIO APIから削除して,ungetc()に置き換えるということも考えた方がいいのではないか。
さらにもう一つ問題がある。PerlIO_unread()の実装は,デフォルトでは汎用のPerlIOBase_unread()が使われる。しかし:scalarレイヤは独自のunread()を実装しており,その実装にバグがあるため条件次第ではSEGVしてしまう*1

というわけで,IO::Handle::unreadは削除する予定です。反省。
削除は考え直しました。
IO::Handle::unreadをPerlIO APIテスト用のモジュールとして開発し,その結果一つ標準ライブラリのバグを見つけることができたので,開発した意義は十分にあったといえる。今後もテスト用として役に立つかもしれないので,保守は続けることにする。

*1:IO::Handleモジュールのungetc()でも再現できる。