Hatena::ブログ(Diary)

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

2014-09-23 ruby-trunk-changes r47687 - r47698

[][]ruby-trunk-changes r47687 - r47698

今日は Hash リテラルの値に if 文を書いた時の文法エラーの不具合修正などがありました。

akr: r47687 2014-09-23 08:29:15 +0900

test/ruby/test_thread.rb の test_main_thread_status_at_exit で Thead.pass → Thread.pass と typo 修正。 実際には mth.stop? の条件がすぐに真になってここは殆ど実行されてなかったみたいですね。

svn: r47688 2014-09-23 08:29:27 +0900

version.h の日付更新。

nobu: r47689 2014-09-23 09:13:32 +0900

doc/ の下のドキュメントファイル類の行末の空白除去。

hsbt: r47690 2014-09-23 11:55:14 +0900

.travis.yml で make test と make test-all で -v オプションを渡すのをやめて、また make test-rubyspec で rubyspec も実行するようにしています。

duerst: r47691 2014-09-23 16:08:03 +0900

tool/downloader.rb にファイルをダウンロードする時に、手元にあるファイルの更新時刻を If-Modified-Since ヘッダで渡して更新があった時だけ本体をダウンロードしなおすようにしています。大きなファイルなので毎回ダウンロードされないようにして通信量を抑えるようにしています。 [ruby-core:65164] [Feature #10084]

svn: r47692 2014-09-23 16:08:16 +0900

tool/downloader.rb の行末の空白除去。

nobu: r47693 2014-09-23 20:52:23 +0900

tool/downloader.rb のリファクタリング。 r47691 で追加した Downloader.download_if_modified_since を Donwloader.donwload メソッドと共通部分を括り出して引数フラグで更新時刻チェックの処理を切り替えるようにしています。

nobu: r47694 2014-09-23 20:56:30 +0900

またまた tool/downloader.rb で Downloader.uri_to_download というメソッドを追加して、利用しているスクリプト側で書いてた gnu.org および rubygems.org の URL を埋め込むようにしています。うーんビルドやリリース用のツールとはいえ、今後このクラスを利用する場所が増えるとここにURI追加していかないといけないことになるのでちょっとこの設計は違和感がありますね。

nobu: r47695 2014-09-23 21:09:30 +0900

make update-gems ターゲットを追加しています。 gems/bundled_gems の bundled gems のバージョンが更新された時のダウンロードしなおすルールが書かれています。リリースパッケージには指定のバージョンの gem パッケージが含まれるので、ソースツリーを追いかける人用でしょうね。

nobu: r47696 2014-09-23 22:00:27 +0900

Hash の { key: value } の記法で value のところに if 文を書こうとすると parse error になる不具合を修正しています。 後置 if として解釈されてしまっていたので、key: のようなラベルの後に modifier は入らないように lexer のステータスの指定を修正しています。 [ruby-core:65211] [Bug #10279]

nagachika: r47697 2014-09-24 01:31:40 +0900

r47696 の ChangeLog エントリが重複していたので1つ削除しています。

svn: r47698 2014-09-24 01:31:51 +0900

version.h の日付更新。

2014-09-22 ruby-trunk-changes r47679 - r47686

[][]ruby-trunk-changes r47679 - r47686

今日はいくつかテストの修正と、久しぶりに RB_GC_GUARD() の追加がありました。

normal: r47679 2014-09-22 09:46:25 +0900

拡張ライブラリ socket の struct sendmsg_args_struct、struct recvmsg_args_struct、struct connect_arg、struct getnameinfo_arg のメンバの順番の入れ換えで構造体サイズを小さくしています。

akr: r47680 2014-09-22 12:12:23 +0900

Fedoraタイムゾーン情報として tzdata-2014g パッケージを入れるとテストが失敗する対策として、テストメソッド生成メソッドを別途増やしています。何が問題だったのかまでは読んでいません。 [ruby-core:65058] [Bug #10245]

nobu: r47681 2014-09-22 13:44:19 +0900

標準添付ライブラリ tmpdir の Dir::Tmpname#make_tmpname で prefix と suffix が String オブジェクトじゃない時に変換する処理を追加しています。

nobu: r47682 2014-09-22 16:38:33 +0900

r47668 で Thread のテストに同期用に Queue を追加したのを利用できるように require "thread" を追加しています。

nobu: r47683 2014-09-22 17:17:24 +0900

rb_ary_splice() の最後に RB_GC_GUARD() を追加しています。引数の rpl ですが途中で rb_ary_to_ary() で変換する時に一時オブジェクトが格納される可能性があるので、その中身のバッファを操作する間オブジェクトが解放されないようにしないといけません。 [Bug #10281]

hsbt: r47684 2014-09-22 18:21:39 +0900

.travis.yml で Travis CI では OS X のテスト結果のみエラーを検出するようにしています。 Linuxビルドはたまに失敗するのでノイズになっているのと、Linux は RubyCI で chkbuild を使ったテスト環境がいくつかあるので TravisCI は OS X 専用としています。

zzak: r47685 2014-09-22 19:50:52 +0900

doc/syntax/methods.rdoc に []= のような aset 型のメソッド定義についての説明を追記しています。 https://github.com/ruby/ruby/pull/662

suke: r47686 2014-09-22 20:01:22 +0900

拡張ライブラリ win32ole の WIN23OLE_VARIANT と Time の変換のテストでチェック方法を assert_in_delta を使ったものにして、さらにテストパターンをいくつか追加しています。 Time の 999999999 ナノ秒を持つものを VT_DATE に変換すると失敗していたそうで。はい、これもよくわかりません。多分変換で精度が落ちるからでしょう…。

2014-09-21 ruby-trunk-changes r47653 - r47678

[][]ruby-trunk-changes r47653 - r47678

今日は RubyKaigi 後ということもあってかたくさんコミットがありました。 Enumerable#chunk と #slice_before には deprecated になった仕様があったり、Time.new の offset が受け付ける文字列の制限に変更があったり、DRbServer の停止が graceful になったりなどの変更がありました。

akr: r47653 2014-09-21 00:01:44 +0900

Enumerable#chunk と Enumerable#slice_before のブロックのブロックパラメータの2つ目に state を受け取る呼び方は deprecate として、警告を出力するようにしています。

svn: r47654 2014-09-21 00:01:56 +0900

version.h の日付更新。

glass: r47655 2014-09-21 02:35:06 +0900

標準添付ライブラリ tempfile および tmpdir で引数を *rest で受けてメソッド内で処理していたのを省略可能引数をやキーワードrest引数を活用したメソッド定義をして明示的な処理を避けるようにしています。

nobu: r47656 2014-09-21 10:40:21 +0900

r47655 での変更でメソッド引数とその中でのメソッド呼び出しのブロックパラメータが同じ名前だったのを修正しています。また tempfile のテストで ConditionVariable が必要だそうで require "thread" を追加しています。

nobu: r47657 2014-09-21 11:03:34 +0900

sigaction(2) によるシグナルハンドラの登録が errno=EINVAL で返ってきた時は、ハンドラを登録できないシグナルが指定された場合というのがありえるので、rb_bug() ではなく Errno::EINVAL 例外の発生にするようにしています。また Signal.trap に :KILL や :STOP を渡した時に Errno::EINVAL が発生することを確認するテストを追加しています。

suke: r47658 2014-09-21 11:18:37 +0900

拡張ライブラリ win32ole で Time を WIN32OLE_VARIANT に変換した時に秒単位以下の精度も変換するようにしていたのをやっぱりやめています。 なんとなく丸めをした時に桁上がりを処理していないのが問題だったようなので精度を落とさなくても解決可能だった気もするのと、以下の文は正しいんでしょうか?

    if (msec >= 59) {                                                                        
      msec -= 60;                                                                            
    }

条件が ">" なんじゃないかという。この後で 1 足してるからいいのかもしれない。 [ruby-dev:48558] [Bug #10258]

glass: r47659 2014-09-21 11:23:32 +0900

Array#include? の実装で要素との比較をするのに rb_equal() を呼んでいたのを rb_equal_opt() を呼ぶことで組込みクラスのオブジェクトの比較にメソッド呼び出しを伴わない直接比較関数の呼び出しを行うようにしてパフォーマンス改善をしています。 [ruby-core:64954] [Feature #10227]

nobu: r47660 2014-09-21 11:42:40 +0900

r47657 の続きで ruby_signal() は errno に関わらず sigaction(2) 失敗時は SIG_ERR を返して、呼び元によって、インタプリタ起動時には rb_bug() で終了し、Signal.trap メソッドからの呼び出しではEINVAL だけでなく全てのエラーを SystemCallError で Errno::EXXX の例外発生にするようにと変更しています。

nobu: r47661 2014-09-21 11:48:38 +0900

r47655 と r47659 の ChangeLog エントリのインデント修正。

hsbt: r47662 2014-09-21 12:10:27 +0900

標準添付ライブラリ rexml でコメントアウトされていたデバッグ用と思われるコードを削除しています。

glass: r47663 2014-09-21 12:21:17 +0900

標準添付ライブラリ csvCSV.new で headers と fields の数が多いほうを Array#zip の receiver にしようとしているところで、数が一致していた時に reverse が必要な無駄が多いパスを通るようになっていたので、条件を変更しています。 [ruby-core:63215] [Feature #9952]

normal: r47664 2014-09-21 12:26:47 +0900

ロードするファイルパスを取得するための rb_find_file_ext_safe() で取得失敗時に明示的に一時バッファのサイズを 0 にしてメモリ使用量を抑えて GC の必要性が上がるのを抑えるようにしています。

nobu: r47665 2014-09-21 12:31:46 +0900

Signal についてのテストメソッドを1つ消しています。 Thread 内の sleep がシグナル割り込みで例外発生にならないことを確認しているものですが、Rubyレベルのシグナルハンドラの実行は常にメインスレッドで行われるので、とあります。それを確認するためにこのテストがあったのでは? という気もしますが。

normal: r47666 2014-09-21 12:50:23 +0900

iseq.c に文末のセミコロンが2重になっていたところがあったので修正しています。

akr: r47667 2014-09-21 13:54:46 +0900

bootstraptest/test_thread.rb の Thread#kill した時の ensure 節が実行されることを確認するテストで、Thread.pass を1回しか実行していなかったのを、対象の Thread が sleep に入ったことを確認するまでループするようにしています。

akr: r47668 2014-09-21 13:55:49 +0900

test/ruby/test_thread.rb の test_main_thread_status_at_exit で子 Thread が begin 節に入ったことを確認してからメインスレッドを終了させるように Queue を使った同期を行うようにしています。

nobu: r47669 2014-09-21 14:10:14 +0900

SIGEXIT というシグナル番号 0 のシグナルはインタプリタ内部で利用されているものなので(?)、sigaction(2) に渡さないようにしています。うーん Signal.trap(:EXIT) で登録したシグナルハンドラは、インタプリタ終了時に呼ばれるようです。知らなかった。at_exit でいいじゃないかという気もしますが、実行は at_exit より前なので実行できる内容に違いがあるのかも。

akr: r47670 2014-09-21 14:14:47 +0900

thread_pthread.c に native_set_thread_name() という関数を追加して、Thread に ps -L で表示した時のコマンド名で区別できる名前を付けるようにしています。

kazu: r47671 2014-09-21 16:27:52 +0900

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

kazu: r47672 2014-09-21 16:28:58 +0900

r47655、r47658、r47659 の ChangeLog エントリのインデント修正や余分な空白の除去。

nari: r47673 2014-09-21 18:22:42 +0900

st.c の重複していたので不要なマクロ定義を削除しています。また node.c の未使用のマクロ定義も削除しています。

nari: r47674 2014-09-21 18:52:37 +0900

parse.y の parser_class_nest() で未使用の構造体メンバとそのアクセスマクロを削除しています。

nari: r47675 2014-09-21 19:07:44 +0900

st.c の未使用マクロを削除しています。

glass: r47676 2014-09-22 01:58:47 +0900

Time.new に渡す offset の文字列で分のところが 60 以上の時にエラーにするようにしています。 [ruby-dev:47539] [Bug #8679]

svn: r47677 2014-09-22 01:59:02 +0900

version.h の日付更新。

akr: r47678 2014-09-22 02:06:05 +0900

標準添付ライブラリ drb の DRbServer の停止を graceful にするようにしています。これまでは Thread#kill して DRbServer の接続待ちスレッドを止めていたのですが、shutdown 通知用の pipe を用意してこれを select することで終了を通知されたらループを抜けるようにしています。 これにより @protocol.close が実行されるようになり test-all での fd の leak 検出でひっかからなくなる、ということかと思います。

2014-09-20 ruby-trunk-changes r47645 - r47652

[][]ruby-trunk-changes r47645 - r47652

今日は Binding#eval 内での super が呼べないという不具合の修正の他、Hash のキーの文法の拡張や Enumerable#slice_when の追加などの新機能追加がありました。

nobu: r47645 2014-09-20 07:55:59 +0900

Binding#eval の中で super が効かないという不具合を修正しています。いやー、これ binding をこのメソッドの外に持ち出してから eval("super") したらやっぱり binding 取得したところの super が呼ばれるというのが正しいというのはわかるけど、なんかすごい。しかし cfp->klass に block->self のクラスを代入していて、こういうあたりといじるとだいたい別のところでなにか出てきたりするんですよね…。2.0.0 からの regression じゃないかということですが、しばらく様子をみよう。 [ruby-core:65122] [Bug #10263]

svn: r47646 2014-09-20 07:56:10 +0900

version.h の日付更新。

akr: r47647 2014-09-20 10:17:05 +0900

拡張ライブラリ opensslOpenSSL::BN#pretty_print と OpenSSL::X509::Name#pretty_print、OpenSSL::X509::Certificate#pretty_print という証明書などのデータを文字列化した表現にするメソッドを追加しています。

nobu: r47648 2014-09-20 10:23:02 +0900

バイトコードへのコンパイル時のキーワード引数の名前リストを ID の数値で管理していたのを Symbol を使うようにしています。 dynamic symbol は ID が Fixnum に収まらない範囲の数値になることがあるため to_sym した Symbol と同名のキーワード引数を定義しようとした時にエラーになる不具合の修正。 [ruby-dev:48564] [Bug #10266]

nobu: r47649 2014-09-20 10:48:43 +0900

Hash のキーの文法を拡張していて、以下のように Symbol のキーにクオートが必要な文字を含むものをクオート付きで書けるようにしています。おおーついに入ったのですね。ということは 2.2 から使えることになるかも。 [ruby-core:34453] [Feature #4276]

{
  key: 42,
  "ill-formed-key": 72
}
  # => {:key=>42, :"ill-formed-key"=>72}

この :"ill-formed-key" は ':' がついているので Symbol です。文字列のキーが書けるようになったのではなくて、そのままでは書けなかった(クオートが必要な) Symbol のキーが ":" で区切る記法で書けるようになったというものです。

nobu: r47650 2014-09-20 11:49:24 +0900

r47649 で追加したクオートつき Symbol のキーの記法について NEWS ファイルに追記しています。

hsbt: r47651 2014-09-20 11:55:27 +0900

.travis.yml に対象 OS として Mac OS X を追加しています。TravisOS X がテストできるようになった(なってた)のを利用するようにしたのですね。

また test_copied_ivar_memory_leak のメモリリークテストのメモリ増加量のしきいちをデフォルトの 1.5 から 1.8 に増やしています。 https://github.com/ruby/ruby/pull/723

akr: r47652 2014-09-20 15:52:29 +0900

Enumerable#slice_when という新規メソッドを追加しています。 これは隣りあった要素を2つの引数としてブロックを呼び出して真を返したらそこで区切るというパターンの slice です。テストケースからいくつか例をひっぱると

[1,4,9,10,11,12,15,16,19,20,21].slice_when {|i, j| i+1 != j }.to_a
  # => [[1], [4], [9,10,11,12], [15,16], [19,20,21]]

とすると連続している(1ずつ増えている)かたまりに分解しますし

[7, 5, 9, 2, 0, 7, 9, 4, 2, 0].slice_when {|i, j| i.even? != j.even? }.to_a
  # => [[7, 5, 9], [2, 0], [7, 9], [4, 2, 0]]

とすると奇数/偶数の種類ごとのかたまりに分解されるという具合です。 [ruby-core:62499] [Feature #9826]

2014-09-19 ruby-trunk-changes r47625 - r47644

[][]ruby-trunk-changes r47625 - r47644

今日は RubyKaigi 2日目でした。 rb_utf8_str_new()/rb_utf8_str_new_cstr() の追加、rb_freeze_singleton_class() の追加などいくつか公開 API を追加しています。

nobu: r47625 2014-09-18 23:51:08 +0900

rb_utf8_str_new_cstr() という C-API を追加して Encoding に UTF-8 を指定した文字列オブジェクト作成のショートカット関数を作成しています。

nobu: r47626 2014-09-18 23:51:45 +0900

拡張ライブラリ json の fbuffer_to_s() で rb_str_new() の引数を FBUFFER_PAIR(fb) で多値みたいに展開していたのでそれぞれの引数毎のマクロにまで展開しています。 rb_str_new() もマクロなのでまずかったらしい。

normal: r47631 2014-09-19 05:37:52 +0900

NEWS ファイルに configure --with-jemalloc オプションの追加について追記しています。

svn: r47632 2014-09-19 05:38:08 +0900

version.h の日付更新。

nobu: r47633 2014-09-19 10:45:45 +0900

r47551 および r47557 あたりからの続きで特異クラスを freeze した時にそこから継承ツリーを遡って freeze してしまわないようにしています。 rb_freeze_singleton_class() という公開 C-API が追加されています。

[追記]ただし rb_freeze_singleton_class() は OBJ_FREEZE() の詳細実装の一部として使うものであって直接使うものではないとのことです[/追記]

nobu: r47634 2014-09-19 10:46:42 +0900

freeze したオブジェクトを変更しようとして発生する例外のメッセージでクラス名のエンコーディングを保持するようにしています。

nobu: r47635 2014-09-19 10:47:06 +0900

test_math.rb で定義している assert_infinity で Float#finite? は NaN についても true を返すため infinite? を利用するようにしています。 [ruby-core:65117] [Feature #10261]

nobu: r47636 2014-09-19 11:01:15 +0900

tainted をチェックする Check_SafeStr() の定義を obsolete にしてエラーメッセージ代替として SafeStringValue() を利用するように表示しています。

nobu: r47637 2014-09-19 11:40:58 +0900

r47633 で追加された rb_freeze_singleton_class() の実装で内部的に利用していて ObjectSpace から隠されているオブジェクトの freeze の時に klass が NULL であることがありえるのを対応するようにしています。

nobu: r47638 2014-09-19 13:55:21 +0900

README.EXT(.ja) に r47625 で追加した rb_utf8_str_new() と rb_utf8_str_new_cstr() について追記しています。

nobu: r47639 2014-09-19 14:53:00 +0900

String オブジェクトバッファに静的領域を利用するものを作成する rb_str_new_static() と rb_{usascii,utf8,enc}_str_new_static() を追加しています。 struct RBasic::flags に解放不要であることを表すフラグ STR_NOFREE を追加して、書き換えや GC 時に free 処理をスキップするようにしています。C 言語の文字列リテラルを String オブジェクトにする時にそのままその文字列バッファにすることで不要なメモリ確保を避けるようになっています。 mruby にはあったのでそれを取り込んでみたということだそうです。

nobu: r47640 2014-09-19 14:53:05 +0900

rb_str_new_literal() や rb_{usascii,utf-8,enc}_str_new_literal() を追加して r47639 で追加した rb_str_new_static() を使って実装しています。

usa: r47641 2014-09-19 15:49:56 +0900

Windows 用の make の win32/Makefile.sub で make up が svn もしくは git で管理されていないディレクトリ(パッケージファイルから展開した時などにエラーになってたのでなにも実行しないようにしています。

nobu: r47642 2014-09-19 16:04:35 +0900

r47641 の typo 修正。

nobu: r47643 2014-09-19 20:06:04 +0900

send を使って foo= のような代入記号つきメソッドを呼び出した時に undefined method になっていた不具合を修正しています。 "foo=" のような Symbol を得る時に "foo" の部分が既に static symbol として登録されていたら同じく static symbol 化するようにしています。 "foo=" のような Symbol は :"foo" の ID に対して特定のビットのフラグを立てて表現しているので…というより、attr_writer で定義する時に :foo の部分の Symbol のみ渡すからということかな。 [ruby-dev:48559] [Bug #10259]

usa: r47644 2014-09-19 23:57:33 +0900

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