ruby-trunk-changes r40603 - r40612

今日は文字列リテラルへの変数の埋め込みの文法エラー時のメッセージ改善や external_encoding が ASCII-8BIT の時の IO の読み込み時の変換の変更、Module#prepend と Module#included_modules を組み合わせた時の修正などがありました。 Module#included_modules の件はまだ完全に直っていないような気がするので再修正があるかもしれません。

naruse:r40603 2013-05-08 07:51:16 +0900

r40593 で Socket.ip_address_list で取得した IPv6ローカルアドレスの sin6_scope_id に 0 が入っていたときに上書きする処理を OpenIndiana SunOS のために入れましたが、KAME の場合 IPv6 アドレスの先頭から3、4バイト目の部分にインターフェースのインデックスを埋め込んでいるので sockaddr_obj() でそこから ipv6_scope_id に移動する処理があるため、ここで上書きしてしまうとそちらの処理が動かなくなってしまうため、処理を囲む #if に defined(__sun) を追加して衝突しないようにしています。

svn:r40604 2013-05-08 07:51:20 +0900

version.h の日付更新。

nobu:r40605 2013-05-08 13:06:34 +0900

rb_isgraph() のラッパである関数マクロ ISGRAPH() が定義されていなかったので include/ruby/ruby.h に定義を追加しています。 ruby 自体のソースでは使っているところはありません。

nobu:r40606 2013-05-08 13:07:21 +0900

test/ripper/test_scanner_events.rb で validate_location という名前で assertion のユーティリティメソッドを定義して使っていたのを assert_location と改名しています。コミットログをみる感じだと assert_??? という名前にしておくとバックトレース表示する時にスキップしてくれるからとのこと。 TestUnit がフレームをスキップする条件にメソッド名があるのでしょう。

nobu:r40607 2013-05-08 13:07:22 +0900

ダブルクオーテーションで括られた文字列の中で #{} で式の埋め込みができるのはよく知られていると思いますが、"#$var" とするとグローバル変数 $var が展開されます。これ時々はまるんですよね。"#@var" や "#@@var" でも展開されるようです。で、この文法の parse がうまくなくて、各変数の接頭語のあとに変数名としておかしな名前が続いた時もトークンは返してしまって、よくわからないエラーになってしまっていたので、きちんと変数名としておかしな文字がきていることを示す例外を発生させるようにしています。 [ruby-core:54846] [Bug #8375]

naruse:r40608 2013-05-08 13:59:52 +0900

拡張ライブラリ json の generator.o と parser.o の依存関係にヘッダ群を追加しています。 [ruby-dev:47327] [Bug #8379]

naruse:r40609 2013-05-08 14:00:02 +0900

拡張ライブラリ json の ext/json/generator/generator.c の isArrayOrObject() において、コンパイラの警告除去のため明示的なキャストを追加しています。 [ruby-dev:47325] [Bug #8378]

naruse:r40610 2013-05-08 17:47:26 +0900

external_encoding を ASCII-8BIT にした IO からの読み込みは internal_encoding に依らず ASCII-8BIT のままにするようにしています。元のチケットは open の mode やオプションで external_encoding と internal_encoding を指定した時などは変換されるのに IO.readlines では変換されない、という不具合報告でしたが、IO.readlines がわではなくて open などが変換してしまうほうが間違いということで修正されています。 [ruby-core:54656] [Bug #8342]

akr:r40611 2013-05-08 21:39:38 +0900

configure.in の libcrypt の確認部分にコメントを追記しています。

nobu:r40612 2013-05-08 22:47:11 +0900

Module#prepend を使った時に Module#included_modules が self (その Module もしくは Class 自体)を含んでしまう不具合を修正しています。 prepend が継承ツリー上で、元のクラスのメソッドエントリを移植した IClass を RCLASS_ORIGIN() が元のクラスを指すようにして prepend した Module のあとに挿入するようになっていたのですが、その IClass を特別扱いしていなかったのでその IClass が指している元のクラスも出現してしまっていたようです。 [ruby-core:53158] [Bug #8025]
しかし、この修正だと Module#included_modules の self だけが特別あつかいされているので、継承した親クラスが prepend を使っていたケースなどでその親クラスが登場してしまう現象が残っているようです。

module M1; end

class C1
  prepend M1
end

class C2 < C1
end

p C1.included_modules # => [M1, Kernel]
p C2.included_modules # => [M1, C1, Kernel]