ruby-trunk-changes r46758 - r46768

今日は Symbol と ID の対応について(内部的な話ではありますが)方針の変更がありました。

keiju: r46758 2014-07-09 00:19:30 +0900

irb で文字列リテラル内の #{} で式を埋め込んでいるところのパースで、改行後に継続の判定のために [] や {} の対応をチェックしているところで対応のチェック条件が間違っていたのを修正しています。テストがないので影響の度合いはよくわかりませんが、どうも

irb(main):001:0> "#{ {foo: 42
irb(main):002:1> }
irb(main):003:0" }
irb(main):004:0" "
=> "{:foo=>42}\n"

となっていたのが

irb(main):001:0> "#{ {foo: 42
irb(main):002:1> }
irb(main):003:0> }
irb(main):004:0" "
=> "{:foo=>42}\n"

と式展開の閉じかっこを受け取るまでクオート文字列用プロンプトにならないようになっている(3行目のプロンプトが違う)のは確認できました。もっとなんか影響ありそうなんですけどね。

svn: r46759 2014-07-09 00:19:46 +0900

version.h の日付更新。

normal: r46760 2014-07-09 05:47:58 +0900

thread_pthread.h で semaphore.h を #include していたのを、もう使わなくなったので削除しています。

normal: r46761 2014-07-09 05:50:37 +0900

thread_pthread.h の struct rb_global_vm_lock_struct で pthread_mutex_t を直接使っていたのを rb_nativethread_lock_t 型を使うようにしています。pthread 用のヘッダなので、事実上同じ型ですが公開されている型を使うようにしているようです。

naruse: r46762 2014-07-09 11:31:05 +0900

test/ruby/find_executable.rb で RbConfig を利用しているので require "rbconfig" を追加。

ko1: r46763 2014-07-09 14:00:53 +0900

r46737 で dynamic symbol の rb_gc_resurrect() をやめた関連で、Symbol.all_symbols でシンボルテーブルを走査する時に sweep 予定のものは削除するようにしています。

ko1: r46764 2014-07-09 15:14:41 +0900

Symbol GC の導入以降の ID と Symbol の対応の管理について方針を変更しています。詳細はチケットのほうに非常に丁寧に書かれているのでそちらに丸投げしたいと思います。ありがとうございます。 [ruby-dev:48384] [Bug #10014]
まあ一応おおざっぱに書くと、GC 対象となる Symbol (チケットでは mortal symbol) と対応する ID はなくなる(使いまわされる)可能性があるため、うっかりその ID を保存して後で使おうとするとエラーになってしまうので、mortal symbol は ID を持たないようにしよう、という変更です。mortal symbol はどのみちテーブルで管理されていて、struct RVALUE から辿るので ID との対応を持つ必要はないのだった、ということですね。

[追記]ここで dynamic <-> static と mortal <-> immortal という Symbol の区別を分けているのが気になっていたのですが、その後ささださんとなかださんに教えてもらったところ

  • dynamic は struct RVALUE の slot で T_SYMBOL 型のオブジェクト (struct RSymbol) として確保されている Symbol
  • static は VALUE のビットパターンで判定される Symbol (slot は消費しない即値)
  • immortal は GC 対象とならない(正確には常に mark されるので GC で回収されない) Symbol で static な Symbol + pindown で参照を登録された dynamic な Symbol
  • mortal は GC で回収され得る Symbol (= pindown されていない dynamic な Symbol)

という関係ということでした。 static/dynamic は名前を変更したいけどなにかいい名前がないかなぁということでした。[/追記]

nobu: r46765 2014-07-09 16:19:31 +0900

test/ruby/test_io.rb の IO#advice のテストで結果が nil であることを確認するチェックを assert_equal を使ってたのを assert_nil に変更。

nobu: r46766 2014-07-09 16:19:43 +0900

IO#advice で発生させる例外メッセージの型に応じて適切な指示子を利用するように修正しています。

nobu: r46767 2014-07-09 16:31:42 +0900

Symbol.all_symbols で st_foreach() に渡すコールバック関数 symbols_i() の引数の型などをコールバック関数の型にそろえています。

nobu: r46768 2014-07-09 17:07:32 +0900

parse.y から Symbol の管理用のコードを symbol.h と symbol.c に分離しているようです。