2012/5/16 Glass_saga (Masaki Matsushita) <glass.saga / gmail.com>:
>
> Issue #6440 has been reported by Glass_saga (Masaki Matsushita).
>
> ----------------------------------------
> Feature #6440: 引数にIOを渡した場合のMarshal.loadにバッファを持たせたい
> https://bugs.ruby-lang.org/issues/6440

> 現在のMarshal.loadでは、引数にIOを渡すとIO#getbyteやIO#readで当座に必要な部分のみの読み出しを繰り返すので
> 大量のメソッド呼び出しが発生し、そのコストが無視できません。
> そこで、引数にIOを渡した場合のMarshal.loadにバッファを持たせる事を提案します。

バッファがあると、読みすぎることがあるのではないでしょうか。

読みすぎたぶんを捨ててしまうと、
marshal したデータが複数並んでいるものを読み込む場合に、
動作しなくなってしまうと思います。

実際、パッチを当てると以下のようにエラーになってしまいます。

% ./ruby -e '2.times { Marshal.dump(1, STDOUT) }'|
./ruby -e '2.times { p Marshal.load(STDIN) }'
1
-e:1:in `readpartial': end of file reached (EOFError)
	from -e:1:in `load'
	from -e:1:in `block in <main>'
	from -e:1:in `times'
	from -e:1:in `<main>'

パッチを当てなければ、以下のように動作します。

% ruby -e '2.times { Marshal.dump(1, STDOUT) }'|
ruby -e '2.times { p Marshal.load(STDIN) }'
1
1

個人的に最近作っている tb というもので、この動作を利用しているので、
気になるところです。
-- 
[田中 哲][たなか あきら][Tanaka Akira]