GET A LIFE
何となく退屈だったのでduncanのmcsのbugzilla潰しに付き合ってしまう。
誰かこういうライトなバグを直してくれませんか〜?
- http://bugzilla.ximian.com/show_bug.cgi?id=70004
- http://bugzilla.ximian.com/show_bug.cgi?id=70474
- http://bugzilla.ximian.com/show_bug.cgi?id=70469
この辺は~~「BinaryReaderを全面的に実装し直し」だと思うので~~これはびみょー(コメント参照)、そこそこ面白いかも:
http://bugzilla.ximian.com/show_bug.cgi?id=70471
Miguel de Icaza will leave Novell and join Google.
Don Boxったら相変わらずお茶目さん。
コメント
Kazuki — 12/30/2004 11:25:12
BinaryReaderというよりUTF8の問題では?
試にUTF8のInternalGetCharsとかを書き換えてみたら、きちんと動きましたし。
atsushieno — 12/30/2004 12:52:04
はい、そのバグレポートの件は動くかもしれません。しかしStreamReader.csのReadBuffer()を見ると分かるのですが、3バイトのbyteに対して2文字のcharが返される場合に、要求文字数によってはバッファを内部的に保持しておく必要があると思います。
Kazuki — 12/30/2004 13:35:13
うーん・・・Text.Decoderの方にバッファがあるので、問題ないのでは?
atsushieno — 12/30/2004 14:16:21
ええと、Decoderは確かにleftOverBits等を保持しています。でも、BinaryReaderでは(StreamReaderとは違って)Decoderを使用しておらず、UTF8Encoding自体はGetDecoderを使っていないようです。
charのバッファをとっておく必要は無さそうですね。動作確認してみないと確実なことは言えませんが…
Kazuki — 12/30/2004 14:30:15
Encoding.GetCharsが指定文字数を返すまで1バイトづつ読み込んでバッファに追加して・・・ですので、問題はないかなと思います。なんか効率が悪そうですけどね(笑
それにしても私ってコメント欄を汚しすぎですね・・・
Kazuki — 12/31/2004 03:32:40
BinaryReader.ReadCharBytesで、一度に大量の文字列を読み込む場合、内部バッファを拡張したまま縮小しないので、無駄にメモリを保持するかも。(おそらくかなり微妙なサイズだと思いますが(笑
問題かもしれない点を発見したのでご報告しておきますw
atsushieno — 12/31/2004 04:05:19
またまたありがとうございます。ええと、これは微妙ですね。内部バッファはbyte[]なので、結局GCによって回収されるまで残るんですが、一応Dispose()した段階でこのbyte[]は解放されます(といっても通常はBinaryReader自体がほどなく解放されると思いますが)。byte[]のメモリ確保も、たびたび行っていると効率が悪いので、通常は同じサイズでの読み込みが連続的に行われることが予想されていると思います。大量に読み込んだ後、多分BinaryReaderはそのまま破棄されてしまうでしょう。
akiramei — 01/02/2005 02:57:10
70474はIntegerFormatter.csのFormatPlain関数が怪しそう。0の削除をすべてのトークンを処理した後にやっていますが、PH_0,PH_NUMBER毎に行わないといけない気がします。関数の最後のコメント以下の処理をマイナスの符号を追加している手前に入れればどうでしょうか? ’ ###’のケースだけでなく、’###’に負数を渡したときも不具合があるので、多分、ここだと思うんですけが、cygwinでmake出来ないので確認出来ないです。(^^;;
atsushieno — 01/02/2005 03:57:15
わーい、meiさんならきっといずれhackしていただけると思ってました(笑 ありがとうございます。ええと、「PH_0,PH_NUMBER毎に」というのをちゃんと理解出来ていないのかもしれませんが、その部分をダイレクトに上に移動してやってみました。が、123.ToString (”00000”) が失敗してしまいます(このテストはmcs/class/corlib/Test/System/Int32Test.csのTestCustomToString()に含まれています)。PH_0のときは先頭の0を消してはいけないからかな?? むしろ、’#’(PH_NUMBER)のときは、そもそもoutputListに追加しないように出来れば良いのでしょうね。