ruby-trunk-changes r44809 - r44840

今日は psych に同梱している libyaml のバージョンアップと、文字列のフラグ操作まわりのリファクタリング、pack("p") が返す文字列の Marshal.dump の不具合修正などがありました。

tenderlove: r44809 2014-02-05 04:18:01 +0900

拡張ライブラリ psych に同梱している libyaml を 0.1.5 に更新しています。 これは libyaml にあったヒープオーバフローの不具合を修正したものです。 http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-6393 こっちはまだ情報が開示されていないみたいですね。

svn: r44810 2014-02-05 04:18:05 +0900

version.h の日付更新。

tenderlove: r44811 2014-02-05 04:24:50 +0900

拡張ライブラリ psych のバージョンを 2.0.3 に更新して gem パッケージをリリースできるようにしています。

hsbt: r44812 2014-02-05 09:33:38 +0900

標準添付ライブラリ set の SortedSet の rdoc 用コメントの typo を修正しています。 https://github.com/ruby/ruby/pull/524

nobu: r44813 2014-02-05 10:04:25 +0900

r44809 で変更した libyaml のソースコードの行末の空白を除去しています。

nobu: r44814 2014-02-05 10:06:45 +0900

r44684 でファイル名を変更した README.ja.md の svn property を設定しています。自動的なんだと思いますがなぜか今頃反応しましたね。

nobu: r44815 2014-02-05 10:17:26 +0900

拡張ライブラリ psych に同梱されている libyaml のソースコードに r37936 と同様に const をつけて警告除去する変更を加えています。
const はまあ必要に応じてつけるにしても typo fix や空白除去を同梱しているソースコードに対してやると更新する時大変ですね。

nobu: r44816 2014-02-05 10:17:28 +0900

同じく r44809 で変更した psych に同梱している libyaml のソースコードで整数オーバフローを回避する修正を行なっています。 これは今回初めて入れる変更っぽいですね。

nobu: r44817 2014-02-05 10:17:29 +0900

同じく r44809 で変更した libyaml のソースコードの修正ですが 44816 の変更で型のサイズのマクロを利用するようにしたため ruby のヘッダが必要になったため ext/psych/yaml/yaml_private.h で RUBY_EXTCONF_H を #include するようにしています。

nobu: r44818 2014-02-05 10:17:31 +0900

r44809 の libyaml 更新から連なる修正です。 ext/psych/yaml/config.h に定義されている PACKAGE_VERSION, PACKAGE_STRING および YAML_VERSION_PATCH, YAML_VERSION_STRING というのを更新しています。 0.1.5 のはずなのに 0.1.4 のままだったみたいです。 libyaml のリポジトリには config.h はないので、多分 configure などで生成したものを取り込み漏れてたのでしょう。

ko1: r44822 2014-02-05 11:45:29 +0900

fstr を作成する rb_str_new_frozen() で分岐に使う条件で struct RString::as.heap.aux.shared についてありえない条件が使われていたのを消しているようです。あとは条件分岐の順番の入れ替えや共通の処理を分岐の後に括り出すなどのリファクタリング

ko1: r44823 2014-02-05 11:49:41 +0900

r44805 で String オブジェクトで使うフラグ STR_ASSOC を削除したのですが gc.c に残っていたのでそれも削除しています。

ko1: r44824 2014-02-05 12:14:23 +0900

string.c で capa を更新する時に使う RESIZE_CAPA() マクロで共有されている文字列オブジェクトは変更しないようにするのではなくて assert(3) で異常終了させるように変更しています。

ko1: r44825 2014-02-05 13:00:02 +0900

文字列のフラグ操作のリファクタリング。 STR_UNSET_NOCAPA() というマクロは削除して普通に FL_UNSET() を直接利用するようにしています。そして NOCAPA に相当するのを STR_SHARED だけにしています。多分 STR_NOEMBED は使うところで常に別途チェック/操作しているから不要ってことではないかと思います。あと文字列の共有化で STR_SET_SHARED() マクロを利用していなかったところを利用するようにしています。
いやー string.c もなかなか難しいですね。

ko1: r44827 2014-02-05 13:21:30 +0900

リファクタリングの続きで internal.h から STR_NOCAPA() と STR_NOCAPA_P() の定義を削除しています。そして不要なフラグ操作やチェックをしていたところなどを削除しています。

ko1: r44828 2014-02-05 13:31:18 +0900

文字列のフラグ操作のリファクタリングで、既に STR_EMBED はチェック済みなので STR_SHARED_P() を使わずに FL_TEST() を直接使うなど不要な処理を省いています。

kazu: r44829 2014-02-05 13:36:18 +0900

r44803, r44805 と r44825 の ChangeLog エントリの typo 修正。

ko1: r44831 2014-02-05 13:58:00 +0900

LIKELY()、UNLIKELY()、UNINITIALIZED_VAR()、__has_attribute() などのマクロ定義を vm_core.h から internal.h に移動して、string.c の vm_core.h から連なるヘッダ群への依存を解消しています。

ko1: r44832 2014-02-05 14:41:04 +0900

拡張ライブラリ objspace でも String オブジェクトのフラグ操作で STR_NOCAPA_P() を使っているところがあったので STR_SHARED_P() で置き換えています。ここでも STR_EMBED_P() も一緒にチェックされているのでみたいでした。

ko1: r44833 2014-02-05 14:42:52 +0900

vsnprintf.c で独自に UNINITIALIZED_VAR() マクロを定義していたのを internal.h で定義するようにしたことで不要になったので削除しています。

nobu: r44834 2014-02-05 15:23:37 +0900

Dir.glob でファイルシステムエンコーディングを利用しようとした時にそれが US-ASCII だったら ASCII-8BIT を利用するようにしています。ファイルパスに非ASCII文字が含まれていた時にエラーにならないようにしているようです。

nobu: r44835 2014-02-05 15:41:00 +0900

標準添付ライブラリ test/unit の assert_raise のメッセージにあったピリオドを削ってます。後ろに連結される可能性があるからとのこと。

nobu: r44836 2014-02-05 15:49:35 +0900

parse.y の rb_enc_symname_type() でシンボルの元になる文字列をチェックする時にエンコーディングが ASCII compatible じゃない文字列(マルチバイト文字を含むエンコーディングという意味じゃなくて UTF-16/UTF-32 など ASCII 文字の表現が異なるもの)の時はエラーを返すようにしています。

nobu: r44837 2014-02-05 17:24:37 +0900

Marshal.dump で無名モジュール/クラスを dump しようとした時などの例外メッセージに含めるモジュール/クラス名を PRIsVALUE を用いて VALUE 型のまま埋め込むようにしてエンコーディングを保存するようにしています。 これ文字列連結で PRIsVALUE の前にある "%" のあとに空白が入っているんですけど、フォーマット文字列に空白入ってもいいんでしたっけ。あー数値の場合は空白で前に padding するんでした。文字列の時は単に無視されるんですかね。[追記]非glyph文字をエスケープする指定になるそうです[/追記]

nobu: r44838 2014-02-05 17:32:11 +0900

Marhsal.dump 時の内部的なインスタンス変数(@ で始まらない変数名のもの)と、エンコーディングの扱いを修正しているようです。エンコーディングのほうは encoding index ではなくてエンコーディング名を使って dump するようにしているようです。多分インデックスより名前のほうが変化に強いからだと思います。インスタンス変数のほうは内部的なインスタンス変数は別途 dump するから ivar として dump しないのでその数あわせをしているのかなぁという感じです。

nobu: r44840 2014-02-05 20:56:35 +0900

r44839 の Marshal.dump で内部的インスタンス変数をスキップしていたところの条件に無名の ID というのも追加して、pack("p") で共有する文字列を参照するためのインスタンス変数にこれを利用するようにしています。 r44804 で pack("p") が返す文字列の持ちかたを変更した影響で pack("p") した文字列を Marshal.dump した結果が変化してしまっていた(?)のを修正しているようです。