ruby-trunk-changes r55547 - r55558

今日は文字列の終端NUL文字のサイズに関する扱いの修正がたくさんと、.gdbinit に便利コマンドの追加がありました。

ngoto: r55547 2016-06-30 19:20:23 +0900

String のメソッドで終端の NUL 文字のワイド文字エンコーディング(UTF-16/32)で複数バイトになるのを考慮漏れしているところを修正しています。まだこんなにあったのか。調査お疲れさまです。 [ruby-dev:49699] [Bug #12536]

naruse: r55548 2016-07-01 04:36:38 +0900

.gdbinit の rb_ps_thread というコマンドで control frame を辿って ruby レベルのバックトレースを表示できるようにしています。たまーに rubygdb でアタッチして調べたくなる時があって、そのような時にいちいち手作業で頑張らなくて良くなるのでとても便利。あと副産物として print_string という embed かどうかによらず String オブジェクトの内容を表示してくれるコマンドも追加されていて便利。というかこれって今までなかったのか。

svn: r55549 2016-07-01 04:36:39 +0900

version.h の日付更新。

naruse: r55550 2016-07-01 12:13:41 +0900

.gdbinit に rb_count_objects というコマンドが追加されていて ObjectSpace の全 slot をみてどのタイプのオブジェクトがいくつあるかをダンプしてくれるようにしています。

ngoto: r55551 2016-07-01 12:58:51 +0900

string.c の r55547 の変更で結合の順序をはっきりさせるためのかっこを追加しています。このくらいだと個人的にはあまり迷わないですけどね。 [ruby-dev:49699] [Bug #12536]

ngoto: r55552 2016-07-01 13:50:38 +0900

string.c の rb_str_subseq(), str_substr() で struct RVALUE に文字列バッファを埋め込む embeded モードにする文字列サイズの判定時に NUL 文字が複数バイトだった時を考慮するようにしています。元々 1バイトぶんは余分に取ってあるのですが、終端文字が複数バイトの時は超えてしまうのでそのぶん短い文字列しか埋め込めないようにしています。

naruse: r55553 2016-07-01 18:24:59 +0900

.gdbinit に r55548 で追加した print_string は output_string に改名して rb_ps_thread で出力する C 実装メソッドの情報を詳細にしています。 gdb 自体の機能を使って関数ポインタからデバッグ情報を元に関数名やソースファイル名を表示しているみたいです。

ngoto: r55554 2016-07-01 19:43:07 +0900

拡張ライブラリ fiddle のテストで r55547 や r55552 の String の終端文字の複数バイト対応により embed できる文字数がエンコーディングによっては変わった結果失敗している(この変更が問題だったというよりもそれによって潜在的な問題が顕在化した)ものがあったので、Fiddle::Pointer にわたして変更する文字列は Marshal.dump/load を使って完全に独立したバッファを持つものを渡すようにしています。文字列リテラルのバッファを直接書き変えてしまっていたみたいです。 [ruby-dev:49700] [Bug #12537]

ngoto: r55555 2016-07-01 20:24:11 +0900

さらに文字列の NUL 終端文字の対応。 str_new0_cstr() という termlen の指定つきで文字列オブジェクトを生成する関数を追加して各所で str_new() や rb_str_new_cstr() のかわりにこれをこれを使うようにしています。 r55547 では TERM_LEN_MAX というマクロでデフォルトで終端文字のサイズを 4 としる文字列オブジェクトを生成する保守的な方法を取っていたので、1バイトで足りるとわかっている時やエンコーディングから終端文字のサイズがわかる時は明示的に指定して作るようにしています。 [ruby-dev:49699] [Bug #12536]

kazu: r55556 2016-07-01 21:00:07 +0900

r55548 の ChangeLog エントリの typo 修正。

ngoto: r55557 2016-07-02 02:32:21 +0900

str_fill_term() で文字列の追加などで(エンコーディングが変化して?)終端文字のバイト数が変化したらそれにあわせて必要ならバッファの再確保をするようにしています。 [ruby-dev:49699] [Bug #12536]

svn: r55558 2016-07-02 02:32:22 +0900

version.h の日付更新。