Bug #12748
closedirb の評価結果が2回表示されます
Description
irbを実行すると次のように評価結果が2回表示されます。
副作用のある呼び出しをしても副作用そのものは1回だけ実行されているので、表示上だけの問題でないかと思います。
作成: Visual Studio 2015 Community
実行: Windows 10 Pro 64bit
Updated by dogatana (Toshihiko Ichida) almost 10 years ago
Updated by usa (Usaku NAKAMURA) almost 10 years ago
- Status changed from Open to Feedback
残念ながら、当方の手元(Win7, Win10 / vc10, vc12, vc14 / x86, x64)では再現することができませんでした。
そちらの環境では、例えば過去のバージョンのrubyでは問題はなかったのでしょうか?
Updated by dogatana (Toshihiko Ichida) almost 10 years ago
Updated by usa (Usaku NAKAMURA) almost 10 years ago
あ、ソースをいじってコンパイルが試せるのであれば話が早いかもです。
win32/win32.cのrb_w32_write_consoleの中にある、7123行目または7132行目の
WriteConsleWが実際の出力処理になります。
そのどっちが呼ばれてるか、またその時引数ptrおよびlen(またはcurlen)がどうなってるか、
というあたりを観察すると、何かわかるかもしれません。
Updated by dogatana (Toshihiko Ichida) almost 10 years ago
io.c の io_fwrite() に問題があるようです。
この関数内で #ifdef _WIN32 内の、rb_w32_write_console() と、その下の io_binwrite() の両方が呼び出されるために、2回出力されています。
リダイレクトすると片方だけになります。
> ruby -e 'p 1'
# io_fwrite: rb_w32
handle: 14c
dwMode: 7
1# io_fwrite: io_binwrite
# io_fwrite: rb_w32
handle: 14c
dwMode: 7
# io_fwrite: io_binwrite
1
> ruby -e 'p 1' > dump.txt
# io_fwrite: io_binwrite
# io_fwrite: io_binwrite
同様の記述が rb_write_error_str() にもあり、こちらも確認が必要かもしれません。
rb_w32_write_console() と コンソール出力かどうかの判定方法が異なるのが気になります。
win32.c の rb_w32_write_console() を眺めたところ、ENABLE_VIRTUAL_TERMINAL_PROCESSING を判定しているので、色出力を対応するための処理のようですね。
2.4 からの追加でしょうか。
Updated by usa (Usaku NAKAMURA) almost 10 years ago
あー、なるほど、バグですね。
これは2.4から入ったコードなので2.3以前で起きないのも納得です。
直しておきます。
Updated by usa (Usaku NAKAMURA) almost 10 years ago
- Status changed from Feedback to Open
Updated by usa (Usaku NAKAMURA) almost 10 years ago
- Status changed from Open to Closed
Updated by nagachika (Tomoyuki Chikanaga) almost 10 years ago
- Backport changed from 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN to 2.1: DONTNEED, 2.2: DONTNEED, 2.3: DONTNEED