Hatena::ブログ(Diary)

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

2015-05-02 ruby-trunk-changes r50417 - r50418

[][]ruby-trunk-changes r50417 - r50418

今日は組み込みで定義済みの id を利用するようにするリファクタリングだけでした。

nobu: r50417 2015-05-02 07:39:14 +0900

range.c の <=> と succ というメソッドのための id を Init_Range() で rb_intern() していたのを id.h で組み込みで定義されている idCmd と idSucc を利用するように変更しています。

svn: r50418 2015-05-02 07:39:44 +0900

version.h の日付更新。

2015-05-01 ruby-trunk-changes r50409 - r50416

[][]ruby-trunk-changes r50409 - r50416

今日は Hash リテラルのキーにクオート付き文字列を使う記法で %q,%Q 記法を使えないようにする文法上の修正と、異なるバージョンの ruby 用にビルドされた拡張ライブラリをロードしようとしたらエラーにするための変更などがありました。

nobu: r50409 2015-04-30 23:36:19 +0900

2.2 から Hash リテラルのキー部分に { "key": 0 } のようにクオート付きの Symbol キーの記法が利用できるようになりましたが、この文字列部分に %q{} とか %Q{} のような%記法のクオートは利用できないようにしています。これまで %Q"" のようなクオート記号を使った %q,%Q 記法のみキーの部分に使えていたようなのですが、あまり意味がないので %q,%Q 記法自体を禁止するようにしています。

nobu: r50410 2015-05-01 13:29:20 +0900

拡張ライブラリのロード時に呼び出すエントリポイントの関数名の prefix が _Init_ か Init_ かの分岐を消し、export される symbol の prefix を保持する EXPORT_PREFIX を利用するようにしています。

svn: r50411 2015-05-01 13:29:33 +0900

version.h の日付更新。

nobu: r50412 2015-05-01 13:30:26 +0900

拡張ライブラリのロード時に ruby_xmalloc() のシンボルのアドレスを ruby 本体のものと比較して、異なっていたら別のバージョンの ruby 向けの拡張ライブラリなのでロード失敗させるようにしています。

これは若干背景があって、rvm の機能で環境のバージョンを変更する機能があるそうで、その時に既存の拡張ライブラリのパスが通ったままになるので古い(別の)バージョンの ruby 用にビルドされた拡張ライブラリがロードされて SEGV するという現象の報告がよく来るので、別の拡張ライブラリの対象のバージョンをチェックして弾きたいという動機が前々からありました。その方法として ruby_xmalloc() を調べるというのを使っているようです。これって libruby.so を利用している場合のみ有効なのかなぁ。

nobu: r50413 2015-05-01 13:41:27 +0900

r50412 では OS X の場合は dlclose(3) が SEGV するよいうことで dlclose(3) をスキップさせてましたが、そもそも開いたままだと問題があるので(SEGV する?)その場で rb_fatal() でバージョン不一致として異常終了させるようにしています。

nobu: r50414 2015-05-01 15:46:59 +0900

r50410 で EXPORT_PREFIX というマクロが必須になったので Windows 環境向けに win32/Makefile.sub で生成する config.h にその定義を追加するようにしています。が空白になってますね。

nobu: r50415 2015-05-01 15:57:17 +0900

r50414 の再修正。 Windows 環境では EXPORT_PREFIX は "_" に定義するようにしています。

nobu: r50416 2015-05-01 16:27:03 +0900

r50410 および r50414, r50415 を revert して、EXPORT_PREFIX のかわりに、拡張ライブラリのエントリポイントの関数名を作るところで元のようにプラットフォームから判定して EXTERNAL_PREFIX を作るようにしています。 EXPORT_PREFIX は extern したシンボルにつく prefix でここで欲しいものとは違うんだそうです。そうなのか…。

2015-04-30 ruby-trunk-changes r50402 - r50408

[][]ruby-trunk-changes r50402 - r50408

今日は lambda 式で Syntax Error が発生することがある不具合の修正や、拡張ライブラリ socket のエラー処理の不具合修正、private な accessor と自己代入演算子の仕様の変更などがありました。

nobu: r50402 2015-04-30 16:22:19 +0900

p ->() do a(1) do end end のように ->() による lambda 式に do end ブロックを渡してその中にかっこ付きのメソッド呼び出し + do-end によるブロック という式が syntax error になるのを修正しています。 だいぶややこしいですが lambda 式の引数の parse 後に cmdarg_stack 変数をリセットしておいて、lambda の body 部の parse 後の規則で $<val> から退避しておいた値を取り出すように修正しています。 cmdarg_stack 変数は parser の規則部で利用されている parser 全体で共有されている変数(構造体のメンバ)なので、再帰的に利用される場所では退避/リセットが必要なようです。 [ruby-core:69017] [Bug #11107]

svn: r50403 2015-04-30 16:22:45 +0900

version.h の日付更新。

nobu: r50404 2015-04-30 16:39:46 +0900

拡張ライブラリ socket の socket(2) や connect(2) listen(2) などのシステムコールのエラー時に errno を退避せずに close(2) を呼んでいたため errno が上書きされて、errno が 0 の状態で SystemCallError を発生させようとして rb_bug() で異常終了することがあった不具合を修正しています。 [ruby-core:68531] [Bug #10975]

nobu: r50405 2015-04-30 16:45:36 +0900

拡張ライブラリ socket の IPSocket の初期化で何らかのシステムコールでエラーが発生した時に例外を発生させる rsock_syserr_fail_host_port() に渡す引数が間違っていたため冗長な例外メッセージを生成してしまっていた不具合を修正しています。 [ruby-core:68531] [Bug #10975]

hsbt: r50406 2015-04-30 17:02:38 +0900

rational.c の Rational の rdoc 用コメントで 2r のような r-suffix による Rational の literal 表記について追記しています。 [Bug #11075] https://github.com/ruby/ruby/pull/885

svn: r50407 2015-04-30 17:02:56 +0900

r50406 のコメントの編集の行末の空白除去。

nobu: r50408 2015-04-30 19:51:13 +0900

private な attr_accessor を定義した時の += のような自己再代入するメソッドのために VM の命令列のコンパイルを修正した r46873 と r46875 の変更を revert しています。 そもそも private なメソッドの呼び出しの制限が += のような記法の時だけ無視されるのはダメなんじゃね? という仕様面での指摘を受けてやっぱりやめということ。 [ruby-core:68984] [Bug #11096]

うーん、[Bug #10060] とは真っ向から対立する仕様なんですが、どっちがいいんですかねぇ。個人的には private な attr_accessor ってそもそも必要か? という気がしますが…

2015-04-29 ruby-trunk-changes r50398 - r50401

[][]ruby-trunk-changes r50398 - r50401

今日は for 文が命令列にコンパイルされる方法のリファクタリングなどがありました。

昨日、一昨日は ruby-trunk-changes の開始以来初めて 2日間コミットがなくてお休みでした。

nobu: r50398 2015-04-29 12:48:26 +0900

for 文の AST ノードを ISeq にコンパイルする時に ITER ノードと同じだったのを、パース時に行なっていた多重代入の処理(length などのメソッド呼び出しと条件分岐を含む AST を生成)をコンパイル時に行なうようにしています。余分な NODE オブジェクトの生成を抑制するためでしょうか。

nobu: r50399 2015-04-29 12:49:05 +0900

r50398 の for 文の parse 処理の分岐を switch 文で書き代えるリファクタリング

svn: r50400 2015-04-29 12:49:05 +0900

version.h の日付更新。

nobu: r50401 2015-04-29 22:22:34 +0900

標準添付ライブラリ cgicgi/cookie.rb の rdoc 用コメントのサンプルコードで最後の引数のあとに "," を追加して引数の追加時に最後の行の変更をしなくていいようにしています。またテストコードでも同様に最後の引数の後に "," を追加しています。

つまり

obj.m(
  a,
  b,
  c,
)

のようにしておくことで c の後に引数を追加する時に "c," の行に "," を追加するだけの変更をしなくて良くなるってことですが、メソッド呼び出しの引数は m() のようなかっこつきの呼び出しの時に限って最後の余分な "," が許容されるんですね。いや、なんか知っていたような気もしますがあんまりこれに依存しないほうがいいような気がしてこういうコードは書かないようにしてました。

2015-04-26 ruby-trunk-changes r50388 - r50395

[][]ruby-trunk-changes r50388 - r50395

今日は UTF-8 の codepoint 上限の修正などがありました。

nobu: r50388 2015-04-26 05:16:04 +0900

r50386 の ChangeLog に記載した ticket 番号が2つ重複していたのを1つ修正しています。 なるほど、これ2つ関連チケットがあったんですね。

svn: r50389 2015-04-26 05:16:22 +0900

version.h の日付更新。

nobu: r50390 2015-04-26 07:19:17 +0900

vm_trace.c で TracePoint.new メソッドの undef を行っていたのを削除しています。 TracePoint.new は再定義されているので undef する必要はなかったため。

nobu: r50391 2015-04-26 07:19:46 +0900

vm_trace.c のインデントの修正のみ。

nobu: r50392 2015-04-26 07:36:52 +0900

UTF-8エンコーディングで受け付ける codepoint の最大値を 0x0010ffff までに修正しています。UTF-8 は 31bit の codepoint で 6バイト文字まで表現できるように定義されていたそうですが、数年前から 4 バイト文字までに収めるように定義が変更されていたそうです。へー。 [ruby-core:68982] [Feature #11094]

nobu: r50393 2015-04-26 08:45:02 +0900

vm_trace.c の symbol2event_flag() で変数 id が関数内 static 変数として定義されていたのを単なるローカル変数に変更しています。

nobu: r50394 2015-04-26 08:55:34 +0900

vm_trace.c の symbol2event_flag() で 関数内で C() という関数マクロを定義して記述をそろえていたのに a_call と a_return イベントのぶんだけ展開した状態で記述されていたのを C() を利用するようにリファクタリングされています。

nobu: r50395 2015-04-26 09:16:38 +0900

gc.c の gc_event_hook_body() の引数に rb_thread_t *th を追加して関数内で GET_THREAD() でカレントスレッドを取得していたのを呼び元で取得して渡すように修正しています。