Hatena::ブログ(Diary)

PB memo このページをアンテナに追加 RSSフィード

2015-01-29 ruby-trunk-changes r49433 - r49442

[][]ruby-trunk-changes r49433 - r49442

今日はいくつかの Math のメソッド引数に Fixnum を渡した時の高速化や、if 文や &&, || などで条件部分(左辺値)がリテラルだった場合の最適化などがありました。

nobu: r49433 2015-01-29 10:41:54 +0900

math.c で数値オブジェクトを double へ変換する Get_Double() というマクロを導入して、Fixnum の時は rb_to_float() を呼ばずに直接 double へキャストするようにしています。高速化のためみたいですね。 to_f を呼ばなくなるので再定義が効かなくなるという非互換はありますが…。実用的にはまあ許容できるような気もします。 [ruby-core:67822] [Feature #10785]

nobu: r49434 2015-01-29 10:42:12 +0900

r49434 の再修正で、Get_Double() で直接キャストするのは Fixnum#to_f が再定義されていない時だけにしています。なるほど、これで再定義時の非互換は回避できそうですね。 [ruby-core:67822] [Feature #10785]

nobu: r49435 2015-01-29 17:03:24 +0900

parse.y に if 文の条件部がリテラルnil, true, false だったり文字列リテラルだったりして真偽が静的にわかる場合は IF ノードを省略して直接実行すべきノードを返す new_if_gen() という関数を定義して、これを使うようにしています。 制御構造としての意味を持つ && や || でも(logop_gen()) 同様の最適化を行っています。

nobu: r49436 2015-01-29 17:26:45 +0900

tool/rbinstall.rb で Makefile変数の置換つき展開のために ":" と書きたいところで Path separator を使っていた(Unix 系だと ":" だけど Windows だと ";" なので意図した Makefile にならない)のを修正しています。

hsbt: r49437 2015-01-29 20:28:31 +0900

tool/make-snapshot で表示するパッケージのチェックサムから MD5 を削除しています。おお、ついに MD5 は使わないようにするんですね。次からリリースパッケージのチェックサムMD5 はなくなるかもしれません。

nobu: r49438 2015-01-29 22:22:39 +0900

r49435 の再修正。 logop_gen() で || や or で左辺値がリテラルnil, false だった時に左辺ノードを 0 にクリアしてしまっていたのを修正しています。

nobu: r49439 2015-01-29 22:22:45 +0900

r49435 の更に再修正。 logop_gen() で defined? の引数ではこの最適化は実行しないようにしています。

mrkn: r49440 2015-01-29 23:34:43 +0900

拡張ライブラリ bigdecimal で Rational の構造体を遮蔽するようになった 2.2.0 から導入された rb_rational_num() と rb_rational_den() や構造体 struct RRational を利用していたため古い rubygem install で gem パッケージ版のインストールができなくなっていたのを修正しています。 存在しなかったら代替を自前実装するようにしています。 [ruby-core:67867] [Bug #10796]

marcandre: r49441 2015-01-30 00:56:58 +0900

String#to_s の rdoc 用コメントで String を継承したサブクラスでは to_s は String に変換されたものが返される点を追記しています。

svn: r49442 2015-01-30 00:57:10 +0900

version.h の日付更新。

2015-01-28 ruby-trunk-changes r49428 - r49432

[][]ruby-trunk-changes r49428 - r49432

今日は Thread 生成、join まわりの細かな最適化や拡張ライブラリ psych の不具合修正がありました。

hsbt: r49428 2015-01-28 21:32:31 +0900

Thread#value の rdoc 用コメントに Thread で例外が発生していた時にそれが raise される挙動について追記しています。 [ruby-core:67324] [Bug #10694]

svn: r49429 2015-01-28 21:32:43 +0900

version.h の日付更新。

normal: r49430 2015-01-29 02:06:40 +0900

Thread の生成や Thread#join の実装について構造体のサイズ削減、関数のインライン展開(inline を付けるのではなく実際に展開)、Thread に名前をつける native_set_thread_name() で inspect から名前を抽出するのではなく rb_proc_location() を呼び出して直接名前を生成するようにするなどの最適化を行っています。 [ruby-core:67459] [Bug #10723]

svn: r49431 2015-01-29 02:06:51 +0900

version.h の日付更新。

tenderlove: r49432 2015-01-29 02:37:09 +0900

拡張ライブラリ psych で Hash を継承したクラスのオブジェクトインスタンス変数をもつものを dump した時に、複数回同じオブジェクトが参照されている場合にちゃんと同一のオブジェクトの参照になるようにオブジェクトの登録をするように修正しています。 r49188 や r49276 の追加修正ですかね。またこの変更で psych のバージョンを 2.0.12 に更新しています。

2015-01-27 ruby-trunk-changes r49414 - r49421

[][]ruby-trunk-changes r49414 - r49421

nobu: r49414 2015-01-27 13:09:04 +0900

CAPI での 文字列の終端文字追加のテスト用の拡張ライブラリで r49402 の修正でエンコーディングに対して不正な文字の時にも Qnil を返していたのをやめています。 うーん難しい。要するに "\x00" が返るのかな。そもそも不正文字の時は先頭バイトしかみてないんですよね…。あ、なるほど、ともかくちゃんと終端文字が入っていれば nil を返して、そうでない時はなにかしら文字を返せばテストとしてはひっかかってくれるというわけですね。

svn: r49415 2015-01-27 13:09:14 +0900

version.h の日付更新。

nobu: r49416 2015-01-27 13:13:52 +0900

svn property で enc/trans/.time を svn:ignore に追加しています。

nobu: r49417 2015-01-27 13:15:03 +0900

svn property svn:ignore から不要な行を削除しています。

nobu: r49418 2015-01-27 14:20:21 +0900

tool/vcs.rb の VCS::GIT.get_revisions で svn property 変更だけのコミットも含めるため path が "." の時は git log コマンドの引数に渡さないようにしています。 "git log ." と "git log" で表示されるコミットが異なるみたいです。

nobu: r49419 2015-01-27 14:39:52 +0900

common.mk から DTRACE_DEPENDENT_OBJS を Makefile.in に移動しています。 Windows では DTrace は利用できないため?

usa: r49420 2015-01-27 16:00:50 +0900

tool/redmine-backporter.rb での readline 代替実装に Ctrl-p と Ctrl-n による履歴の参照機能を追加しています。

usa: r49421 2015-01-27 16:04:38 +0900

tool/redmine-backporter.rb に `!` コマンドで外部コマンドの起動をする機能を追加しています。

2015-01-26 ruby-trunk-changes r49402 - r49413

[][]ruby-trunk-changes r49402 - r49413

今日は文字列の終端文字関連の修正がありました。拡張ライブラリを書く人にしか影響はないですね。

nobu: r49402 2015-01-26 11:00:43 +0900

文字列オブジェクトのワイド文字エンコーディングの時の終端文字の考慮のテスト用拡張ライブラリエンコーディングにおいて不正な文字の時に例外が発生しないように MBCLEN_CHARFOUND_P() で文字をチェックして不正な時はバイト列の先頭をそのまま返ししています。 これ *s だけ返しているけどそれでいいんですかね?

nobu: r49403 2015-01-26 11:00:56 +0900

文字列操作の関数のテスト用拡張ライブラリに Bug::String#cstr_term_char だけでなくクラスメソッドとして Bug::String.cstr_term_char も追加しています。後で追加されるテストスクリプトで利用されています。

svn: r49404 2015-01-26 11:00:57 +0900

version.h の日付更新。

nobu: r49405 2015-01-26 11:37:51 +0900

str_make_independent_expand() で struct RVALUE 内に文字列を埋め込んだ時に終端文字 '\0' を追記するようにしています。 あれ、ここではエンコーディングは意識しなくていいのかな……と思ったらとりあえず Pull Request の変更を取り込んで後で再修正しているみたいです。 https://github.com/ruby/ruby/pull/821

nobu: r49406 2015-01-26 11:39:00 +0900

r49405 の追加修正で、終端文字は NUL文字に決め打たず TERM_FILL() を利用してワイド文字エンコーディングの時を考慮するようにしています。 またテストも追加しています。 ここで r49403 で追加したクラスメソッドを利用しています。 https://github.com/ruby/ruby/pull/821

nobu: r49407 2015-01-26 12:43:08 +0900

str_buf_cat() で RSTRING_PTR() や RSTRING_LEN() を毎回呼んでいるところをローカル変数に代入して使いまわすようにしています。こういう時メモリ確保(の副作用としての GC、の副作用としての finalizer 実行)などで Rubyメソッドが呼ばれる可能性があると対象のオブジェクトが変更される可能性があるので気をつけないといけませんが、rb_str_modify() の後と RESIZE_CAPA() の後は再取得しているので大丈夫そうですね。と思ったけど RESIZE_CAPA() の後 olen は取り直していないけどこれは大丈夫ですかね。まさに操作中の文字列のサイズを弄られるとかだいぶ嫌な想定ですし、きっと考慮済みでしょうけど。

nobu: r49408 2015-01-26 12:43:20 +0900

str_buf_cat() および RESIZE_CAPA() マクロにおいても終端文字のサイズを考慮するようにしています。

nobu: r49410 2015-01-26 16:20:34 +0900

gcc 5 以降では -Wno-maybe-uninitialized というオプションを追加するようにしています。 thread.c の do_select() で誤検出するので抑制のためだそうです。

nobu: r49411 2015-01-26 17:14:17 +0900

configure で dtrace -G のチェックをしているところで、実際にオブジェクトファイルが更新されているかを diff を取ってチェックしています。環境によって dtrace の -G オプションの有無や挙動が異なるのでその対応のためみたいです。

knu: r49412 2015-01-26 18:06:54 +0900

misc/ruby-electric.el に 2.2.2 をマージしています。 https://github.com/knu/ruby-electric.el

hsbt: r49413 2015-01-26 22:09:50 +0900

.gitignore に r49326 で enc/trans をビルドディレクトリに作成するようにした時に生成されるようになったタイムスタンプファイル enc/trans/.time を追加しています。

2015-01-25 ruby-trunk-changes r49399 - r49401

[][]ruby-trunk-changes r49399 - r49401

今日は Array#flatten が to_ary を呼ぶ条件が少し修正されています。

nobu: r49399 2015-01-25 12:02:39 +0900

Array#flatten 関連のテストが大きなメソッドになっていたのを複数のテストメソッドに分割するリファクタリング

nobu: r49400 2015-01-25 12:04:10 +0900

Array#flatten で引数 level で展開するネストの深さの指定があった時に、展開が不要なレベルのオブジェクトにも to_ary が呼ばれていたのを修正しています。 よく気がつきましたねこれ。 [ruby-core:67637] [Bug #10748]

kazu: r49401 2015-01-25 17:17:52 +0900

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