今日は defined?(super) の不具合の修正などがありました。
svn:r40579 2013-05-05 11:40:38 +0900
version.h の日付更新。
nobu:r40580 2013-05-05 13:29:01 +0900
multiarch 対応のために template/ruby.pc.in の Cflags に使うアーキテクチャ依存のヘッダファイルディレクトリパスを ${rubyhdrdir}/${arch} から ${rubyarchhdrdir} に変更しています。 [ruby-core:52622] [Bug #7874]
nobu:r40581 2013-05-05 13:37:48 +0900
ビルド時に実行ファイルのリンク後に実行するコマンドを指定する POSTLINK を、Mac OS X で実行ファイルの署名するために codesign を呼ぶ設定をする時にその場で $LINK_SO にその時点での ${POSTLINK} の内容を埋め込まずに、変数の参照として入れておくようにしています。あとで POSTLINK を上書きできるようにしたのでしょうか。
nobu:r40582 2013-05-05 15:54:32 +0900
r40581 の再修正。 LINK_SO の改行を消さないようにしているそうです。
nobu:r40583 2013-05-05 16:29:44 +0900
defined?(super) がブロック内で呼ばれると nil がかえってきてしまう不具合を修正しています。 r36369 で method entry の検索を iseq から cfp を見るように変更した影響でブロック内のときにメソッドエントリをみつけそこなっていたようです。 VM の control frame stack を EP == LP のところまで(つまりメソッド定義の直下、ローカル変数が定義されるところ)まで辿ってから method entry を探すようにしています。 [ruby-core:54769] [Bug #8367]
これって今度は define_method にブロック渡ししてメソッドを定義した時のそのブロック内の defined?(super) が別のものを見るようになったりしないんでしょうか? と、思ってちょっと実験してみたのですが、どうやら大丈夫みたいでした。
class A def a; end # A の a と def_a をそれぞれコメントアウトして実験 def def_a; end end class B < A def def_a 1.times{ p [:in_block, defined?(super)] } self.class.module_eval do define_method(:a) do p [:in_define_method_block, defined?(super)] end end end end b = B.new b.def_a b.a
A#a を定義した時は :in_define_method_block で "super" を、A#def_a を定義した時は :in_block で "super" を返したので大丈夫そうです。
nobu:r40584 2013-05-05 18:57:02 +0900
r40583 の追加。 VM の命令 defined のなかで ZSUPER(引数なし、引数のかっこもなしの super) の時の super の呼び先を探索するのに vm_search_superclass() を使うようにしています。またこのために vm_search_superclass() で継承しているメソッドがみつからなかった時に例外を発生させていたのをやめて、戻り値で結果を返し、これまでの呼び元(1箇所だけ)で条件分岐して例外を発生させるようにしています。これで実際に super を呼ぶ時と同じ探索方法を使うので確実に判定できるようになっているはず。 [ruby-core:54769] [Bug #8367]
nobu:r40585 2013-05-05 19:02:41 +0900
r40584 の変更に関連して、トップレベルでの defined?(super) (nil を返す)のテストを追加しています。
eregon:r40586 2013-05-05 20:49:53 +0900
doc/syntax/refinements.rdoc のサンプルコードのクオート閉じ忘れを修正しています。