ruby-trunk-changes r47731 - r47739

今日は拡張ライブラリ date の TypedData 化と Write Barrier 挿入による WB Protected 化、Windows 版での File.expand_path のユーザ名展開の不具合修正などがありました。

nobu: r47731 2014-09-29 06:47:59 +0900

CentOS 5 の古い ruby だと Array#shift に引数が受け付けられなかったり String#start_with? がなかったりするので tool/downloader.rb の r47693 や r47726 の変更を修正しています。start_with? ってどれくらい前だろ…多分 1.8系でしょうね。
[追記]String#start_with? は 1.8.7 からで、CentOS5 の ruby は 1.8.5 だそうです。古いなぁ[/追記]

nobu: r47732 2014-09-29 09:49:12 +0900

拡張ライブラリ date で TypedData を利用するようにしています。

nobu: r47733 2014-09-29 09:49:18 +0900

r47732 の続きで拡張ライブラリ date で Date の操作に Write Barrier を挿入して WB Protected としています。

nobu: r47734 2014-09-29 10:45:11 +0900

r47733 のさらに続きで拡張ライブラリ date にさらに Write Barrier を挿入しています。また struct SimpleDateData と struct ComplexDateData の VALUE 型のメンバに const を付けることで Write Barrier 挿入すべき箇所を検出できるようにしています。

nobu: r47735 2014-09-29 11:20:56 +0900

で、最終的に r47734 の構造体メンバの const を付加したのはやめています。 aggregation assignments のためとあるのですが、多分初期化の代入で {0, 0, 0} みたいに定数で初期化する時の書きかたのことじゃないかと思います。
[追記]と思ったらそうではなくて adat->s = bdat->s のように構造体丸ごと代入の右辺左辺に書く方法のことだそうです。[/追記]

nobu: r47736 2014-09-29 21:17:47 +0900

拡張ライブラリ digest で Data_Get_Struct() や Data_Wrap_Struct() が利用されているところで警告が出ないように RUBY_UNTYPED_DATA_WARNING を 0 に再定義するようにしています。

nobu: r47737 2014-09-29 22:54:37 +0900

Windows で File.expand_path で "~" を展開する時に rb_bug() で異常終了する不具合を修正しています。 r47639 で導入された、String オブジェクトのバッファ部分に C の静的メモリ領域をそのまま使った時に struct RBasic::flags に STR_NOFREE を立てておいて sweep 時のバッファの free() 処理をスキップさせるしくみが、String のバッファが拡張された時に flags から STR_NOFREE フラグを落としていなかったのを修正しています。 [ruby-core:65317] [Bug #10304]

nobu: r47738 2014-09-29 22:54:50 +0900

r47737 の追加修正。 win32/file.c で File.expand_path 時の文字列サイズの拡張で新しいサイズの指定が間違っていたのを修正しています。 さっきの r47737 の修正がチケットにあったパッチとだいぶ違うなぁと思ったら別の問題も潜んでたってことみたいですね。 [ruby-core:65317] [Bug #10304]

nobu: r47739 2014-09-29 23:13:50 +0900

拡張ライブラリ racc/cparse で Racc::CparseParams というクラスを内部クラスとして allocate メソッドや initialize/initialize_copy を undef しています。 初期化されないオブジェクトを作って SEGV させたりできないようにするためのケアだと思います。